gdb/
* ada-lang.c (modify_general_field): Remove. (make_array_descriptor): Replace all modify_general_field calls by modify_field. * value.c (modify_field): Update comment. New variable bytesize. Normalize BITPOS. Initialize BYTESIZE, use it.
This commit is contained in:
parent
87df528e2a
commit
19f220c3b4
|
@ -1,3 +1,11 @@
|
|||
2010-11-16 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* ada-lang.c (modify_general_field): Remove.
|
||||
(make_array_descriptor): Replace all modify_general_field calls by
|
||||
modify_field.
|
||||
* value.c (modify_field): Update comment. New variable bytesize.
|
||||
Normalize BITPOS. Initialize BYTESIZE, use it.
|
||||
|
||||
2010-11-16 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* dwarf2read.c (dw2_forget_cached_source_info): Clear the FULL_NAMES
|
||||
|
|
|
@ -69,8 +69,6 @@
|
|||
#define TRUNCATION_TOWARDS_ZERO ((-5 / 2) == -2)
|
||||
#endif
|
||||
|
||||
static void modify_general_field (struct type *, char *, LONGEST, int, int);
|
||||
|
||||
static struct type *desc_base_type (struct type *);
|
||||
|
||||
static struct type *desc_bounds_type (struct type *);
|
||||
|
@ -1343,15 +1341,6 @@ static char *bound_name[] = {
|
|||
|
||||
#define MAX_ADA_DIMENS (sizeof(bound_name) / (2*sizeof(char *)))
|
||||
|
||||
/* Like modify_field, but allows bitpos > wordlength. */
|
||||
|
||||
static void
|
||||
modify_general_field (struct type *type, char *addr,
|
||||
LONGEST fieldval, int bitpos, int bitsize)
|
||||
{
|
||||
modify_field (type, addr + bitpos / 8, fieldval, bitpos % 8, bitsize);
|
||||
}
|
||||
|
||||
|
||||
/* The desc_* routines return primitive portions of array descriptors
|
||||
(fat pointers). */
|
||||
|
@ -4038,33 +4027,31 @@ make_array_descriptor (struct type *type, struct value *arr)
|
|||
|
||||
for (i = ada_array_arity (ada_check_typedef (value_type (arr))); i > 0; i -= 1)
|
||||
{
|
||||
modify_general_field (value_type (bounds),
|
||||
value_contents_writeable (bounds),
|
||||
ada_array_bound (arr, i, 0),
|
||||
desc_bound_bitpos (bounds_type, i, 0),
|
||||
desc_bound_bitsize (bounds_type, i, 0));
|
||||
modify_general_field (value_type (bounds),
|
||||
value_contents_writeable (bounds),
|
||||
ada_array_bound (arr, i, 1),
|
||||
desc_bound_bitpos (bounds_type, i, 1),
|
||||
desc_bound_bitsize (bounds_type, i, 1));
|
||||
modify_field (value_type (bounds), value_contents_writeable (bounds),
|
||||
ada_array_bound (arr, i, 0),
|
||||
desc_bound_bitpos (bounds_type, i, 0),
|
||||
desc_bound_bitsize (bounds_type, i, 0));
|
||||
modify_field (value_type (bounds), value_contents_writeable (bounds),
|
||||
ada_array_bound (arr, i, 1),
|
||||
desc_bound_bitpos (bounds_type, i, 1),
|
||||
desc_bound_bitsize (bounds_type, i, 1));
|
||||
}
|
||||
|
||||
bounds = ensure_lval (bounds);
|
||||
|
||||
modify_general_field (value_type (descriptor),
|
||||
value_contents_writeable (descriptor),
|
||||
value_pointer (ensure_lval (arr),
|
||||
TYPE_FIELD_TYPE (desc_type, 0)),
|
||||
fat_pntr_data_bitpos (desc_type),
|
||||
fat_pntr_data_bitsize (desc_type));
|
||||
modify_field (value_type (descriptor),
|
||||
value_contents_writeable (descriptor),
|
||||
value_pointer (ensure_lval (arr),
|
||||
TYPE_FIELD_TYPE (desc_type, 0)),
|
||||
fat_pntr_data_bitpos (desc_type),
|
||||
fat_pntr_data_bitsize (desc_type));
|
||||
|
||||
modify_general_field (value_type (descriptor),
|
||||
value_contents_writeable (descriptor),
|
||||
value_pointer (bounds,
|
||||
TYPE_FIELD_TYPE (desc_type, 1)),
|
||||
fat_pntr_bounds_bitpos (desc_type),
|
||||
fat_pntr_bounds_bitsize (desc_type));
|
||||
modify_field (value_type (descriptor),
|
||||
value_contents_writeable (descriptor),
|
||||
value_pointer (bounds,
|
||||
TYPE_FIELD_TYPE (desc_type, 1)),
|
||||
fat_pntr_bounds_bitpos (desc_type),
|
||||
fat_pntr_bounds_bitsize (desc_type));
|
||||
|
||||
descriptor = ensure_lval (descriptor);
|
||||
|
||||
|
|
17
gdb/value.c
17
gdb/value.c
|
@ -2202,7 +2202,7 @@ unpack_field_as_long (struct type *type, const gdb_byte *valaddr, int fieldno)
|
|||
target byte order; the bitfield starts in the byte pointed to. FIELDVAL
|
||||
is the desired value of the field, in host byte order. BITPOS and BITSIZE
|
||||
indicate which bits (in target bit order) comprise the bitfield.
|
||||
Requires 0 < BITSIZE <= lbits, 0 <= BITPOS+BITSIZE <= lbits, and
|
||||
Requires 0 < BITSIZE <= lbits, 0 <= BITPOS % 8 + BITSIZE <= lbits, and
|
||||
0 <= BITPOS, where lbits is the size of a LONGEST in bits. */
|
||||
|
||||
void
|
||||
|
@ -2212,6 +2212,11 @@ modify_field (struct type *type, gdb_byte *addr,
|
|||
enum bfd_endian byte_order = gdbarch_byte_order (get_type_arch (type));
|
||||
ULONGEST oword;
|
||||
ULONGEST mask = (ULONGEST) -1 >> (8 * sizeof (ULONGEST) - bitsize);
|
||||
int bytesize;
|
||||
|
||||
/* Normalize BITPOS. */
|
||||
addr += bitpos / 8;
|
||||
bitpos %= 8;
|
||||
|
||||
/* If a negative fieldval fits in the field in question, chop
|
||||
off the sign extension bits. */
|
||||
|
@ -2229,16 +2234,20 @@ modify_field (struct type *type, gdb_byte *addr,
|
|||
fieldval &= mask;
|
||||
}
|
||||
|
||||
oword = extract_unsigned_integer (addr, sizeof oword, byte_order);
|
||||
/* Ensure no bytes outside of the modified ones get accessed as it may cause
|
||||
false valgrind reports. */
|
||||
|
||||
bytesize = (bitpos + bitsize + 7) / 8;
|
||||
oword = extract_unsigned_integer (addr, bytesize, byte_order);
|
||||
|
||||
/* Shifting for bit field depends on endianness of the target machine. */
|
||||
if (gdbarch_bits_big_endian (get_type_arch (type)))
|
||||
bitpos = sizeof (oword) * 8 - bitpos - bitsize;
|
||||
bitpos = bytesize * 8 - bitpos - bitsize;
|
||||
|
||||
oword &= ~(mask << bitpos);
|
||||
oword |= fieldval << bitpos;
|
||||
|
||||
store_unsigned_integer (addr, sizeof oword, byte_order, oword);
|
||||
store_unsigned_integer (addr, bytesize, byte_order, oword);
|
||||
}
|
||||
|
||||
/* Pack NUM into BUF using a target format of TYPE. */
|
||||
|
|
Loading…
Reference in New Issue