diff options
author | Alexander Yermolovich <43973793+ayermolo@users.noreply.github.com> | 2024-02-14 11:23:57 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-14 11:23:57 -0800 |
commit | c9e8e91acae73c84a30311c6c745361251cf5146 (patch) | |
tree | fd0e0f469ab0a8ee7858ee668b632c3907e76b9a | |
parent | 6297479ff0808e7c5335ec9ec837513e1cff610f (diff) |
[BOLT][DWARF] Fix out of order rangelists/loclists (#81645)
GCC can generate rangelists/loclists that are out of order. Fixed so
that we don't assert, and instead generate partially optimized list.
Through most code paths we do sort rnglists/loclists, but not for
loclist for a path where BOLT does not modify a function. Although it's
nice to have lists sorted, this implementation shouldn't rely on it.
This also fixes an issue if we partially capture a list we would write
out *end_of_list in helper function. So tools won't see the rest of the
addresses being written out.
-rw-r--r-- | bolt/lib/Core/DebugData.cpp | 45 | ||||
-rw-r--r-- | bolt/test/X86/dwarf5-loclist-out-of-order.s | 485 |
2 files changed, 504 insertions, 26 deletions
diff --git a/bolt/lib/Core/DebugData.cpp b/bolt/lib/Core/DebugData.cpp index 8c3f6bd2052f..2942f0b9190f 100644 --- a/bolt/lib/Core/DebugData.cpp +++ b/bolt/lib/Core/DebugData.cpp @@ -230,7 +230,7 @@ template <typename DebugVector, typename ListEntry, typename DebugAddressEntry> static bool emitWithBase(raw_ostream &OS, const DebugVector &Entries, DebugAddrWriter &AddrWriter, DWARFUnit &CU, uint32_t &Index, const ListEntry BaseAddressx, - const ListEntry OffsetPair, const ListEntry EndOfList, + const ListEntry OffsetPair, const std::function<void(uint32_t)> &Func) { if (Entries.size() < 2) return false; @@ -241,7 +241,9 @@ static bool emitWithBase(raw_ostream &OS, const DebugVector &Entries, const DebugAddressEntry &Entry = Entries[Index]; if (Entry.LowPC == 0) break; - assert(Base <= Entry.LowPC && "Entry base is higher than low PC"); + // In case rnglists or loclists are not sorted. + if (Base > Entry.LowPC) + break; uint32_t StartOffset = Entry.LowPC - Base; uint32_t EndOffset = Entry.HighPC - Base; if (encodeULEB128(EndOffset, TempBuffer) > 2) @@ -266,8 +268,6 @@ static bool emitWithBase(raw_ostream &OS, const DebugVector &Entries, encodeULEB128(OffsetEntry.EndOffset, OS); Func(OffsetEntry.Index); } - support::endian::write(OS, static_cast<uint8_t>(EndOfList), - llvm::endianness::little); return true; } @@ -276,19 +276,17 @@ DebugRangeListsSectionWriter::addRanges(DebugAddressRangesVector &Ranges) { std::lock_guard<std::mutex> Lock(WriterMutex); RangeEntries.push_back(CurrentOffset); - bool WrittenStartxLength = false; std::sort( Ranges.begin(), Ranges.end(), [](const DebugAddressRange &R1, const DebugAddressRange &R2) -> bool { return R1.LowPC < R2.LowPC; }); for (unsigned I = 0; I < Ranges.size();) { - WrittenStartxLength = false; if (emitWithBase<DebugAddressRangesVector, dwarf::RnglistEntries, - DebugAddressRange>( - *CUBodyStream, Ranges, *AddrWriter, *CU, I, - dwarf::DW_RLE_base_addressx, dwarf::DW_RLE_offset_pair, - dwarf::DW_RLE_end_of_list, [](uint32_t Index) -> void {})) + DebugAddressRange>(*CUBodyStream, Ranges, *AddrWriter, *CU, + I, dwarf::DW_RLE_base_addressx, + dwarf::DW_RLE_offset_pair, + [](uint32_t Index) -> void {})) continue; const DebugAddressRange &Range = Ranges[I]; @@ -299,12 +297,11 @@ DebugRangeListsSectionWriter::addRanges(DebugAddressRangesVector &Ranges) { encodeULEB128(Index, *CUBodyStream); encodeULEB128(Range.HighPC - Range.LowPC, *CUBodyStream); ++I; - WrittenStartxLength = true; } - if (WrittenStartxLength) - support::endian::write(*CUBodyStream, - static_cast<uint8_t>(dwarf::DW_RLE_end_of_list), - llvm::endianness::little); + + support::endian::write(*CUBodyStream, + static_cast<uint8_t>(dwarf::DW_RLE_end_of_list), + llvm::endianness::little); CurrentOffset = CUBodyBuffer->size(); return RangeEntries.size() - 1; } @@ -688,7 +685,6 @@ static void writeDWARF5LocList(uint32_t &NumberOfEntries, DIEValue &AttrInfo, } std::vector<uint64_t> OffsetsArray; - bool WrittenStartxLength = false; auto writeExpression = [&](uint32_t Index) -> void { const DebugLocationEntry &Entry = LocList[Index]; encodeULEB128(Entry.Expr.size(), LocBodyStream); @@ -696,12 +692,11 @@ static void writeDWARF5LocList(uint32_t &NumberOfEntries, DIEValue &AttrInfo, reinterpret_cast<const char *>(Entry.Expr.data()), Entry.Expr.size()); }; for (unsigned I = 0; I < LocList.size();) { - WrittenStartxLength = false; if (emitWithBase<DebugLocationsVector, dwarf::LoclistEntries, - DebugLocationEntry>( - LocBodyStream, LocList, AddrWriter, CU, I, - dwarf::DW_LLE_base_addressx, dwarf::DW_LLE_offset_pair, - dwarf::DW_LLE_end_of_list, writeExpression)) + DebugLocationEntry>(LocBodyStream, LocList, AddrWriter, CU, + I, dwarf::DW_LLE_base_addressx, + dwarf::DW_LLE_offset_pair, + writeExpression)) continue; const DebugLocationEntry &Entry = LocList[I]; @@ -713,13 +708,11 @@ static void writeDWARF5LocList(uint32_t &NumberOfEntries, DIEValue &AttrInfo, encodeULEB128(Entry.HighPC - Entry.LowPC, LocBodyStream); writeExpression(I); ++I; - WrittenStartxLength = true; } - if (WrittenStartxLength) - support::endian::write(LocBodyStream, - static_cast<uint8_t>(dwarf::DW_LLE_end_of_list), - llvm::endianness::little); + support::endian::write(LocBodyStream, + static_cast<uint8_t>(dwarf::DW_LLE_end_of_list), + llvm::endianness::little); } void DebugLoclistWriter::addList(DIEBuilder &DIEBldr, DIE &Die, diff --git a/bolt/test/X86/dwarf5-loclist-out-of-order.s b/bolt/test/X86/dwarf5-loclist-out-of-order.s new file mode 100644 index 000000000000..acd0bfa5bbef --- /dev/null +++ b/bolt/test/X86/dwarf5-loclist-out-of-order.s @@ -0,0 +1,485 @@ +# REQUIRES: system-linux + +# RUN: llvm-mc -dwarf-version=5 -filetype=obj -triple x86_64-unknown-linux %s -o %t1.o +# RUN: %clang %cflags -dwarf-5 %t1.o -o %t.exe -Wl,-q +# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections --skip-funcs=main +# RUN: llvm-dwarfdump --show-form --verbose --debug-loclists --debug-addr %t.bolt > %t.txt +# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.bolt >> %t.txt +# RUN: cat %t.txt | FileCheck --check-prefix=POSTCHECK %s + +## Tests to make sure BOLT handles correctly locations that are out of order, and the function is not being processed. + +# POSTCHECK: DW_LLE_base_addressx +# POSTCHECK-NEXT: DW_LLE_offset_pair +# POSTCHECK-NEXT: DW_LLE_offset_pair +# POSTCHECK-NEXT: DW_LLE_startx_length +# POSTCHECK-NEXT: DW_LLE_end_of_list +# POSTCHECK: DW_LLE_base_addressx +# POSTCHECK-NEXT: DW_LLE_offset_pair +# POSTCHECK-NEXT: DW_LLE_offset_pair +# POSTCHECK-NEXT: DW_LLE_end_of_list + +# POSTCHECK: Addrs: [ +# POSTCHECK-NEXT: 0x[[#%.16x,ADDR:]] +# POSTCHECK-NEXT: 0x +# POSTCHECK-NEXT: 0x +# POSTCHECK-NEXT: 0x[[#%.16x,ADDR1:]] +# POSTCHECK-NEXT: 0x +# POSTCHECK-NEXT: 0x + +# POSTCHECK: DW_TAG_formal_parameter +# POSTCHECK: DW_TAG_formal_parameter +# POSTCHECK-NEXT: DW_AT_location +# POSTCHECK-NEXT: [0x[[#ADDR1]], 0x[[#ADDR1 + 0x1a]]): DW_OP_reg3 RBX +# POSTCHECK-NEXT: [0x[[#ADDR1 + 0x1a]], 0x[[#ADDR1 + 0x1d]]): DW_OP_entry_value(DW_OP_reg5 RDI), DW_OP_stack_value +# POSTCHECK-NEXT: [0x[[#ADDR]], 0x[[#ADDR + 0x12]]): DW_OP_reg5 RDI) + +## clang++ main.cpp -fno-inline-functions -g2 -O2 -S +## void use(int * x) { +## *x += 4; +## } +## int main(int argc, char *argv[]) { +## int x = argc; +## use(&x); +## x = x + argc; +## use(&x); +## return x; +## } + +## Test was manually modified to re-order locations. + .text + .file "main.cpp" + .globl _Z3usePi # -- Begin function _Z3usePi + .p2align 4, 0x90 + .type _Z3usePi,@function +_Z3usePi: # @_Z3usePi +.Lfunc_begin0: + .file 0 "/repro" "main.cpp" md5 0xe24a1d6afb5e23ce0028f1f33bc08cd7 + .cfi_startproc +# %bb.0: # %entry + #DEBUG_VALUE: use:x <- $rdi + .loc 0 2 8 prologue_end # main.cpp:2:8 + addl $4, (%rdi) + .loc 0 3 1 # main.cpp:3:1 + retq +.Ltmp0: +.Lfunc_end0: + .size _Z3usePi, .Lfunc_end0-_Z3usePi + .cfi_endproc + # -- End function + .globl main # -- Begin function main + .p2align 4, 0x90 + .type main,@function +main: # @main +.Lfunc_begin1: + .loc 0 4 0 # main.cpp:4:0 + .cfi_startproc +# %bb.0: # %entry + #DEBUG_VALUE: main:argc <- $edi + #DEBUG_VALUE: main:argv <- $rsi + pushq %r14 + .cfi_def_cfa_offset 16 + pushq %rbx + .cfi_def_cfa_offset 24 + pushq %rax + .cfi_def_cfa_offset 32 + .cfi_offset %rbx, -24 + .cfi_offset %r14, -16 + movl %edi, %ebx +.Ltmp1: + .loc 0 5 7 prologue_end # main.cpp:5:7 + movl %edi, 4(%rsp) + leaq 4(%rsp), %r14 + .loc 0 6 3 # main.cpp:6:3 + movq %r14, %rdi +.Ltmp2: + #DEBUG_VALUE: main:argc <- $ebx + callq _Z3usePi +.Ltmp3: + #DEBUG_VALUE: main:argv <- [DW_OP_LLVM_entry_value 1] $rsi + .loc 0 7 5 # main.cpp:7:5 + addl %ebx, 4(%rsp) + .loc 0 8 3 # main.cpp:8:3 + movq %r14, %rdi + callq _Z3usePi +.Ltmp4: + .loc 0 9 10 # main.cpp:9:10 + movl 4(%rsp), %eax + .loc 0 9 3 epilogue_begin is_stmt 0 # main.cpp:9:3 + addq $8, %rsp + .cfi_def_cfa_offset 24 + popq %rbx +.Ltmp5: + #DEBUG_VALUE: main:argc <- [DW_OP_LLVM_entry_value 1] $edi + .cfi_def_cfa_offset 16 + popq %r14 + .cfi_def_cfa_offset 8 + retq +.Ltmp6: +.Lfunc_end1: + .size main, .Lfunc_end1-main + .cfi_endproc + # -- End function + .section .debug_loclists,"",@progbits + .long .Ldebug_list_header_end0-.Ldebug_list_header_start0 # Length +.Ldebug_list_header_start0: + .short 5 # Version + .byte 8 # Address size + .byte 0 # Segment selector size + .long 2 # Offset entry count +.Lloclists_table_base0: + .long .Ldebug_loc0-.Lloclists_table_base0 + .long .Ldebug_loc1-.Lloclists_table_base0 +.Ldebug_loc0: + .byte 4 # DW_LLE_offset_pair + .uleb128 .Ltmp2-.Lfunc_begin0 # starting offset + .uleb128 .Ltmp5-.Lfunc_begin0 # ending offset + .byte 1 # Loc expr size + .byte 83 # super-register DW_OP_reg3 + .byte 4 # DW_LLE_offset_pair + .uleb128 .Ltmp5-.Lfunc_begin0 # starting offset + .uleb128 .Lfunc_end1-.Lfunc_begin0 # ending offset + .byte 4 # Loc expr size + .byte 163 # DW_OP_entry_value + .byte 1 # 1 + .byte 85 # super-register DW_OP_reg5 + .byte 159 # DW_OP_stack_value + .byte 4 # DW_LLE_offset_pair #manually moved out of order + .uleb128 .Lfunc_begin1-.Lfunc_begin0 # starting offset + .uleb128 .Ltmp2-.Lfunc_begin0 # ending offset + .byte 1 # Loc expr size + .byte 85 # super-register DW_OP_reg5 + .byte 0 # DW_LLE_end_of_list +.Ldebug_loc1: + .byte 4 # DW_LLE_offset_pair + .uleb128 .Lfunc_begin1-.Lfunc_begin0 # starting offset + .uleb128 .Ltmp3-.Lfunc_begin0 # ending offset + .byte 1 # Loc expr size + .byte 84 # DW_OP_reg4 + .byte 4 # DW_LLE_offset_pair + .uleb128 .Ltmp3-.Lfunc_begin0 # starting offset + .uleb128 .Lfunc_end1-.Lfunc_begin0 # ending offset + .byte 4 # Loc expr size + .byte 163 # DW_OP_entry_value + .byte 1 # 1 + .byte 84 # DW_OP_reg4 + .byte 159 # DW_OP_stack_value + .byte 0 # DW_LLE_end_of_list +.Ldebug_list_header_end0: + .section .debug_abbrev,"",@progbits + .byte 1 # Abbreviation Code + .byte 17 # DW_TAG_compile_unit + .byte 1 # DW_CHILDREN_yes + .byte 37 # DW_AT_producer + .byte 37 # DW_FORM_strx1 + .byte 19 # DW_AT_language + .byte 5 # DW_FORM_data2 + .byte 3 # DW_AT_name + .byte 37 # DW_FORM_strx1 + .byte 114 # DW_AT_str_offsets_base + .byte 23 # DW_FORM_sec_offset + .byte 16 # DW_AT_stmt_list + .byte 23 # DW_FORM_sec_offset + .byte 27 # DW_AT_comp_dir + .byte 37 # DW_FORM_strx1 + .byte 17 # DW_AT_low_pc + .byte 27 # DW_FORM_addrx + .byte 18 # DW_AT_high_pc + .byte 6 # DW_FORM_data4 + .byte 115 # DW_AT_addr_base + .byte 23 # DW_FORM_sec_offset + .ascii "\214\001" # DW_AT_loclists_base + .byte 23 # DW_FORM_sec_offset + .byte 0 # EOM(1) + .byte 0 # EOM(2) + .byte 2 # Abbreviation Code + .byte 46 # DW_TAG_subprogram + .byte 1 # DW_CHILDREN_yes + .byte 17 # DW_AT_low_pc + .byte 27 # DW_FORM_addrx + .byte 18 # DW_AT_high_pc + .byte 6 # DW_FORM_data4 + .byte 64 # DW_AT_frame_base + .byte 24 # DW_FORM_exprloc + .byte 122 # DW_AT_call_all_calls + .byte 25 # DW_FORM_flag_present + .byte 110 # DW_AT_linkage_name + .byte 37 # DW_FORM_strx1 + .byte 3 # DW_AT_name + .byte 37 # DW_FORM_strx1 + .byte 58 # DW_AT_decl_file + .byte 11 # DW_FORM_data1 + .byte 59 # DW_AT_decl_line + .byte 11 # DW_FORM_data1 + .byte 63 # DW_AT_external + .byte 25 # DW_FORM_flag_present + .byte 0 # EOM(1) + .byte 0 # EOM(2) + .byte 3 # Abbreviation Code + .byte 5 # DW_TAG_formal_parameter + .byte 0 # DW_CHILDREN_no + .byte 2 # DW_AT_location + .byte 24 # DW_FORM_exprloc + .byte 3 # DW_AT_name + .byte 37 # DW_FORM_strx1 + .byte 58 # DW_AT_decl_file + .byte 11 # DW_FORM_data1 + .byte 59 # DW_AT_decl_line + .byte 11 # DW_FORM_data1 + .byte 73 # DW_AT_type + .byte 19 # DW_FORM_ref4 + .byte 0 # EOM(1) + .byte 0 # EOM(2) + .byte 4 # Abbreviation Code + .byte 46 # DW_TAG_subprogram + .byte 1 # DW_CHILDREN_yes + .byte 17 # DW_AT_low_pc + .byte 27 # DW_FORM_addrx + .byte 18 # DW_AT_high_pc + .byte 6 # DW_FORM_data4 + .byte 64 # DW_AT_frame_base + .byte 24 # DW_FORM_exprloc + .byte 122 # DW_AT_call_all_calls + .byte 25 # DW_FORM_flag_present + .byte 3 # DW_AT_name + .byte 37 # DW_FORM_strx1 + .byte 58 # DW_AT_decl_file + .byte 11 # DW_FORM_data1 + .byte 59 # DW_AT_decl_line + .byte 11 # DW_FORM_data1 + .byte 73 # DW_AT_type + .byte 19 # DW_FORM_ref4 + .byte 63 # DW_AT_external + .byte 25 # DW_FORM_flag_present + .byte 0 # EOM(1) + .byte 0 # EOM(2) + .byte 5 # Abbreviation Code + .byte 5 # DW_TAG_formal_parameter + .byte 0 # DW_CHILDREN_no + .byte 2 # DW_AT_location + .byte 34 # DW_FORM_loclistx + .byte 3 # DW_AT_name + .byte 37 # DW_FORM_strx1 + .byte 58 # DW_AT_decl_file + .byte 11 # DW_FORM_data1 + .byte 59 # DW_AT_decl_line + .byte 11 # DW_FORM_data1 + .byte 73 # DW_AT_type + .byte 19 # DW_FORM_ref4 + .byte 0 # EOM(1) + .byte 0 # EOM(2) + .byte 6 # Abbreviation Code + .byte 52 # DW_TAG_variable + .byte 0 # DW_CHILDREN_no + .byte 2 # DW_AT_location + .byte 24 # DW_FORM_exprloc + .byte 3 # DW_AT_name + .byte 37 # DW_FORM_strx1 + .byte 58 # DW_AT_decl_file + .byte 11 # DW_FORM_data1 + .byte 59 # DW_AT_decl_line + .byte 11 # DW_FORM_data1 + .byte 73 # DW_AT_type + .byte 19 # DW_FORM_ref4 + .byte 0 # EOM(1) + .byte 0 # EOM(2) + .byte 7 # Abbreviation Code + .byte 72 # DW_TAG_call_site + .byte 1 # DW_CHILDREN_yes + .byte 127 # DW_AT_call_origin + .byte 19 # DW_FORM_ref4 + .byte 125 # DW_AT_call_return_pc + .byte 27 # DW_FORM_addrx + .byte 0 # EOM(1) + .byte 0 # EOM(2) + .byte 8 # Abbreviation Code + .byte 73 # DW_TAG_call_site_parameter + .byte 0 # DW_CHILDREN_no + .byte 2 # DW_AT_location + .byte 24 # DW_FORM_exprloc + .byte 126 # DW_AT_call_value + .byte 24 # DW_FORM_exprloc + .byte 0 # EOM(1) + .byte 0 # EOM(2) + .byte 9 # Abbreviation Code + .byte 36 # DW_TAG_base_type + .byte 0 # DW_CHILDREN_no + .byte 3 # DW_AT_name + .byte 37 # DW_FORM_strx1 + .byte 62 # DW_AT_encoding + .byte 11 # DW_FORM_data1 + .byte 11 # DW_AT_byte_size + .byte 11 # DW_FORM_data1 + .byte 0 # EOM(1) + .byte 0 # EOM(2) + .byte 10 # Abbreviation Code + .byte 15 # DW_TAG_pointer_type + .byte 0 # DW_CHILDREN_no + .byte 73 # DW_AT_type + .byte 19 # DW_FORM_ref4 + .byte 0 # EOM(1) + .byte 0 # EOM(2) + .byte 0 # EOM(3) + .section .debug_info,"",@progbits +.Lcu_begin0: + .long .Ldebug_info_end0-.Ldebug_info_start0 # Length of Unit +.Ldebug_info_start0: + .short 5 # DWARF version number + .byte 1 # DWARF Unit Type + .byte 8 # Address Size (in bytes) + .long .debug_abbrev # Offset Into Abbrev. Section + .byte 1 # Abbrev [1] 0xc:0x91 DW_TAG_compile_unit + .byte 0 # DW_AT_producer + .short 33 # DW_AT_language + .byte 1 # DW_AT_name + .long .Lstr_offsets_base0 # DW_AT_str_offsets_base + .long .Lline_table_start0 # DW_AT_stmt_list + .byte 2 # DW_AT_comp_dir + .byte 0 # DW_AT_low_pc + .long .Lfunc_end1-.Lfunc_begin0 # DW_AT_high_pc + .long .Laddr_table_base0 # DW_AT_addr_base + .long .Lloclists_table_base0 # DW_AT_loclists_base + .byte 2 # Abbrev [2] 0x27:0x17 DW_TAG_subprogram + .byte 0 # DW_AT_low_pc + .long .Lfunc_end0-.Lfunc_begin0 # DW_AT_high_pc + .byte 1 # DW_AT_frame_base + .byte 87 + # DW_AT_call_all_calls + .byte 3 # DW_AT_linkage_name + .byte 4 # DW_AT_name + .byte 0 # DW_AT_decl_file + .byte 1 # DW_AT_decl_line + # DW_AT_external + .byte 3 # Abbrev [3] 0x33:0xa DW_TAG_formal_parameter + .byte 1 # DW_AT_location + .byte 85 + .byte 7 # DW_AT_name + .byte 0 # DW_AT_decl_file + .byte 1 # DW_AT_decl_line + .long 137 # DW_AT_type + .byte 0 # End Of Children Mark + .byte 4 # Abbrev [4] 0x3e:0x47 DW_TAG_subprogram + .byte 1 # DW_AT_low_pc + .long .Lfunc_end1-.Lfunc_begin1 # DW_AT_high_pc + .byte 1 # DW_AT_frame_base + .byte 87 + # DW_AT_call_all_calls + .byte 5 # DW_AT_name + .byte 0 # DW_AT_decl_file + .byte 4 # DW_AT_decl_line + .long 133 # DW_AT_type + # DW_AT_external + .byte 5 # Abbrev [5] 0x4d:0x9 DW_TAG_formal_parameter + .byte 0 # DW_AT_location + .byte 8 # DW_AT_name + .byte 0 # DW_AT_decl_file + .byte 4 # DW_AT_decl_line + .long 133 # DW_AT_type + .byte 5 # Abbrev [5] 0x56:0x9 DW_TAG_formal_parameter + .byte 1 # DW_AT_location + .byte 9 # DW_AT_name + .byte 0 # DW_AT_decl_file + .byte 4 # DW_AT_decl_line + .long 142 # DW_AT_type + .byte 6 # Abbrev [6] 0x5f:0xb DW_TAG_variable + .byte 2 # DW_AT_location + .byte 145 + .byte 4 + .byte 7 # DW_AT_name + .byte 0 # DW_AT_decl_file + .byte 5 # DW_AT_decl_line + .long 133 # DW_AT_type + .byte 7 # Abbrev [7] 0x6a:0xd DW_TAG_call_site + .long 39 # DW_AT_call_origin + .byte 2 # DW_AT_call_return_pc + .byte 8 # Abbrev [8] 0x70:0x6 DW_TAG_call_site_parameter + .byte 1 # DW_AT_location + .byte 85 + .byte 2 # DW_AT_call_value + .byte 126 + .byte 0 + .byte 0 # End Of Children Mark + .byte 7 # Abbrev [7] 0x77:0xd DW_TAG_call_site + .long 39 # DW_AT_call_origin + .byte 3 # DW_AT_call_return_pc + .byte 8 # Abbrev [8] 0x7d:0x6 DW_TAG_call_site_parameter + .byte 1 # DW_AT_location + .byte 85 + .byte 2 # DW_AT_call_value + .byte 126 + .byte 0 + .byte 0 # End Of Children Mark + .byte 0 # End Of Children Mark + .byte 9 # Abbrev [9] 0x85:0x4 DW_TAG_base_type + .byte 6 # DW_AT_name + .byte 5 # DW_AT_encoding + .byte 4 # DW_AT_byte_size + .byte 10 # Abbrev [10] 0x89:0x5 DW_TAG_pointer_type + .long 133 # DW_AT_type + .byte 10 # Abbrev [10] 0x8e:0x5 DW_TAG_pointer_type + .long 147 # DW_AT_type + .byte 10 # Abbrev [10] 0x93:0x5 DW_TAG_pointer_type + .long 152 # DW_AT_type + .byte 9 # Abbrev [9] 0x98:0x4 DW_TAG_base_type + .byte 10 # DW_AT_name + .byte 6 # DW_AT_encoding + .byte 1 # DW_AT_byte_size + .byte 0 # End Of Children Mark +.Ldebug_info_end0: + .section .debug_str_offsets,"",@progbits + .long 48 # Length of String Offsets Set + .short 5 + .short 0 +.Lstr_offsets_base0: + .section .debug_str,"MS",@progbits,1 +.Linfo_string0: + .asciz "clang version 19.0.0git (git@github.com:ayermolo/llvm-project.git a1e412af2bf4bf613021f72205f249ab2469f08b)" # string offset=0 +.Linfo_string1: + .asciz "main.cpp" # string offset=108 +.Linfo_string2: + .asciz "/repro" # string offset=117 +.Linfo_string3: + .asciz "_Z3usePi" # string offset=161 +.Linfo_string4: + .asciz "use" # string offset=170 +.Linfo_string5: + .asciz "main" # string offset=174 +.Linfo_string6: + .asciz "int" # string offset=179 +.Linfo_string7: + .asciz "x" # string offset=183 +.Linfo_string8: + .asciz "argc" # string offset=185 +.Linfo_string9: + .asciz "argv" # string offset=190 +.Linfo_string10: + .asciz "char" # string offset=195 + .section .debug_str_offsets,"",@progbits + .long .Linfo_string0 + .long .Linfo_string1 + .long .Linfo_string2 + .long .Linfo_string3 + .long .Linfo_string4 + .long .Linfo_string5 + .long .Linfo_string6 + .long .Linfo_string7 + .long .Linfo_string8 + .long .Linfo_string9 + .long .Linfo_string10 + .section .debug_addr,"",@progbits + .long .Ldebug_addr_end0-.Ldebug_addr_start0 # Length of contribution +.Ldebug_addr_start0: + .short 5 # DWARF version number + .byte 8 # Address size + .byte 0 # Segment selector size +.Laddr_table_base0: + .quad .Lfunc_begin0 + .quad .Lfunc_begin1 + .quad .Ltmp3 + .quad .Ltmp4 +.Ldebug_addr_end0: + .ident "clang version 19.0.0git (git@github.com:ayermolo/llvm-project.git a1e412af2bf4bf613021f72205f249ab2469f08b)" + .section ".note.GNU-stack","",@progbits + .addrsig + .section .debug_line,"",@progbits +.Lline_table_start0: |