From d4e375358221229320045c026978014d0a205c9f Mon Sep 17 00:00:00 2001 From: Adrian Prantl Date: Sat, 16 Sep 2017 17:28:00 +0000 Subject: [PATCH] llvm-dwarfdump: support a --show-children option This will print all children of a DIE when selectively printing only one DIE at a given offset. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@313464 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/DebugInfo/DIContext.h | 1 + lib/DebugInfo/DWARF/DWARFContext.cpp | 6 ++++-- .../llvm-dwarfdump/X86/debug_info_offset.test | 14 +++++++++++++- .../llvm-dwarfdump/X86/debug_type_offset.test | 9 +++++++++ tools/llvm-dwarfdump/llvm-dwarfdump.cpp | 7 +++++++ 5 files changed, 34 insertions(+), 3 deletions(-) diff --git a/include/llvm/DebugInfo/DIContext.h b/include/llvm/DebugInfo/DIContext.h index 59f8e297296..9da31e6e173 100644 --- a/include/llvm/DebugInfo/DIContext.h +++ b/include/llvm/DebugInfo/DIContext.h @@ -139,6 +139,7 @@ enum DIDumpType : unsigned { struct DIDumpOptions { unsigned DumpType = DIDT_All; bool DumpEH = false; + bool ShowChildren = false; bool SummarizeTypes = false; bool Verbose = false; }; diff --git a/lib/DebugInfo/DWARF/DWARFContext.cpp b/lib/DebugInfo/DWARF/DWARFContext.cpp index 02d37f21c38..373452a9278 100644 --- a/lib/DebugInfo/DWARF/DWARFContext.cpp +++ b/lib/DebugInfo/DWARF/DWARFContext.cpp @@ -223,6 +223,8 @@ void DWARFContext::dump( Optional DumpOffset; uint64_t DumpType = DumpOpts.DumpType; bool DumpEH = DumpOpts.DumpEH; + unsigned RecDepth = + DumpOpts.ShowChildren ? std::numeric_limits::max() : 0; StringRef Extension = sys::path::extension(DObj->getFileName()); bool IsDWO = (Extension == ".dwo") || (Extension == ".dwp"); @@ -260,7 +262,7 @@ void DWARFContext::dump( if (shouldDump(IsExplicit, Name, DIDT_ID_DebugInfo, Section.Data)) { for (const auto &CU : CUs) if (DumpOffset) - CU->getDIEForOffset(DumpOffset.getValue()).dump(OS, 0); + CU->getDIEForOffset(DumpOffset.getValue()).dump(OS, RecDepth); else CU->dump(OS, DumpOpts); } @@ -277,7 +279,7 @@ void DWARFContext::dump( for (const auto &TUS : TUSections) for (const auto &TU : TUS) if (DumpOffset) - TU->getDIEForOffset(*DumpOffset).dump(OS, 0); + TU->getDIEForOffset(*DumpOffset).dump(OS, RecDepth); else TU->dump(OS, DumpOpts); }; diff --git a/test/tools/llvm-dwarfdump/X86/debug_info_offset.test b/test/tools/llvm-dwarfdump/X86/debug_info_offset.test index d3d1b6a94c6..0c95eabf0f9 100644 --- a/test/tools/llvm-dwarfdump/X86/debug_info_offset.test +++ b/test/tools/llvm-dwarfdump/X86/debug_info_offset.test @@ -6,5 +6,17 @@ CHECK: DW_AT_name CHECK-NOT: {{:}} RUN: llvm-mc %S/brief.s -filetype obj -triple x86_64-apple-darwin -o - \ -RUN: | llvm-dwarfdump -debug-info=0 - | FileCheck --allow-empty --check-prefix=EMPTY %s +RUN: | llvm-dwarfdump -debug-info=0 - \ +RUN: | FileCheck --allow-empty --check-prefix=EMPTY %s EMPTY-NOT: DW_TAG + +RUN: llvm-mc %S/brief.s -filetype obj -triple x86_64-apple-darwin -o - \ +RUN: | llvm-dwarfdump -debug-info=0x0000000b -c - \ +RUN: | FileCheck %s --check-prefix=CHILDREN + +UN: llvm-mc %S/brief.s -filetype obj -triple x86_64-apple-darwin -o - \ +UN: | llvm-dwarfdump -debug-info=0x0000000b --show-children - \ +UN: | FileCheck %s --check-prefix=CHILDREN +CHILDREN: .debug_info contents: +CHILDREN: 0x0000000b: DW_TAG_compile_unit +CHILDREN: DW_TAG_subprogram diff --git a/test/tools/llvm-dwarfdump/X86/debug_type_offset.test b/test/tools/llvm-dwarfdump/X86/debug_type_offset.test index b1fcad4312d..5be0bff2009 100644 --- a/test/tools/llvm-dwarfdump/X86/debug_type_offset.test +++ b/test/tools/llvm-dwarfdump/X86/debug_type_offset.test @@ -6,3 +6,12 @@ CHECK: .debug_types contents: CHECK: 0x00000019: DW_TAG_structure_type CHECK: DW_AT_visibility CHECK-NOT: {{:}} + +RUN: llvm-mc %S/../../../DebugInfo/Inputs/typeunit-header.s -filetype obj \ +RUN: -triple x86_64-unknown-elf -o - \ +RUN: | llvm-dwarfdump -c -debug-types=0x0000017 - \ +RUN: | FileCheck %s --check-prefix=CHILDREN +CHILDREN: .debug_types contents: +CHILDREN: 0x00000017: DW_TAG_type_unit +CHILDREN: 0x00000019: DW_TAG_structure_type +CHECK-NOT: {{:}} diff --git a/tools/llvm-dwarfdump/llvm-dwarfdump.cpp b/tools/llvm-dwarfdump/llvm-dwarfdump.cpp index 0ac3354a7aa..725152161a6 100644 --- a/tools/llvm-dwarfdump/llvm-dwarfdump.cpp +++ b/tools/llvm-dwarfdump/llvm-dwarfdump.cpp @@ -126,6 +126,12 @@ static opt DumpUUID("uuid", desc("Show the UUID for each architecture"), cat(DwarfDumpCategory)); static alias DumpUUIDAlias("u", desc("Alias for -uuid"), aliasopt(DumpUUID)); +static opt + ShowChildren("show-children", + desc("Show a debug info entry's children when selectively " + "printing with the = option")); +static alias ShowChildrenAlias("c", desc("Alias for -show-children"), + aliasopt(ShowChildren)); static opt SummarizeTypes("summarize-types", desc("Abbreviate the description of type unit entries")); @@ -153,6 +159,7 @@ static void error(StringRef Filename, std::error_code EC) { static DIDumpOptions getDumpOpts() { DIDumpOptions DumpOpts; DumpOpts.DumpType = DumpType; + DumpOpts.ShowChildren = ShowChildren; DumpOpts.SummarizeTypes = SummarizeTypes; DumpOpts.Verbose = Verbose; return DumpOpts; -- 2.40.0