diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2011-09-14 20:52:27 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2011-09-14 20:52:27 +0000 |
commit | 3266493603b2e77d1fca273be6410a546262459e (patch) | |
tree | 54d31942ef5e1ca3beca8db82588c9f1fb2a10b3 /llvm/lib/DebugInfo/DWARFDebugInfoEntry.cpp | |
parent | d48ed128e0f8d7745362a0120526db377f33e830 (diff) | |
download | bcm5719-llvm-3266493603b2e77d1fca273be6410a546262459e.tar.gz bcm5719-llvm-3266493603b2e77d1fca273be6410a546262459e.zip |
DWARF: Generate the address lookup table from the DIE tree if .debug_aranges is not available.
Ported from LLDB.
llvm-svn: 139732
Diffstat (limited to 'llvm/lib/DebugInfo/DWARFDebugInfoEntry.cpp')
-rw-r--r-- | llvm/lib/DebugInfo/DWARFDebugInfoEntry.cpp | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/llvm/lib/DebugInfo/DWARFDebugInfoEntry.cpp b/llvm/lib/DebugInfo/DWARFDebugInfoEntry.cpp index 627fad5afce..0bf8b69611f 100644 --- a/llvm/lib/DebugInfo/DWARFDebugInfoEntry.cpp +++ b/llvm/lib/DebugInfo/DWARFDebugInfoEntry.cpp @@ -397,7 +397,8 @@ DWARFDebugInfoEntryMinimal::getAttributeValueAsSigned( } uint64_t -DWARFDebugInfoEntryMinimal::getAttributeValueAsReference(const DWARFCompileUnit* cu, +DWARFDebugInfoEntryMinimal::getAttributeValueAsReference( + const DWARFCompileUnit* cu, const uint16_t attr, uint64_t fail_value) const { DWARFFormValue form_value; @@ -405,3 +406,26 @@ DWARFDebugInfoEntryMinimal::getAttributeValueAsReference(const DWARFCompileUnit* return form_value.getReference(cu); return fail_value; } + +void +DWARFDebugInfoEntryMinimal::buildAddressRangeTable(const DWARFCompileUnit *cu, + DWARFDebugAranges *debug_aranges) + const { + if (AbbrevDecl) { + uint16_t tag = AbbrevDecl->getTag(); + if (tag == DW_TAG_subprogram) { + uint64_t hi_pc = -1ULL; + uint64_t lo_pc = getAttributeValueAsUnsigned(cu, DW_AT_low_pc, -1ULL); + if (lo_pc != -1ULL) + hi_pc = getAttributeValueAsUnsigned(cu, DW_AT_high_pc, -1ULL); + if (hi_pc != -1ULL) + debug_aranges->appendRange(cu->getOffset(), lo_pc, hi_pc); + } + + const DWARFDebugInfoEntryMinimal *child = getFirstChild(); + while (child) { + child->buildAddressRangeTable(cu, debug_aranges); + child = child->getSibling(); + } + } +} |