[llvm] [llvm][dwarfdump] Add --child-tags option to filter by DWARF tags (PR #165720)

Michael Buch via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 4 02:30:24 PST 2025


https://github.com/Michael137 updated https://github.com/llvm/llvm-project/pull/165720

>From 9f93f7a129f94aa34b87f4a0772ecf31648c7666 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Tue, 21 Oct 2025 16:51:43 +0100
Subject: [PATCH 01/11] [llvm][dwarfdump] Add --child-tags option to filter by
 DWARF tags

This patch adds a new option `--child-tags` (`-t` for short), which
makes dwarfdump only dump children whose DWARF tag is in the list of
tags specified by the user.

Motivating examples are:
* dumping all global variables in a CU
* dumping all non-static data members of a structure
* dumping all module import declarations of a CU
* etc.

For tags not known to dwarfdump, we pretend that the tag wasn't specified.
---
 llvm/include/llvm/DebugInfo/DIContext.h      |  2 ++
 llvm/lib/DebugInfo/DWARF/DWARFDie.cpp        |  4 +++-
 llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp | 24 ++++++++++++++++++++
 3 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/llvm/include/llvm/DebugInfo/DIContext.h b/llvm/include/llvm/DebugInfo/DIContext.h
index e7e87bbfebf38..32ce4520dbca7 100644
--- a/llvm/include/llvm/DebugInfo/DIContext.h
+++ b/llvm/include/llvm/DebugInfo/DIContext.h
@@ -202,6 +202,8 @@ struct DIDumpOptions {
   bool ShowAddresses = true;
   bool ShowChildren = false;
   bool ShowParents = false;
+  /// List of DWARF tags to filter children by.
+  llvm::SmallVector<unsigned> ChildTagsFilter;
   bool ShowForm = false;
   bool SummarizeTypes = false;
   bool Verbose = false;
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
index 6c78ef05e1b61..0e17a8aad7f5c 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
@@ -704,7 +704,9 @@ void DWARFDie::dump(raw_ostream &OS, unsigned Indent,
           DIDumpOptions ChildDumpOpts = DumpOpts;
           ChildDumpOpts.ShowParents = false;
           while (Child) {
-            Child.dump(OS, Indent + 2, ChildDumpOpts);
+            if (DumpOpts.ChildTagsFilter.empty() ||
+                llvm::is_contained(DumpOpts.ChildTagsFilter, Child.getTag()))
+              Child.dump(OS, Indent + 2, ChildDumpOpts);
             Child = Child.getSibling();
           }
         }
diff --git a/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp b/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp
index 11eb58ea911df..877f5b13ffb9a 100644
--- a/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp
+++ b/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp
@@ -14,6 +14,7 @@
 #include "llvm/ADT/MapVector.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/SmallSet.h"
+#include "llvm/ADT/SmallVectorExtras.h"
 #include "llvm/ADT/StringSet.h"
 #include "llvm/DebugInfo/DIContext.h"
 #include "llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h"
@@ -242,6 +243,15 @@ static opt<bool>
                 cat(DwarfDumpCategory));
 static alias ShowParentsAlias("p", desc("Alias for --show-parents."),
                               aliasopt(ShowParents), cl::NotHidden);
+
+static list<std::string>
+    ChildTags("child-tags",
+              desc("When --show-children is specified, show only DIEs with the "
+                   "specified DWARF tags."),
+              value_desc("list of DWARF tags"), cat(DwarfDumpCategory));
+static alias TagsAlias("t", desc("Alias for --child-tags."),
+                       aliasopt(ChildTags), cl::NotHidden);
+
 static opt<bool>
     ShowForm("show-form",
              desc("Show DWARF form types after the DWARF attribute types."),
@@ -330,6 +340,13 @@ static cl::extrahelp
 /// @}
 //===----------------------------------------------------------------------===//
 
+static llvm::SmallVector<unsigned>
+makeTagVector(const list<std::string> &TagStrings) {
+  return llvm::map_to_vector(TagStrings, [](const std::string &Tag) {
+    return llvm::dwarf::getTag(Tag);
+  });
+}
+
 static void error(Error Err) {
   if (!Err)
     return;
@@ -356,6 +373,7 @@ static DIDumpOptions getDumpOpts(DWARFContext &C) {
   DumpOpts.ShowAddresses = !Diff;
   DumpOpts.ShowChildren = ShowChildren;
   DumpOpts.ShowParents = ShowParents;
+  DumpOpts.ChildTagsFilter = makeTagVector(ChildTags);
   DumpOpts.ShowForm = ShowForm;
   DumpOpts.SummarizeTypes = SummarizeTypes;
   DumpOpts.Verbose = Verbose;
@@ -899,6 +917,12 @@ int main(int argc, char **argv) {
       Find.empty() && !FindAllApple)
     ShowChildren = true;
 
+  if (!ShowChildren && !ChildTags.empty()) {
+    WithColor::error()
+        << "incompatible arguments: --child-tags requires --show-children";
+    return 1;
+  }
+
   // Defaults to a.out if no filenames specified.
   if (InputFilenames.empty())
     InputFilenames.push_back("a.out");

>From 5ab95132910ac617abbad2ca5bf1979282d3f393 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Thu, 30 Oct 2025 13:46:47 +0000
Subject: [PATCH 02/11] fixup! add test

---
 .../llvm-dwarfdump/X86/child-tags-filter.yaml | 127 ++++++++++++++++++
 1 file changed, 127 insertions(+)
 create mode 100644 llvm/test/tools/llvm-dwarfdump/X86/child-tags-filter.yaml

diff --git a/llvm/test/tools/llvm-dwarfdump/X86/child-tags-filter.yaml b/llvm/test/tools/llvm-dwarfdump/X86/child-tags-filter.yaml
new file mode 100644
index 0000000000000..608cba24cbb4a
--- /dev/null
+++ b/llvm/test/tools/llvm-dwarfdump/X86/child-tags-filter.yaml
@@ -0,0 +1,127 @@
+# Tests the --child-tags (-t) option.
+# RUN: yaml2obj %s -o %t.o
+# RUN: llvm-dwarfdump %t.o --child-tags=DW_TAG_structure_type | FileCheck %s --check-prefix=ONLY_STRUCT
+# RUN: llvm-dwarfdump %t.o -t DW_TAG_structure_type -t DW_TAG_namespace | FileCheck %s --check-prefix=STRUCT_AND_NS --implicit-check-not=DW_TAG_subprogram --implicit-check-not=DW_TAG_member
+# RUN: llvm-dwarfdump %t.o -c --name=Foo -t DW_TAG_member | FileCheck %s --check-prefix=FOO_MEM --implicit-check-not=DW_TAG_compile_unit --implicit-check-not=DW_TAG_subprogram --implicit-check-not=DW_TAG_namespace
+# RUN: llvm-dwarfdump %t.o -c --name=Foo -t not_a_tag -t DW_TAG_member | FileCheck %s --check-prefix=SINGLE_INVALID_TAG --implicit-check-not=DW_TAG_compile_unit --implicit-check-not=DW_TAG_subprogram --implicit-check-not=DW_TAG_namespace
+# RUN: llvm-dwarfdump %t.o -c --name=Foo -t not_a_tag | FileCheck %s --check-prefix=ONLY_INVALID_TAGS --implicit-check-not=DW_TAG_compile_unit --implicit-check-not=DW_TAG_subprogram --implicit-check-not=DW_TAG_namespace --implicit-check-not=DW_TAG_member
+# RUN: llvm-dwarfdump %t.o -c -p --name=Foo -t DW_TAG_member | FileCheck %s --check-prefix=FOO_MEM_WITH_PARENT --implicit-check-not=DW_TAG_subprogram
+# RUN: not llvm-dwarfdump %t.o --name=Foo -t DW_TAG_member 2>&1 | FileCheck %s --check-prefix=ERROR_NO_SHOW_CHILDREN
+
+# ONLY_STRUCT: DW_TAG_compile_unit
+# ONLY_STRUCT-NOT: DW_TAG_namespace
+# ONLY_STRUCT-NOT: DW_TAG_structure_type
+
+# STRUCT_AND_NS: DW_TAG_compile_unit
+# STRUCT_AND_NS: DW_TAG_namespace
+# STRUCT_AND_NS: DW_TAG_structure_type
+# STRUCT_AND_NS: DW_TAG_structure_type
+
+# FOO_MEM: DW_TAG_structure_type
+# FOO_MEM: DW_TAG_member
+# FOO_MEM: DW_TAG_member
+# FOO_MEM: DW_TAG_member
+# FOO_MEM-NOT: DW_TAG_structure_type
+# FOO_MEM-NOT: DW_TAG_member
+
+# SINGLE_INVALID_TAG: DW_TAG_structure_type
+# SINGLE_INVALID_TAG: DW_TAG_member
+# SINGLE_INVALID_TAG: DW_TAG_member
+# SINGLE_INVALID_TAG: DW_TAG_member
+# SINGLE_INVALID_TAG-NOT: DW_TAG_structure_type
+# SINGLE_INVALID_TAG-NOT: DW_TAG_member
+
+# ONLY_INVALID_TAGS: DW_TAG_structure_type
+# ONLY_INVALID_TAGS-NOT: DW_TAG_structure_type
+
+# FOO_MEM_WITH_PARENT: DW_TAG_compile_unit
+# FOO_MEM_WITH_PARENT: DW_TAG_namespace
+# FOO_MEM_WITH_PARENT: DW_TAG_structure_type
+# FOO_MEM_WITH_PARENT: DW_TAG_member
+# FOO_MEM_WITH_PARENT: DW_TAG_member
+# FOO_MEM_WITH_PARENT: DW_TAG_member
+# FOO_MEM_WITH_PARENT-NOT: DW_TAG_structure_type
+# FOO_MEM_WITH_PARENT-NOT: DW_TAG_member
+
+# ERROR_NO_SHOW_CHILDREN: incompatible arguments: --child-tags requires --show-children
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_EXEC
+  Machine: EM_X86_64
+DWARF:
+  debug_abbrev:
+    - Table:
+      # 1
+      - Tag:      DW_TAG_compile_unit
+        Children: DW_CHILDREN_yes
+        Attributes:
+          - Attribute: DW_AT_producer
+            Form:      DW_FORM_string
+      # 2
+      - Tag:      DW_TAG_namespace
+        Children: DW_CHILDREN_yes
+        Attributes:
+          - Attribute: DW_AT_name
+            Form:      DW_FORM_string
+      # 3
+      - Tag:      DW_TAG_structure_type
+        Children: DW_CHILDREN_yes
+        Attributes:
+          - Attribute: DW_AT_name
+            Form:      DW_FORM_string
+      # 4
+      - Tag:      DW_TAG_member
+        Children: DW_CHILDREN_no
+        Attributes:
+          - Attribute: DW_AT_name
+            Form:      DW_FORM_string
+      # 5
+      - Tag:      DW_TAG_subprogram
+        Children: DW_CHILDREN_no
+        Attributes:
+          - Attribute: DW_AT_name
+            Form:      DW_FORM_string
+  debug_info:
+    - Version: 5
+      UnitType: DW_UT_compile
+      Entries:
+        - AbbrCode: 1
+          Values:
+            - CStr: handwritten
+        - AbbrCode: 2
+          Values:
+            - CStr: ns
+        - AbbrCode: 3
+          Values:
+          - CStr: Foo
+        - AbbrCode: 4
+          Values:
+            - CStr: mem1
+        - AbbrCode: 4
+          Values:
+            - CStr: mem2
+        - AbbrCode: 4
+          Values:
+            - CStr: mem3
+        - AbbrCode: 3
+          Values:
+            - CStr: NestedInFoo
+        - AbbrCode: 4
+          Values:
+            - CStr: NestedMem1
+        - AbbrCode: 4
+          Values:
+            - CStr: NestedMem2
+        - AbbrCode: 5
+          Values:
+            - CStr: NestedFunc
+        - AbbrCode: 0x0
+        - AbbrCode: 5
+          Values:
+            - CStr: FooFunc
+        - AbbrCode: 0x0
+        - AbbrCode: 0x0
+        - AbbrCode: 0x0

>From 3d927472a03e76e09207dbc93592f43c41f777c8 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Fri, 31 Oct 2025 09:57:35 +0000
Subject: [PATCH 03/11] fixup! rename option

---
 llvm/include/llvm/DebugInfo/DIContext.h       |  2 +-
 llvm/lib/DebugInfo/DWARF/DWARFDie.cpp         |  4 ++--
 ...tags-filter.yaml => filter-child-tag.yaml} |  6 ++---
 llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp  | 22 +++++++++----------
 4 files changed, 17 insertions(+), 17 deletions(-)
 rename llvm/test/tools/llvm-dwarfdump/X86/{child-tags-filter.yaml => filter-child-tag.yaml} (94%)

diff --git a/llvm/include/llvm/DebugInfo/DIContext.h b/llvm/include/llvm/DebugInfo/DIContext.h
index 32ce4520dbca7..858e5874f6d1f 100644
--- a/llvm/include/llvm/DebugInfo/DIContext.h
+++ b/llvm/include/llvm/DebugInfo/DIContext.h
@@ -203,7 +203,7 @@ struct DIDumpOptions {
   bool ShowChildren = false;
   bool ShowParents = false;
   /// List of DWARF tags to filter children by.
-  llvm::SmallVector<unsigned> ChildTagsFilter;
+  llvm::SmallVector<unsigned> FilterChildTag;
   bool ShowForm = false;
   bool SummarizeTypes = false;
   bool Verbose = false;
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
index 0e17a8aad7f5c..7496c5a084da4 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
@@ -704,8 +704,8 @@ void DWARFDie::dump(raw_ostream &OS, unsigned Indent,
           DIDumpOptions ChildDumpOpts = DumpOpts;
           ChildDumpOpts.ShowParents = false;
           while (Child) {
-            if (DumpOpts.ChildTagsFilter.empty() ||
-                llvm::is_contained(DumpOpts.ChildTagsFilter, Child.getTag()))
+            if (DumpOpts.FilterChildTag.empty() ||
+                llvm::is_contained(DumpOpts.FilterChildTag, Child.getTag()))
               Child.dump(OS, Indent + 2, ChildDumpOpts);
             Child = Child.getSibling();
           }
diff --git a/llvm/test/tools/llvm-dwarfdump/X86/child-tags-filter.yaml b/llvm/test/tools/llvm-dwarfdump/X86/filter-child-tag.yaml
similarity index 94%
rename from llvm/test/tools/llvm-dwarfdump/X86/child-tags-filter.yaml
rename to llvm/test/tools/llvm-dwarfdump/X86/filter-child-tag.yaml
index 608cba24cbb4a..145791cc8ea51 100644
--- a/llvm/test/tools/llvm-dwarfdump/X86/child-tags-filter.yaml
+++ b/llvm/test/tools/llvm-dwarfdump/X86/filter-child-tag.yaml
@@ -1,6 +1,6 @@
-# Tests the --child-tags (-t) option.
+# Tests the --filter-child-tag (-t) option.
 # RUN: yaml2obj %s -o %t.o
-# RUN: llvm-dwarfdump %t.o --child-tags=DW_TAG_structure_type | FileCheck %s --check-prefix=ONLY_STRUCT
+# RUN: llvm-dwarfdump %t.o --filter-child-tag=DW_TAG_structure_type | FileCheck %s --check-prefix=ONLY_STRUCT
 # RUN: llvm-dwarfdump %t.o -t DW_TAG_structure_type -t DW_TAG_namespace | FileCheck %s --check-prefix=STRUCT_AND_NS --implicit-check-not=DW_TAG_subprogram --implicit-check-not=DW_TAG_member
 # RUN: llvm-dwarfdump %t.o -c --name=Foo -t DW_TAG_member | FileCheck %s --check-prefix=FOO_MEM --implicit-check-not=DW_TAG_compile_unit --implicit-check-not=DW_TAG_subprogram --implicit-check-not=DW_TAG_namespace
 # RUN: llvm-dwarfdump %t.o -c --name=Foo -t not_a_tag -t DW_TAG_member | FileCheck %s --check-prefix=SINGLE_INVALID_TAG --implicit-check-not=DW_TAG_compile_unit --implicit-check-not=DW_TAG_subprogram --implicit-check-not=DW_TAG_namespace
@@ -43,7 +43,7 @@
 # FOO_MEM_WITH_PARENT-NOT: DW_TAG_structure_type
 # FOO_MEM_WITH_PARENT-NOT: DW_TAG_member
 
-# ERROR_NO_SHOW_CHILDREN: incompatible arguments: --child-tags requires --show-children
+# ERROR_NO_SHOW_CHILDREN: incompatible arguments: --filter-child-tag requires --show-children
 
 --- !ELF
 FileHeader:
diff --git a/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp b/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp
index 877f5b13ffb9a..8b829ec1e0225 100644
--- a/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp
+++ b/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp
@@ -244,13 +244,13 @@ static opt<bool>
 static alias ShowParentsAlias("p", desc("Alias for --show-parents."),
                               aliasopt(ShowParents), cl::NotHidden);
 
-static list<std::string>
-    ChildTags("child-tags",
-              desc("When --show-children is specified, show only DIEs with the "
-                   "specified DWARF tags."),
-              value_desc("list of DWARF tags"), cat(DwarfDumpCategory));
-static alias TagsAlias("t", desc("Alias for --child-tags."),
-                       aliasopt(ChildTags), cl::NotHidden);
+static list<std::string> FilterChildTag(
+    "filter-child-tag",
+    desc("When --show-children is specified, show only DIEs with the "
+         "specified DWARF tags."),
+    value_desc("list of DWARF tags"), cat(DwarfDumpCategory));
+static alias FilterChildTagAlias("t", desc("Alias for --filter-child-tag."),
+                                 aliasopt(FilterChildTag), cl::NotHidden);
 
 static opt<bool>
     ShowForm("show-form",
@@ -373,7 +373,7 @@ static DIDumpOptions getDumpOpts(DWARFContext &C) {
   DumpOpts.ShowAddresses = !Diff;
   DumpOpts.ShowChildren = ShowChildren;
   DumpOpts.ShowParents = ShowParents;
-  DumpOpts.ChildTagsFilter = makeTagVector(ChildTags);
+  DumpOpts.FilterChildTag = makeTagVector(FilterChildTag);
   DumpOpts.ShowForm = ShowForm;
   DumpOpts.SummarizeTypes = SummarizeTypes;
   DumpOpts.Verbose = Verbose;
@@ -917,9 +917,9 @@ int main(int argc, char **argv) {
       Find.empty() && !FindAllApple)
     ShowChildren = true;
 
-  if (!ShowChildren && !ChildTags.empty()) {
-    WithColor::error()
-        << "incompatible arguments: --child-tags requires --show-children";
+  if (!ShowChildren && !FilterChildTag.empty()) {
+    WithColor::error() << "incompatible arguments: --filter-child-tag requires "
+                          "--show-children";
     return 1;
   }
 

>From c03d99518eb9c6bf417e1c63fdb26a5361d9df22 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Fri, 31 Oct 2025 10:01:06 +0000
Subject: [PATCH 04/11] fixup! SmallVector size to 0

---
 llvm/include/llvm/DebugInfo/DIContext.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/include/llvm/DebugInfo/DIContext.h b/llvm/include/llvm/DebugInfo/DIContext.h
index 858e5874f6d1f..39f5ab5b9298d 100644
--- a/llvm/include/llvm/DebugInfo/DIContext.h
+++ b/llvm/include/llvm/DebugInfo/DIContext.h
@@ -203,7 +203,7 @@ struct DIDumpOptions {
   bool ShowChildren = false;
   bool ShowParents = false;
   /// List of DWARF tags to filter children by.
-  llvm::SmallVector<unsigned> FilterChildTag;
+  llvm::SmallVector<unsigned, 0> FilterChildTag;
   bool ShowForm = false;
   bool SummarizeTypes = false;
   bool Verbose = false;

>From 9c9a459b7b6c45b795091bfa523db0bb1c34a2cb Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Fri, 31 Oct 2025 10:07:00 +0000
Subject: [PATCH 05/11] fixup! update docs

---
 llvm/docs/CommandGuide/llvm-dwarfdump.rst | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/llvm/docs/CommandGuide/llvm-dwarfdump.rst b/llvm/docs/CommandGuide/llvm-dwarfdump.rst
index 137830259eb64..87920741f26dd 100644
--- a/llvm/docs/CommandGuide/llvm-dwarfdump.rst
+++ b/llvm/docs/CommandGuide/llvm-dwarfdump.rst
@@ -134,6 +134,12 @@ OPTIONS
 
             Abbreviate the description of type unit entries.
 
+.. option:: -t, --filter-child-tag
+
+            Only dump children whose DWARF tag is one of the specified tags.
+            Example usage:
+            `llvm-dwarfdump -t DW_TAG_structure_type -t DW_TAG_member -c`
+
 .. option:: -x, --regex
 
             Treat any <name> strings as regular expressions when searching

>From 30da83283756cea4d7a03eb87f84c1f319c4461e Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Tue, 4 Nov 2025 09:25:06 +0000
Subject: [PATCH 06/11] fixup! re-order DIDumpOptions member

---
 llvm/include/llvm/DebugInfo/DIContext.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/llvm/include/llvm/DebugInfo/DIContext.h b/llvm/include/llvm/DebugInfo/DIContext.h
index 39f5ab5b9298d..b404c92e71836 100644
--- a/llvm/include/llvm/DebugInfo/DIContext.h
+++ b/llvm/include/llvm/DebugInfo/DIContext.h
@@ -202,8 +202,6 @@ struct DIDumpOptions {
   bool ShowAddresses = true;
   bool ShowChildren = false;
   bool ShowParents = false;
-  /// List of DWARF tags to filter children by.
-  llvm::SmallVector<unsigned, 0> FilterChildTag;
   bool ShowForm = false;
   bool SummarizeTypes = false;
   bool Verbose = false;
@@ -213,6 +211,8 @@ struct DIDumpOptions {
   bool ShowAggregateErrors = false;
   bool PrintRegisterOnly = false;
   std::string JsonErrSummaryFile;
+  /// List of DWARF tags to filter children by.
+  llvm::SmallVector<unsigned, 0> FilterChildTag;
   std::function<llvm::StringRef(uint64_t DwarfRegNum, bool IsEH)>
       GetNameForDWARFReg;
 

>From 8f711d2ec5d38df0522200586acd3c7dff3a95a1 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Tue, 4 Nov 2025 09:26:03 +0000
Subject: [PATCH 07/11] fixup! fix test comment

---
 llvm/test/tools/llvm-dwarfdump/X86/filter-child-tag.yaml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/test/tools/llvm-dwarfdump/X86/filter-child-tag.yaml b/llvm/test/tools/llvm-dwarfdump/X86/filter-child-tag.yaml
index 145791cc8ea51..c91b1471350ad 100644
--- a/llvm/test/tools/llvm-dwarfdump/X86/filter-child-tag.yaml
+++ b/llvm/test/tools/llvm-dwarfdump/X86/filter-child-tag.yaml
@@ -1,4 +1,4 @@
-# Tests the --filter-child-tag (-t) option.
+## Tests the --filter-child-tag (-t) option.
 # RUN: yaml2obj %s -o %t.o
 # RUN: llvm-dwarfdump %t.o --filter-child-tag=DW_TAG_structure_type | FileCheck %s --check-prefix=ONLY_STRUCT
 # RUN: llvm-dwarfdump %t.o -t DW_TAG_structure_type -t DW_TAG_namespace | FileCheck %s --check-prefix=STRUCT_AND_NS --implicit-check-not=DW_TAG_subprogram --implicit-check-not=DW_TAG_member

>From ae5adf896f45ec69647e0ab7d19fff5bbccf3384 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Tue, 4 Nov 2025 09:58:27 +0000
Subject: [PATCH 08/11] fixup! make tests more readable

---
 .../llvm-dwarfdump/X86/filter-child-tag.yaml  | 25 ++++++++++++++-----
 1 file changed, 19 insertions(+), 6 deletions(-)

diff --git a/llvm/test/tools/llvm-dwarfdump/X86/filter-child-tag.yaml b/llvm/test/tools/llvm-dwarfdump/X86/filter-child-tag.yaml
index c91b1471350ad..409ab79bf2415 100644
--- a/llvm/test/tools/llvm-dwarfdump/X86/filter-child-tag.yaml
+++ b/llvm/test/tools/llvm-dwarfdump/X86/filter-child-tag.yaml
@@ -1,22 +1,24 @@
 ## Tests the --filter-child-tag (-t) option.
+
 # RUN: yaml2obj %s -o %t.o
+
 # RUN: llvm-dwarfdump %t.o --filter-child-tag=DW_TAG_structure_type | FileCheck %s --check-prefix=ONLY_STRUCT
-# RUN: llvm-dwarfdump %t.o -t DW_TAG_structure_type -t DW_TAG_namespace | FileCheck %s --check-prefix=STRUCT_AND_NS --implicit-check-not=DW_TAG_subprogram --implicit-check-not=DW_TAG_member
-# RUN: llvm-dwarfdump %t.o -c --name=Foo -t DW_TAG_member | FileCheck %s --check-prefix=FOO_MEM --implicit-check-not=DW_TAG_compile_unit --implicit-check-not=DW_TAG_subprogram --implicit-check-not=DW_TAG_namespace
-# RUN: llvm-dwarfdump %t.o -c --name=Foo -t not_a_tag -t DW_TAG_member | FileCheck %s --check-prefix=SINGLE_INVALID_TAG --implicit-check-not=DW_TAG_compile_unit --implicit-check-not=DW_TAG_subprogram --implicit-check-not=DW_TAG_namespace
-# RUN: llvm-dwarfdump %t.o -c --name=Foo -t not_a_tag | FileCheck %s --check-prefix=ONLY_INVALID_TAGS --implicit-check-not=DW_TAG_compile_unit --implicit-check-not=DW_TAG_subprogram --implicit-check-not=DW_TAG_namespace --implicit-check-not=DW_TAG_member
-# RUN: llvm-dwarfdump %t.o -c -p --name=Foo -t DW_TAG_member | FileCheck %s --check-prefix=FOO_MEM_WITH_PARENT --implicit-check-not=DW_TAG_subprogram
-# RUN: not llvm-dwarfdump %t.o --name=Foo -t DW_TAG_member 2>&1 | FileCheck %s --check-prefix=ERROR_NO_SHOW_CHILDREN
 
 # ONLY_STRUCT: DW_TAG_compile_unit
 # ONLY_STRUCT-NOT: DW_TAG_namespace
 # ONLY_STRUCT-NOT: DW_TAG_structure_type
 
+# RUN: llvm-dwarfdump %t.o -t DW_TAG_structure_type -t DW_TAG_namespace | \
+# RUN:     FileCheck %s --check-prefix=STRUCT_AND_NS --implicit-check-not=DW_TAG_subprogram --implicit-check-not=DW_TAG_member
+
 # STRUCT_AND_NS: DW_TAG_compile_unit
 # STRUCT_AND_NS: DW_TAG_namespace
 # STRUCT_AND_NS: DW_TAG_structure_type
 # STRUCT_AND_NS: DW_TAG_structure_type
 
+# RUN: llvm-dwarfdump %t.o -c --name=Foo -t DW_TAG_member | \
+# RUN:     FileCheck %s --check-prefix=FOO_MEM --implicit-check-not=DW_TAG_compile_unit --implicit-check-not=DW_TAG_subprogram --implicit-check-not=DW_TAG_namespace
+
 # FOO_MEM: DW_TAG_structure_type
 # FOO_MEM: DW_TAG_member
 # FOO_MEM: DW_TAG_member
@@ -24,6 +26,9 @@
 # FOO_MEM-NOT: DW_TAG_structure_type
 # FOO_MEM-NOT: DW_TAG_member
 
+# RUN: llvm-dwarfdump %t.o -c --name=Foo -t not_a_tag -t DW_TAG_member | \
+# RUN:     FileCheck %s --check-prefix=SINGLE_INVALID_TAG --implicit-check-not=DW_TAG_compile_unit --implicit-check-not=DW_TAG_subprogram --implicit-check-not=DW_TAG_namespace
+
 # SINGLE_INVALID_TAG: DW_TAG_structure_type
 # SINGLE_INVALID_TAG: DW_TAG_member
 # SINGLE_INVALID_TAG: DW_TAG_member
@@ -31,9 +36,15 @@
 # SINGLE_INVALID_TAG-NOT: DW_TAG_structure_type
 # SINGLE_INVALID_TAG-NOT: DW_TAG_member
 
+# RUN: llvm-dwarfdump %t.o -c --name=Foo -t not_a_tag | \
+# RUN:     FileCheck %s --check-prefix=ONLY_INVALID_TAGS --implicit-check-not=DW_TAG_compile_unit --implicit-check-not=DW_TAG_subprogram --implicit-check-not=DW_TAG_namespace --implicit-check-not=DW_TAG_member
+
 # ONLY_INVALID_TAGS: DW_TAG_structure_type
 # ONLY_INVALID_TAGS-NOT: DW_TAG_structure_type
 
+# RUN: llvm-dwarfdump %t.o -c -p --name=Foo -t DW_TAG_member | \
+# RUN:     FileCheck %s --check-prefix=FOO_MEM_WITH_PARENT --implicit-check-not=DW_TAG_subprogram
+
 # FOO_MEM_WITH_PARENT: DW_TAG_compile_unit
 # FOO_MEM_WITH_PARENT: DW_TAG_namespace
 # FOO_MEM_WITH_PARENT: DW_TAG_structure_type
@@ -43,6 +54,8 @@
 # FOO_MEM_WITH_PARENT-NOT: DW_TAG_structure_type
 # FOO_MEM_WITH_PARENT-NOT: DW_TAG_member
 
+# RUN: not llvm-dwarfdump %t.o --name=Foo -t DW_TAG_member 2>&1 | FileCheck %s --check-prefix=ERROR_NO_SHOW_CHILDREN
+
 # ERROR_NO_SHOW_CHILDREN: incompatible arguments: --filter-child-tag requires --show-children
 
 --- !ELF

>From 60b75233032be8ff94a84b696ff460de84b4c57a Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Tue, 4 Nov 2025 09:59:22 +0000
Subject: [PATCH 09/11] fixup! remove redundant comments

---
 llvm/test/tools/llvm-dwarfdump/X86/filter-child-tag.yaml | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/llvm/test/tools/llvm-dwarfdump/X86/filter-child-tag.yaml b/llvm/test/tools/llvm-dwarfdump/X86/filter-child-tag.yaml
index 409ab79bf2415..015fca0afef8f 100644
--- a/llvm/test/tools/llvm-dwarfdump/X86/filter-child-tag.yaml
+++ b/llvm/test/tools/llvm-dwarfdump/X86/filter-child-tag.yaml
@@ -67,31 +67,26 @@ FileHeader:
 DWARF:
   debug_abbrev:
     - Table:
-      # 1
       - Tag:      DW_TAG_compile_unit
         Children: DW_CHILDREN_yes
         Attributes:
           - Attribute: DW_AT_producer
             Form:      DW_FORM_string
-      # 2
       - Tag:      DW_TAG_namespace
         Children: DW_CHILDREN_yes
         Attributes:
           - Attribute: DW_AT_name
             Form:      DW_FORM_string
-      # 3
       - Tag:      DW_TAG_structure_type
         Children: DW_CHILDREN_yes
         Attributes:
           - Attribute: DW_AT_name
             Form:      DW_FORM_string
-      # 4
       - Tag:      DW_TAG_member
         Children: DW_CHILDREN_no
         Attributes:
           - Attribute: DW_AT_name
             Form:      DW_FORM_string
-      # 5
       - Tag:      DW_TAG_subprogram
         Children: DW_CHILDREN_no
         Attributes:

>From f912b46ee630a3621c060df961f6fbfad81f83af Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Tue, 4 Nov 2025 10:25:10 +0000
Subject: [PATCH 10/11] fixup! adjust codeblock in docs

---
 llvm/docs/CommandGuide/llvm-dwarfdump.rst | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/llvm/docs/CommandGuide/llvm-dwarfdump.rst b/llvm/docs/CommandGuide/llvm-dwarfdump.rst
index 87920741f26dd..dfc0431f07826 100644
--- a/llvm/docs/CommandGuide/llvm-dwarfdump.rst
+++ b/llvm/docs/CommandGuide/llvm-dwarfdump.rst
@@ -138,7 +138,10 @@ OPTIONS
 
             Only dump children whose DWARF tag is one of the specified tags.
             Example usage:
-            `llvm-dwarfdump -t DW_TAG_structure_type -t DW_TAG_member -c`
+
+            .. code-block:: c
+
+              llvm-dwarfdump -t DW_TAG_structure_type -t DW_TAG_member -c
 
 .. option:: -x, --regex
 

>From e42f202043e59a7f65446be39d2fa3f860178558 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Tue, 4 Nov 2025 10:30:07 +0000
Subject: [PATCH 11/11] fixup! don't error on incompatible flag

---
 llvm/test/tools/llvm-dwarfdump/X86/filter-child-tag.yaml | 5 +++--
 llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp             | 6 ------
 2 files changed, 3 insertions(+), 8 deletions(-)

diff --git a/llvm/test/tools/llvm-dwarfdump/X86/filter-child-tag.yaml b/llvm/test/tools/llvm-dwarfdump/X86/filter-child-tag.yaml
index 015fca0afef8f..2a8c37da80e64 100644
--- a/llvm/test/tools/llvm-dwarfdump/X86/filter-child-tag.yaml
+++ b/llvm/test/tools/llvm-dwarfdump/X86/filter-child-tag.yaml
@@ -54,9 +54,10 @@
 # FOO_MEM_WITH_PARENT-NOT: DW_TAG_structure_type
 # FOO_MEM_WITH_PARENT-NOT: DW_TAG_member
 
-# RUN: not llvm-dwarfdump %t.o --name=Foo -t DW_TAG_member 2>&1 | FileCheck %s --check-prefix=ERROR_NO_SHOW_CHILDREN
+## Not specifying --show-children ignores the --filter-child-tag option.
+# RUN: llvm-dwarfdump %t.o --name=Foo -t DW_TAG_member 2>&1 | FileCheck %s --check-prefix=NO_SHOW_CHILDREN
 
-# ERROR_NO_SHOW_CHILDREN: incompatible arguments: --filter-child-tag requires --show-children
+# NO_SHOW_CHILDREN: DW_TAG_structure_type
 
 --- !ELF
 FileHeader:
diff --git a/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp b/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp
index 8b829ec1e0225..6f120f93700f6 100644
--- a/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp
+++ b/llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp
@@ -917,12 +917,6 @@ int main(int argc, char **argv) {
       Find.empty() && !FindAllApple)
     ShowChildren = true;
 
-  if (!ShowChildren && !FilterChildTag.empty()) {
-    WithColor::error() << "incompatible arguments: --filter-child-tag requires "
-                          "--show-children";
-    return 1;
-  }
-
   // Defaults to a.out if no filenames specified.
   if (InputFilenames.empty())
     InputFilenames.push_back("a.out");



More information about the llvm-commits mailing list