Index: llvm/lib/DWARFLinker/DWARFLinker.cpp =================================================================== --- llvm/lib/DWARFLinker/DWARFLinker.cpp +++ llvm/lib/DWARFLinker/DWARFLinker.cpp @@ -1088,7 +1088,8 @@ 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 @@ ? 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::max()) return 0; Index: llvm/test/tools/dsymutil/X86/label2.test =================================================================== --- /dev/null +++ llvm/test/tools/dsymutil/X86/label2.test @@ -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)