diff options
author | Jim Wilson <wilson@gcc.gnu.org> | 1997-06-24 12:35:11 -0700 |
---|---|---|
committer | Jim Wilson <wilson@gcc.gnu.org> | 1997-06-24 12:35:11 -0700 |
commit | d5042f7babffdc94208d976598ec6491403510b7 (patch) | |
tree | 950b659c8abdd07a608c5f680262f96250956506 /gcc/dwarfout.c | |
parent | c4eec1924130f98fe935b09833096f20b6687842 (diff) | |
download | gcc-d5042f7babffdc94208d976598ec6491403510b7.zip gcc-d5042f7babffdc94208d976598ec6491403510b7.tar.gz gcc-d5042f7babffdc94208d976598ec6491403510b7.tar.bz2 |
(field_byte_offset): Check for object_offset_in_bits
> bitpos_int, and recompute object_offset_in_bytes if true.
From-SVN: r14299
Diffstat (limited to 'gcc/dwarfout.c')
-rw-r--r-- | gcc/dwarfout.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/gcc/dwarfout.c b/gcc/dwarfout.c index f91cccb..c9457f5 100644 --- a/gcc/dwarfout.c +++ b/gcc/dwarfout.c @@ -2067,6 +2067,25 @@ field_byte_offset (decl) /* Compute the offset of the containing object in bytes. */ object_offset_in_bytes = object_offset_in_align_units * type_align_in_bytes; + /* The above code assumes that the field does not cross an alignment + boundary. This can happen if PCC_BITFIELD_TYPE_MATTERS is not defined, + or if the structure is packed. If this happens, then we get an object + which starts after the bitfield, which means that the bit offset is + negative. Gdb fails when given negative bit offsets. We avoid this + by recomputing using the first bit of the bitfield. This will give + us an object which does not completely contain the bitfield, but it + will be aligned, and it will contain the first bit of the bitfield. */ + if (object_offset_in_bits > bitpos_int) + { + deepest_bitpos = bitpos_int + 1; + object_offset_in_bits + = ceiling (deepest_bitpos, type_align_in_bits) - type_size_in_bits; + object_offset_in_align_units = (object_offset_in_bits + / type_align_in_bits); + object_offset_in_bytes = (object_offset_in_align_units + * type_align_in_bytes); + } + return object_offset_in_bytes; } |