llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-lldb Author: Augusto Noronha (augusto2112) <details> <summary>Changes</summary> Swift types have mangled type names. This adds functionality to look up those types through the FindTypes API by searching for the mangled type name instead of the regular name. --- Full diff: https://github.com/llvm/llvm-project/pull/113007.diff 7 Files Affected: - (modified) lldb/include/lldb/Symbol/Type.h (+8) - (modified) lldb/source/Plugins/SymbolFile/CTF/SymbolFileCTF.cpp (+10-4) - (modified) lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp (+28-7) - (modified) lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.h (+3-2) - (modified) lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp (+1-1) - (modified) lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp (+4-1) - (modified) lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp (+4-1) ``````````diff diff --git a/lldb/include/lldb/Symbol/Type.h b/lldb/include/lldb/Symbol/Type.h index 03d9f927997476..b90cfc44e907b9 100644 --- a/lldb/include/lldb/Symbol/Type.h +++ b/lldb/include/lldb/Symbol/Type.h @@ -84,6 +84,8 @@ FLAGS_ENUM(TypeQueryOptions){ /// matching type is found. When false, the type query should find all /// matching types. e_find_one = (1u << 4), + // If set, treat TypeQuery::m_name as a mangled name that should be searched. + e_search_by_mangled_name = (1u << 5), }; LLDB_MARK_AS_BITMASK_ENUM(TypeQueryOptions) @@ -300,6 +302,12 @@ class TypeQuery { m_options &= ~e_find_one; } + /// Returns true if the type query is supposed to treat the name to be searched + /// as a mangled name. + bool GetSearchByMangledName() const { + return (m_options & e_search_by_mangled_name) != 0; + } + /// Access the internal compiler context array. /// /// Clients can use this to populate the context manually. diff --git a/lldb/source/Plugins/SymbolFile/CTF/SymbolFileCTF.cpp b/lldb/source/Plugins/SymbolFile/CTF/SymbolFileCTF.cpp index bb738c3dcc54a0..ee63c21663128a 100644 --- a/lldb/source/Plugins/SymbolFile/CTF/SymbolFileCTF.cpp +++ b/lldb/source/Plugins/SymbolFile/CTF/SymbolFileCTF.cpp @@ -1032,10 +1032,16 @@ void SymbolFileCTF::FindTypes(const lldb_private::TypeQuery &match, ConstString name = match.GetTypeBasename(); for (TypeSP type_sp : GetTypeList().Types()) { - if (type_sp && type_sp->GetName() == name) { - results.InsertUnique(type_sp); - if (results.Done(match)) - return; + if (type_sp) { + auto type_name = + match.GetSearchByMangledName() + ? type_sp->GetForwardCompilerType().GetMangledTypeName() + : type_sp->GetName(); + if (type_name == name) { + results.InsertUnique(type_sp); + if (results.Done(match)) + return; + } } } } diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp index d83740f8e2113b..d4604d72b3a3b6 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp @@ -14,6 +14,7 @@ #include "DWARFDeclContext.h" #include "DWARFUnit.h" #include "lldb/Symbol/Type.h" +#include "lldb/lldb-private-enumerations.h" #include "llvm/ADT/iterator.h" #include "llvm/BinaryFormat/Dwarf.h" @@ -368,7 +369,7 @@ lldb_private::Type *DWARFDIE::ResolveTypeUID(const DWARFDIE &die) const { return nullptr; } -static void GetDeclContextImpl(DWARFDIE die, +static void GetDeclContextImpl(DWARFDIE die, bool use_mangled_name, llvm::SmallSet<lldb::user_id_t, 4> &seen, std::vector<CompilerContext> &context) { // Stop if we hit a cycle. @@ -383,6 +384,13 @@ static void GetDeclContextImpl(DWARFDIE die, auto push_ctx = [&](CompilerContextKind kind, llvm::StringRef name) { context.push_back({kind, ConstString(name)}); }; + + // Since mangled names are unique there's no need to build an entire context. + if (use_mangled_name) { + push_ctx(CompilerContextKind::AnyType, die.GetMangledName()); + return; + } + switch (die.Tag()) { case DW_TAG_module: push_ctx(CompilerContextKind::Module, die.GetName()); @@ -417,15 +425,15 @@ static void GetDeclContextImpl(DWARFDIE die, } } -std::vector<CompilerContext> DWARFDIE::GetDeclContext() const { +std::vector<CompilerContext> DWARFDIE::GetDeclContext(bool use_mangled_name) const { llvm::SmallSet<lldb::user_id_t, 4> seen; std::vector<CompilerContext> context; - GetDeclContextImpl(*this, seen, context); + GetDeclContextImpl(*this, use_mangled_name, seen, context); std::reverse(context.begin(), context.end()); return context; } -static void GetTypeLookupContextImpl(DWARFDIE die, +static void GetTypeLookupContextImpl(DWARFDIE die, bool use_mangled_name, llvm::SmallSet<lldb::user_id_t, 4> &seen, std::vector<CompilerContext> &context) { // Stop if we hit a cycle. @@ -434,6 +442,19 @@ static void GetTypeLookupContextImpl(DWARFDIE die, auto push_ctx = [&](CompilerContextKind kind, llvm::StringRef name) { context.push_back({kind, ConstString(name)}); }; + + // Since mangled names are unique there's no need to build an entire context. + if (use_mangled_name) { + push_ctx(CompilerContextKind::AnyType, die.GetMangledName()); + return; + } + + // If there is no name, then there is no need to look anything up for this + // DIE. + const char *name = die.GetName(); + if (!name || !name[0]) + return; + switch (die.Tag()) { case DW_TAG_namespace: push_ctx(CompilerContextKind::Namespace, die.GetName()); @@ -453,7 +474,7 @@ static void GetTypeLookupContextImpl(DWARFDIE die, break; case DW_TAG_typedef: push_ctx(CompilerContextKind::Typedef, die.GetName()); - break; + break; case DW_TAG_base_type: push_ctx(CompilerContextKind::Builtin, die.GetName()); break; @@ -477,10 +498,10 @@ static void GetTypeLookupContextImpl(DWARFDIE die, } } -std::vector<CompilerContext> DWARFDIE::GetTypeLookupContext() const { +std::vector<CompilerContext> DWARFDIE::GetTypeLookupContext(bool use_mangled_name) const { llvm::SmallSet<lldb::user_id_t, 4> seen; std::vector<CompilerContext> context; - GetTypeLookupContextImpl(*this, seen, context); + GetTypeLookupContextImpl(*this, use_mangled_name, seen, context); std::reverse(context.begin(), context.end()); return context; } diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.h index e1318953a384cd..109070bdcb6e95 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.h @@ -72,7 +72,7 @@ class DWARFDIE : public DWARFBaseDIE { /// Return this DIE's decl context as it is needed to look up types /// in Clang modules. This context will include any modules or functions that /// the type is declared in so an exact module match can be efficiently made. - std::vector<CompilerContext> GetDeclContext() const; + std::vector<CompilerContext> GetDeclContext(bool use_mangled_name = false) const; /// Get a context to a type so it can be looked up. /// @@ -84,7 +84,8 @@ class DWARFDIE : public DWARFBaseDIE { /// appropriate time, like either the translation unit or at a function /// context. This is designed to allow users to efficiently look for types /// using a full or partial CompilerContext array. - std::vector<CompilerContext> GetTypeLookupContext() const; + std::vector<CompilerContext> + GetTypeLookupContext(bool use_mangled_name = false) const; DWARFDeclContext GetDWARFDeclContext() const; diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index 9287d4baf19e9c..f1956f006de84d 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -2762,7 +2762,7 @@ void SymbolFileDWARF::FindTypes(const TypeQuery &query, TypeResults &results) { if (query.GetModuleSearch()) die_context = die.GetDeclContext(); else - die_context = die.GetTypeLookupContext(); + die_context = die.GetTypeLookupContext(query.GetSearchByMangledName()); assert(!die_context.empty()); if (!query.ContextMatches(die_context)) return true; // Keep iterating over index types, context mismatch. diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp index 7fded6a31a3af5..b55518a136c997 100644 --- a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp +++ b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp @@ -1735,7 +1735,10 @@ void SymbolFileNativePDB::FindTypes(const lldb_private::TypeQuery &query, continue; // We resolved a type. Get the fully qualified name to ensure it matches. - ConstString name = type_sp->GetQualifiedName(); + ConstString name = + query.GetSearchByMangledName() + ? type_sp->GetForwardCompilerType().GetMangledTypeName() + : type_sp->GetQualifiedName(); TypeQuery type_match(name.GetStringRef(), TypeQueryOptions::e_exact_match); if (query.ContextMatches(type_match.GetContextRef())) { results.InsertUnique(type_sp); diff --git a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp index 584c2115459c66..0179c52df9e563 100644 --- a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp +++ b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp @@ -1562,7 +1562,10 @@ void SymbolFilePDB::FindTypes(const lldb_private::TypeQuery &query, if (iter == m_types.end()) continue; // We resolved a type. Get the fully qualified name to ensure it matches. - ConstString name = iter->second->GetQualifiedName(); + ConstString name = + query.GetSearchByMangledName() + ? iter->second->GetForwardCompilerType().GetMangledTypeName() + : iter->second->GetQualifiedName(); TypeQuery type_match(name.GetStringRef(), TypeQueryOptions::e_exact_match); if (query.ContextMatches(type_match.GetContextRef())) { type_results.InsertUnique(iter->second); `````````` </details> https://github.com/llvm/llvm-project/pull/113007 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits