1 From a50c11a7a47b26e6a3e095dfb72aa2e465919fb6 Mon Sep 17 00:00:00 2001
2 From: Nick Clifton <nickc@redhat.com>
3 Date: Fri, 5 Mar 2021 17:06:59 +0000
4 Subject: [PATCH] Add support for the DW_FORM_strx* forms to the BFD library.
7 * dwarf2.c (is_str_attr): Add DW_FORM_strx* forms.
8 (read_indexed_string): Placeholder function.
9 (read_attribute_value): Handle DW_FORM_strx* and DW_FORM_addrx*
12 Upstream-Status: Backport [https://sourceware.org/bugzilla/show_bug.cgi?id=27521]
13 Signed-off-by: Khem Raj <raj.khem@gmail.com>
15 bfd/dwarf2.c | 105 ++++++++++++++++++++++++++++++++-------------------
16 1 file changed, 67 insertions(+), 38 deletions(-)
18 diff --git a/bfd/dwarf2.c b/bfd/dwarf2.c
19 index 5651696c0f7..5ffcd93f54c 100644
22 @@ -1160,8 +1160,23 @@ read_abbrevs (bfd *abfd, bfd_uint64_t offset, struct dwarf2_debug *stash,
23 static inline bfd_boolean
24 is_str_attr (enum dwarf_form form)
26 - return (form == DW_FORM_string || form == DW_FORM_strp
27 - || form == DW_FORM_line_strp || form == DW_FORM_GNU_strp_alt);
28 + return (form == DW_FORM_string
29 + || form == DW_FORM_strp
30 + || form == DW_FORM_strx
31 + || form == DW_FORM_strx1
32 + || form == DW_FORM_strx2
33 + || form == DW_FORM_strx3
34 + || form == DW_FORM_strx4
35 + || form == DW_FORM_line_strp
36 + || form == DW_FORM_GNU_strp_alt);
40 +read_indexed_string (bfd_uint64_t index ATTRIBUTE_UNUSED,
41 + struct comp_unit * unit ATTRIBUTE_UNUSED)
43 + /* FIXME: Add support for indexed strings. */
44 + return "<indexed strings not yet supported>";
47 /* Read and fill in the value of attribute ATTR as described by FORM.
48 @@ -1192,6 +1207,9 @@ read_attribute_value (struct attribute * attr,
52 + case DW_FORM_flag_present:
55 case DW_FORM_ref_addr:
56 /* DW_FORM_ref_addr is an address in DWARF2, and an offset in
58 @@ -1237,15 +1255,32 @@ read_attribute_value (struct attribute * attr,
59 info_ptr = read_n_bytes (info_ptr, info_ptr_end, blk);
65 + case DW_FORM_addrx1:
66 + attr->u.val = read_1_byte (abfd, info_ptr, info_ptr_end);
71 attr->u.val = read_2_bytes (abfd, info_ptr, info_ptr_end);
74 + case DW_FORM_addrx3:
75 + attr->u.val = read_4_bytes (abfd, info_ptr, info_ptr_end);
76 + attr->u.val &= 0xffffff;
81 + case DW_FORM_addrx4:
82 attr->u.val = read_4_bytes (abfd, info_ptr, info_ptr_end);
87 + case DW_FORM_ref_sig8:
88 attr->u.val = read_8_bytes (abfd, info_ptr, info_ptr_end);
91 @@ -1265,6 +1300,33 @@ read_attribute_value (struct attribute * attr,
92 attr->u.str = read_alt_indirect_string (unit, info_ptr, info_ptr_end, &bytes_read);
93 info_ptr += bytes_read;
96 + attr->u.val = read_1_byte (abfd, info_ptr, info_ptr_end);
98 + attr->u.str = (char *) read_indexed_string (attr->u.val, unit);
100 + case DW_FORM_strx2:
101 + attr->u.val = read_2_bytes (abfd, info_ptr, info_ptr_end);
103 + attr->u.str = (char *) read_indexed_string (attr->u.val, unit);
105 + case DW_FORM_strx3:
106 + attr->u.val = read_4_bytes (abfd, info_ptr, info_ptr_end);
108 + attr->u.val &= 0xffffff;
109 + attr->u.str = (char *) read_indexed_string (attr->u.val, unit);
111 + case DW_FORM_strx4:
112 + attr->u.val = read_4_bytes (abfd, info_ptr, info_ptr_end);
114 + attr->u.str = (char *) read_indexed_string (attr->u.val, unit);
117 + attr->u.val = _bfd_safe_read_leb128 (abfd, info_ptr, &bytes_read,
118 + FALSE, info_ptr_end);
119 + info_ptr += bytes_read;
120 + attr->u.str = (char *) read_indexed_string (attr->u.val, unit);
122 case DW_FORM_exprloc:
124 amt = sizeof (struct dwarf_block);
125 @@ -1287,48 +1349,14 @@ read_attribute_value (struct attribute * attr,
126 info_ptr = read_n_bytes (info_ptr, info_ptr_end, blk);
129 - case DW_FORM_data1:
130 - attr->u.val = read_1_byte (abfd, info_ptr, info_ptr_end);
134 - attr->u.val = read_1_byte (abfd, info_ptr, info_ptr_end);
137 - case DW_FORM_flag_present:
141 attr->u.sval = _bfd_safe_read_leb128 (abfd, info_ptr, &bytes_read,
143 info_ptr += bytes_read;
145 - case DW_FORM_udata:
146 - attr->u.val = _bfd_safe_read_leb128 (abfd, info_ptr, &bytes_read,
147 - FALSE, info_ptr_end);
148 - info_ptr += bytes_read;
151 - attr->u.val = read_1_byte (abfd, info_ptr, info_ptr_end);
155 - attr->u.val = read_2_bytes (abfd, info_ptr, info_ptr_end);
159 - attr->u.val = read_4_bytes (abfd, info_ptr, info_ptr_end);
163 - attr->u.val = read_8_bytes (abfd, info_ptr, info_ptr_end);
166 - case DW_FORM_ref_sig8:
167 - attr->u.val = read_8_bytes (abfd, info_ptr, info_ptr_end);
170 case DW_FORM_ref_udata:
171 + case DW_FORM_udata:
172 + case DW_FORM_addrx:
173 attr->u.val = _bfd_safe_read_leb128 (abfd, info_ptr, &bytes_read,
174 FALSE, info_ptr_end);
175 info_ptr += bytes_read;
176 @@ -1361,6 +1389,7 @@ read_attribute_value (struct attribute * attr,
177 info_ptr = read_n_bytes (info_ptr, info_ptr_end, blk);
182 _bfd_error_handler (_("DWARF error: invalid or unhandled FORM value: %#x"),