[llvm-dwarfdump] dump link to the immediate parent.

It is often useful to know which die is the parent of the current die.
This patch adds information about parent offset into the dump:

0x0000000b: DW_TAG_compile_unit
              DW_AT_producer    ("by_hand")

0x00000014:   DW_TAG_base_type (0x0000000b)  <<<<<<<<<<<<<<
                DW_AT_name      ("int")

Now it is easy to see which die is the parent of the current die.
This patch makes that behaviour to be default.
We can make it to be opt-in if neccessary.

This functionality differs from already existed "--show-parents"
in that sence that parent information is shown for all dies and
only link to the immediate parent is shown.

Differential Revision: https://reviews.llvm.org/D113406
This commit is contained in:
Alexey Lapshin 2021-11-08 18:34:32 +03:00
parent cb728cb8a9
commit c8ae08987d
3 changed files with 56 additions and 3 deletions

View File

@ -1080,9 +1080,13 @@ void DWARFDie::dump(raw_ostream &OS, unsigned Indent,
if (AbbrevDecl) {
WithColor(OS, HighlightColor::Tag).get().indent(Indent)
<< formatv("{0}", getTag());
if (DumpOpts.Verbose)
if (DumpOpts.Verbose) {
OS << format(" [%u] %c", abbrCode,
AbbrevDecl->hasChildren() ? '*' : ' ');
if (Optional<uint32_t> ParentIdx = Die->getParentIdx())
OS << format(" (0x%8.8" PRIx64 ")",
U->getDIEAtIndex(*ParentIdx).getOffset());
}
OS << '\n';
// Dump all data in the DIE for the attributes.

View File

@ -0,0 +1,49 @@
# RUN: yaml2obj %s -o %t.o
# RUN: llvm-dwarfdump -v -a %t.o | FileCheck %s
## This test checks that llvm-dwarfdump prints link
## to the parent of the current die:
## DW_TAG_base_type [3] (0x00000014) <<<<<
# CHECK: .o: file format
# CHECK: 0x0000000b: DW_TAG_compile_unit
# CHECK: 0x00000014: DW_TAG_namespace [2] * (0x0000000b)
# CHECK: DW_TAG_base_type [3] (0x00000014)
--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_EXEC
Machine: EM_X86_64
DWARF:
debug_abbrev:
- Table:
- Tag: DW_TAG_compile_unit
Children: DW_CHILDREN_yes
Attributes:
- Attribute: DW_AT_producer
Form: DW_FORM_string
- Tag: DW_TAG_namespace
Children: DW_CHILDREN_yes
Attributes:
- Attribute: DW_AT_name
Form: DW_FORM_string
- Tag: DW_TAG_base_type
Children: DW_CHILDREN_no
Attributes:
- Attribute: DW_AT_name
Form: DW_FORM_string
debug_info:
- Version: 4
Entries:
- AbbrCode: 1
Values:
- CStr: by_hand
- AbbrCode: 2
Values:
- CStr: name
- AbbrCode: 3
Values:
- CStr: int

View File

@ -7,9 +7,9 @@
# CHECK:.debug_info contents:
# CHECK:0x0000000b: DW_TAG_compile_unit [1] *
# CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{.*}}] = "brief.c")
# CHECK:0x0000002a: DW_TAG_subprogram [2]
# CHECK:0x0000002a: DW_TAG_subprogram [2] (0x0000000b)
# CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{.*}}] = "main")
# CHECK:0x00000043: DW_TAG_base_type [3]
# CHECK:0x00000043: DW_TAG_base_type [3] (0x0000000b)
# CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[0x{{.*}}] = "int")
# CHECK:.debug_line contents: