From 24d7fafc750cc5dc8e75690cd6aaee89be45b81a Mon Sep 17 00:00:00 2001 From: Paul Robinson Date: Wed, 24 Oct 2018 21:51:55 +0000 Subject: [PATCH] Make llvm-dwarfdump -name work on type units. Differential Revision: https://reviews.llvm.org/D53672 llvm-svn: 345203 --- test/tools/llvm-dwarfdump/X86/typeunit-name.s | 100 ++++++++++++++++++ tools/llvm-dwarfdump/llvm-dwarfdump.cpp | 4 +- 2 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 test/tools/llvm-dwarfdump/X86/typeunit-name.s diff --git a/test/tools/llvm-dwarfdump/X86/typeunit-name.s b/test/tools/llvm-dwarfdump/X86/typeunit-name.s new file mode 100644 index 00000000000..7b60ac96ffe --- /dev/null +++ b/test/tools/llvm-dwarfdump/X86/typeunit-name.s @@ -0,0 +1,100 @@ +# Demonstrate that -name works with type units. +# RUN: llvm-mc -triple x86_64-unknown-linux %s -filetype=obj -o %t.o +# RUN: llvm-dwarfdump -name=V4_type_unit -name=V5_split_type_unit %t.o | FileCheck %s +# +# The names should appear twice, once for the unit and once for the type DIE, +# because we give them the same name. +# CHECK: V4_type_unit +# CHECK: V4_type_unit +# CHECK: V5_split_type_unit +# CHECK: V5_split_type_unit + + .section .debug_str,"MS",@progbits,1 +str_TU_4: + .asciz "V4_type_unit" + + .section .debug_str.dwo,"MS",@progbits,1 +dwo_TU_5: + .asciz "V5_split_type_unit" + +# Abbrev section for the normal type unit. + .section .debug_abbrev,"",@progbits + .byte 0x01 # Abbrev code + .byte 0x41 # DW_TAG_type_unit + .byte 0x01 # DW_CHILDREN_yes + .byte 0x03 # DW_AT_name + .byte 0x0e # DW_FORM_strp + .byte 0x00 # EOM(1) + .byte 0x00 # EOM(2) + .byte 0x02 # Abbrev code + .byte 0x13 # DW_TAG_structure_type + .byte 0x00 # DW_CHILDREN_no (no members) + .byte 0x03 # DW_AT_name + .byte 0x0e # DW_FORM_strp + .byte 0x00 # EOM(1) + .byte 0x00 # EOM(2) + .byte 0x00 # EOM(3) + +# And a .dwo copy for the .dwo section. + .section .debug_abbrev.dwo,"",@progbits + .byte 0x01 # Abbrev code + .byte 0x41 # DW_TAG_type_unit + .byte 0x01 # DW_CHILDREN_yes + .byte 0x03 # DW_AT_name + .byte 0x0e # DW_FORM_strp + .byte 0x00 # EOM(1) + .byte 0x00 # EOM(2) + .byte 0x02 # Abbrev code + .byte 0x13 # DW_TAG_structure_type + .byte 0x00 # DW_CHILDREN_no (no members) + .byte 0x03 # DW_AT_name + .byte 0x0e # DW_FORM_strp + .byte 0x00 # EOM(1) + .byte 0x00 # EOM(2) + .byte 0x00 # EOM(3) + + .section .debug_types,"",@progbits + +# DWARF v4 Type unit header. Normal/split are identical so we do only one. +TU_4_start: + .long TU_4_end-TU_4_version # Length of Unit +TU_4_version: + .short 4 # DWARF version number + .long .debug_abbrev # Offset Into Abbrev. Section + .byte 8 # Address Size (in bytes) + .quad 0x0011223344556677 # Type Signature + .long TU_4_type-TU_4_start # Type offset +# The type-unit DIE, which has a name. + .byte 1 + .long str_TU_4 +# The type DIE, which has the same name. +TU_4_type: + .byte 2 + .long str_TU_4 + .byte 0 # NULL + .byte 0 # NULL +TU_4_end: + + .section .debug_types.dwo,"",@progbits +# FIXME: DWARF v5 wants type units in .debug_info[.dwo] not .debug_types[.dwo]. + +# DWARF v5 split type unit header. +TU_split_5_start: + .long TU_split_5_end-TU_split_5_version # Length of Unit +TU_split_5_version: + .short 5 # DWARF version number + .byte 6 # DWARF Unit Type + .byte 8 # Address Size (in bytes) + .long .debug_abbrev.dwo # Offset Into Abbrev. Section + .quad 0x8899aabbccddeeff # Type Signature + .long TU_split_5_type-TU_split_5_start # Type offset +# The type-unit DIE, which has a name. + .byte 1 + .long dwo_TU_5 +# The type DIE, which has the same name. +TU_split_5_type: + .byte 2 + .long dwo_TU_5 + .byte 0 # NULL + .byte 0 # NULL +TU_split_5_end: diff --git a/tools/llvm-dwarfdump/llvm-dwarfdump.cpp b/tools/llvm-dwarfdump/llvm-dwarfdump.cpp index 0ed86964089..d9e8e36efe5 100644 --- a/tools/llvm-dwarfdump/llvm-dwarfdump.cpp +++ b/tools/llvm-dwarfdump/llvm-dwarfdump.cpp @@ -422,8 +422,8 @@ static bool dumpObjectFile(ObjectFile &Obj, DWARFContext &DICtx, Twine Filename, for (auto name : Name) Names.insert((IgnoreCase && !UseRegex) ? StringRef(name).lower() : name); - filterByName(Names, DICtx.compile_units(), OS); - filterByName(Names, DICtx.dwo_compile_units(), OS); + filterByName(Names, DICtx.normal_units(), OS); + filterByName(Names, DICtx.dwo_units(), OS); return true; }