]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Move store/extract ... integer routines to gdb/common/
authorPedro Alves <palves@redhat.com>
Thu, 11 Feb 2016 11:35:05 +0000 (11:35 +0000)
committerPedro Alves <palves@redhat.com>
Thu, 11 Feb 2016 12:14:02 +0000 (12:14 +0000)
In preparation for gdbserver using them as well.

gdb/ChangeLog:
2016-02-11  Pedro Alves  <palves@redhat.com>

* Makefile.in (SFILES): Add common/gdb-byteswap.c.
(HFILES_NO_SRCDIR): Add common/gdb-byteswap.h.
(COMMON_OBS): Add common/gdb-byteswap.o.
(gdb-byteswap.o): New rule.
* common/common-types.h: Include bfd-types.h.
* common/gdb-byteswap.c: New file.
* common/gdb-byteswap.h: New file.
* defs.h (extract_signed_integer, extract_unsigned_integer)
(extract_long_unsigned_integer, extract_typed_address)
(store_signed_integer, store_unsigned_integer): Moved to
common/gdb-byteswap.h.
* findvar.c (extract_signed_integer, extract_unsigned_integer)
(extract_long_unsigned_integer, extract_typed_address)
(store_signed_integer, store_unsigned_integer): Moved to
common/gdb-byteswap.c.

gdb/Makefile.in
gdb/common/common-types.h
gdb/common/gdb-byteswap.c [new file with mode: 0644]
gdb/common/gdb-byteswap.h [new file with mode: 0644]
gdb/defs.h
gdb/findvar.c

index ec2af52dc44ddc68f71b84d8eae7cbcc79678d14..d63d8aa4f7f66eeff033c9488c0d2f704429afc5 100644 (file)
@@ -896,6 +896,7 @@ SFILES = ada-exp.y ada-lang.c ada-typeprint.c ada-valprint.c ada-tasks.c \
        target/waitstatus.c common/print-utils.c common/rsp-low.c \
        common/errors.c common/common-debug.c common/common-exceptions.c \
        common/btrace-common.c common/fileio.c common/common-regcache.c \
+       common/gdb-byteswap.c \
        $(SUBDIR_GCC_COMPILE_SRCS)
 
 LINTFILES = $(SFILES) $(YYFILES) $(CONFIG_SRCS) init.c
@@ -988,7 +989,9 @@ common/common-exceptions.h target/target.h common/symbol.h \
 common/common-regcache.h fbsd-tdep.h nat/linux-personality.h \
 common/fileio.h nat/x86-linux.h nat/x86-linux-dregs.h nat/amd64-linux-siginfo.h\
 nat/linux-namespaces.h arch/arm.h common/gdb_sys_time.h arch/aarch64-insn.h \
-tid-parse.h
+tid-parse.h \
+common/gdb-byteswap.h
+
 
 # Header files that already have srcdir in them, or which are in objdir.
 
@@ -1087,7 +1090,7 @@ COMMON_OBS = $(DEPFILES) $(CONFIG_OBS) $(YYOBJ) \
        format.o registry.o btrace.o record-btrace.o waitstatus.o \
        print-utils.o rsp-low.o errors.o common-debug.o debug.o \
        common-exceptions.o btrace-common.o fileio.o \
-       common-regcache.o \
+       common-regcache.o gdb-byteswap.o \
        $(SUBDIR_GCC_COMPILE_OBS)
 
 TSOBS = inflow.o
@@ -2275,6 +2278,10 @@ common-regcache.o: ${srcdir}/common/common-regcache.c
        $(COMPILE) $(srcdir)/common/common-regcache.c
        $(POSTCOMPILE)
 
+gdb-byteswap.o: ${srcdir}/common/gdb-byteswap.c
+       $(COMPILE) $(srcdir)/common/gdb-byteswap.c
+       $(POSTCOMPILE)
+
 #
 # gdb/target/ dependencies
 #
index efeb0db46c9fc9969aa91c02b257c866f4f8544f..760f4773e19170da533c8a13c27e1db61ccc8840 100644 (file)
 #ifndef COMMON_TYPES_H
 #define COMMON_TYPES_H
 
+/* This header is always available, even when BFD is not
+   configured.  */
+#include "bfd-types.h"
+
 #ifdef GDBSERVER
 
 /* * A byte from the program being debugged.  */
