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 | 10df80692cc1594fb06fc02cae6eba177123cfd9 (patch) | |
tree | 52bf8e0b53fb79a6dd33acaea72b23acc6908414 /lib/DebugInfo/DWARFDebugInfoEntry.cpp | |
parent | 55cf815e19691d8a1cda40a331943ebfee9d7255 (diff) |
DWARF: Generate the address lookup table from the DIE tree if .debug_aranges is not available.
Ported from LLDB.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@139732 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/DebugInfo/DWARFDebugInfoEntry.cpp')
-rw-r--r-- | lib/DebugInfo/DWARFDebugInfoEntry.cpp | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/lib/DebugInfo/DWARFDebugInfoEntry.cpp b/lib/DebugInfo/DWARFDebugInfoEntry.cpp index 627fad5afc..0bf8b69611 100644 --- a/lib/DebugInfo/DWARFDebugInfoEntry.cpp +++ b/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(); + } + } +} |