diff --git a/llvm/lib/DWARFLinker/DWARFLinker.cpp b/llvm/lib/DWARFLinker/DWARFLinker.cpp --- a/llvm/lib/DWARFLinker/DWARFLinker.cpp +++ b/llvm/lib/DWARFLinker/DWARFLinker.cpp @@ -1109,7 +1109,9 @@ if (Form == dwarf::DW_FORM_addrx) { if (Optional AddrOffsetSectionBase = Unit.getOrigUnit().getAddrOffsetSectionBase()) { - uint64_t StartOffset = *AddrOffsetSectionBase + Val.getRawUValue(); + uint64_t StartOffset = + *AddrOffsetSectionBase + + Val.getRawUValue() * Unit.getOrigUnit().getAddressByteSize(); uint64_t EndOffset = StartOffset + Unit.getOrigUnit().getAddressByteSize(); if (llvm::Expected RelocAddr = @@ -1120,7 +1122,8 @@ } else Linker.reportWarning("no base offset for address table", ObjFile); - // If this is an indexed address emit the debug_info address. + // Generation of DWARFv5 .debug_addr table is not supported yet. + // Convert attribute into the dwarf::DW_FORM_addr. Form = dwarf::DW_FORM_addr; } else Addr = *Val.getAsAddress(); diff --git a/llvm/test/tools/dsymutil/Inputs/private/tmp/dwarf5/dwarf5-addrx.o b/llvm/test/tools/dsymutil/Inputs/private/tmp/dwarf5/dwarf5-addrx.o new file mode 100644 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@&1 | FileCheck %s --allow-empty +RUN: llvm-dwarfdump --verify %t.dSYM 2>&1 | FileCheck %s +CHECK-NOT: error: + +RUN: llvm-dwarfdump --verbose %t.dSYM | FileCheck %s --check-prefix DWARF +DWARF: DW_TAG_compile_unit +DWARF: DW_AT_name [DW_FORM_strp] {{.*}} "dwarf5-addrx.c" +DWARF: DW_AT_low_pc [DW_FORM_addr] (0x0000000100000eb0) +DWARF: DW_AT_high_pc [DW_FORM_data4] (0x00000103) +DWARF: DW_AT_addr_base [DW_FORM_sec_offset] (0x00000008) +DWARF: DW_TAG_subprogram +DWARF: DW_AT_low_pc [DW_FORM_addr] (0x0000000100000eb0) +DWARF: DW_AT_high_pc [DW_FORM_data4] (0x00000010) +DWARF: DW_AT_name [DW_FORM_strp] {{.*}} "foo1" +DWARF: DW_TAG_subprogram +DWARF: DW_AT_low_pc [DW_FORM_addr] (0x0000000100000ec0) +DWARF: DW_AT_high_pc [DW_FORM_data4] (0x00000010) +DWARF: DW_AT_name [DW_FORM_strp] {{.*}} "foo2" +DWARF: DW_TAG_subprogram +DWARF: DW_AT_low_pc [DW_FORM_addr] (0x0000000100000ed0) +DWARF: DW_AT_high_pc [DW_FORM_data4] (0x00000010) +DWARF: DW_AT_name [DW_FORM_strp] {{.*}} "foo3" +DWARF: DW_TAG_subprogram +DWARF: DW_AT_low_pc [DW_FORM_addr] (0x0000000100000ee0) +DWARF: DW_AT_high_pc [DW_FORM_data4] (0x00000010) +DWARF: DW_AT_name [DW_FORM_strp] {{.*}} "foo4" +DWARF: DW_TAG_subprogram +DWARF: DW_AT_low_pc [DW_FORM_addr] (0x0000000100000ef0) +DWARF: DW_AT_high_pc [DW_FORM_data4] (0x00000010) +DWARF: DW_AT_name [DW_FORM_strp] {{.*}} "foo5" +DWARF: DW_TAG_subprogram +DWARF: DW_AT_low_pc [DW_FORM_addr] (0x0000000100000f00) +DWARF: DW_AT_high_pc [DW_FORM_data4] (0x00000010) +DWARF: DW_AT_name [DW_FORM_strp] {{.*}} "foo6" +DWARF: DW_TAG_subprogram +DWARF: DW_AT_low_pc [DW_FORM_addr] (0x0000000100000f10) +DWARF: DW_AT_high_pc [DW_FORM_data4] (0x00000010) +DWARF: DW_AT_name [DW_FORM_strp] {{.*}} "foo7" +DWARF: DW_TAG_subprogram +DWARF: DW_AT_low_pc [DW_FORM_addr] (0x0000000100000f20) +DWARF: DW_AT_high_pc [DW_FORM_data4] (0x00000010) +DWARF: DW_AT_name [DW_FORM_strp] {{.*}} "foo8" +DWARF: DW_TAG_subprogram +DWARF: DW_AT_low_pc [DW_FORM_addr] (0x0000000100000f30) +DWARF: DW_AT_high_pc [DW_FORM_data4] (0x00000083) +DWARF: DW_AT_name [DW_FORM_strp] {{.*}} "main" diff --git a/llvm/test/tools/dsymutil/X86/dwarf5.test b/llvm/test/tools/dsymutil/X86/dwarf5.test deleted file mode 100644 --- a/llvm/test/tools/dsymutil/X86/dwarf5.test +++ /dev/null @@ -1,59 +0,0 @@ -Test DWARF5 support in dsymutil. Currently this still generates an empty dSYM. - -$ cat dwarf5.c -__attribute__ ((optnone)) -int foo() { - volatile i; - return i; -} - -int main(int argc, char** argv) { - return foo(); -} - -$ clang -gdwarf-5 dwarf5.c -c -o dwarf5.o -$ clang dwarf5.o -o dwarf5.out - -RUN: dsymutil -oso-prepend-path %p/../Inputs %p/../Inputs/private/tmp/dwarf5/dwarf5.out -o %t.dSYM 2>&1 | FileCheck %s --allow-empty -RUN: llvm-dwarfdump --verify %t.dSYM 2>&1 | FileCheck %s -CHECK-NOT: error: - -RUN: llvm-dwarfdump %t.dSYM | FileCheck %s --check-prefix DWARF -DWARF: DW_TAG_compile_unit -DWARF: DW_AT_producer ("clang version 12.0.0 -DWARF: DW_AT_language (DW_LANG_C99) -DWARF: DW_AT_name ("dwarf5.c") -DWARF: DW_AT_LLVM_sysroot ("/") -DWARF: DW_AT_stmt_list (0x00000000) -DWARF: DW_AT_comp_dir ("/private/tmp/dwarf5") -DWARF: DW_AT_low_pc (0x0000000100003f80) -DWARF: DW_AT_high_pc (0x0000000100003fb1) -DWARF: DW_AT_addr_base (0x00000008) -DWARF: DW_TAG_subprogram -DWARF: DW_AT_name ("foo") -DWARF: DW_AT_decl_file (0x00) -DWARF: DW_AT_decl_line (2) -DWARF: DW_AT_type (0x00000091 "int") -DWARF: DW_AT_external (true) -DWARF: DW_TAG_variable -DWARF: DW_AT_name ("i") -DWARF: DW_AT_decl_file (0x00) -DWARF: DW_AT_decl_line (3) -DWARF: DW_AT_type (0x00000098 "volatile int") -DWARF: DW_TAG_subprogram -DWARF: DW_AT_name ("main") -DWARF: DW_AT_decl_file (0x00) -DWARF: DW_AT_decl_line (7) -DWARF: DW_AT_prototyped (true) -DWARF: DW_AT_type (0x00000091 "int") -DWARF: DW_AT_external (true) -DWARF: DW_TAG_formal_parameter -DWARF: DW_AT_name ("argc") -DWARF: DW_AT_decl_file (0x00) -DWARF: DW_AT_decl_line (7) -DWARF: DW_AT_type (0x00000091 "int") -DWARF: DW_TAG_formal_parameter -DWARF: DW_AT_name ("argv") -DWARF: DW_AT_decl_file (0x00) -DWARF: DW_AT_decl_line (7) -DWARF: DW_AT_type (0x0000009d "char **")