diff --git a/gdb/common/gdb-byteswap.c b/gdb/common/gdb-byteswap.c
new file mode 100644 (file)
index 0000000..ed2c8f5
--- /dev/null
@@ -0,0 +1,201 @@
+/* Basic byte-swapping routines, for GDB, the GNU debugger.
+
+   Copyright (C) 1986-2016 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "common-defs.h"
+#include "gdb-byteswap.h"
+#include "host-defs.h"
+
+/* See gdb-byteswap.h.  */
+
+LONGEST
+extract_signed_integer (const gdb_byte *addr, int len,
+                       enum bfd_endian byte_order)
+{
+  LONGEST retval;
+  const unsigned char *p;
+  const unsigned char *startaddr = addr;
+  const unsigned char *endaddr = startaddr + len;
+
+  if (len > (int) sizeof (LONGEST))
+    error (_("\
+That operation is not available on integers of more than %d bytes."),
+          (int) sizeof (LONGEST));
+
+  /* Start at the most significant end of the integer, and work towards
+     the least significant.  */
+  if (byte_order == BFD_ENDIAN_BIG)
+    {
+      p = startaddr;
+      /* Do the sign extension once at the start.  */
+      retval = ((LONGEST) * p ^ 0x80) - 0x80;
+      for (++p; p < endaddr; ++p)
+       retval = (retval << 8) | *p;
+    }
+  else
+    {
+      p = endaddr - 1;
+      /* Do the sign extension once at the start.  */
+      retval = ((LONGEST) * p ^ 0x80) - 0x80;
+      for (--p; p >= startaddr; --p)
+       retval = (retval << 8) | *p;
+    }
+  return retval;
+}
+
+/* See gdb-byteswap.h.  */
+
+ULONGEST
+extract_unsigned_integer (const gdb_byte *addr, int len,
+                         enum bfd_endian byte_order)
+{
+  ULONGEST retval;
+  const unsigned char *p;
+  const unsigned char *startaddr = addr;
+  const unsigned char *endaddr = startaddr + len;
+
+  if (len > (int) sizeof (ULONGEST))
+    error (_("\
+That operation is not available on integers of more than %d bytes."),
+          (int) sizeof (ULONGEST));
+
+  /* Start at the most significant end of the integer, and work towards
+     the least significant.  */
+  retval = 0;
+  if (byte_order == BFD_ENDIAN_BIG)
+    {
+      for (p = startaddr; p < endaddr; ++p)
+       retval = (retval << 8) | *p;
+    }
+  else
+    {
+      for (p = endaddr - 1; p >= startaddr; --p)
+       retval = (retval << 8) | *p;
+    }
+  return retval;
+}
+
+/* See gdb_byteswap.h.  */
+
+int
+extract_long_unsigned_integer (const gdb_byte *addr, int orig_len,
+                              enum bfd_endian byte_order, LONGEST *pval)
+{
+  const gdb_byte *p;
+  const gdb_byte *first_addr;
+  int len;
+
+  len = orig_len;
+  if (byte_order == BFD_ENDIAN_BIG)
+    {
+      for (p = addr;
+          len > (int) sizeof (LONGEST) && p < addr + orig_len;
+          p++)
+       {
+         if (*p == 0)
+           len--;
+         else
+           break;
+       }
+      first_addr = p;
+    }
+  else
+    {
+      first_addr = addr;
+      for (p = addr + orig_len - 1;
+          len > (int) sizeof (LONGEST) && p >= addr;
+          p--)
+       {
+         if (*p == 0)
+           len--;
+         else
+           break;
+       }
+    }
+
+  if (len <= (int) sizeof (LONGEST))
+    {
+      *pval = (LONGEST) extract_unsigned_integer (first_addr,
+                                                 sizeof (LONGEST),
+                                                 byte_order);
+      return 1;
+    }
+
+  return 0;
+}
+
+
+/* See gdb-byteswap.h.  */
+
+void
+store_signed_integer (gdb_byte *addr, int len,
+                     enum bfd_endian byte_order, LONGEST val)
+{
+  gdb_byte *p;
+  gdb_byte *startaddr = addr;
+  gdb_byte *endaddr = startaddr + len;
+
+  /* Start at the least significant end of the integer, and work towards
+     the most significant.  */
+  if (byte_order == BFD_ENDIAN_BIG)
+    {
+      for (p = endaddr - 1; p >= startaddr; --p)
+       {
+         *p = val & 0xff;
+         val >>= 8;
+       }
+    }
+  else
+    {
+      for (p = startaddr; p < endaddr; ++p)
+       {
+         *p = val & 0xff;
+         val >>= 8;
+       }
+    }
+}
+
+/* See gdb-byteswap.h.  */
+
+void
+store_unsigned_integer (gdb_byte *addr, int len,
+                       enum bfd_endian byte_order, ULONGEST val)
+{
+  unsigned char *p;
+  unsigned char *startaddr = (unsigned char *) addr;
+  unsigned char *endaddr = startaddr + len;
+
+  /* Start at the least significant end of the integer, and work towards
+     the most significant.  */
+  if (byte_order == BFD_ENDIAN_BIG)
+    {
+      for (p = endaddr - 1; p >= startaddr; --p)
+       {
+         *p = val & 0xff;
+         val >>= 8;
+       }
+    }
+  else
+    {
+      for (p = startaddr; p < endaddr; ++p)
+       {
+         *p = val & 0xff;
+         val >>= 8;
+       }
+    }
+}
diff --git a/gdb/common/gdb-byteswap.h b/gdb/common/gdb-byteswap.h
new file mode 100644 (file)
index 0000000..9cf1d22
--- /dev/null
@@ -0,0 +1,49 @@
+/* Basic byte-swapping routines, for GDB, the GNU debugger.
+
+   Copyright (C) 2009-2016 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef GDB_BYTESWAP_H
+#define GDB_BYTESWAP_H 1
+
+/* All 'extract' functions return a host-format integer from a
+   target-format integer at ADDR which is LEN bytes long.  */
+
+extern LONGEST extract_signed_integer (const gdb_byte *, int,
+                                      enum bfd_endian);
+
+extern ULONGEST extract_unsigned_integer (const gdb_byte *, int,
+                                         enum bfd_endian);
+
+/* Sometimes a long long unsigned integer can be extracted as a
+   LONGEST value.  This is done so that we can print these values
+   better.  If this integer can be converted to a LONGEST, this
+   function returns 1 and sets *PVAL.  Otherwise it returns 0.  */
+
+extern int extract_long_unsigned_integer (const gdb_byte *, int,
+                                         enum bfd_endian, LONGEST *);
+
+/* All 'store' functions accept a host-format integer and store a
+   target-format integer at ADDR which is LEN bytes long.  */
+
+extern void store_signed_integer (gdb_byte *, int,
+                                 enum bfd_endian, LONGEST);
+
+extern void store_unsigned_integer (gdb_byte *, int,
+                                   enum bfd_endian, ULONGEST);
+
+#endif
index f6ffeac0e6f16b84051e5a5a9a36a6b79b6d10f8..1e7fd1042adfb0af3c4751b301cab231db07322d 100644 (file)
@@ -594,26 +594,13 @@ extern double atof (const char *);        /* X3.159-1989  4.10.1.1 */
 
 enum { MAX_REGISTER_SIZE = 64 };
 
