[llvm] 7a64e63 - [dsymutil][DWARFv5] fix DW_FORM_addrx attribute offset calculation.
Alexey Lapshin via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 26 05:27:07 PDT 2022
Author: Alexey Lapshin
Date: 2022-08-26T15:26:06+03:00
New Revision: 7a64e636af376b2201bc01badc67d57b6f7e2c0f
URL: https://github.com/llvm/llvm-project/commit/7a64e636af376b2201bc01badc67d57b6f7e2c0f
DIFF: https://github.com/llvm/llvm-project/commit/7a64e636af376b2201bc01badc67d57b6f7e2c0f.diff
LOG: [dsymutil][DWARFv5] fix DW_FORM_addrx attribute offset calculation.
DWARFLinker::DIECloner::cloneAddressAttribute() contains call to
relocateIndexedAddr(StartOffset, EndOffset). StartOffset is
incorrectly calculated. Val.getRawUValue() is an index into the
.debug_addr table, so it should be multiplied
by Unit.getOrigUnit().getAddressByteSize().
Differential Revision: https://reviews.llvm.org/D132644
Added:
llvm/test/tools/dsymutil/Inputs/private/tmp/dwarf5/dwarf5-addrx.o
llvm/test/tools/dsymutil/Inputs/private/tmp/dwarf5/dwarf5-addrx.out
llvm/test/tools/dsymutil/X86/dwarf5-addrx.test
Modified:
llvm/lib/DWARFLinker/DWARFLinker.cpp
Removed:
llvm/test/tools/dsymutil/Inputs/private/tmp/dwarf5/dwarf5.o
llvm/test/tools/dsymutil/Inputs/private/tmp/dwarf5/dwarf5.out
llvm/test/tools/dsymutil/X86/dwarf5.test
################################################################################
diff --git a/llvm/lib/DWARFLinker/DWARFLinker.cpp b/llvm/lib/DWARFLinker/DWARFLinker.cpp
index 495a582d825f..a6f21000895c 100644
--- a/llvm/lib/DWARFLinker/DWARFLinker.cpp
+++ b/llvm/lib/DWARFLinker/DWARFLinker.cpp
@@ -1109,7 +1109,9 @@ unsigned DWARFLinker::DIECloner::cloneAddressAttribute(
if (Form == dwarf::DW_FORM_addrx) {
if (Optional<uint64_t> 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<uint64_t> RelocAddr =
@@ -1120,7 +1122,8 @@ unsigned DWARFLinker::DIECloner::cloneAddressAttribute(
} 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 000000000000..d7636e59733e
Binary files /dev/null and b/llvm/test/tools/dsymutil/Inputs/private/tmp/dwarf5/dwarf5-addrx.o
diff er
diff --git a/llvm/test/tools/dsymutil/Inputs/private/tmp/dwarf5/dwarf5-addrx.out b/llvm/test/tools/dsymutil/Inputs/private/tmp/dwarf5/dwarf5-addrx.out
new file mode 100755
index 000000000000..475510326430
Binary files /dev/null and b/llvm/test/tools/dsymutil/Inputs/private/tmp/dwarf5/dwarf5-addrx.out
diff er
diff --git a/llvm/test/tools/dsymutil/Inputs/private/tmp/dwarf5/dwarf5.o b/llvm/test/tools/dsymutil/Inputs/private/tmp/dwarf5/dwarf5.o
deleted file mode 100644
index 1f47f6a225de..000000000000
Binary files a/llvm/test/tools/dsymutil/Inputs/private/tmp/dwarf5/dwarf5.o and /dev/null
diff er
diff --git a/llvm/test/tools/dsymutil/Inputs/private/tmp/dwarf5/dwarf5.out b/llvm/test/tools/dsymutil/Inputs/private/tmp/dwarf5/dwarf5.out
deleted file mode 100755
index 420395f0d15b..000000000000
Binary files a/llvm/test/tools/dsymutil/Inputs/private/tmp/dwarf5/dwarf5.out and /dev/null
diff er
diff --git a/llvm/test/tools/dsymutil/X86/dwarf5-addrx.test b/llvm/test/tools/dsymutil/X86/dwarf5-addrx.test
new file mode 100644
index 000000000000..292f760c3f9d
--- /dev/null
+++ b/llvm/test/tools/dsymutil/X86/dwarf5-addrx.test
@@ -0,0 +1,89 @@
+## Test that DWARF5 DW_FORM_addrx is correctly recognized
+## and converted into the DW_FORM_addr
+
+## $ cat dwarf5-addrx.c
+## __attribute__ ((optnone)) int foo1 ( ) {
+## volatile int a = 0x1; return a;
+## }
+##
+## __attribute__ ((optnone)) int foo2 ( ) {
+## volatile int a = 0x2; return a;
+## }
+##
+## __attribute__ ((optnone)) int foo3 ( ) {
+## volatile int a = 0x3; return a;
+## }
+##
+## __attribute__ ((optnone)) int foo4 ( ) {
+## volatile int a = 0x4; return a;
+## }
+##
+## __attribute__ ((optnone)) int foo5 ( ) {
+## volatile int a = 0x5; return a;
+## }
+##
+## __attribute__ ((optnone)) int foo6 ( ) {
+## volatile int a = 0x6; return a;
+## }
+##
+## __attribute__ ((optnone)) int foo7 ( ) {
+## volatile int a = 0x7; return a;
+## }
+##
+## __attribute__ ((optnone)) int foo8 ( ) {
+## volatile int a = 0x8; return a;
+## }
+##
+## int main ( void ) {
+## return foo1()+foo2()+foo3()+foo4()+foo5()+foo6()+foo7()+foo8();
+## }
+##
+## $ clang -gdwarf-5 dwarf5-addrx.c -c -o dwarf5-addrx.o
+## $ clang dwarf5-addrx.o -o dwarf5-addrx.out
+
+RUN: dsymutil -oso-prepend-path %p/../Inputs %p/../Inputs/private/tmp/dwarf5/dwarf5-addrx.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 --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
index a37b4f3ba4c6..000000000000
--- 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 **")
More information about the llvm-commits
mailing list