From e89738451a3830d80fcf23554fd0b297bca60266 Mon Sep 17 00:00:00 2001 From: Alexey Lapshin Date: Thu, 15 Jun 2023 10:23:41 +0200 Subject: [PATCH] [DWARFLinker] Handle DW_OP_GNU_push_tls_address while check for variable location. The D147066 changed the way how DWARF location expressions are handled. Now expressions are parsed and their operands are analysed. New handling misses the DW_OP_GNU_push_tls_address extention. This patch adds handling DW_OP_GNU_push_tls_address while checking for addresses. Differential Revision: https://reviews.llvm.org/D153010 --- llvm/lib/DWARFLinker/DWARFLinker.cpp | 8 +- llvm/test/tools/dsymutil/X86/tls-variable.test | 193 +++++++++++++++++++++++++ 2 files changed, 199 insertions(+), 2 deletions(-) create mode 100644 llvm/test/tools/dsymutil/X86/tls-variable.test diff --git a/llvm/lib/DWARFLinker/DWARFLinker.cpp b/llvm/lib/DWARFLinker/DWARFLinker.cpp index 7d02e05..619df44 100644 --- a/llvm/lib/DWARFLinker/DWARFLinker.cpp +++ b/llvm/lib/DWARFLinker/DWARFLinker.cpp @@ -420,6 +420,11 @@ void DWARFLinker::cleanupAuxiliarryData(LinkContext &Context) { DIEAlloc.Reset(); } +static bool isTlsAddressCode(uint8_t DW_OP_Code) { + return DW_OP_Code == dwarf::DW_OP_form_tls_address || + DW_OP_Code == dwarf::DW_OP_GNU_push_tls_address; +} + std::optional DWARFLinker::getVariableRelocAdjustment(AddressesMap &RelocMgr, const DWARFDie &DIE) { @@ -471,8 +476,7 @@ DWARFLinker::getVariableRelocAdjustment(AddressesMap &RelocMgr, case dwarf::DW_OP_const8u: case dwarf::DW_OP_const4s: case dwarf::DW_OP_const8s: - if (NextIt == Expression.end() || - NextIt->getCode() != dwarf::DW_OP_form_tls_address) + if (NextIt == Expression.end() || !isTlsAddressCode(NextIt->getCode())) break; [[fallthrough]]; case dwarf::DW_OP_addr: { diff --git a/llvm/test/tools/dsymutil/X86/tls-variable.test b/llvm/test/tools/dsymutil/X86/tls-variable.test new file mode 100644 index 0000000..6aabcfe --- /dev/null +++ b/llvm/test/tools/dsymutil/X86/tls-variable.test @@ -0,0 +1,193 @@ +## This test checks that thread local storage variables +## are preserved. + +# RUN: yaml2obj %s -o %t.o +# RUN: echo '---' > %t2.map +# RUN: echo "triple: 'x86_64-apple-darwin'" >> %t2.map +# RUN: echo 'objects:' >> %t2.map +# RUN: echo " - filename: '%t.o'" >> %t2.map +# RUN: echo ' symbols:' >> %t2.map +# RUN: echo ' - { sym: __Z3foov, objAddr: 0x0, binAddr: 0x10000, size: 0x10 }' >> %t2.map +# RUN: echo '...' >> %t2.map +# RUN: dsymutil -y %t2.map --keep-function-for-static -f -o - | llvm-dwarfdump -a - | FileCheck %s + +# CHECK: file format Mach-O 64-bit x86-64 +# CHECK: .debug_info contents: +# CHECK: Compile Unit: +# CHECK: DW_TAG_compile_unit +# CHECK: DW_AT_name{{.*}}"CU1" +# CHECK: DW_TAG_subprogram +# CHECK: DW_AT_name{{.*}}"foo" +# CHECK: DW_TAG_variable +# CHECK: DW_AT_name{{.*}}"var1" +# CHECK: DW_AT_location (DW_OP_const8u 0x10001, DW_OP_GNU_push_tls_address) +# CHECK: DW_AT_name{{.*}}"var2" +# CHECK: DW_AT_location (DW_OP_const8u 0x10001, DW_OP_form_tls_address) + +--- !mach-o +FileHeader: + magic: 0xFEEDFACF + cputype: 0x01000007 + cpusubtype: 0x00000003 + filetype: 0x00000001 + ncmds: 2 + sizeofcmds: 376 + flags: 0x00002000 + reserved: 0x00000000 +LoadCommands: + - cmd: LC_SEGMENT_64 + cmdsize: 232 + segname: '' + vmaddr: 0x00 + vmsize: 0x300 + fileoff: 0x300 + filesize: 0x300 + maxprot: 7 + initprot: 7 + nsects: 2 + flags: 0 + Sections: + - sectname: __debug_abbrev + segname: __DWARF + addr: 0x000000000000000F + size: 0x27 + offset: 0x00000380 + align: 0 + reloff: 0x00000000 + nreloc: 0 + flags: 0x02000000 + reserved1: 0x00000000 + reserved2: 0x00000000 + reserved3: 0x00000000 + - sectname: __debug_info + segname: __DWARF + addr: 0x000000000000100 + size: 0x54 + offset: 0x00000410 + align: 0 + reloff: 0x00000600 + nreloc: 2 + flags: 0x02000000 + reserved1: 0x00000000 + reserved2: 0x00000000 + reserved3: 0x00000000 + relocations: + - address: 0x32 + symbolnum: 1 + pcrel: true + length: 3 + extern: true + type: 0 + scattered: false + value: 0 + - address: 0x47 + symbolnum: 1 + pcrel: true + length: 3 + extern: true + type: 0 + scattered: false + value: 0 + - cmd: LC_SYMTAB + cmdsize: 24 + symoff: 0x700 + nsyms: 2 + stroff: 0x720 + strsize: 10 +LinkEditData: + NameList: + - n_strx: 1 + n_type: 0x0F + n_sect: 1 + n_desc: 0 + n_value: 0 + - n_strx: 1 + n_type: 0x0F + n_sect: 1 + n_desc: 0 + n_value: 0 + StringTable: + - '' + - '__Z3foov' + - '' +DWARF: + debug_abbrev: + - Table: + - Tag: DW_TAG_compile_unit + Children: DW_CHILDREN_yes + Attributes: + - Attribute: DW_AT_producer + Form: DW_FORM_string + - Attribute: DW_AT_language + Form: DW_FORM_data2 + - Attribute: DW_AT_name + Form: DW_FORM_string + - Tag: DW_TAG_subprogram + Children: DW_CHILDREN_yes + Attributes: + - Attribute: DW_AT_name + Form: DW_FORM_string + - Attribute: DW_AT_type + Form: DW_FORM_ref4 + - Tag: DW_TAG_variable + Children: DW_CHILDREN_no + Attributes: + - Attribute: DW_AT_name + Form: DW_FORM_string + - Attribute: DW_AT_type + Form: DW_FORM_ref4 + - Attribute: DW_AT_location + Form: DW_FORM_exprloc + - Tag: DW_TAG_base_type + Children: DW_CHILDREN_no + Attributes: + - Attribute: DW_AT_name + Form: DW_FORM_string + debug_info: + - Version: 4 + Entries: + - AbbrCode: 1 + Values: + - CStr: by_hand + - Value: 0x04 + - CStr: CU1 + - AbbrCode: 4 + Values: + - CStr: int + - AbbrCode: 2 + Values: + - CStr: foo + - Value: 0x1a + - AbbrCode: 3 + Values: + - CStr: var1 + - Value: 0x0000001a + - BlockData: + - 0x0e + - 0x00 + - 0x00 + - 0x01 + - 0x00 + - 0x00 + - 0x00 + - 0x00 + - 0x00 + - 0xe0 + - AbbrCode: 3 + Values: + - CStr: var2 + - Value: 0x0000001a + - BlockData: + - 0x0e + - 0x00 + - 0x00 + - 0x01 + - 0x00 + - 0x00 + - 0x00 + - 0x00 + - 0x00 + - 0x9b + - AbbrCode: 0 + - AbbrCode: 0 +... -- 2.7.4