-/* In findvar.c.  */
-
-extern LONGEST extract_signed_integer (const gdb_byte *, int,
-                                      enum bfd_endian);
-
-extern ULONGEST extract_unsigned_integer (const gdb_byte *, int,
-                                         enum bfd_endian);
+#include "gdb-byteswap.h"
 
-extern int extract_long_unsigned_integer (const gdb_byte *, int,
-                                         enum bfd_endian, LONGEST *);
+/* In findvar.c.  */
 
 extern CORE_ADDR extract_typed_address (const gdb_byte *buf,
                                        struct type *type);
 
-extern void store_signed_integer (gdb_byte *, int,
-                                 enum bfd_endian, LONGEST);
-
-extern void store_unsigned_integer (gdb_byte *, int,
-                                   enum bfd_endian, ULONGEST);
-
 extern void store_typed_address (gdb_byte *buf, struct type *type,
                                 CORE_ADDR addr);
 
index a39d89788e8c16dd128887913c3ac8d8d998cb95..70b92496111e0a0a2283f3dffa84513e92cd3022 100644 (file)
 #include "language.h"
 #include "dwarf2loc.h"
 
-/* Basic byte-swapping routines.  All 'extract' functions return a
-   host-format integer from a target-format integer at ADDR which is
-   LEN bytes long.  */
-
-#if TARGET_CHAR_BIT != 8 || HOST_CHAR_BIT != 8
-  /* 8 bit characters are a pretty safe assumption these days, so we
-     assume it throughout all these swapping routines.  If we had to deal with
-     9 bit characters, we would need to make len be in bits and would have
-     to re-write these routines...  */
-you lose
-#endif
-
-LONGEST
-extract_signed_integer (const gdb_byte *addr, int len,
-                       enum bfd_endian byte_order)
-{
-  LONGEST retval;
-  const unsigned char *p;
-  const unsigned char *startaddr = addr;
-  const unsigned char *endaddr = startaddr + len;
-
-  if (len > (int) sizeof (LONGEST))
-    error (_("\
-That operation is not available on integers of more than %d bytes."),
-          (int) sizeof (LONGEST));
-
-  /* Start at the most significant end of the integer, and work towards
-     the least significant.  */
-  if (byte_order == BFD_ENDIAN_BIG)
-    {
-      p = startaddr;
-      /* Do the sign extension once at the start.  */
-      retval = ((LONGEST) * p ^ 0x80) - 0x80;
-      for (++p; p < endaddr; ++p)
-       retval = (retval << 8) | *p;
-    }
-  else
-    {
-      p = endaddr - 1;
-      /* Do the sign extension once at the start.  */
-      retval = ((LONGEST) * p ^ 0x80) - 0x80;
-      for (--p; p >= startaddr; --p)
-       retval = (retval << 8) | *p;
-    }
-  return retval;
-}
-
-ULONGEST
-extract_unsigned_integer (const gdb_byte *addr, int len,
-                         enum bfd_endian byte_order)
-{
-  ULONGEST retval;
-  const unsigned char *p;
-  const unsigned char *startaddr = addr;
-  const unsigned char *endaddr = startaddr + len;
-
-  if (len > (int) sizeof (ULONGEST))
-    error (_("\
-That operation is not available on integers of more than %d bytes."),
-          (int) sizeof (ULONGEST));
-
-  /* Start at the most significant end of the integer, and work towards
-     the least significant.  */
-  retval = 0;
-  if (byte_order == BFD_ENDIAN_BIG)
-    {
-      for (p = startaddr; p < endaddr; ++p)
-       retval = (retval << 8) | *p;
-    }
-  else
-    {
-      for (p = endaddr - 1; p >= startaddr; --p)
-       retval = (retval << 8) | *p;
-    }
-  return retval;
-}
-
-/* Sometimes a long long unsigned integer can be extracted as a
-   LONGEST value.  This is done so that we can print these values
-   better.  If this integer can be converted to a LONGEST, this
-   function returns 1 and sets *PVAL.  Otherwise it returns 0.  */
-
-int
-extract_long_unsigned_integer (const gdb_byte *addr, int orig_len,
-                              enum bfd_endian byte_order, LONGEST *pval)
-{
-  const gdb_byte *p;
-  const gdb_byte *first_addr;
-  int len;
-
-  len = orig_len;
-  if (byte_order == BFD_ENDIAN_BIG)
-    {
-      for (p = addr;
-          len > (int) sizeof (LONGEST) && p < addr + orig_len;
-          p++)
-       {
-         if (*p == 0)
-           len--;
-         else
-           break;
-       }
-      first_addr = p;
-    }
-  else
-    {
-      first_addr = addr;
-      for (p = addr + orig_len - 1;
-          len > (int) sizeof (LONGEST) && p >= addr;
-          p--)
-       {
-         if (*p == 0)
-           len--;
-         else
-           break;
-       }
-    }
-
-  if (len <= (int) sizeof (LONGEST))
-    {
-      *pval = (LONGEST) extract_unsigned_integer (first_addr,
-                                                 sizeof (LONGEST),
-                                                 byte_order);
-      return 1;
-    }
-
-  return 0;
-}
-
-
 /* Treat the bytes at BUF as a pointer of type TYPE, and return the
    address it represents.  */
 CORE_ADDR
