================ @@ -374,25 +377,40 @@ void DebugNamesDWARFIndex::GetFullyQualifiedType( m_fallback.GetFullyQualifiedType(context, callback); } +bool DebugNamesDWARFIndex::SameAsEntryATName( + llvm::StringRef query_name, const DebugNames::Entry &entry) const { + auto maybe_dieoffset = entry.getDIEUnitOffset(); + if (!maybe_dieoffset) + return false; + + // [Optimization] instead of parsing the entry from dwo file, we simply + // check if the query_name can point to an entry of the same DIE offset. + // This greatly reduced number of dwo file parsed and thus improved the + // performance. + for (const DebugNames::Entry &query_entry : + entry.getNameIndex()->equal_range(query_name)) { + auto query_dieoffset = query_entry.getDIEUnitOffset(); + if (!query_dieoffset) + continue; + + if (*query_dieoffset == *maybe_dieoffset) { + return true; + } else if (*query_dieoffset > *maybe_dieoffset) { + // The pool entries of the same name are sequentially cluttered together + // so if the query name from `query_name` is after the target entry, this + // is definitely not the correct one, we can stop searching. + return false; + } + } + return false; +} + bool DebugNamesDWARFIndex::SameParentChain( llvm::ArrayRef<llvm::StringRef> parent_names, llvm::ArrayRef<DebugNames::Entry> parent_entries) const { - if (parent_entries.size() != parent_names.size()) return false; - auto SameAsEntryATName = [this](llvm::StringRef name, - const DebugNames::Entry &entry) { - // Peek at the AT_name of `entry` and test equality to `name`. - auto maybe_dieoffset = entry.getDIEUnitOffset(); - if (!maybe_dieoffset) - return false; - DWARFUnit *unit = GetNonSkeletonUnit(entry); - if (!unit) - return false; - return name == unit->PeekDIEName(unit->GetOffset() + *maybe_dieoffset); ---------------- felipepiovezan wrote:
I think this is the core of your proposal, right? In the original implementation that I did, the vast majority of the savings was thanks to being able to do `PeekDIEName`. I would strongly recommend we benchmark this new implementation is the non-dwo case as well. One way to check is to build with regular object files (the non dwo case) and repeat the experiments I described in this reply: https://discourse.llvm.org/t/rfc-improve-dwarf-5-debug-names-type-lookup-parsing-speed/74151/38?u=felipe And instrumenting this portion of the code: https://github.com/llvm/llvm-project/pull/75365/commits/837bc0f476820f9ee5695223420105dedfea8d79 https://github.com/llvm/llvm-project/pull/108907 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits