diff --git a/bolt/lib/Rewrite/DWARFRewriter.cpp b/bolt/lib/Rewrite/DWARFRewriter.cpp --- a/bolt/lib/Rewrite/DWARFRewriter.cpp +++ b/bolt/lib/Rewrite/DWARFRewriter.cpp @@ -463,28 +463,31 @@ ? BC.getBinaryFunctionContainingAddress( RangesOrError->front().LowPC) : nullptr; - DebugAddressRangesVector OutputRanges; bool ErrorState = false; + std::optional NewLowPC; if (Function) { - OutputRanges = Function->translateInputToOutputRanges(*RangesOrError); + DebugAddressRangesVector OutputRanges = + Function->translateInputToOutputRanges(*RangesOrError); LLVM_DEBUG(if (OutputRanges.empty() != RangesOrError->empty()) { dbgs() << "BOLT-DEBUG: problem with DIE at 0x" << Twine::utohexstr(DIE.getOffset()) << " in CU at 0x" << Twine::utohexstr(Unit.getOffset()) << '\n'; }); - + if (!OutputRanges.empty()) + NewLowPC = OutputRanges.front().LowPC; RangesSectionOffset = RangesSectionWriter.addRanges( std::move(OutputRanges), CachedRanges); } else if (!RangesOrError) { ErrorState = true; consumeError(RangesOrError.takeError()); } + uint64_t LowPCToUse = 0; if (!ErrorState && RangesOrError.get().size() == 1 && RangesOrError.get().begin()->LowPC == RangesOrError.get().begin()->HighPC) { - if (!OutputRanges.empty()) - LowPCToUse = OutputRanges.front().LowPC; + if (NewLowPC) + LowPCToUse = NewLowPC.value(); else LowPCToUse = RangesOrError.get().begin()->LowPC; } diff --git a/bolt/test/X86/dwarf4-size-0-inlined_subroutine.s b/bolt/test/X86/dwarf4-size-0-inlined_subroutine.s --- a/bolt/test/X86/dwarf4-size-0-inlined_subroutine.s +++ b/bolt/test/X86/dwarf4-size-0-inlined_subroutine.s @@ -1,94 +1,139 @@ # REQUIRES: system-linux # RUN: llvm-mc -dwarf-version=4 -filetype=obj -triple x86_64-unknown-linux %s -o %tmain.o -# RUN: %clang %cflags -dwarf-5 %tmain.o -o %t.exe -Wl,-q -# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections -# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.bolt | FileCheck --check-prefix=CHECK %s +# RUN: %clang %cflags -dwarf-4 %tmain.o -o %t.exe -Wl,-q +# RUN: llvm-bolt %t.exe -o %t.bolt --update-debug-sections --use-old-text +# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.bolt > %t.txt +# RUN: llvm-dwarfdump --show-form --verbose --debug-info %t.exe >> %t.txt +# RUN: cat %t.txt | FileCheck --check-prefix=CHECK %s -# CHECK: DW_TAG_inlined_subroutine +# CHECK: DW_TAG_inlined_subroutine # CHECK: DW_AT_low_pc [DW_FORM_addr] (0x[[#%.16x,ADDR:]]) -# CHECK: DW_AT_ranges [DW_FORM_sec_offset] +# CHECK: DW_AT_ranges [DW_FORM_sec_offset] # CHECK-NEXT: [0x[[#ADDR]], 0x[[#ADDR]]) +# CHECK: DW_TAG_inlined_subroutine +# CHECK-NOT: DW_AT_low_pc [DW_FORM_addr] (0x[[#ADDR]]) + # Testing BOLT handles correctly when size of DW_AT_inlined_subroutine is 0. # In other words DW_AT_high_pc is 0 or DW_AT_low_pc == DW_AT_high_pc. # Modified assembly manually to set DW_AT_high_pc to 0. +# clang++ -g2 -gdwarf-4 main.cpp -O1 -S -o main4.s + # static int helper(int i) { # return ++i; # } -# +# void may_not_exist(void) __attribute__ ((weak)); # int main(int argc, char *argv[]) { -# return helper(argc); +# if (may_not_exist) +# may_not_exist(); +# int j = 0; +# [[clang::always_inline]] j = helper(argc); +# return j; # } + .text .file "main.cpp" - .globl _Z6helperi # -- Begin function _Z6helperi - .p2align 4, 0x90 - .type _Z6helperi,@function -_Z6helperi: # @_Z6helperi -.Lfunc_begin0: - .file 1 "." "main.cpp" - .loc 1 1 0 # main.cpp:1:0 - .cfi_startproc -# %bb.0: # %entry - #DEBUG_VALUE: helper:i <- $edi - # kill: def $edi killed $edi def $rdi - .loc 1 2 10 prologue_end # main.cpp:2:10 - leal 1(%rdi), %eax -.Ltmp0: - #DEBUG_VALUE: helper:i <- $eax - .loc 1 2 3 is_stmt 0 # main.cpp:2:3 - retq -.Ltmp1: -.Lfunc_end0: - .size _Z6helperi, .Lfunc_end0-_Z6helperi - .cfi_endproc - # -- End function .globl main # -- Begin function main .p2align 4, 0x90 .type main,@function main: # @main -.Lfunc_begin1: - .loc 1 5 0 is_stmt 1 # main.cpp:5:0 +.Lfunc_begin0: + .file 1 "." "main.cpp" + .loc 1 5 0 # main.cpp:5:0 .cfi_startproc # %bb.0: # %entry #DEBUG_VALUE: main:argc <- $edi #DEBUG_VALUE: main:argv <- $rsi - #DEBUG_VALUE: helper:i <- $edi - # kill: def $edi killed $edi def $rdi - .loc 1 2 10 prologue_end # main.cpp:2:10 - leal 1(%rdi), %eax + pushq %rbx + .cfi_def_cfa_offset 16 + .cfi_offset %rbx, -16 + movl %edi, %ebx +.Ltmp0: + .loc 1 6 7 prologue_end # main.cpp:6:7 + cmpq $0, _Z13may_not_existv@GOTPCREL(%rip) + je .LBB0_2 +.Ltmp1: +# %bb.1: # %if.then + #DEBUG_VALUE: main:argc <- $ebx + #DEBUG_VALUE: main:argv <- $rsi + .loc 1 7 5 # main.cpp:7:5 + callq _Z13may_not_existv@PLT .Ltmp2: + #DEBUG_VALUE: main:argv <- [DW_OP_LLVM_entry_value 1] $rsi +.LBB0_2: # %if.end + #DEBUG_VALUE: main:argc <- $ebx + #DEBUG_VALUE: main:argv <- [DW_OP_LLVM_entry_value 1] $rsi + #DEBUG_VALUE: main:j <- 0 + #DEBUG_VALUE: helper:i <- $ebx + .loc 1 2 10 # main.cpp:2:10 + incl %ebx +.Ltmp3: + #DEBUG_VALUE: main:argc <- [DW_OP_LLVM_entry_value 1] $edi + #DEBUG_VALUE: helper:i <- $ebx + #DEBUG_VALUE: main:j <- $ebx + .loc 1 10 3 # main.cpp:10:3 + movl %ebx, %eax + popq %rbx +.Ltmp4: #DEBUG_VALUE: helper:i <- $eax - .loc 1 6 3 # main.cpp:6:3 + #DEBUG_VALUE: main:j <- $eax + .cfi_def_cfa_offset 8 retq -.Ltmp3: -.Lfunc_end1: - .size main, .Lfunc_end1-main +.Ltmp5: +.Lfunc_end0: + .size main, .Lfunc_end0-main .cfi_endproc # -- End function .section .debug_loc,"",@progbits .Ldebug_loc0: .quad .Lfunc_begin0-.Lfunc_begin0 - .quad .Ltmp0-.Lfunc_begin0 + .quad .Ltmp1-.Lfunc_begin0 .short 1 # Loc expr size .byte 85 # super-register DW_OP_reg5 - .quad .Ltmp0-.Lfunc_begin0 - .quad .Lfunc_end0-.Lfunc_begin0 + .quad .Ltmp1-.Lfunc_begin0 + .quad .Ltmp3-.Lfunc_begin0 .short 1 # Loc expr size - .byte 80 # super-register DW_OP_reg0 + .byte 83 # super-register DW_OP_reg3 + .quad .Ltmp3-.Lfunc_begin0 + .quad .Lfunc_end0-.Lfunc_begin0 + .short 4 # Loc expr size + .byte 243 # DW_OP_GNU_entry_value + .byte 1 # 1 + .byte 85 # super-register DW_OP_reg5 + .byte 159 # DW_OP_stack_value .quad 0 .quad 0 .Ldebug_loc1: - .quad .Lfunc_begin1-.Lfunc_begin0 + .quad .Lfunc_begin0-.Lfunc_begin0 .quad .Ltmp2-.Lfunc_begin0 .short 1 # Loc expr size - .byte 85 # super-register DW_OP_reg5 + .byte 84 # DW_OP_reg4 .quad .Ltmp2-.Lfunc_begin0 - .quad .Lfunc_end1-.Lfunc_begin0 + .quad .Lfunc_end0-.Lfunc_begin0 + .short 4 # Loc expr size + .byte 243 # DW_OP_GNU_entry_value + .byte 1 # 1 + .byte 84 # DW_OP_reg4 + .byte 159 # DW_OP_stack_value + .quad 0 + .quad 0 +.Ldebug_loc2: + .quad .Ltmp2-.Lfunc_begin0 + .quad .Ltmp3-.Lfunc_begin0 + .short 3 # Loc expr size + .byte 17 # DW_OP_consts + .byte 0 # 0 + .byte 159 # DW_OP_stack_value + .quad .Ltmp3-.Lfunc_begin0 + .quad .Ltmp4-.Lfunc_begin0 + .short 1 # Loc expr size + .byte 83 # super-register DW_OP_reg3 + .quad .Ltmp4-.Lfunc_begin0 + .quad .Lfunc_end0-.Lfunc_begin0 .short 1 # Loc expr size .byte 80 # super-register DW_OP_reg0 .quad 0 @@ -116,30 +161,6 @@ .byte 2 # Abbreviation Code .byte 46 # DW_TAG_subprogram .byte 1 # DW_CHILDREN_yes - .byte 17 # DW_AT_low_pc - .byte 1 # DW_FORM_addr - .byte 18 # DW_AT_high_pc - .byte 6 # DW_FORM_data4 - .byte 64 # DW_AT_frame_base - .byte 24 # DW_FORM_exprloc - .ascii "\227B" # DW_AT_GNU_all_call_sites - .byte 25 # DW_FORM_flag_present - .byte 49 # DW_AT_abstract_origin - .byte 19 # DW_FORM_ref4 - .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 23 # DW_FORM_sec_offset - .byte 49 # DW_AT_abstract_origin - .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 110 # DW_AT_linkage_name .byte 14 # DW_FORM_strp .byte 3 # DW_AT_name @@ -150,13 +171,11 @@ .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 32 # DW_AT_inline .byte 11 # DW_FORM_data1 .byte 0 # EOM(1) .byte 0 # EOM(2) - .byte 5 # Abbreviation Code + .byte 3 # Abbreviation Code .byte 5 # DW_TAG_formal_parameter .byte 0 # DW_CHILDREN_no .byte 3 # DW_AT_name @@ -169,7 +188,7 @@ .byte 19 # DW_FORM_ref4 .byte 0 # EOM(1) .byte 0 # EOM(2) - .byte 6 # Abbreviation Code + .byte 4 # Abbreviation Code .byte 36 # DW_TAG_base_type .byte 0 # DW_CHILDREN_no .byte 3 # DW_AT_name @@ -180,7 +199,7 @@ .byte 11 # DW_FORM_data1 .byte 0 # EOM(1) .byte 0 # EOM(2) - .byte 7 # Abbreviation Code + .byte 5 # Abbreviation Code .byte 46 # DW_TAG_subprogram .byte 1 # DW_CHILDREN_yes .byte 17 # DW_AT_low_pc @@ -203,11 +222,11 @@ .byte 25 # DW_FORM_flag_present .byte 0 # EOM(1) .byte 0 # EOM(2) - .byte 8 # Abbreviation Code + .byte 6 # Abbreviation Code .byte 5 # DW_TAG_formal_parameter .byte 0 # DW_CHILDREN_no .byte 2 # DW_AT_location - .byte 24 # DW_FORM_exprloc + .byte 23 # DW_FORM_sec_offset .byte 3 # DW_AT_name .byte 14 # DW_FORM_strp .byte 58 # DW_AT_decl_file @@ -218,7 +237,22 @@ .byte 19 # DW_FORM_ref4 .byte 0 # EOM(1) .byte 0 # EOM(2) - .byte 9 # Abbreviation Code + .byte 7 # Abbreviation Code + .byte 52 # DW_TAG_variable + .byte 0 # DW_CHILDREN_no + .byte 2 # DW_AT_location + .byte 23 # DW_FORM_sec_offset + .byte 3 # DW_AT_name + .byte 14 # DW_FORM_strp + .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 8 # Abbreviation Code .byte 29 # DW_TAG_inlined_subroutine .byte 1 # DW_CHILDREN_yes .byte 49 # DW_AT_abstract_origin @@ -235,7 +269,42 @@ .byte 11 # DW_FORM_data1 .byte 0 # EOM(1) .byte 0 # EOM(2) + .byte 9 # Abbreviation Code + .byte 5 # DW_TAG_formal_parameter + .byte 0 # DW_CHILDREN_no + .byte 2 # DW_AT_location + .byte 24 # DW_FORM_exprloc + .byte 49 # DW_AT_abstract_origin + .byte 19 # DW_FORM_ref4 + .byte 0 # EOM(1) + .byte 0 # EOM(2) .byte 10 # Abbreviation Code + .ascii "\211\202\001" # DW_TAG_GNU_call_site + .byte 0 # DW_CHILDREN_no + .byte 49 # DW_AT_abstract_origin + .byte 19 # DW_FORM_ref4 + .byte 17 # DW_AT_low_pc + .byte 1 # DW_FORM_addr + .byte 0 # EOM(1) + .byte 0 # EOM(2) + .byte 11 # Abbreviation Code + .byte 46 # DW_TAG_subprogram + .byte 0 # DW_CHILDREN_no + .byte 110 # DW_AT_linkage_name + .byte 14 # DW_FORM_strp + .byte 3 # DW_AT_name + .byte 14 # DW_FORM_strp + .byte 58 # DW_AT_decl_file + .byte 11 # DW_FORM_data1 + .byte 59 # DW_AT_decl_line + .byte 11 # DW_FORM_data1 + .byte 60 # DW_AT_declaration + .byte 25 # DW_FORM_flag_present + .byte 63 # DW_AT_external + .byte 25 # DW_FORM_flag_present + .byte 0 # EOM(1) + .byte 0 # EOM(2) + .byte 12 # Abbreviation Code .byte 15 # DW_TAG_pointer_type .byte 0 # DW_CHILDREN_no .byte 73 # DW_AT_type @@ -250,115 +319,126 @@ .short 4 # DWARF version number .long .debug_abbrev # Offset Into Abbrev. Section .byte 8 # Address Size (in bytes) - .byte 1 # Abbrev [1] 0xb:0xc3 DW_TAG_compile_unit + .byte 1 # Abbrev [1] 0xb:0xcf DW_TAG_compile_unit .long .Linfo_string0 # DW_AT_producer .short 33 # DW_AT_language .long .Linfo_string1 # DW_AT_name .long .Lline_table_start0 # DW_AT_stmt_list .long .Linfo_string2 # DW_AT_comp_dir .quad .Lfunc_begin0 # DW_AT_low_pc - .long .Lfunc_end1-.Lfunc_begin0 # DW_AT_high_pc - .byte 2 # Abbrev [2] 0x2a:0x1d DW_TAG_subprogram - .quad .Lfunc_begin0 # DW_AT_low_pc .long .Lfunc_end0-.Lfunc_begin0 # DW_AT_high_pc - .byte 1 # DW_AT_frame_base - .byte 87 - # DW_AT_GNU_all_call_sites - .long 71 # DW_AT_abstract_origin - .byte 3 # Abbrev [3] 0x3d:0x9 DW_TAG_formal_parameter - .long .Ldebug_loc0 # DW_AT_location - .long 87 # DW_AT_abstract_origin - .byte 0 # End Of Children Mark - .byte 4 # Abbrev [4] 0x47:0x1c DW_TAG_subprogram + .byte 2 # Abbrev [2] 0x2a:0x1c DW_TAG_subprogram .long .Linfo_string3 # DW_AT_linkage_name .long .Linfo_string4 # DW_AT_name .byte 1 # DW_AT_decl_file .byte 1 # DW_AT_decl_line - .long 99 # DW_AT_type - # DW_AT_external + .long 70 # DW_AT_type .byte 1 # DW_AT_inline - .byte 5 # Abbrev [5] 0x57:0xb DW_TAG_formal_parameter + .byte 3 # Abbrev [3] 0x3a:0xb DW_TAG_formal_parameter .long .Linfo_string6 # DW_AT_name .byte 1 # DW_AT_decl_file .byte 1 # DW_AT_decl_line - .long 99 # DW_AT_type + .long 70 # DW_AT_type .byte 0 # End Of Children Mark - .byte 6 # Abbrev [6] 0x63:0x7 DW_TAG_base_type + .byte 4 # Abbrev [4] 0x46:0x7 DW_TAG_base_type .long .Linfo_string5 # DW_AT_name .byte 5 # DW_AT_encoding .byte 4 # DW_AT_byte_size - .byte 7 # Abbrev [7] 0x6a:0x52 DW_TAG_subprogram - .quad .Lfunc_begin1 # DW_AT_low_pc - .long .Lfunc_end1-.Lfunc_begin1 # DW_AT_high_pc + .byte 5 # Abbrev [5] 0x4d:0x70 DW_TAG_subprogram + .quad .Lfunc_begin0 # DW_AT_low_pc + .long .Lfunc_end0-.Lfunc_begin0 # DW_AT_high_pc .byte 1 # DW_AT_frame_base .byte 87 # DW_AT_GNU_all_call_sites - .long .Linfo_string7 # DW_AT_name + .long .Linfo_string9 # DW_AT_name .byte 1 # DW_AT_decl_file .byte 5 # DW_AT_decl_line - .long 99 # DW_AT_type + .long 70 # DW_AT_type # DW_AT_external - .byte 8 # Abbrev [8] 0x83:0xd DW_TAG_formal_parameter - .byte 1 # DW_AT_location - .byte 85 - .long .Linfo_string8 # DW_AT_name + .byte 6 # Abbrev [6] 0x66:0xf DW_TAG_formal_parameter + .long .Ldebug_loc0 # DW_AT_location + .long .Linfo_string10 # DW_AT_name .byte 1 # DW_AT_decl_file .byte 5 # DW_AT_decl_line - .long 99 # DW_AT_type - .byte 8 # Abbrev [8] 0x90:0xd DW_TAG_formal_parameter - .byte 1 # DW_AT_location - .byte 84 - .long .Linfo_string9 # DW_AT_name + .long 70 # DW_AT_type + .byte 6 # Abbrev [6] 0x75:0xf DW_TAG_formal_parameter + .long .Ldebug_loc1 # DW_AT_location + .long .Linfo_string11 # DW_AT_name .byte 1 # DW_AT_decl_file .byte 5 # DW_AT_decl_line - .long 188 # DW_AT_type - .byte 9 # Abbrev [9] 0x9d:0x1e DW_TAG_inlined_subroutine - .long 71 # DW_AT_abstract_origin - .quad .Lfunc_begin1 # DW_AT_low_pc - .long 0 # DW_AT_high_pc # This was manually modified to be 0 + .long 200 # DW_AT_type + .byte 7 # Abbrev [7] 0x84:0xf DW_TAG_variable + .long .Ldebug_loc2 # DW_AT_location + .long .Linfo_string13 # DW_AT_name + .byte 1 # DW_AT_decl_file + .byte 8 # DW_AT_decl_line + .long 70 # DW_AT_type + .byte 8 # Abbrev [8] 0x93:0x1c DW_TAG_inlined_subroutine + .long 42 # DW_AT_abstract_origin + .quad .Ltmp2 # DW_AT_low_pc + .long 0 # DW_AT_high_pc Manually modified .byte 1 # DW_AT_call_file - .byte 6 # DW_AT_call_line - .byte 10 # DW_AT_call_column - .byte 3 # Abbrev [3] 0xb1:0x9 DW_TAG_formal_parameter - .long .Ldebug_loc1 # DW_AT_location - .long 87 # DW_AT_abstract_origin + .byte 9 # DW_AT_call_line + .byte 32 # DW_AT_call_column + .byte 9 # Abbrev [9] 0xa7:0x7 DW_TAG_formal_parameter + .byte 1 # DW_AT_location + .byte 83 + .long 58 # DW_AT_abstract_origin .byte 0 # End Of Children Mark + .byte 10 # Abbrev [10] 0xaf:0xd DW_TAG_GNU_call_site + .long 189 # DW_AT_abstract_origin + .quad .Ltmp2 # DW_AT_low_pc .byte 0 # End Of Children Mark - .byte 10 # Abbrev [10] 0xbc:0x5 DW_TAG_pointer_type - .long 193 # DW_AT_type - .byte 10 # Abbrev [10] 0xc1:0x5 DW_TAG_pointer_type - .long 198 # DW_AT_type - .byte 6 # Abbrev [6] 0xc6:0x7 DW_TAG_base_type - .long .Linfo_string10 # DW_AT_name + .byte 11 # Abbrev [11] 0xbd:0xb DW_TAG_subprogram + .long .Linfo_string7 # DW_AT_linkage_name + .long .Linfo_string8 # DW_AT_name + .byte 1 # DW_AT_decl_file + .byte 4 # DW_AT_decl_line + # DW_AT_declaration + # DW_AT_external + .byte 12 # Abbrev [12] 0xc8:0x5 DW_TAG_pointer_type + .long 205 # DW_AT_type + .byte 12 # Abbrev [12] 0xcd:0x5 DW_TAG_pointer_type + .long 210 # DW_AT_type + .byte 4 # Abbrev [4] 0xd2:0x7 DW_TAG_base_type + .long .Linfo_string12 # 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,"MS",@progbits,1 .Linfo_string0: - .asciz "clang version 15.0.0" # string offset=0 + .asciz "clang version 16.0.0" # string offset=0 .Linfo_string1: - .asciz "main.cpp" # string offset=134 + .asciz "main.cpp" # string offset=105 .Linfo_string2: - .asciz "." # string offset=143 + .asciz "." # string offset=114 .Linfo_string3: - .asciz "_Z6helperi" # string offset=181 + .asciz "_ZL6helperi" # string offset=152 .Linfo_string4: - .asciz "helper" # string offset=192 + .asciz "helper" # string offset=164 .Linfo_string5: - .asciz "int" # string offset=199 + .asciz "int" # string offset=171 .Linfo_string6: - .asciz "i" # string offset=203 + .asciz "i" # string offset=175 .Linfo_string7: - .asciz "main" # string offset=205 + .asciz "_Z13may_not_existv" # string offset=177 .Linfo_string8: - .asciz "argc" # string offset=210 + .asciz "may_not_exist" # string offset=196 .Linfo_string9: - .asciz "argv" # string offset=215 + .asciz "main" # string offset=210 .Linfo_string10: - .asciz "char" # string offset=220 - .ident "clang version 15.0.0" + .asciz "argc" # string offset=215 +.Linfo_string11: + .asciz "argv" # string offset=220 +.Linfo_string12: + .asciz "char" # string offset=225 +.Linfo_string13: + .asciz "j" # string offset=230 + .weak _Z13may_not_existv + .ident "clang version 16.0.0" .section ".note.GNU-stack","",@progbits .addrsig + .addrsig_sym _Z13may_not_existv .section .debug_line,"",@progbits .Lline_table_start0: