Skip to content

Commit

Permalink
[lldb][DWARFIndex][nfc] Factor out fully qualified name query
Browse files Browse the repository at this point in the history
This moves the functionally of finding a DIE based on a fully qualified name
from SymbolFileDWARF into DWARFIndex itself, so that specializations of
DWARFIndex can implement faster versions of this query.
  • Loading branch information
felipepiovezan committed Jan 4, 2024
1 parent 80aeb62 commit b828fb2
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 7 deletions.
14 changes: 14 additions & 0 deletions lldb/source/Plugins/SymbolFile/DWARF/DWARFIndex.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
//===----------------------------------------------------------------------===//

#include "Plugins/SymbolFile/DWARF/DWARFIndex.h"
#include "DWARFDebugInfoEntry.h"
#include "DWARFDeclContext.h"
#include "Plugins/Language/ObjC/ObjCLanguage.h"
#include "Plugins/SymbolFile/DWARF/DWARFDIE.h"
#include "Plugins/SymbolFile/DWARF/SymbolFileDWARF.h"
Expand Down Expand Up @@ -112,3 +114,15 @@ void DWARFIndex::ReportInvalidDIERef(DIERef ref, llvm::StringRef name) const {
"bad die {0:x16} for '{1}')\n",
ref.die_offset(), name.str().c_str());
}

void DWARFIndex::GetFullyQualifiedType(
const DWARFDeclContext &context,
llvm::function_ref<bool(DWARFDIE die)> callback) {
GetTypes(context, [&](DWARFDIE die) {
DWARFDeclContext dwarf_decl_ctx =
die.GetDIE()->GetDWARFDeclContext(die.GetCU());
if (dwarf_decl_ctx == context)
return callback(die);
return true;
});
}
8 changes: 8 additions & 0 deletions lldb/source/Plugins/SymbolFile/DWARF/DWARFIndex.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,14 @@ class DWARFIndex {
llvm::function_ref<bool(DWARFDIE die)> callback) = 0;
virtual void GetTypes(const DWARFDeclContext &context,
llvm::function_ref<bool(DWARFDIE die)> callback) = 0;

/// Finds all DIEs whose fully qualified name matches `context`. A base
/// implementation is provided, and it uses the entire CU to check the DIE
/// parent hierarchy. Specializations should override this if they are able
/// to provide a faster implementation.
virtual void
GetFullyQualifiedType(const DWARFDeclContext &context,
llvm::function_ref<bool(DWARFDIE die)> callback);
virtual void
GetNamespaces(ConstString name,
llvm::function_ref<bool(DWARFDIE die)> callback) = 0;
Expand Down
9 changes: 2 additions & 7 deletions lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3095,7 +3095,7 @@ SymbolFileDWARF::FindDefinitionTypeForDWARFDeclContext(const DWARFDIE &die) {
}

const DWARFDeclContext die_dwarf_decl_ctx = GetDWARFDeclContext(die);
m_index->GetTypes(die_dwarf_decl_ctx, [&](DWARFDIE type_die) {
m_index->GetFullyQualifiedType(die_dwarf_decl_ctx, [&](DWARFDIE type_die) {
// Make sure type_die's language matches the type system we are
// looking for. We don't want to find a "Foo" type from Java if we
// are looking for a "Foo" type for C, C++, ObjC, or ObjC++.
Expand All @@ -3122,9 +3122,8 @@ SymbolFileDWARF::FindDefinitionTypeForDWARFDeclContext(const DWARFDIE &die) {
return true;
}

DWARFDeclContext type_dwarf_decl_ctx = GetDWARFDeclContext(type_die);

if (log) {
DWARFDeclContext type_dwarf_decl_ctx = GetDWARFDeclContext(type_die);
GetObjectFile()->GetModule()->LogMessage(
log,
"SymbolFileDWARF::"
Expand All @@ -3134,10 +3133,6 @@ SymbolFileDWARF::FindDefinitionTypeForDWARFDeclContext(const DWARFDIE &die) {
type_dwarf_decl_ctx.GetQualifiedName());
}

// Make sure the decl contexts match all the way up
if (die_dwarf_decl_ctx != type_dwarf_decl_ctx)
return true;

Type *resolved_type = ResolveType(type_die, false);
if (!resolved_type || resolved_type == DIE_IS_BEING_PARSED)
return true;
Expand Down

0 comments on commit b828fb2

Please sign in to comment.