aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib
diff options
context:
space:
mode:
authorDavid Blaikie <dblaikie@gmail.com>2017-09-19 18:36:11 +0000
committerDavid Blaikie <dblaikie@gmail.com>2017-09-19 18:36:11 +0000
commite79dda31e9ed6cfc97d06ad87976fb16e53f3780 (patch)
tree339ea31b04b0f23ff8c0bfd5f1c682696e91097e /llvm/lib
parentb6e60c8b80704e948cf049569145ddf8497d7e05 (diff)
downloadllvm-e79dda31e9ed6cfc97d06ad87976fb16e53f3780.zip
llvm-e79dda31e9ed6cfc97d06ad87976fb16e53f3780.tar.gz
llvm-e79dda31e9ed6cfc97d06ad87976fb16e53f3780.tar.bz2
dwarfdump/symbolizer: Avoid loading unneeded CUs from a DWP
When symbolizing large binaries, parsing every CU in a DWP file is a significant performance penalty. Instead, use the index to only load the CUs that are needed. llvm-svn: 313659
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/DebugInfo/DWARF/DWARFContext.cpp5
-rw-r--r--llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp8
-rw-r--r--llvm/lib/DebugInfo/DWARF/DWARFUnitIndex.cpp7
3 files changed, 11 insertions, 9 deletions
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp b/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp
index 90df9f4..0e28954 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp
@@ -464,12 +464,11 @@ void DWARFContext::dump(
}
DWARFCompileUnit *DWARFContext::getDWOCompileUnitForHash(uint64_t Hash) {
- parseDWOCompileUnits();
+ DWOCUs.parseDWO(*this, DObj->getInfoDWOSection(), true);
if (const auto &CUI = getCUIndex()) {
if (const auto *R = CUI.getFromHash(Hash))
- if (auto CUOff = R->getOffset(DW_SECT_INFO))
- return DWOCUs.getUnitForOffset(CUOff->Offset);
+ return DWOCUs.getUnitForIndexEntry(*R);
return nullptr;
}
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp b/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp
index 4467b4a..86451fa 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFUnit.cpp
@@ -33,17 +33,17 @@ void DWARFUnitSectionBase::parse(DWARFContext &C, const DWARFSection &Section) {
const DWARFObject &D = C.getDWARFObj();
parseImpl(C, Section, C.getDebugAbbrev(), &D.getRangeSection(),
D.getStringSection(), D.getStringOffsetSection(),
- &D.getAddrSection(), D.getLineSection(), D.isLittleEndian(), false);
+ &D.getAddrSection(), D.getLineSection(), D.isLittleEndian(), false,
+ false);
}
void DWARFUnitSectionBase::parseDWO(DWARFContext &C,
- const DWARFSection &DWOSection,
- DWARFUnitIndex *Index) {
+ const DWARFSection &DWOSection, bool Lazy) {
const DWARFObject &D = C.getDWARFObj();
parseImpl(C, DWOSection, C.getDebugAbbrevDWO(), &D.getRangeDWOSection(),
D.getStringDWOSection(), D.getStringOffsetDWOSection(),
&D.getAddrSection(), D.getLineDWOSection(), C.isLittleEndian(),
- true);
+ true, Lazy);
}
DWARFUnit::DWARFUnit(DWARFContext &DC, const DWARFSection &Section,
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFUnitIndex.cpp b/llvm/lib/DebugInfo/DWARF/DWARFUnitIndex.cpp
index 6e8cbca..17f1757 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFUnitIndex.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFUnitIndex.cpp
@@ -165,9 +165,12 @@ DWARFUnitIndex::Entry::getOffset() const {
const DWARFUnitIndex::Entry *
DWARFUnitIndex::getFromOffset(uint32_t Offset) const {
for (uint32_t i = 0; i != Header.NumBuckets; ++i)
- if (const auto &Contribs = Rows[i].Contributions)
- if (Contribs[InfoColumn].Offset == Offset)
+ if (const auto &Contribs = Rows[i].Contributions) {
+ const auto &InfoContrib = Contribs[InfoColumn];
+ if (InfoContrib.Offset <= Offset &&
+ Offset < (InfoContrib.Offset + InfoContrib.Length))
return &Rows[i];
+ }
return nullptr;
}