@@ -178,65 +48,6 @@ extract_typed_address (const gdb_byte *buf, struct type *type)
   return gdbarch_pointer_to_address (get_type_arch (type), type, buf);
 }
 
-/* All 'store' functions accept a host-format integer and store a
-   target-format integer at ADDR which is LEN bytes long.  */
-
-void
-store_signed_integer (gdb_byte *addr, int len,
-                     enum bfd_endian byte_order, LONGEST val)
-{
-  gdb_byte *p;
-  gdb_byte *startaddr = addr;
-  gdb_byte *endaddr = startaddr + len;
-
-  /* Start at the least significant end of the integer, and work towards
-     the most significant.  */
-  if (byte_order == BFD_ENDIAN_BIG)
-    {
-      for (p = endaddr - 1; p >= startaddr; --p)
-       {
-         *p = val & 0xff;
-         val >>= 8;
-       }
-    }
-  else
-    {
-      for (p = startaddr; p < endaddr; ++p)
-       {
-         *p = val & 0xff;
-         val >>= 8;
-       }
-    }
-}
-
-void
-store_unsigned_integer (gdb_byte *addr, int len,
-                       enum bfd_endian byte_order, ULONGEST val)
-{
-  unsigned char *p;
-  unsigned char *startaddr = (unsigned char *) addr;
-  unsigned char *endaddr = startaddr + len;
-
-  /* Start at the least significant end of the integer, and work towards
-     the most significant.  */
-  if (byte_order == BFD_ENDIAN_BIG)
-    {
-      for (p = endaddr - 1; p >= startaddr; --p)
-       {
-         *p = val & 0xff;
-         val >>= 8;
-       }
-    }
-  else
-    {
-      for (p = startaddr; p < endaddr; ++p)
-       {
-         *p = val & 0xff;
-         val >>= 8;
-       }
-    }
-}
-
 /* Store the address ADDR as a pointer of type TYPE at BUF, in target
    form.  */
 void