diff options
author | Alexey Samsonov <samsonov@google.com> | 2012-09-04 08:12:33 +0000 |
---|---|---|
committer | Alexey Samsonov <samsonov@google.com> | 2012-09-04 08:12:33 +0000 |
commit | c942e6b781040187516ccf10be2bc83d1c097b59 (patch) | |
tree | 452f309be0e5163ca8bf2d134400066b6057a4bc /llvm/lib/DebugInfo/DWARFDebugRangeList.cpp | |
parent | 01cfbfe9d00ceed2074fb5e3c296d506afe63a36 (diff) | |
download | llvm-c942e6b781040187516ccf10be2bc83d1c097b59.zip llvm-c942e6b781040187516ccf10be2bc83d1c097b59.tar.gz llvm-c942e6b781040187516ccf10be2bc83d1c097b59.tar.bz2 |
Add support for fetching inlining context (stack of source code locations)
by instruction address from DWARF.
Add --inlining flag to llvm-dwarfdump to demonstrate and test this functionality,
so that "llvm-dwarfdump --inlining --address=0x..." now works much like
"addr2line -i 0x...", provided that the binary has debug info
(Clang's -gline-tables-only *is* enough).
llvm-svn: 163128
Diffstat (limited to 'llvm/lib/DebugInfo/DWARFDebugRangeList.cpp')
-rw-r--r-- | llvm/lib/DebugInfo/DWARFDebugRangeList.cpp | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/llvm/lib/DebugInfo/DWARFDebugRangeList.cpp b/llvm/lib/DebugInfo/DWARFDebugRangeList.cpp index fa15bb0..1806bee 100644 --- a/llvm/lib/DebugInfo/DWARFDebugRangeList.cpp +++ b/llvm/lib/DebugInfo/DWARFDebugRangeList.cpp @@ -37,10 +37,7 @@ bool DWARFDebugRangeList::extract(DataExtractor data, uint32_t *offset_ptr) { clear(); return false; } - // The end of any given range list is marked by an end of list entry, - // which consists of a 0 for the beginning address offset - // and a 0 for the ending address offset. - if (entry.StartAddress == 0 && entry.EndAddress == 0) + if (entry.isEndOfListEntry()) break; Entries.push_back(entry); } @@ -57,3 +54,14 @@ void DWARFDebugRangeList::dump(raw_ostream &OS) const { } OS << format("%08x <End of list>\n", Offset); } + +bool DWARFDebugRangeList::containsAddress(uint64_t BaseAddress, + uint64_t Address) const { + for (int i = 0, n = Entries.size(); i != n; ++i) { + if (Entries[i].isBaseAddressSelectionEntry(AddressSize)) + BaseAddress = Entries[i].EndAddress; + else if (Entries[i].containsAddress(BaseAddress, Address)) + return true; + } + return false; +} |