Skip to content

Commit

Permalink
dwarf: use find_abstract_instance for vars and DW_AT_specification
Browse files Browse the repository at this point in the history
The following simple test case fails when dwz is used:

$ cat demo.C
namespace std {
  enum { _S_fixed, _S_floatfield = _S_fixed };
  struct {
    struct {};
  }
  __ioinit;
}

int main() {
  return 0;
}

$ g++ demo.C -g && cp a.out b.out && dwz -m xxx.so a.out b.out && objdump -S a.out >/dev/null
objdump: DWARF error: could not find variable specification at offset 0x3d3

As seen the reference is defined in xxx.so shared part:

$ eu-readelf -w -N a.out | grep -A3 -B3 3d3
             decl_column          (data1) 11
             sibling              (ref_udata) [   387]
 [   387]    variable             abbrev: 30
             specification        (GNU_ref_alt) [   3d3]
             location             (exprloc)
              [ 0] addr 0x404019
 [   396]    subprogram           abbrev: 32

$ eu-readelf -w -N a.out | less

...

 Compilation unit at offset 920:
 Version: 5, Abbreviation section offset: 0, Address size: 8, Offset size: 4
 Unit type: partial (3)
...
 [   3d3]      variable             abbrev: 31
               name                 (strp) "__ioinit"
               decl_file            (data1) demo.C (10)
               decl_line            (data1) 6
               decl_column          (data1) 3
               type                 (ref_udata) [   3c4]
               declaration          (flag_present) yes

With the patch the same output is emitted as before usage of dwz.

bfd/ChangeLog:

	PR 29442
	* dwarf2.c (struct varinfo): Use const char * type.
	(scan_unit_for_symbols): Call find_abstract_instance for
	DW_AT_specification for variables that can be in a different CU
	(e.g. done by dwz)
  • Loading branch information
marxin committed Aug 8, 2022
1 parent d7872eb commit 06ce017
Showing 1 changed file with 7 additions and 15 deletions.
22 changes: 7 additions & 15 deletions bfd/dwarf2.c
Original file line number Diff line number Diff line change
Expand Up @@ -1801,7 +1801,7 @@ struct varinfo
/* The type of this variable. */
int tag;
/* The name of the variable, if it has one. */
char *name;
const char *name;
/* The address of the variable. */
bfd_vma addr;
/* Where the symbol is defined. */
Expand Down Expand Up @@ -4094,27 +4094,19 @@ scan_unit_for_symbols (struct comp_unit *unit)
case DW_AT_specification:
if (is_int_form (&attr) && attr.u.val)
{
struct varinfo * spec_var;

spec_var = lookup_var_by_offset (attr.u.val,
unit->variable_table);
if (spec_var == NULL)
bool is_linkage;
if (!find_abstract_instance (unit, &attr, 0,
&var->name,
&is_linkage,
&var->file,
&var->line))
{
_bfd_error_handler (_("DWARF error: could not find "
"variable specification "
"at offset 0x%lx"),
(unsigned long) attr.u.val);
break;
}

if (var->name == NULL)
var->name = spec_var->name;
if (var->file == NULL && spec_var->file != NULL)
var->file = strdup (spec_var->file);
if (var->line == 0)
var->line = spec_var->line;
if (var->sec == NULL)
var->sec = spec_var->sec;
}
break;

Expand Down

0 comments on commit 06ce017

Please sign in to comment.