-
Notifications
You must be signed in to change notification settings - Fork 15.3k
[llvm][dwarfdump] Add --child-tags option to filter by DWARF tags #165720
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 5 commits
9f93f7a
5ab9513
3d92747
c03d995
9c9a459
30da832
8f711d2
ae5adf8
60b7523
f912b46
e42f202
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -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, 0> FilterChildTag; | ||
|
||
| bool ShowForm = false; | ||
| bool SummarizeTypes = false; | ||
| bool Verbose = false; | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,127 @@ | ||
| # 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 | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would find it easier to follow the test if you did something like: etc. You should also break up your longer lines over multiple lines using
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. done! |
||
| # 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: --filter-child-tag 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 | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -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> 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", | ||
| 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.FilterChildTag = makeTagVector(FilterChildTag); | ||
| 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 && !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"); | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do you have a local docs build? How does this render in the output? What it be better using
.. code-block:: c?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yea confirmed with the code-block it looks nicer. Fixed