summaryrefslogtreecommitdiffstats
path: root/llvm/test/tools/llvm-dwarfdump
diff options
context:
space:
mode:
authorPavel Labath <labath@google.com>2018-06-13 08:14:27 +0000
committerPavel Labath <labath@google.com>2018-06-13 08:14:27 +0000
commit4adc88ed25b313b1dc6594f3b00d1a206f5449b6 (patch)
treebe04e2b6d57a26947082c18f4564d8a77fbab2d5 /llvm/test/tools/llvm-dwarfdump
parent2527c378c67bc274c0a93bb0fabbbabd95405699 (diff)
downloadbcm5719-llvm-4adc88ed25b313b1dc6594f3b00d1a206f5449b6.tar.gz
bcm5719-llvm-4adc88ed25b313b1dc6594f3b00d1a206f5449b6.zip
[DWARF/AccelTable] Remove getDIESectionOffset for DWARF v5 entries
Summary: This method was not correct for entries in DWO files as it assumed it could just add up the CU and DIE offsets to get the absolute DIE offset. This is not correct for the DWO files, as here the CU offset will reference the skeleton unit, whereas the DIE offset will be the offset in the full unit in the DWO file. Unfortunately, this means that we are not able to determine the absolute DIE offset using the information in the .debug_names section alone, which means we have to offload some of this work to the users of this class. To demonstrate how this can be done, I've added/fixed the ability to lookup entries using accelerator tables in DWO files in llvm-dwarfdump. To make this happen, I've needed to make two extra changes in other classes: - made the DWARFContext method to lookup a CU based on the section offset public. I've needed this functionality to lookup a CU, and this seems like a useful thing in general. - made DWARFUnit::getDWOId call extractDIEsIfNeeded. Before this, the DWOId was filled in only if the root DIE happened to be parsed before we called the accessor. Since the lazy parsing is supposed to happen under the hood, calling extractDIEsIfNeeded seems appropriate. Reviewers: JDevlieghere, aprantl, dblaikie Subscribers: mgrang, llvm-commits Differential Revision: https://reviews.llvm.org/D48009 llvm-svn: 334578
Diffstat (limited to 'llvm/test/tools/llvm-dwarfdump')
-rw-r--r--llvm/test/tools/llvm-dwarfdump/X86/debug-names-find-dwo.s162
1 files changed, 162 insertions, 0 deletions
diff --git a/llvm/test/tools/llvm-dwarfdump/X86/debug-names-find-dwo.s b/llvm/test/tools/llvm-dwarfdump/X86/debug-names-find-dwo.s
new file mode 100644
index 00000000000..a12aa2e90f1
--- /dev/null
+++ b/llvm/test/tools/llvm-dwarfdump/X86/debug-names-find-dwo.s
@@ -0,0 +1,162 @@
+# RUN: llvm-mc -triple x86_64-pc-linux %s -filetype=obj | \
+# RUN: llvm-dwarfdump -find=foobar - | FileCheck %s
+
+# CHECK: DW_TAG_variable
+# CHECK-NEXT: DW_AT_name ("foobar")
+
+ .text
+ .file "<stdin>"
+ .file 1 "/tmp/cu1.c"
+ .type foobar,@object # @foobar
+ .comm foobar,8,8
+ .section .debug_str,"MS",@progbits,1
+.Lskel_string0:
+ .asciz "foo.dwo" # string offset=0
+.Lskel_string1:
+ .asciz "/tmp" # string offset=8
+.Lskel_string2:
+ .asciz "foobar" # string offset=13
+ .section .debug_loc.dwo,"",@progbits
+ .section .debug_abbrev,"",@progbits
+ .byte 1 # Abbreviation Code
+ .byte 17 # DW_TAG_compile_unit
+ .byte 0 # DW_CHILDREN_no
+ .byte 16 # DW_AT_stmt_list
+ .byte 23 # DW_FORM_sec_offset
+ .ascii "\260B" # DW_AT_GNU_dwo_name
+ .byte 14 # DW_FORM_strp
+ .byte 27 # DW_AT_comp_dir
+ .byte 14 # DW_FORM_strp
+ .ascii "\261B" # DW_AT_GNU_dwo_id
+ .byte 7 # DW_FORM_data8
+ .ascii "\263B" # DW_AT_GNU_addr_base
+ .byte 23 # DW_FORM_sec_offset
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 0 # EOM(3)
+ .section .debug_info,"",@progbits
+.Lcu_begin0:
+ .long 32 # Length of Unit
+ .short 4 # DWARF version number
+ .long .debug_abbrev # Offset Into Abbrev. Section
+ .byte 8 # Address Size (in bytes)
+ .byte 1 # Abbrev [1] 0xb:0x19 DW_TAG_compile_unit
+ .long 0 # DW_AT_stmt_list
+ .long .Lskel_string0 # DW_AT_GNU_dwo_name
+ .long .Lskel_string1 # DW_AT_comp_dir
+ .quad -1328675031687321003 # DW_AT_GNU_dwo_id
+ .long .debug_addr # DW_AT_GNU_addr_base
+ .section .debug_ranges,"",@progbits
+ .section .debug_macinfo,"",@progbits
+ .byte 0 # End Of Macro List Mark
+ .section .debug_str.dwo,"MS",@progbits,1
+.Linfo_string0:
+ .asciz "foo.dwo" # string offset=0
+.Linfo_string1:
+ .asciz "clang version 7.0.0 (trunk 325496) (llvm/trunk 325732)" # string offset=8
+.Linfo_string2:
+ .asciz "/tmp/cu1.c" # string offset=63
+.Linfo_string3:
+ .asciz "foobar" # string offset=74
+ .section .debug_str_offsets.dwo,"",@progbits
+ .long 0
+ .long 8
+ .long 63
+ .long 74
+ .section .debug_info.dwo,"",@progbits
+ .long 34 # Length of Unit
+ .short 4 # DWARF version number
+ .long 0 # Offset Into Abbrev. Section
+ .byte 8 # Address Size (in bytes)
+ .byte 1 # Abbrev [1] 0xb:0x1b DW_TAG_compile_unit
+ .byte 0 # DW_AT_GNU_dwo_name
+ .byte 1 # DW_AT_producer
+ .short 12 # DW_AT_language
+ .byte 2 # DW_AT_name
+ .quad -1328675031687321003 # DW_AT_GNU_dwo_id
+ .byte 2 # Abbrev [2] 0x19:0xb DW_TAG_variable
+ .byte 3 # DW_AT_name
+ .long 36 # DW_AT_type
+ # DW_AT_external
+ .byte 1 # DW_AT_decl_file
+ .byte 1 # DW_AT_decl_line
+ .byte 2 # DW_AT_location
+ .byte 251
+ .byte 0
+ .byte 3 # Abbrev [3] 0x24:0x1 DW_TAG_pointer_type
+ .byte 0 # End Of Children Mark
+ .section .debug_abbrev.dwo,"",@progbits
+ .byte 1 # Abbreviation Code
+ .byte 17 # DW_TAG_compile_unit
+ .byte 1 # DW_CHILDREN_yes
+ .ascii "\260B" # DW_AT_GNU_dwo_name
+ .ascii "\202>" # DW_FORM_GNU_str_index
+ .byte 37 # DW_AT_producer
+ .ascii "\202>" # DW_FORM_GNU_str_index
+ .byte 19 # DW_AT_language
+ .byte 5 # DW_FORM_data2
+ .byte 3 # DW_AT_name
+ .ascii "\202>" # DW_FORM_GNU_str_index
+ .ascii "\261B" # DW_AT_GNU_dwo_id
+ .byte 7 # DW_FORM_data8
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 2 # Abbreviation Code
+ .byte 52 # DW_TAG_variable
+ .byte 0 # DW_CHILDREN_no
+ .byte 3 # DW_AT_name
+ .ascii "\202>" # DW_FORM_GNU_str_index
+ .byte 73 # DW_AT_type
+ .byte 19 # DW_FORM_ref4
+ .byte 63 # DW_AT_external
+ .byte 25 # DW_FORM_flag_present
+ .byte 58 # DW_AT_decl_file
+ .byte 11 # DW_FORM_data1
+ .byte 59 # DW_AT_decl_line
+ .byte 11 # DW_FORM_data1
+ .byte 2 # DW_AT_location
+ .byte 24 # DW_FORM_exprloc
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 3 # Abbreviation Code
+ .byte 15 # DW_TAG_pointer_type
+ .byte 0 # DW_CHILDREN_no
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 0 # EOM(3)
+ .section .debug_addr,"",@progbits
+ .quad foobar
+ .section .debug_names,"",@progbits
+ .long .Lnames_end0-.Lnames_start0 # Header: unit length
+.Lnames_start0:
+ .short 5 # Header: version
+ .short 0 # Header: padding
+ .long 1 # Header: compilation unit count
+ .long 0 # Header: local type unit count
+ .long 0 # Header: foreign type unit count
+ .long 1 # Header: bucket count
+ .long 1 # Header: name count
+ .long .Lnames_abbrev_end0-.Lnames_abbrev_start0 # Header: abbreviation table size
+ .long 8 # Header: augmentation string size
+ .ascii "LLVM0700" # Header: augmentation string
+ .long .Lcu_begin0 # Compilation unit 0
+ .long 1 # Bucket 0
+ .long -35364674 # Hash in Bucket 0
+ .long .Lskel_string2 # String in Bucket 0: foobar
+ .long .Lnames0-.Lnames_entries0 # Offset in Bucket 0
+.Lnames_abbrev_start0:
+ .byte 52 # Abbrev code
+ .byte 52 # DW_TAG_variable
+ .byte 3 # DW_IDX_die_offset
+ .byte 19 # DW_FORM_ref4
+ .byte 0 # End of abbrev
+ .byte 0 # End of abbrev
+ .byte 0 # End of abbrev list
+.Lnames_abbrev_end0:
+.Lnames_entries0:
+.Lnames0:
+ .byte 52 # Abbreviation code
+ .long 25 # DW_IDX_die_offset
+ .long 0 # End of list: foobar
+ .p2align 2
+.Lnames_end0:
OpenPOWER on IntegriCloud