diff options
author | Pedro Alves <palves@redhat.com> | 2016-02-11 11:35:05 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2016-02-11 12:14:02 +0000 |
commit | ca47aa93d4a13e676e771041eb7372ff2cdb1487 (patch) | |
tree | eee42ec0c59fa79b8bba333fe89c72fefa57452d | |
parent | dd4a4f86240eac1262c760b6109b42242e007923 (diff) | |
download | gdb-ca47aa93d4a13e676e771041eb7372ff2cdb1487.zip gdb-ca47aa93d4a13e676e771041eb7372ff2cdb1487.tar.gz gdb-ca47aa93d4a13e676e771041eb7372ff2cdb1487.tar.bz2 |
Move store/extract ... integer routines to gdb/common/
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.
-rw-r--r-- | gdb/Makefile.in | 11 | ||||
-rw-r--r-- | gdb/common/common-types.h | 4 | ||||
-rw-r--r-- | gdb/common/gdb-byteswap.c | 201 | ||||
-rw-r--r-- | gdb/common/gdb-byteswap.h | 49 | ||||
-rw-r--r-- | gdb/defs.h | 17 | ||||
-rw-r--r-- | gdb/findvar.c | 189 |
6 files changed, 265 insertions, 206 deletions
diff --git a/gdb/Makefile.in b/gdb/Makefile.in index ec2af52..d63d8aa 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -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 # diff --git a/gdb/common/common-types.h b/gdb/common/common-types.h index efeb0db..760f477 100644 --- a/gdb/common/common-types.h +++ b/gdb/common/common-types.h @@ -20,6 +20,10 @@ #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 index 0000000..ed2c8f5 --- /dev/null +++ b/gdb/common/gdb-byteswap.c @@ -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 index 0000000..9cf1d22 --- /dev/null +++ b/gdb/common/gdb-byteswap.h @@ -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 @@ -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); diff --git a/gdb/findvar.c b/gdb/findvar.c index a39d897..70b9249 100644 --- a/gdb/findvar.c +++ b/gdb/findvar.c @@ -34,136 +34,6 @@ #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 |