From 7a64e636af376b2201bc01badc67d57b6f7e2c0f Mon Sep 17 00:00:00 2001 From: Alexey Lapshin Date: Thu, 25 Aug 2022 00:36:13 +0300 Subject: [PATCH] [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 --- llvm/lib/DWARFLinker/DWARFLinker.cpp | 7 +- .../Inputs/private/tmp/dwarf5/dwarf5-addrx.o | Bin 0 -> 3400 bytes .../Inputs/private/tmp/dwarf5/dwarf5-addrx.out | Bin 0 -> 5352 bytes .../dsymutil/Inputs/private/tmp/dwarf5/dwarf5.o | Bin 1976 -> 0 bytes .../dsymutil/Inputs/private/tmp/dwarf5/dwarf5.out | Bin 16912 -> 0 bytes llvm/test/tools/dsymutil/X86/dwarf5-addrx.test | 89 +++++++++++++++++++++ llvm/test/tools/dsymutil/X86/dwarf5.test | 59 -------------- 7 files changed, 94 insertions(+), 61 deletions(-) create mode 100644 llvm/test/tools/dsymutil/Inputs/private/tmp/dwarf5/dwarf5-addrx.o create mode 100755 llvm/test/tools/dsymutil/Inputs/private/tmp/dwarf5/dwarf5-addrx.out delete mode 100644 llvm/test/tools/dsymutil/Inputs/private/tmp/dwarf5/dwarf5.o delete mode 100755 llvm/test/tools/dsymutil/Inputs/private/tmp/dwarf5/dwarf5.out create mode 100644 llvm/test/tools/dsymutil/X86/dwarf5-addrx.test delete mode 100644 llvm/test/tools/dsymutil/X86/dwarf5.test diff --git a/llvm/lib/DWARFLinker/DWARFLinker.cpp b/llvm/lib/DWARFLinker/DWARFLinker.cpp index 495a582..a6f2100 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 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 @@ 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 0000000000000000000000000000000000000000..d7636e59733e08b88b418c10a982c9401471115c GIT binary patch literal 3400 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 Q(U>&yN-GTf|1XjL0bdzvF#rGn literal 0 HcmV?d00001 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 1f47f6a225dec2387edc6a61c1051910717932f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1976 zcma)6U2oH76h5yVJ89C=K#>Z9t(imwlSV#Thqf?{qR}ZxTp$EncY$0dv14zI6FF|k zrh+OuF{*Jvg*5GEH@n)+w9EYfCXGAz16(4ZX-Hf$V6b!S>TrDz~Z6eA~)rYVV{>%Q6dLqCkqEiRpV8Ao23 z9pWR(C2Edx30Nl+iLN)y+G5jsj7B3M zjPpr6`yS>?tD&=u=fR~|fAw~&W7K_p)xGGr4P8Hdl7|K+$LIx49zs64I-NK2nYM0u zM#~Hb==$(|S!O<)`E2In5HfgeBcE(^zAKI!Fviz=oB6)xL3eq*>(TuiEIR~j=hNws zWA|@{-^F{(cMN%AGPHlwSfsrUj}g0PArR%S@jm^EHj6PK&Y*4=!VZycFTTY;U){X_ z!{W0Gx5lT|2}*HwwW=?xtVggHm%Lp=dD_0 z&NQ{zBjq{Gm^Ev2B~7c%SryHiuassgA421z;aQbJ9g0xwcuvpo&7$Ax6vI4N?KU{B z4=uxS!2!c-*6GuOx@~x{8@p5>+Q#sfVJarHr6~Nj2?P4log|@sMR}!8>?Gpbvmp9e zksVE@ZXoIa=Junm|Mwyg<_9>jBYRc)bc~;2fTJIZ%{ZRt6h}R zsOU_Q3$mD!#+CO)&{bn&%=z*7-~D^`+V_p$M*mF!j0~R9gpy95R%G>K1=O49r@q8s zNm7yPbz3|*frB&+z+u`KoKmHIC7WZ5CWxzSsjcy#H>w~ImEve$L8sHxgQKJR|E)po ADF6Tf 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 420395f0d15b77ba1e6b163d827e667efe69c88b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16912 zcmeI4&ubG=5Xav(N`)4alPC&ZrIfbdZjx?nDuSsPno_AnD~M1Y*<{nMo&F#Fzj-rITeKH2MJ@Ar>C z{X!@aAw(bfS@M0FJQXU46o3x2+gdF+P86nQlIOb{aVq*eKfC(@GCcp%k025#WOn?b60Vco% zm;e)C0!)AjFaajO1egF5U;<2l2`~XBzyz286JP>NfC(@GCcp%k025#WOn?b60Vco% zm;e)C0!)AjFaajO1egF5U;<2l34p+ZT>IPe?BUW*bg1R)-1hg_hwLF_`^iDB-Tb-# z`RM2SCl+tBLVS-mVHAnIodLMUT!F&FP#iw_6*1-G1*k;xCTrSENf3 zMU1^ZkXXl|8a@0z{r9AY0~+hY`_|q&qE%P*xEIf{xRTRb`tDlmmPZJWy5Kj(xkr`Ag+aSzPhZg zS@niptE!2l7T4nH=(6o($XA-CR;X33m&&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 a37b4f3..0000000 --- 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 **") -- 2.7.4