1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 02:52:53 +02:00

[dsymutil] Relocate DW_TAG_label

dsymutil is not relocating the DW_AT_low_pc for a DW_TAG_label. This
patch fixes that and adds a test.

Differential revision: https://reviews.llvm.org/D99534
This commit is contained in:
Jonas Devlieghere 2021-03-29 12:35:17 -07:00
parent 905dd0e95b
commit de3fec33a9
4 changed files with 24 additions and 2 deletions

View File

@ -1088,7 +1088,8 @@ unsigned DWARFLinker::DIECloner::cloneAddressAttribute(
if (AttrSpec.Attr == dwarf::DW_AT_low_pc) {
if (Die.getTag() == dwarf::DW_TAG_inlined_subroutine ||
Die.getTag() == dwarf::DW_TAG_lexical_block)
Die.getTag() == dwarf::DW_TAG_lexical_block ||
Die.getTag() == dwarf::DW_TAG_label) {
// The low_pc of a block or inline subroutine might get
// relocated because it happens to match the low_pc of the
// enclosing subprogram. To prevent issues with that, always use
@ -1097,7 +1098,7 @@ unsigned DWARFLinker::DIECloner::cloneAddressAttribute(
? Info.OrigLowPc
: Addr) +
Info.PCOffset;
else if (Die.getTag() == dwarf::DW_TAG_compile_unit) {
} else if (Die.getTag() == dwarf::DW_TAG_compile_unit) {
Addr = Unit.getLowPc();
if (Addr == std::numeric_limits<uint64_t>::max())
return 0;

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,21 @@
$ cat label.c
int main(int argc, char **argv) {
if (argc) {
goto foobar;
}
return 1;
foobar:
return 0;
}
$ clang -g label.c -c -o label.o
$ clang label.o -o label.out
RUN: dsymutil -oso-prepend-path %p/../Inputs %p/../Inputs/private/tmp/label/label.out -o %t.dSYM
RUN: dwarfdump %t.dSYM | FileCheck %s
CHECK: DW_TAG_label
CHECK-NEXT: DW_AT_name ("foobar")
CHECK-NEXT: DW_AT_decl_file ("/tmp/label/label.c")
CHECK-NEXT: DW_AT_decl_line (6)
CHECK-NEXT: DW_AT_low_pc (0x0000000100003f9d)