Files
clang-p2996/llvm/test/tools/llvm-dwarfdump/X86/debugloc.s
Pavel Labath 0908093977 DWARFDebugLoc(v4): Add an incremental parsing function
Summary:
This adds a visitLocationList function to the DWARF v4 location lists,
similar to what already exists for DWARF v5. It follows the approach
outlined in previous patches (D69672), where the parsed form is always
stored in the DWARF v5 format, which makes it easier for generic code to
be built on top of that. v4 location lists are "upgraded" during
parsing, and then this upgrade is undone while dumping.

Both "inline" and section-based dumping is rewritten to reuse the
existing "generic" location list dumper. This means that the output
format is consistent for all location lists (the only thing one needs to
implement is the function which prints the "raw" form of a location
list), and that debug_loc dumping correctly processes base address
selection entries, etc.

The previous existing debug_loc functionality (e.g.,
parseOneLocationList) is rewritten on top of the new API, but it is not
removed as there is still code which uses them. This will be done in
follow-up patches, after I build the API to access the "interpreted"
location lists in a generic way (as that is what those users really
want).

Reviewers: dblaikie, probinson, JDevlieghere, aprantl, SouraVX

Subscribers: hiraditya, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D69847
2019-11-15 13:38:00 +01:00

285 lines
11 KiB
ArmAsm

