diff options
| author | David Blaikie <dblaikie@gmail.com> | 2018-09-12 23:39:51 +0000 | 
|---|---|---|
| committer | David Blaikie <dblaikie@gmail.com> | 2018-09-12 23:39:51 +0000 | 
| commit | da36f3f4820a3d9aa20cd32b9ca21e54f53bec82 (patch) | |
| tree | fbe06fd2c2e4160b496f315534345ccc2afd3f94 /llvm/lib/DebugInfo/DWARF | |
| parent | 56dd0d2cfd353e4eeb1510e7557bbd2817a47737 (diff) | |
| download | bcm5719-llvm-da36f3f4820a3d9aa20cd32b9ca21e54f53bec82.tar.gz bcm5719-llvm-da36f3f4820a3d9aa20cd32b9ca21e54f53bec82.zip | |
dwarfdump: Improve performance on large DWP files
llvm-svn: 342099
Diffstat (limited to 'llvm/lib/DebugInfo/DWARF')
| -rw-r--r-- | llvm/lib/DebugInfo/DWARF/DWARFUnitIndex.cpp | 29 | 
1 files changed, 21 insertions, 8 deletions
| diff --git a/llvm/lib/DebugInfo/DWARF/DWARFUnitIndex.cpp b/llvm/lib/DebugInfo/DWARF/DWARFUnitIndex.cpp index 17f17572a30..3b39bf58b3c 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFUnitIndex.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFUnitIndex.cpp @@ -164,14 +164,27 @@ 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) { -      const auto &InfoContrib = Contribs[InfoColumn]; -      if (InfoContrib.Offset <= Offset && -          Offset < (InfoContrib.Offset + InfoContrib.Length)) -        return &Rows[i]; -    } -  return nullptr; +  if (OffsetLookup.empty()) { +    for (uint32_t i = 0; i != Header.NumBuckets; ++i) +      if (const auto &Contribs = Rows[i].Contributions) +        OffsetLookup.push_back(&Rows[i]); +    llvm::sort(OffsetLookup, [&](Entry *E1, Entry *E2) { +      return E1->Contributions[InfoColumn].Offset < +             E2->Contributions[InfoColumn].Offset; +    }); +  } +  auto I = +      llvm::upper_bound(OffsetLookup, Offset, [&](uint32_t Offset, Entry *E2) { +        return Offset < E2->Contributions[InfoColumn].Offset; +      }); +  if (I == OffsetLookup.begin()) +    return nullptr; +  --I; +  const auto *E = *I; +  const auto &InfoContrib = E->Contributions[InfoColumn]; +  if ((InfoContrib.Offset + InfoContrib.Length) <= Offset) +    return nullptr; +  return E;  }  const DWARFUnitIndex::Entry *DWARFUnitIndex::getFromHash(uint64_t S) const { | 

