summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Kratochvil <jan.kratochvil@redhat.com>2010-11-16 22:13:02 +0000
committerJan Kratochvil <jan.kratochvil@redhat.com>2010-11-16 22:13:02 +0000
commit19f220c3b4954d0f9f8597d7de19b071bcf99be0 (patch)
treed210b0d084605590ef80e8e89804b3510e3f8948
parent87df528e2a286b731101643c2c485d85be60f987 (diff)
downloadbinutils-gdb-19f220c3b4954d0f9f8597d7de19b071bcf99be0.tar.gz
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.
-rw-r--r--gdb/ChangeLog8
-rw-r--r--gdb/ada-lang.c55
-rw-r--r--gdb/value.c17
3 files changed, 42 insertions, 38 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 5db1732de5c..e75bab448a7 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,13 @@
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
elements after xfree.
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index ea71ea2fa9c..76b20e747fc 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -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_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 (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 (bounds,
+ TYPE_FIELD_TYPE (desc_type, 1)),
+ fat_pntr_bounds_bitpos (desc_type),
+ fat_pntr_bounds_bitsize (desc_type));
descriptor = ensure_lval (descriptor);
diff --git a/gdb/value.c b/gdb/value.c
index 85cb62af31c..31111cf1277 100644
--- a/gdb/value.c
+++ b/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. */