From 95a33445496e28505ef65d51ea2462a4d4a80517 Mon Sep 17 00:00:00 2001 From: deuling Date: Fri, 18 Jan 2008 17:07:38 +0000 Subject: [PATCH] * gdbarch.sh (function_list): Add new property bits_big_endian to gdbarch structure. * gdbarch.{c,h}: Regenerate. * value.c (struct value): Replace BITS_BIG_ENDIAN by gdbarch_bits_big_endian (comment). (unpack_field_as_long, modify_field): Likewise. * value.h: Likewise (comment). * valops.c (value_slice): Likewise. * valarith.c (value_subscript, value_bit_index): Likewise. * gdbtypes.h (field): Likewise (comment). * eval.c (evaluate_subexp_standard): Likewise. * dwarf2read.c (dwarf2_add_field): Likewise. * ada-lang.c (decode_packed_array, ada_value_primitive_packed_val) (move_bits, ada_value_assign, value_assign_to_component): Likewise. * defs.h (BITS_BIG_ENDIAN): Remove. * gdbint.texinfo (Target Conditionals): Replace the description of BITS_BIG_ENDIAN with a description of gdbarch_bits_big_endian. --- gdb/ChangeLog | 20 ++++++++++++++++++++ gdb/ada-lang.c | 13 +++++++------ gdb/defs.h | 8 -------- gdb/doc/ChangeLog | 5 +++++ gdb/doc/gdbint.texinfo | 14 ++++++++++---- gdb/dwarf2read.c | 2 +- gdb/eval.c | 2 +- gdb/gdbarch.c | 24 ++++++++++++++++++++++++ gdb/gdbarch.h | 6 ++++++ gdb/gdbarch.sh | 5 +++++ gdb/gdbtypes.h | 4 ++-- gdb/valarith.c | 5 +++-- gdb/valops.c | 2 +- gdb/value.c | 8 ++++---- gdb/value.h | 4 ++-- 15 files changed, 91 insertions(+), 31 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ed9f2dc6b1..e66df1e931 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,25 @@ 2008-01-18 Markus Deuling + * gdbarch.sh (function_list): Add new property bits_big_endian to + gdbarch structure. + * gdbarch.{c,h}: Regenerate. + + * value.c (struct value): Replace BITS_BIG_ENDIAN by + gdbarch_bits_big_endian (comment). + (unpack_field_as_long, modify_field): Likewise. + * value.h: Likewise (comment). + * valops.c (value_slice): Likewise. + * valarith.c (value_subscript, value_bit_index): Likewise. + * gdbtypes.h (field): Likewise (comment). + * eval.c (evaluate_subexp_standard): Likewise. + * dwarf2read.c (dwarf2_add_field): Likewise. + * ada-lang.c (decode_packed_array, ada_value_primitive_packed_val) + (move_bits, ada_value_assign, value_assign_to_component): Likewise. + + * defs.h (BITS_BIG_ENDIAN): Remove. + +2008-01-18 Markus Deuling + * jv-exp.y (yylex): Replace DEPRECATED_STREQN with the appropriate function calls. * m2-exp.y (yylex): Likewise. diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 49da2ec43b..7880645fc4 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -1875,7 +1875,8 @@ decode_packed_array (struct value *arr) return NULL; } - if (BITS_BIG_ENDIAN && ada_is_modular_type (value_type (arr))) + if (gdbarch_bits_big_endian (current_gdbarch) + && ada_is_modular_type (value_type (arr))) { /* This is a (right-justified) modular type representing a packed array with no wrapper. In order to interpret the value through @@ -1998,7 +1999,7 @@ ada_value_primitive_packed_val (struct value *obj, const gdb_byte *valaddr, int len = (bit_size + bit_offset + HOST_CHAR_BIT - 1) / 8; /* Transmit bytes from least to most significant; delta is the direction the indices move. */ - int delta = BITS_BIG_ENDIAN ? -1 : 1; + int delta = gdbarch_bits_big_endian (current_gdbarch) ? -1 : 1; type = ada_check_typedef (type); @@ -2047,7 +2048,7 @@ ada_value_primitive_packed_val (struct value *obj, const gdb_byte *valaddr, memset (unpacked, 0, TYPE_LENGTH (type)); return v; } - else if (BITS_BIG_ENDIAN) + else if (gdbarch_bits_big_endian (current_gdbarch)) { src = len - 1; if (has_negatives (type) @@ -2141,7 +2142,7 @@ move_bits (gdb_byte *target, int targ_offset, const gdb_byte *source, targ_offset %= HOST_CHAR_BIT; source += src_offset / HOST_CHAR_BIT; src_offset %= HOST_CHAR_BIT; - if (BITS_BIG_ENDIAN) + if (gdbarch_bits_big_endian (current_gdbarch)) { accum = (unsigned char) *source; source += 1; @@ -2229,7 +2230,7 @@ ada_value_assign (struct value *toval, struct value *fromval) fromval = value_cast (type, fromval); read_memory (to_addr, buffer, len); - if (BITS_BIG_ENDIAN) + if (gdbarch_bits_big_endian (current_gdbarch)) move_bits (buffer, value_bitpos (toval), value_contents (fromval), TYPE_LENGTH (value_type (fromval)) * TARGET_CHAR_BIT - @@ -2276,7 +2277,7 @@ value_assign_to_component (struct value *container, struct value *component, else bits = value_bitsize (component); - if (BITS_BIG_ENDIAN) + if (gdbarch_bits_big_endian (current_gdbarch)) move_bits (value_contents_writeable (container) + offset_in_container, value_bitpos (container) + bit_offset_in_container, value_contents (val), diff --git a/gdb/defs.h b/gdb/defs.h index b0d07e7c2b..3486df8c63 100644 --- a/gdb/defs.h +++ b/gdb/defs.h @@ -1011,14 +1011,6 @@ enum { MAX_REGISTER_SIZE = 16 }; #define HOST_CHAR_BIT TARGET_CHAR_BIT #endif -/* The bit byte-order has to do just with numbering of bits in - debugging symbols and such. Conceptually, it's quite separate - from byte/word byte order. */ - -#if !defined (BITS_BIG_ENDIAN) -#define BITS_BIG_ENDIAN (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG) -#endif - /* In findvar.c. */ extern LONGEST extract_signed_integer (const gdb_byte *, int); diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 9a47760380..5de82446de 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,8 @@ +2008-01-18 Markus Deuling + + * gdbint.texinfo (Target Conditionals): Replace the description of + BITS_BIG_ENDIAN with a description of gdbarch_bits_big_endian. + 2008-01-12 Paul Hilfinger * gdb.texinfo (C Operators): Remove incorrect parenthetical comment diff --git a/gdb/doc/gdbint.texinfo b/gdb/doc/gdbint.texinfo index da2cd7bb76..8aa741006e 100644 --- a/gdb/doc/gdbint.texinfo +++ b/gdb/doc/gdbint.texinfo @@ -3344,12 +3344,18 @@ Used to notify if the compiler promotes a @code{short} or @code{char} parameter to an @code{int}, but still reports the parameter as its original type, rather than the promoted type. -@item BITS_BIG_ENDIAN -@findex BITS_BIG_ENDIAN -Define this if the numbering of bits in the targets does @strong{not} match the -endianness of the target byte order. A value of 1 means that the bits +@item gdbarch_bits_big_endian (@var{gdbarch}) +@findex gdbarch_bits_big_endian +This is used if the numbering of bits in the targets does @strong{not} match +the endianness of the target byte order. A value of 1 means that the bits are numbered in a big-endian bit order, 0 means little-endian. +@item set_gdbarch_bits_big_endian (@var{gdbarch}, @var{bits_big_endian}) +@findex set_gdbarch_bits_big_endian +Calling set_gdbarch_bits_big_endian with a value of 1 indicates that the +bits in the target are numbered in a big-endian bit order, 0 indicates +little-endian. + @item BREAKPOINT @findex BREAKPOINT This is the character array initializer for the bit pattern to put into diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 44f9c2aac6..15e168ff9b 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -3502,7 +3502,7 @@ dwarf2_add_field (struct field_info *fip, struct die_info *die, attr = dwarf2_attr (die, DW_AT_bit_offset, cu); if (attr) { - if (BITS_BIG_ENDIAN) + if (gdbarch_bits_big_endian (current_gdbarch)) { /* For big endian bits, the DW_AT_bit_offset gives the additional bit offset from the MSB of the containing diff --git a/gdb/eval.c b/gdb/eval.c index 188cca0e0b..466ae248ce 100644 --- a/gdb/eval.c +++ b/gdb/eval.c @@ -686,7 +686,7 @@ evaluate_subexp_standard (struct type *expect_type, for (; range_low <= range_high; range_low++) { int bit_index = (unsigned) range_low % TARGET_CHAR_BIT; - if (BITS_BIG_ENDIAN) + if (gdbarch_bits_big_endian (current_gdbarch)) bit_index = TARGET_CHAR_BIT - 1 - bit_index; valaddr[(unsigned) range_low / TARGET_CHAR_BIT] |= 1 << bit_index; diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c index 90e3f47c42..3c5a282eb5 100644 --- a/gdb/gdbarch.c +++ b/gdb/gdbarch.c @@ -130,6 +130,7 @@ struct gdbarch */ + int bits_big_endian; int short_bit; int int_bit; int long_bit; @@ -251,6 +252,7 @@ struct gdbarch startup_gdbarch = /*per-architecture data-pointers and swap regions */ 0, NULL, NULL, /* Multi-arch values */ + 1, /* bits_big_endian */ 8 * sizeof (short), /* short_bit */ 8 * sizeof (int), /* int_bit */ 8 * sizeof (long), /* long_bit */ @@ -382,6 +384,7 @@ gdbarch_alloc (const struct gdbarch_info *info, gdbarch->target_desc = info->target_desc; /* Force the explicit initialization of these. */ + gdbarch->bits_big_endian = (gdbarch->byte_order == BFD_ENDIAN_BIG); gdbarch->short_bit = 2*TARGET_CHAR_BIT; gdbarch->int_bit = 4*TARGET_CHAR_BIT; gdbarch->long_bit = 4*TARGET_CHAR_BIT; @@ -480,6 +483,7 @@ verify_gdbarch (struct gdbarch *gdbarch) if (gdbarch->bfd_arch_info == NULL) fprintf_unfiltered (log, "\n\tbfd_arch_info"); /* Check those that need to be defined for the given multi-arch level. */ + /* Skip verify of bits_big_endian, invalid_p == 0 */ /* Skip verify of short_bit, invalid_p == 0 */ /* Skip verify of int_bit, invalid_p == 0 */ /* Skip verify of long_bit, invalid_p == 0 */ @@ -648,6 +652,9 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file) "gdbarch_dump: bfd_arch_info = %s\n", gdbarch_bfd_arch_info (gdbarch)->printable_name); fprintf_unfiltered (file, + "gdbarch_dump: bits_big_endian = %s\n", + paddr_d (gdbarch->bits_big_endian)); + fprintf_unfiltered (file, "gdbarch_dump: breakpoint_from_pc = <0x%lx>\n", (long) gdbarch->breakpoint_from_pc); fprintf_unfiltered (file, @@ -1060,6 +1067,23 @@ gdbarch_target_desc (struct gdbarch *gdbarch) } int +gdbarch_bits_big_endian (struct gdbarch *gdbarch) +{ + gdb_assert (gdbarch != NULL); + /* Skip verify of bits_big_endian, invalid_p == 0 */ + if (gdbarch_debug >= 2) + fprintf_unfiltered (gdb_stdlog, "gdbarch_bits_big_endian called\n"); + return gdbarch->bits_big_endian; +} + +void +set_gdbarch_bits_big_endian (struct gdbarch *gdbarch, + int bits_big_endian) +{ + gdbarch->bits_big_endian = bits_big_endian; +} + +int gdbarch_short_bit (struct gdbarch *gdbarch) { gdb_assert (gdbarch != NULL); diff --git a/gdb/gdbarch.h b/gdb/gdbarch.h index ebb8c60995..c068ddec5a 100644 --- a/gdb/gdbarch.h +++ b/gdb/gdbarch.h @@ -71,6 +71,12 @@ extern const struct target_desc * gdbarch_target_desc (struct gdbarch *gdbarch); /* The following are initialized by the target dependent code. */ +/* The bit byte-order has to do just with numbering of bits in debugging symbols + and such. Conceptually, it's quite separate from byte/word byte order. */ + +extern int gdbarch_bits_big_endian (struct gdbarch *gdbarch); +extern void set_gdbarch_bits_big_endian (struct gdbarch *gdbarch, int bits_big_endian); + /* Number of bits in a char or unsigned char for the target machine. Just like CHAR_BIT in but describes the target machine. v:TARGET_CHAR_BIT:int:char_bit::::8 * sizeof (char):8::0: diff --git a/gdb/gdbarch.sh b/gdb/gdbarch.sh index 92b2316033..eda85af533 100755 --- a/gdb/gdbarch.sh +++ b/gdb/gdbarch.sh @@ -343,6 +343,11 @@ i:int:byte_order:::BFD_ENDIAN_BIG i:enum gdb_osabi:osabi:::GDB_OSABI_UNKNOWN # i:const struct target_desc *:target_desc:::::::paddr_d ((long) gdbarch->target_desc) + +# The bit byte-order has to do just with numbering of bits in debugging symbols +# and such. Conceptually, it's quite separate from byte/word byte order. +v:int:bits_big_endian:::1:(gdbarch->byte_order == BFD_ENDIAN_BIG)::0 + # Number of bits in a char or unsigned char for the target machine. # Just like CHAR_BIT in but describes the target machine. # v:TARGET_CHAR_BIT:int:char_bit::::8 * sizeof (char):8::0: diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index 54aae9c10a..d224140de3 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -403,8 +403,8 @@ struct main_type { /* Position of this field, counting in bits from start of containing structure. - For BITS_BIG_ENDIAN=1 targets, it is the bit offset to the MSB. - For BITS_BIG_ENDIAN=0 targets, it is the bit offset to the LSB. + For gdbarch_bits_big_endian=1 targets, it is the bit offset to the MSB. + For gdbarch_bits_big_endian=0 targets, it is the bit offset to the LSB. For a range bound or enum value, this is the value itself. */ int bitpos; diff --git a/gdb/valarith.c b/gdb/valarith.c index 562be0cab1..173c7a5dbb 100644 --- a/gdb/valarith.c +++ b/gdb/valarith.c @@ -230,7 +230,8 @@ value_subscript (struct value *array, struct value *idx) offset = index / TARGET_CHAR_BIT; byte = *((char *) value_contents (array) + offset); bit_index = index % TARGET_CHAR_BIT; - byte >>= (BITS_BIG_ENDIAN ? TARGET_CHAR_BIT - 1 - bit_index : bit_index); + byte >>= (gdbarch_bits_big_endian (current_gdbarch) ? + TARGET_CHAR_BIT - 1 - bit_index : bit_index); v = value_from_longest (LA_BOOL_TYPE, byte & 1); set_value_bitpos (v, bit_index); set_value_bitsize (v, 1); @@ -1575,7 +1576,7 @@ value_bit_index (struct type *type, const gdb_byte *valaddr, int index) word = unpack_long (builtin_type_unsigned_char, valaddr + (rel_index / TARGET_CHAR_BIT)); rel_index %= TARGET_CHAR_BIT; - if (BITS_BIG_ENDIAN) + if (gdbarch_bits_big_endian (current_gdbarch)) rel_index = TARGET_CHAR_BIT - 1 - rel_index; return (word >> rel_index) & 1; } diff --git a/gdb/valops.c b/gdb/valops.c index bb4814f00a..d4a0a9a27d 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -2743,7 +2743,7 @@ value_slice (struct value *array, int lowbound, int length) else if (element > 0) { int j = i % TARGET_CHAR_BIT; - if (BITS_BIG_ENDIAN) + if (gdbarch_bits_big_endian (current_gdbarch)) j = TARGET_CHAR_BIT - 1 - j; value_contents_raw (slice)[i / TARGET_CHAR_BIT] |= (1 << j); } diff --git a/gdb/value.c b/gdb/value.c index 1a5f984feb..e620550eca 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -72,8 +72,8 @@ struct value int bitsize; /* Only used for bitfields; position of start of field. For - BITS_BIG_ENDIAN=0 targets, it is the position of the LSB. For - BITS_BIG_ENDIAN=1 targets, it is the position of the MSB. */ + gdbarch_bits_big_endian=0 targets, it is the position of the LSB. For + gdbarch_bits_big_endian=1 targets, it is the position of the MSB. */ int bitpos; /* Frame register value is relative to. This will be described in @@ -1481,7 +1481,7 @@ unpack_field_as_long (struct type *type, const gdb_byte *valaddr, int fieldno) /* Extract bits. See comment above. */ - if (BITS_BIG_ENDIAN) + if (gdbarch_bits_big_endian (current_gdbarch)) lsbcount = (sizeof val * 8 - bitpos % 8 - bitsize); else lsbcount = (bitpos % 8); @@ -1537,7 +1537,7 @@ modify_field (gdb_byte *addr, LONGEST fieldval, int bitpos, int bitsize) oword = extract_unsigned_integer (addr, sizeof oword); /* Shifting for bit field depends on endianness of the target machine. */ - if (BITS_BIG_ENDIAN) + if (gdbarch_bits_big_endian (current_gdbarch)) bitpos = sizeof (oword) * 8 - bitpos - bitsize; oword &= ~(mask << bitpos); diff --git a/gdb/value.h b/gdb/value.h index 7e1ccaf298..6086917b40 100644 --- a/gdb/value.h +++ b/gdb/value.h @@ -62,8 +62,8 @@ extern int value_bitsize (struct value *); extern void set_value_bitsize (struct value *, int bit); /* Only used for bitfields; position of start of field. For - BITS_BIG_ENDIAN=0 targets, it is the position of the LSB. For - BITS_BIG_ENDIAN=1 targets, it is the position of the MSB. */ + gdbarch_bits_big_endian=0 targets, it is the position of the LSB. For + gdbarch_bits_big_endian=1 targets, it is the position of the MSB. */ extern int value_bitpos (struct value *); extern void set_value_bitpos (struct value *, int bit); -- 2.11.0