# RUN: llvm-mc %s -filetype obj -triple x86_64-linux-elf -o - \
# RUN: | llvm-dwarfdump --debug-loc - \
# RUN: | FileCheck %s
# RUN: llvm-mc %s -filetype obj -triple x86_64-linux-elf -o - \
# RUN: | llvm-dwarfdump --verify - \
# RUN: | FileCheck %s --check-prefix VERIFY
# CHECK: .debug_loc contents:
# CHECK: 0x00000000:
# CHECK-NEXT: (0x0000000000000000, 0x0000000000000003): DW_OP_reg5 RDI
# CHECK-NEXT: (0x0000000000000003, 0x0000000000000004): DW_OP_reg0 RAX
# CHECK: 0x00000036:
# CHECK-NEXT: (0x0000000000000010, 0x0000000000000013): DW_OP_reg5 RDI
# CHECK-NEXT: (0x0000000000000013, 0x0000000000000014): DW_OP_reg0 RAX
# VERIFY: Verifying .debug_info Unit Header Chain
# VERIFY-NOT: DIE has invalid DW_AT_location encoding
# Source:
# int* foo(int* i) { return i; }
# int* bar(int* i) { return i; }
# Compile with:
# clang -g -O3 test.c -S -o debugloc.s
.text
.file "test.c"
.globl foo
.align 16, 0x90
.type foo,@function
foo: # @foo
.Lfunc_begin0:
.file 1 "test.c"
.loc 1 1 0 # test.c:1:0
.cfi_startproc
# %bb.0:
#DEBUG_VALUE: foo:i <- %RDI
.loc 1 2 3 prologue_end # test.c:2:3
movq %rdi, %rax
.Ltmp0:
#DEBUG_VALUE: foo:i <- %RAX
retq
.Ltmp1:
.Lfunc_end0:
.size foo, .Lfunc_end0-foo
.cfi_endproc
.globl bar
.align 16, 0x90
.type bar,@function
bar: # @bar
.Lfunc_begin1:
.loc 1 5 0 # test.c:5:0
.cfi_startproc
# %bb.0:
#DEBUG_VALUE: bar:i <- %RDI
.loc 1 6 3 prologue_end # test.c:6:3
movq %rdi, %rax
.Ltmp2:
#DEBUG_VALUE: bar:i <- %RAX
retq
.Ltmp3:
.Lfunc_end1:
.size bar, .Lfunc_end1-bar
.cfi_endproc
.section .debug_str,"MS",@progbits,1
.Linfo_string0:
.asciz "clang version 3.8.0-2ubuntu4 (tags/RELEASE_380/final)" # string offset=0
.Linfo_string1:
.asciz "test.c" # string offset=54
.Linfo_string2:
.asciz "/tmp" # string offset=61
.Linfo_string3:
.asciz "foo" # string offset=66
.Linfo_string4:
.asciz "int" # string offset=70
.Linfo_string5:
.asciz "bar" # string offset=74
.Linfo_string6:
.asciz "i" # string offset=78
.section .debug_loc,"",@progbits
.Ldebug_loc0:
.quad .Lfunc_begin0-.Lfunc_begin0
.quad .Ltmp0-.Lfunc_begin0
.short 1 # Loc expr size
.byte 85 # DW_OP_reg5
.quad .Ltmp0-.Lfunc_begin0
.quad .Lfunc_end0-.Lfunc_begin0
.short 1 # Loc expr size
.byte 80 # DW_OP_reg0
.quad 0
.quad 0
.Ldebug_loc1:
.quad .Lfunc_begin1-.Lfunc_begin0
.quad .Ltmp2-.Lfunc_begin0
.short 1 # Loc expr size
.byte 85 # DW_OP_reg5
.quad .Ltmp2-.Lfunc_begin0
.quad .Lfunc_end1-.Lfunc_begin0
.short 1 # Loc expr size
.byte 80 # DW_OP_reg0
.quad 0
.quad 0
.section .debug_abbrev,"",@progbits
.Lsection_abbrev:
.byte 1 # Abbreviation Code
.byte 17 # DW_TAG_compile_unit
.byte 1 # DW_CHILDREN_yes
.byte 37 # DW_AT_producer
.byte 14 # DW_FORM_strp
.byte 19 # DW_AT_language
.byte 5 # DW_FORM_data2
.byte 3 # DW_AT_name
.byte 14 # DW_FORM_strp
.byte 16 # DW_AT_stmt_list
.byte 23 # DW_FORM_sec_offset
.byte 27 # DW_AT_comp_dir
.byte 14 # DW_FORM_strp
.ascii "\341\177" # DW_AT_APPLE_optimized
.byte 25 # DW_FORM_flag_present
.byte 17 # DW_AT_low_pc
.byte 1 # DW_FORM_addr
.byte 18 # DW_AT_high_pc
.byte 6 # DW_FORM_data4
.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 1 # DW_FORM_addr
.byte 18 # DW_AT_high_pc
.byte 6 # DW_FORM_data4
.ascii "\347\177" # DW_AT_APPLE_omit_frame_ptr
.byte 25 # DW_FORM_flag_present
.byte 64 # DW_AT_frame_base
.byte 24 # DW_FORM_exprloc
.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 39 # DW_AT_prototyped
.byte 25 # DW_FORM_flag_present
.byte 73 # DW_AT_type
.byte 19 # DW_FORM_ref4
.byte 63 # DW_AT_external
.byte 25 # DW_FORM_flag_present
.ascii "\341\177" # DW_AT_APPLE_optimized
.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 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 4 # 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 5 # Abbreviation Code
.byte 36 # DW_TAG_base_type
.byte 0 # DW_CHILDREN_no
.byte 3 # DW_AT_name
.byte 14 # DW_FORM_strp
.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 0 # EOM(3)
.section .debug_info,"",@progbits
.Lsection_info:
.Lcu_begin0:
.long 133 # Length of Unit
.short 4 # DWARF version number
.long .Lsection_abbrev # Offset Into Abbrev. Section
.byte 8 # Address Size (in bytes)
.byte 1 # Abbrev [1] 0xb:0x7e DW_TAG_compile_unit
.long .Linfo_string0 # DW_AT_producer
.short 12 # DW_AT_language
.long .Linfo_string1 # DW_AT_name
.long .Lline_table_start0 # DW_AT_stmt_list
.long .Linfo_string2 # DW_AT_comp_dir
# DW_AT_APPLE_optimized
.quad .Lfunc_begin0 # DW_AT_low_pc
.long .Lfunc_end1-.Lfunc_begin0 # DW_AT_high_pc
.byte 2 # Abbrev [2] 0x2a:0x29 DW_TAG_subprogram
.quad .Lfunc_begin0 # DW_AT_low_pc
.long .Lfunc_end0-.Lfunc_begin0 # DW_AT_high_pc
# DW_AT_APPLE_omit_frame_ptr
.byte 1 # DW_AT_frame_base
.byte 87
.long .Linfo_string3 # DW_AT_name
.byte 1 # DW_AT_decl_file
.byte 1 # DW_AT_decl_line
# DW_AT_prototyped
.long 124 # DW_AT_type
# DW_AT_external
# DW_AT_APPLE_optimized
.byte 3 # Abbrev [3] 0x43:0xf DW_TAG_formal_parameter
.long .Ldebug_loc0 # DW_AT_location
.long .Linfo_string6 # DW_AT_name
.byte 1 # DW_AT_decl_file
.byte 1 # DW_AT_decl_line
.long 124 # DW_AT_type
.byte 0 # End Of Children Mark
.byte 2 # Abbrev [2] 0x53:0x29 DW_TAG_subprogram
.quad .Lfunc_begin1 # DW_AT_low_pc
.long .Lfunc_end1-.Lfunc_begin1 # DW_AT_high_pc
# DW_AT_APPLE_omit_frame_ptr
.byte 1 # DW_AT_frame_base
.byte 87
.long .Linfo_string5 # DW_AT_name
.byte 1 # DW_AT_decl_file
.byte 5 # DW_AT_decl_line
# DW_AT_prototyped
.long 124 # DW_AT_type
# DW_AT_external
# DW_AT_APPLE_optimized
.byte 3 # Abbrev [3] 0x6c:0xf DW_TAG_formal_parameter
.long .Ldebug_loc1 # DW_AT_location
.long .Linfo_string6 # DW_AT_name
.byte 1 # DW_AT_decl_file
.byte 5 # DW_AT_decl_line
.long 124 # DW_AT_type
.byte 0 # End Of Children Mark
.byte 4 # Abbrev [4] 0x7c:0x5 DW_TAG_pointer_type
.long 129 # DW_AT_type
.byte 5 # Abbrev [5] 0x81:0x7 DW_TAG_base_type
.long .Linfo_string4 # DW_AT_name
.byte 5 # DW_AT_encoding
.byte 4 # DW_AT_byte_size
.byte 0 # End Of Children Mark
.section .debug_ranges,"",@progbits
.Ldebug_range:
.section .debug_macinfo,"",@progbits
.byte 0 # End Of Macro List Mark
.section .debug_pubnames,"",@progbits
.long .LpubNames_end0-.LpubNames_begin0 # Length of Public Names Info
.LpubNames_begin0:
.short 2 # DWARF Version
.long .Lcu_begin0 # Offset of Compilation Unit Info
.long 137 # Compilation Unit Length
.long 42 # DIE offset
.asciz "foo" # External Name
.long 83 # DIE offset
.asciz "bar" # External Name
.long 0 # End Mark
.LpubNames_end0:
.section .debug_pubtypes,"",@progbits
.long .LpubTypes_end0-.LpubTypes_begin0 # Length of Public Types Info
.LpubTypes_begin0:
.short 2 # DWARF Version
.long .Lcu_begin0 # Offset of Compilation Unit Info
.long 137 # Compilation Unit Length
.long 129 # DIE offset
.asciz "int" # External Name
.long 0 # End Mark
.LpubTypes_end0:
.ident "clang version 3.8.0-2ubuntu4 (tags/RELEASE_380/final)"
.section ".note.GNU-stack","",@progbits
.section .debug_line,"",@progbits
.Lline_table_start0: