diff options
author | Mark Wielaard <mark@klomp.org> | 2017-11-02 16:24:17 +0100 |
---|---|---|
committer | Mark Wielaard <mark@klomp.org> | 2017-11-10 16:36:01 +0100 |
commit | 7286e5c5de53840126b4046a46442872a3b00692 (patch) | |
tree | bd00b5129ae632a9cc211cf953f3bab5a209eb85 /libdw/dwarf_getlocation.c | |
parent | e23c71330c3b332d19fdf9e48ca8b03680d9ad34 (diff) |
libdw: Update acceptable forms and attributes for dwarf_getlocation.
dwarf_getlocation has to know which attributes can contain a DWARF
expression or location list because the form alone might be ambiguous.
Since DWARF4 there is DW_FORM_exprloc so always accept that. But for older
DWARF or location lists we cannot just check for DW_FORM_sec_offset since
that could be a reference to diffent kinds of sections (based on attribute).
Update the attribute list based on the latest DWARF5 encodings table.
Note that DW_AT_call_origin wasn't added because that seems to be a
typo in the DWARF5 spec. http://dwarfstd.org/ShowIssue.php?issue=171103.1
Signed-off-by: Mark Wielaard <mark@klomp.org>
Diffstat (limited to 'libdw/dwarf_getlocation.c')
-rw-r--r-- | libdw/dwarf_getlocation.c | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/libdw/dwarf_getlocation.c b/libdw/dwarf_getlocation.c index a4a2761e..c59546e0 100644 --- a/libdw/dwarf_getlocation.c +++ b/libdw/dwarf_getlocation.c @@ -45,10 +45,34 @@ attr_ok (Dwarf_Attribute *attr) if (attr == NULL) return false; - /* Must be one of the attributes listed below. */ + /* If it is an exprloc, it is obviously OK. */ + if (dwarf_whatform (attr) == DW_FORM_exprloc) + return true; + + /* Otherwise must be one of the attributes listed below. Older + DWARF versions might have encoded the exprloc as block, and we + cannot easily distinquish attributes in the loclist class because + the same forms are used for different classes. */ switch (attr->code) { case DW_AT_location: + case DW_AT_byte_size: + case DW_AT_bit_offset: + case DW_AT_bit_size: + case DW_AT_lower_bound: + case DW_AT_bit_stride: + case DW_AT_upper_bound: + case DW_AT_count: + case DW_AT_allocated: + case DW_AT_associated: + case DW_AT_data_location: + case DW_AT_byte_stride: + case DW_AT_rank: + case DW_AT_call_value: + case DW_AT_call_target: + case DW_AT_call_target_clobbered: + case DW_AT_call_data_location: + case DW_AT_call_data_value: case DW_AT_data_member_location: case DW_AT_vtable_elem_location: case DW_AT_string_length: |