summaryrefslogtreecommitdiff
path: root/libbacktrace
diff options
context:
space:
mode:
authorTom de Vries <tdevries@suse.de>2019-01-17 13:42:20 +0000
committerTom de Vries <vries@gcc.gnu.org>2019-01-17 13:42:20 +0000
commit1c2a9a37c681aa24ece35b671931870b1afe5797 (patch)
tree4b2be38998bc9b1b8ba93ff07ea35b71da40244b /libbacktrace
parent9d576782a29581c04c60d7b9415bb7d3014b0c8c (diff)
[libbacktrace] Handle DW_FORM_GNU_ref_alt
Handle DW_FORM_GNU_ref_alt which references the .debug_info section in the .gnu_debugaltlink file. 2019-01-17 Tom de Vries <tdevries@suse.de> PR libbacktrace/82857 * dwarf.c (enum attr_val_encoding): Add ATTR_VAL_REF_ALT_INFO. (read_attribute): Handle DW_FORM_GNU_ref_alt using ATTR_VAL_REF_ALT_INFO. (read_referenced_name_from_attr): Handle DW_FORM_GNU_ref_alt. From-SVN: r268031
Diffstat (limited to 'libbacktrace')
-rw-r--r--libbacktrace/ChangeLog8
-rw-r--r--libbacktrace/dwarf.c17
2 files changed, 24 insertions, 1 deletions
diff --git a/libbacktrace/ChangeLog b/libbacktrace/ChangeLog
index 1fd307bf512..191bfa3cac3 100644
--- a/libbacktrace/ChangeLog
+++ b/libbacktrace/ChangeLog
@@ -1,5 +1,13 @@
2019-01-17 Tom de Vries <tdevries@suse.de>
+ PR libbacktrace/82857
+ * dwarf.c (enum attr_val_encoding): Add ATTR_VAL_REF_ALT_INFO.
+ (read_attribute): Handle DW_FORM_GNU_ref_alt using
+ ATTR_VAL_REF_ALT_INFO.
+ (read_referenced_name_from_attr): Handle DW_FORM_GNU_ref_alt.
+
+2019-01-17 Tom de Vries <tdevries@suse.de>
+
* dwarf.c (struct unit): Add low_offset and high_offset fields.
(struct unit_vector): New type.
(struct dwarf_data): Add units and units_counts fields.
diff --git a/libbacktrace/dwarf.c b/libbacktrace/dwarf.c
index 6f56c46774b..aacbd3a453d 100644
--- a/libbacktrace/dwarf.c
+++ b/libbacktrace/dwarf.c
@@ -143,6 +143,8 @@ enum attr_val_encoding
ATTR_VAL_REF_UNIT,
/* An offset to other data within the .dwarf_info section. */
ATTR_VAL_REF_INFO,
+ /* An offset to other data within the alt .dwarf_info section. */
+ ATTR_VAL_REF_ALT_INFO,
/* An offset to data in some other section. */
ATTR_VAL_REF_SECTION,
/* A type signature. */
@@ -858,7 +860,7 @@ read_attribute (enum dwarf_form form, struct dwarf_buf *buf,
val->encoding = ATTR_VAL_NONE;
return 1;
}
- val->encoding = ATTR_VAL_REF_SECTION;
+ val->encoding = ATTR_VAL_REF_ALT_INFO;
return 1;
case DW_FORM_GNU_strp_alt:
{
@@ -2200,6 +2202,19 @@ read_referenced_name_from_attr (struct dwarf_data *ddata, struct unit *u,
|| val->encoding == ATTR_VAL_REF_UNIT)
return read_referenced_name (ddata, u, val->u.uint, error_callback, data);
+ if (val->encoding == ATTR_VAL_REF_ALT_INFO)
+ {
+ struct unit *alt_unit
+ = find_unit (ddata->altlink->units, ddata->altlink->units_count,
+ val->u.uint);
+ if (alt_unit == NULL)
+ return NULL;
+
+ uint64_t offset = val->u.uint - alt_unit->low_offset;
+ return read_referenced_name (ddata->altlink, alt_unit, offset,
+ error_callback, data);
+ }
+
return NULL;
}