> Due to the different interfaces of int_size_in_bytes and
> simple_type_size_in_bits (and 'size' in add_byte_size_attribute being
> unsigned and not [unsigned] HWI) it would be cleaner to
> add an early return after the call to int_size_in_bytes if its
> return value is -1 (and make sure the return value doesn't
> overflow an unsigned int - likewise for simple_type_size_in_bits,
> not sure why that case doesn't use int_size_in_bytes as well ...)?
Both calls are present in the first version of the function, but I agree that
the discrepancy looks strange.
Revised version attached, tested {GCC,GDB} on x86_64-suse-linux.
2013-11-11 Eric Botcazou <ebotca...@adacore.com>
PR ada/35998
* dwarf2out.c (add_byte_size_attribute): Use int_size_in_bytes also
for fields. Do not add the attribute if the size is negative.
--
Eric Botcazou
Index: dwarf2out.c
===================================================================
--- dwarf2out.c (revision 204444)
+++ dwarf2out.c (working copy)
@@ -16319,11 +16319,13 @@ add_subscript_info (dw_die_ref type_die,
}
}
+/* Add a DW_AT_byte_size attribute to DIE with TREE_NODE's size. */
+
static void
add_byte_size_attribute (dw_die_ref die, tree tree_node)
{
dw_die_ref decl_die;
- unsigned size;
+ HOST_WIDE_INT size;
switch (TREE_CODE (tree_node))
{
@@ -16347,7 +16349,7 @@ add_byte_size_attribute (dw_die_ref die,
generally given as the number of bytes normally allocated for an
object of the *declared* type of the member itself. This is true
even for bit-fields. */
- size = simple_type_size_in_bits (field_type (tree_node)) / BITS_PER_UNIT;
+ size = int_size_in_bytes (field_type (tree_node));
break;
default:
gcc_unreachable ();
@@ -16356,8 +16358,9 @@ add_byte_size_attribute (dw_die_ref die,
/* Note that `size' might be -1 when we get to this point. If it is, that
indicates that the byte size of the entity in question is variable. We
have no good way of expressing this fact in Dwarf at the present time,
- so just let the -1 pass on through. */
- add_AT_unsigned (die, DW_AT_byte_size, size);
+ when location description was not used by the caller code instead. */
+ if (size >= 0)
+ add_AT_unsigned (die, DW_AT_byte_size, size);
}
/* For a FIELD_DECL node which represents a bit-field, output an attribute