From 2d88202ad431b7c4c15b89fe5fe6c12355f97842 Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Mon, 28 Sep 2009 09:16:15 +0000 Subject: [PATCH] * valops.c (value_assign): Respect parent offset when assigning to a bitfield. --- gdb/ChangeLog | 5 +++++ gdb/valops.c | 16 +++++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f68766938a4..defd90ef498 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2009-09-28 Ulrich Weigand + + * valops.c (value_assign): Respect parent offset when + assigning to a bitfield. + 2009-09-28 Hui Zhu * i386-tdep.c (i386_process_record): Remove "0x" that diff --git a/gdb/valops.c b/gdb/valops.c index b64cb21eace..012ea6a4297 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -827,6 +827,9 @@ value_assign (struct value *toval, struct value *fromval) if (value_bitsize (toval)) { + struct value *parent = value_parent (toval); + changed_addr = value_address (parent) + value_offset (toval); + changed_len = (value_bitpos (toval) + value_bitsize (toval) + HOST_CHAR_BIT - 1) @@ -838,17 +841,16 @@ value_assign (struct value *toval, struct value *fromval) registers. */ if (changed_len < TYPE_LENGTH (type) && TYPE_LENGTH (type) <= (int) sizeof (LONGEST) - && ((LONGEST) value_address (toval) % TYPE_LENGTH (type)) == 0) + && ((LONGEST) changed_addr % TYPE_LENGTH (type)) == 0) changed_len = TYPE_LENGTH (type); if (changed_len > (int) sizeof (LONGEST)) error (_("Can't handle bitfields which don't fit in a %d bit word."), (int) sizeof (LONGEST) * HOST_CHAR_BIT); - read_memory (value_address (toval), buffer, changed_len); + read_memory (changed_addr, buffer, changed_len); modify_field (type, buffer, value_as_long (fromval), value_bitpos (toval), value_bitsize (toval)); - changed_addr = value_address (toval); dest_buffer = buffer; } else @@ -891,6 +893,8 @@ value_assign (struct value *toval, struct value *fromval) { if (value_bitsize (toval)) { + struct value *parent = value_parent (toval); + int offset = value_offset (parent) + value_offset (toval); int changed_len; gdb_byte buffer[sizeof (LONGEST)]; @@ -903,15 +907,13 @@ value_assign (struct value *toval, struct value *fromval) error (_("Can't handle bitfields which don't fit in a %d bit word."), (int) sizeof (LONGEST) * HOST_CHAR_BIT); - get_frame_register_bytes (frame, value_reg, - value_offset (toval), + get_frame_register_bytes (frame, value_reg, offset, changed_len, buffer); modify_field (type, buffer, value_as_long (fromval), value_bitpos (toval), value_bitsize (toval)); - put_frame_register_bytes (frame, value_reg, - value_offset (toval), + put_frame_register_bytes (frame, value_reg, offset, changed_len, buffer); } else -- 2.30.2