[ELF] Improve undefined symbol message w/ DW_TAG_variable of the enclosing symbol...
commitb169e7feddce44dd48cf76018860f2168e1e8d0f
authorFangrui Song <i@maskray.me>
Fri, 3 Nov 2023 20:53:36 +0000 (3 13:53 -0700)
committerGitHub <noreply@github.com>
Fri, 3 Nov 2023 20:53:36 +0000 (3 13:53 -0700)
tree2a9b3bbdf52292fc94101105acf2c5467dcd6c54
parent888742a12119b46190642ce521367e0531196e3b
[ELF] Improve undefined symbol message w/ DW_TAG_variable of the enclosing symbol but w/o line number information (#70854)

The undefined symbol message suggests the source line when line number
information is available (see https://reviews.llvm.org/D31481).
When the undefined symbol is from a global variable, we won't get the
line information.
```
extern int undef;
namespace ns {
int *var[] = {
  &undef
};
// DW_TAG_variable(DW_AT_decl_file/DW_AT_decl_line) is available while
// line number information is unavailable.
}

ld.lld: error: undefined symbol: undef
>>> referenced by undef-debug2.cc
>>>               undef-debug2.o:(ns::var)
```

This patch utilizes `getEnclosingSymbol` to locate `var` and find
DW_TAG_variable for `var`:
```
ld.lld: error: undefined symbol: undef
>>> referenced by undef-debug2.cc:3 (/tmp/c/undef-debug2.cc:3)
>>>               undef-debug2.o:(ns::var)
```
lld/ELF/Relocations.cpp
lld/test/ELF/Inputs/undef-debug.s
lld/test/ELF/Inputs/undef-debug2.s [new file with mode: 0644]
lld/test/ELF/undef.s