This is the mail archive of the
mailing list for the GCC project.
[PATCH] Fix wrong offset in DWARF
- From: Eric Botcazou <ebotcazou at adacore dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Fri, 17 Apr 2009 21:46:28 +0200
- Subject: [PATCH] Fix wrong offset in DWARF
when a field has a non-constant size (this of course can happen in Ada :-),
simple_type_size_in_bits returns the alignment in bits but field_byte_offset
picks BITS_PER_WORD for the field size; so a field with non-constant size at
offset 0 with 16-bit alignment is wrongly output at offset 2.
Fixed by using simple_type_size_in_bits for the field size in this case.
Tested (GCC, GDB) on i586-suse-linux, OK for mainline?
2009-04-17 Eric Botcazou <email@example.com>
* dwarf2out.c (field_byte_offset): Use the type size as the field size
if the latter is not constant.
--- dwarf2out.c (revision 146259)
+++ dwarf2out.c (working copy)
@@ -10900,21 +10900,22 @@ field_byte_offset (const_tree decl)
unsigned HOST_WIDE_INT type_size_in_bits;
type = field_type (decl);
+ type_size_in_bits = simple_type_size_in_bits (type);
+ type_align_in_bits = simple_type_align_in_bits (type);
field_size_tree = DECL_SIZE (decl);
/* The size could be unspecified if there was an error, or for
a flexible array member. */
- if (! field_size_tree)
+ if (!field_size_tree)
field_size_tree = bitsize_zero_node;
- /* If we don't know the size of the field, pretend it's a full word. */
+ /* If the size of the field is not constant, use the type size. */
if (host_integerp (field_size_tree, 1))
field_size_in_bits = tree_low_cst (field_size_tree, 1);
- field_size_in_bits = BITS_PER_WORD;
+ field_size_in_bits = type_size_in_bits;
- type_size_in_bits = simple_type_size_in_bits (type);
- type_align_in_bits = simple_type_align_in_bits (type);
decl_align_in_bits = simple_decl_align_in_bits (decl);
/* The GCC front-end doesn't make any attempt to keep track of the