scripts: Added DwarfEntry.info to help find recursive tags

Long story short: DW_TAG_lexical_blocks are annoying.

In order to search the full tree of children of a given dwarf entry, we
need a recursive function somewhere. We might as well make this function
a part of the DwarfEntry class so we can share it with other scripts.

Note this is roughly the same as collect_dwarf_info, but limited to
the children of a given dwarf entry.

This is useful for ongoing stack.py rework.
This commit is contained in:
Christopher Haster
2024-12-05 15:50:09 -06:00
parent faf4d09c34
commit 19cd428a3c
4 changed files with 57 additions and 5 deletions

View File

@@ -393,6 +393,19 @@ class DwarfEntry:
else:
return None
def info(self, tags=None):
# recursively flatten children
def flatten(entry):
for child in entry.children:
# filter if requested
if tags is None or child.tag in tags:
yield child
yield from flatten(child)
return DwarfInfo(co.OrderedDict(
(child.off, child) for child in flatten(self)))
# a collection of dwarf entries
class DwarfInfo:
def __init__(self, entries):
@@ -443,7 +456,7 @@ class DwarfInfo:
return len(self.entries)
def __iter__(self):
return (v for k, v in self.entries.items())
return iter(self.entries.values())
def collect_dwarf_info(obj_path, tags=None, *,
objdump_path=OBJDUMP_PATH,