diff options
author | Peter Schauer <Peter.Schauer@mytum.de> | 1997-08-09 08:51:41 +0000 |
---|---|---|
committer | Peter Schauer <Peter.Schauer@mytum.de> | 1997-08-09 08:51:41 +0000 |
commit | 93e7a07fd7570202058c8d069059f42934370db4 (patch) | |
tree | 53fba10d7db0cbc8cee3e385ee021fabd466cc5f /gdb/values.c | |
parent | 0485d3df519ed4113c8829f67898c474efc5bb78 (diff) | |
download | gdb-93e7a07fd7570202058c8d069059f42934370db4.zip gdb-93e7a07fd7570202058c8d069059f42934370db4.tar.gz gdb-93e7a07fd7570202058c8d069059f42934370db4.tar.bz2 |
* values.c (value_primitive_field): Account for offset when
extracting the value of a bitfield.
From Paul Hilfinger <hilfingr@CS.Berkeley.EDU>.
Diffstat (limited to 'gdb/values.c')
-rw-r--r-- | gdb/values.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/gdb/values.c b/gdb/values.c index 6f631ac..0ffd5a6 100644 --- a/gdb/values.c +++ b/gdb/values.c @@ -1,5 +1,5 @@ /* Low level packing and unpacking of values for GDB, the GNU Debugger. - Copyright 1986, 1987, 1989, 1991, 1993, 1994, 1995, 1996 + Copyright 1986, 1987, 1989, 1991, 1993, 1994, 1995, 1996, 1997 Free Software Foundation, Inc. This file is part of GDB. @@ -761,13 +761,13 @@ value_primitive_field (arg1, offset, fieldno, arg_type) /* Handle packed fields */ - offset += TYPE_FIELD_BITPOS (arg_type, fieldno) / 8; if (TYPE_FIELD_BITSIZE (arg_type, fieldno)) { v = value_from_longest (type, - unpack_field_as_long (arg_type, - VALUE_CONTENTS (arg1), - fieldno)); + unpack_field_as_long (arg_type, + VALUE_CONTENTS (arg1) + + offset, + fieldno)); VALUE_BITPOS (v) = TYPE_FIELD_BITPOS (arg_type, fieldno) % 8; VALUE_BITSIZE (v) = TYPE_FIELD_BITSIZE (arg_type, fieldno); } @@ -777,14 +777,17 @@ value_primitive_field (arg1, offset, fieldno, arg_type) if (VALUE_LAZY (arg1)) VALUE_LAZY (v) = 1; else - memcpy (VALUE_CONTENTS_RAW (v), VALUE_CONTENTS_RAW (arg1) + offset, + memcpy (VALUE_CONTENTS_RAW (v), + VALUE_CONTENTS_RAW (arg1) + offset + + TYPE_FIELD_BITPOS (arg_type, fieldno) / 8, TYPE_LENGTH (type)); } VALUE_LVAL (v) = VALUE_LVAL (arg1); if (VALUE_LVAL (arg1) == lval_internalvar) VALUE_LVAL (v) = lval_internalvar_component; VALUE_ADDRESS (v) = VALUE_ADDRESS (arg1); - VALUE_OFFSET (v) = offset + VALUE_OFFSET (arg1); + VALUE_OFFSET (v) = VALUE_OFFSET (arg1) + offset + + TYPE_FIELD_BITPOS (arg_type, fieldno) / 8; return v; } |