# REQUIRES: webassembly-registered-target # Test that DWARF tombstones are correctly detected/respected in wasm # 32 bit object files. # The test case was produced by the following steps: # # // test-clang.cpp # void foo() { # } # # 1) clang --target=wasm32 -S -g test-clang.cpp # -o Inputs/wasm-32bit-tombstone.s # # 2) Creating a single function, tombstoning it in the assembly, by # manually changing the DW_AT_low_pc for the DW_TAG_subprogram: # .Lfunc_begin0 to 0xffffffff to mark the function as dead code: # # .int8 2 # Abbrev [2] 0x26:0x1b DW_TAG_subprogram # .int32 .Lfunc_begin0 # DW_AT_low_pc <--------- # .int32 .Lfunc_end0-.Lfunc_begin0 # DW_AT_high_pc # .int8 2 # Abbrev [2] 0x26:0x1b DW_TAG_subprogram # .int32 0xffffffff # DW_AT_low_pc <--------- # .int32 .Lfunc_end0-.Lfunc_begin0 # DW_AT_high_pc # RUN: llvm-mc -arch=wasm32 -filetype=obj \ # RUN: %p/wasm-32bit-tombstone.s \ # RUN: -o %t.wasm-32bit-tombstone.wasm # RUN: llvm-debuginfo-analyzer --select-elements=Discarded \ # RUN: --print=elements \ # RUN: %t.wasm-32bit-tombstone.wasm 2>&1 | \ # RUN: FileCheck --strict-whitespace -check-prefix=ONE %s # ONE: Logical View: # ONE-NEXT: {File} '{{.*}}wasm-32bit-tombstone.wasm' # ONE-EMPTY: # ONE-NEXT: {CompileUnit} 'test-clang.cpp' # ONE-NEXT: {Function} not_inlined 'foo' -> 'void' # RUN: llvm-dwarfdump --debug-info %t.wasm-32bit-tombstone.wasm | \ # RUN: FileCheck %s --check-prefix=TWO # TWO: DW_TAG_subprogram # TWO-NEXT: DW_AT_low_pc (dead code) # TWO-NEXT: DW_AT_high_pc # TWO-NEXT: DW_AT_name ("foo") .text .file "test-clang.cpp" .functype _Z3foov () -> () .section .text._Z3foov,"",@ _Z3foov: # @_Z3foov .Lfunc_begin0: .functype _Z3foov () -> () return end_function .Lfunc_end0: # -- End function .section .debug_abbrev,"",@ .int8 1 # Abbreviation Code .int8 17 # DW_TAG_compile_unit .int8 1 # DW_CHILDREN_yes .int8 3 # DW_AT_name .int8 14 # DW_FORM_strp .int8 17 # DW_AT_low_pc .int8 1 # DW_FORM_addr .int8 18 # DW_AT_high_pc .int8 6 # DW_FORM_data4 .int8 0 # EOM(1) .int8 0 # EOM(2) .int8 2 # Abbreviation Code .int8 46 # DW_TAG_subprogram .int8 0 # DW_CHILDREN_no .int8 17 # DW_AT_low_pc .int8 1 # DW_FORM_addr .int8 18 # DW_AT_high_pc .int8 6 # DW_FORM_data4 .int8 3 # DW_AT_name .int8 14 # DW_FORM_strp .int8 0 # EOM(1) .int8 0 # EOM(2) .int8 0 # EOM(3) .section .debug_info,"",@ .Lcu_begin0: .int32 .Ldebug_info_end0-.Ldebug_info_start0 # Length of Unit .Ldebug_info_start0: .int16 4 # DWARF version number .int32 .debug_abbrev0 # Offset Into Abbrev. Section .int8 4 # Address Size (in bytes) .int8 1 # Abbrev [1] 0xb:0x37 DW_TAG_compile_unit .int32 .Linfo_string1 # DW_AT_name .int32 .Lfunc_begin0 # DW_AT_low_pc .int32 .Lfunc_end0-.Lfunc_begin0 # DW_AT_high_pc .int8 2 # Abbrev [2] 0x26:0x1b DW_TAG_subprogram .int32 0xffffffff # DW_AT_low_pc .int32 .Lfunc_end0-.Lfunc_begin0 # DW_AT_high_pc .int32 .Linfo_string4 # DW_AT_name .int8 0 # End Of Children Mark .Ldebug_info_end0: .section .debug_str,"S",@ .Linfo_string1: .asciz "test-clang.cpp" # string offset=176 .Linfo_string4: .asciz "foo" # string offset=241 .ident "clang version 19.0.0"