* dwarf2read.c (dwarf2_add_field): Correctly scale all byte
offsets obtained from DW_AT_data_member_location before recording them in FIELD_BITPOS (*fp). * dwarf2read.c (attr_form_is_section_offset): Doc fixes.
This commit is contained in:
parent
9544c605b6
commit
c6a0999f0f
|
@ -1,3 +1,11 @@
|
||||||
|
2007-12-17 Jim Blandy <jimb@codesourcery.com>
|
||||||
|
|
||||||
|
* dwarf2read.c (dwarf2_add_field): Correctly scale all byte
|
||||||
|
offsets obtained from DW_AT_data_member_location before recording
|
||||||
|
them in FIELD_BITPOS (*fp).
|
||||||
|
|
||||||
|
* dwarf2read.c (attr_form_is_section_offset): Doc fixes.
|
||||||
|
|
||||||
2007-12-17 Nigel Stephens <nigel@mips.com>
|
2007-12-17 Nigel Stephens <nigel@mips.com>
|
||||||
Maciej W. Rozycki <macro@mips.com>
|
Maciej W. Rozycki <macro@mips.com>
|
||||||
|
|
||||||
|
|
|
@ -3478,16 +3478,19 @@ dwarf2_add_field (struct field_info *fip, struct die_info *die,
|
||||||
attr = dwarf2_attr (die, DW_AT_data_member_location, cu);
|
attr = dwarf2_attr (die, DW_AT_data_member_location, cu);
|
||||||
if (attr)
|
if (attr)
|
||||||
{
|
{
|
||||||
|
int byte_offset;
|
||||||
|
|
||||||
if (attr_form_is_section_offset (attr))
|
if (attr_form_is_section_offset (attr))
|
||||||
{
|
{
|
||||||
dwarf2_complex_location_expr_complaint ();
|
dwarf2_complex_location_expr_complaint ();
|
||||||
FIELD_BITPOS (*fp) = 0;
|
byte_offset = 0;
|
||||||
}
|
}
|
||||||
else if (attr_form_is_constant (attr))
|
else if (attr_form_is_constant (attr))
|
||||||
FIELD_BITPOS (*fp) = dwarf2_get_attr_constant_value (attr, 0);
|
byte_offset = dwarf2_get_attr_constant_value (attr, 0);
|
||||||
else
|
else
|
||||||
FIELD_BITPOS (*fp) =
|
byte_offset = decode_locdesc (DW_BLOCK (attr), cu);
|
||||||
decode_locdesc (DW_BLOCK (attr), cu) * bits_per_byte;
|
|
||||||
|
FIELD_BITPOS (*fp) = byte_offset * bits_per_byte;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
FIELD_BITPOS (*fp) = 0;
|
FIELD_BITPOS (*fp) = 0;
|
||||||
|
@ -9734,9 +9737,14 @@ attr_form_is_block (struct attribute *attr)
|
||||||
|| attr->form == DW_FORM_block);
|
|| attr->form == DW_FORM_block);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return non-zero if ATTR's value is a section offset (classes
|
/* Return non-zero if ATTR's value is a section offset --- classes
|
||||||
lineptr, loclistptr, macptr or rangelistptr). In this case,
|
lineptr, loclistptr, macptr or rangelistptr --- or zero, otherwise.
|
||||||
you may use DW_UNSND (attr) to retrieve the offset. */
|
You may use DW_UNSND (attr) to retrieve such offsets.
|
||||||
|
|
||||||
|
Section 7.5.4, "Attribute Encodings", explains that no attribute
|
||||||
|
may have a value that belongs to more than one of these classes; it
|
||||||
|
would be ambiguous if we did, because we use the same forms for all
|
||||||
|
of them. */
|
||||||
static int
|
static int
|
||||||
attr_form_is_section_offset (struct attribute *attr)
|
attr_form_is_section_offset (struct attribute *attr)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue