Skip to content

Commit e161d5c

Browse files
committed
Refactor LookupClangType to take a module holder rather than a module.
This allows look up types in an entire expression context in addition to looking types up in just one lldb::Module.
1 parent e31457a commit e161d5c

6 files changed

+81
-57
lines changed

lldb/source/Plugins/TypeSystem/Swift/SwiftASTContext.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,8 @@ class SwiftASTContext : public TypeSystemSwift {
175175

176176
bool SupportsLanguage(lldb::LanguageType language) override;
177177

178+
SwiftASTContext *GetSwiftASTContext() override { return this; }
179+
178180
Status IsCompatible() override;
179181

180182
swift::SourceManager &GetSourceManager();

lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwift.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ class Decl;
2727

2828
namespace lldb_private {
2929
class TypeSystemClang;
30+
class SwiftASTContext;
3031

3132
/// The implementation of lldb::Type's m_payload field for TypeSystemSwift.
3233
class TypePayloadSwift {
@@ -97,6 +98,7 @@ class TypeSystemSwift : public TypeSystem {
9798
/// \}
9899

99100
static LanguageSet GetSupportedLanguagesForTypes();
101+
virtual SwiftASTContext *GetSwiftASTContext() = 0;
100102
virtual Module *GetModule() const = 0;
101103
virtual lldb::TypeSP GetCachedType(ConstString mangled) = 0;
102104
virtual void SetCachedType(ConstString mangled,

lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.cpp

Lines changed: 69 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
#include "Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.h"
14+
#include "Plugins/TypeSystem/Swift/SwiftASTContext.h"
1415

1516
#include "lldb/Symbol/CompileUnit.h"
1617
#include "lldb/Symbol/TypeList.h"
@@ -52,23 +53,39 @@ static ConstString GetTypeAlias(swift::Demangle::Demangler &dem,
5253
return ConstString(mangleNode(global));
5354
}
5455

55-
/// Find a Clang type by name in module \p M.
56-
static TypeSP LookupClangType(Module &M, StringRef name) {
57-
llvm::SmallVector<CompilerContext, 2> decl_context;
58-
decl_context.push_back({CompilerContextKind::AnyModule, ConstString()});
59-
decl_context.push_back({CompilerContextKind::AnyType, ConstString(name)});
60-
llvm::DenseSet<SymbolFile *> searched_symbol_files;
61-
TypeMap clang_types;
62-
M.FindTypes(decl_context, TypeSystemClang::GetSupportedLanguagesForTypes(),
63-
searched_symbol_files, clang_types);
64-
if (clang_types.Empty())
56+
/// Find a Clang type by name in the modules in \p module_holder.
57+
static TypeSP LookupClangType(SwiftASTContext *module_holder, StringRef name) {
58+
auto lookup = [](Module &M, StringRef name) -> TypeSP {
59+
llvm::SmallVector<CompilerContext, 2> decl_context;
60+
decl_context.push_back({CompilerContextKind::AnyModule, ConstString()});
61+
decl_context.push_back({CompilerContextKind::AnyType, ConstString(name)});
62+
llvm::DenseSet<SymbolFile *> searched_symbol_files;
63+
TypeMap clang_types;
64+
M.FindTypes(decl_context, TypeSystemClang::GetSupportedLanguagesForTypes(),
65+
searched_symbol_files, clang_types);
66+
if (clang_types.Empty())
67+
return {};
68+
return clang_types.GetTypeAtIndex(0);
69+
};
70+
if (!module_holder)
71+
return {};
72+
if (auto *M = module_holder->GetModule())
73+
return lookup(*M, name);
74+
TargetSP target_sp = module_holder->GetTarget().lock();
75+
if (!target_sp)
6576
return {};
66-
return clang_types.GetTypeAtIndex(0);
77+
TypeSP result;
78+
target_sp->GetImages().ForEach([&](const ModuleSP &module) -> bool {
79+
result = lookup(const_cast<Module &>(*module), name);
80+
return !result;
81+
});
82+
return result;
6783
}
6884

6985
/// Find a Clang type by name in module \p M.
70-
CompilerType LookupClangForwardType(Module &M, StringRef name) {
71-
if (TypeSP type = LookupClangType(M, name))
86+
static CompilerType LookupClangForwardType(SwiftASTContext *module_holder,
87+
StringRef name) {
88+
if (TypeSP type = LookupClangType(module_holder, name))
7289
return type->GetForwardCompilerType();
7390
return {};
7491
}
@@ -119,22 +136,28 @@ GetDemangledType(swift::Demangle::Demangler &dem, StringRef name) {
119136
/// __C module are resolved as Clang types.
120137
///
121138
static std::pair<swift::Demangle::NodePointer, CompilerType>
122-
ResolveTypeAlias(lldb_private::Module *M, swift::Demangle::Demangler &dem,
139+
ResolveTypeAlias(SwiftASTContext *module_holder,
140+
swift::Demangle::Demangler &dem,
123141
swift::Demangle::NodePointer node,
124142
bool prefer_clang_types = false) {
125143
// Try to look this up as a Swift type alias. For each *Swift*
126144
// type alias there is a debug info entry that has the mangled
127145
// name as name and the aliased type as a type.
128146
ConstString mangled = GetTypeAlias(dem, node);
129-
if (!M) {
130-
LLDB_LOGF(GetLogIfAllCategoriesSet(LIBLLDB_LOG_TYPES),
131-
"No module. Couldn't resolve type alias %s", mangled.AsCString());
132-
return {{}, {}};
133-
}
134147
TypeList types;
135148
if (!prefer_clang_types) {
136-
llvm::DenseSet<lldb_private::SymbolFile *> searched_symbol_files;
137-
M->FindTypes({mangled}, false, 1, searched_symbol_files, types);
149+
llvm::DenseSet<SymbolFile *> searched_symbol_files;
150+
if (auto *M = module_holder->GetModule())
151+
M->FindTypes({mangled}, false, 1, searched_symbol_files, types);
152+
else if (TargetSP target_sp = module_holder->GetTarget().lock())
153+
target_sp->GetImages().FindTypes(nullptr, {mangled},
154+
false, 1, searched_symbol_files, types);
155+
else {
156+
LLDB_LOGF(GetLogIfAllCategoriesSet(LIBLLDB_LOG_TYPES),
157+
"No module. Couldn't resolve type alias %s",
158+
mangled.AsCString());
159+
return {{}, {}};
160+
}
138161
}
139162
if (prefer_clang_types || types.Empty()) {
140163
// No Swift type found -- this could be a Clang typedef. This
@@ -146,7 +169,7 @@ ResolveTypeAlias(lldb_private::Module *M, swift::Demangle::Demangler &dem,
146169
node->getChild(1)->hasText()) {
147170
// Resolve the typedef within the Clang debug info.
148171
auto clang_type =
149-
LookupClangForwardType(*M, node->getChild(1)->getText());
172+
LookupClangForwardType(module_holder, node->getChild(1)->getText());
150173
if (!clang_type)
151174
return {{}, {}};
152175
return {{}, clang_type.GetCanonicalType()};
@@ -214,7 +237,8 @@ swift::Demangle::NodePointer TypeSystemSwiftTypeRef::Transform(
214237
/// Iteratively resolve all type aliases in \p node by looking up their
215238
/// desugared types in the debug info of module \p M.
216239
static swift::Demangle::NodePointer
217-
GetCanonicalNode(lldb_private::Module *M, swift::Demangle::Demangler &dem,
240+
GetCanonicalNode(SwiftASTContext *module_holder,
241+
swift::Demangle::Demangler &dem,
218242
swift::Demangle::NodePointer node) {
219243
using namespace swift::Demangle;
220244
return TypeSystemSwiftTypeRef::Transform(dem, node, [&](NodePointer node) {
@@ -317,7 +341,7 @@ GetCanonicalNode(lldb_private::Module *M, swift::Demangle::Demangler &dem,
317341

318342
case Node::Kind::BoundGenericTypeAlias:
319343
case Node::Kind::TypeAlias: {
320-
auto node_clangtype = ResolveTypeAlias(M, dem, node);
344+
auto node_clangtype = ResolveTypeAlias(module_holder, dem, node);
321345
if (CompilerType clang_type = node_clangtype.second)
322346
return GetClangTypeNode(clang_type, dem);
323347
if (node_clangtype.first)
@@ -334,10 +358,10 @@ GetCanonicalNode(lldb_private::Module *M, swift::Demangle::Demangler &dem,
334358
/// Return the demangle tree representation of this type's canonical
335359
/// (type aliases resolved) type.
336360
swift::Demangle::NodePointer TypeSystemSwiftTypeRef::GetCanonicalDemangleTree(
337-
lldb_private::Module *Module, swift::Demangle::Demangler &dem,
361+
SwiftASTContext *module_holder, swift::Demangle::Demangler &dem,
338362
StringRef mangled_name) {
339363
NodePointer node = dem.demangleSymbol(mangled_name);
340-
NodePointer canonical = GetCanonicalNode(Module, dem, node);
364+
NodePointer canonical = GetCanonicalNode(module_holder, dem, node);
341365
return canonical;
342366
}
343367

@@ -504,7 +528,7 @@ TypeSystemSwiftTypeRef::GetSwiftified(swift::Demangle::Demangler &dem,
504528

505529
// This is an imported Objective-C type; look it up in the
506530
// debug info.
507-
TypeSP clang_type = LookupClangType(*Module, ident);
531+
TypeSP clang_type = LookupClangType(m_swift_ast_context, ident);
508532
if (!clang_type)
509533
return node;
510534

@@ -680,7 +704,8 @@ swift::Demangle::NodePointer TypeSystemSwiftTypeRef::GetDemangleTreeForPrinting(
680704
/// determine whether a node is generic or not, it needs to visit all
681705
/// nodes. The \p generic_walk argument specifies that the primary
682706
/// attributes have been collected and that we only look for generics.
683-
static uint32_t collectTypeInfo(Module *M, swift::Demangle::Demangler &dem,
707+
static uint32_t collectTypeInfo(SwiftASTContext *module_holder,
708+
swift::Demangle::Demangler &dem,
684709
swift::Demangle::NodePointer node,
685710
bool generic_walk = false) {
686711
if (!node)
@@ -724,6 +749,7 @@ static uint32_t collectTypeInfo(Module *M, swift::Demangle::Demangler &dem,
724749
}
725750
else
726751
switch (node->getKind()) {
752+
727753
case Node::Kind::SugaredOptional:
728754
swift_flags |= eTypeIsGeneric | eTypeIsBound | eTypeHasChildren |
729755
eTypeHasValue | eTypeIsEnumeration;
@@ -793,7 +819,8 @@ static uint32_t collectTypeInfo(Module *M, swift::Demangle::Demangler &dem,
793819
if (node->getNumChildren() != 2)
794820
break;
795821
// Bug-for-bug compatibility.
796-
if (!(collectTypeInfo(M, dem, node->getChild(1)) & eTypeIsGenericTypeParam))
822+
if (!(collectTypeInfo(module_holder, dem, node->getChild(1)) &
823+
eTypeIsGenericTypeParam))
797824
swift_flags |= eTypeHasValue | eTypeHasChildren;
798825
auto module = node->getChild(0);
799826
if (module->hasText() &&
@@ -827,10 +854,9 @@ static uint32_t collectTypeInfo(Module *M, swift::Demangle::Demangler &dem,
827854
if (ident->getKind() != Node::Kind::Identifier || !ident->hasText())
828855
break;
829856

830-
if (!M)
831-
break;
832857
// Look up the Clang type in DWARF.
833-
CompilerType clang_type = LookupClangForwardType(*M, ident->getText());
858+
CompilerType clang_type =
859+
LookupClangForwardType(module_holder, ident->getText());
834860
collect_clang_type(clang_type.GetCanonicalType());
835861
return swift_flags;
836862
}
@@ -879,12 +905,14 @@ static uint32_t collectTypeInfo(Module *M, swift::Demangle::Demangler &dem,
879905
case Node::Kind::TypeAlias: {
880906
// Bug-for-bug compatibility.
881907
// swift_flags |= eTypeIsTypedef;
882-
auto node_clangtype = ResolveTypeAlias(M, dem, node);
908+
auto node_clangtype =
909+
ResolveTypeAlias(module_holder, dem, node);
883910
if (CompilerType clang_type = node_clangtype.second) {
884911
collect_clang_type(clang_type);
885912
return swift_flags;
886913
}
887-
swift_flags |= collectTypeInfo(M, dem, node_clangtype.first, generic_walk);
914+
swift_flags |= collectTypeInfo(module_holder, dem, node_clangtype.first,
915+
generic_walk);
888916
return swift_flags;
889917
}
890918
default:
@@ -897,7 +925,7 @@ static uint32_t collectTypeInfo(Module *M, swift::Demangle::Demangler &dem,
897925

898926
// Visit the child nodes.
899927
for (unsigned i = 0; i < node->getNumChildren(); ++i)
900-
swift_flags |= collectTypeInfo(M, dem, node->getChild(i), generic_walk);
928+
swift_flags |= collectTypeInfo(module_holder, dem, node->getChild(i), generic_walk);
901929

902930
return swift_flags;
903931
}
@@ -1276,8 +1304,8 @@ TypeSystemSwiftTypeRef::RemangleAsType(swift::Demangle::Demangler &dem,
12761304
swift::Demangle::NodePointer TypeSystemSwiftTypeRef::DemangleCanonicalType(
12771305
swift::Demangle::Demangler &dem, opaque_compiler_type_t opaque_type) {
12781306
using namespace swift::Demangle;
1279-
NodePointer node =
1280-
GetCanonicalDemangleTree(GetModule(), dem, AsMangledName(opaque_type));
1307+
NodePointer node = GetCanonicalDemangleTree(m_swift_ast_context, dem,
1308+
AsMangledName(opaque_type));
12811309
return GetType(node);
12821310
}
12831311

@@ -1538,7 +1566,7 @@ uint32_t TypeSystemSwiftTypeRef::GetTypeInfo(
15381566
using namespace swift::Demangle;
15391567
Demangler dem;
15401568
NodePointer node = dem.demangleSymbol(AsMangledName(type));
1541-
return collectTypeInfo(GetModule(), dem, node);
1569+
return collectTypeInfo(m_swift_ast_context, dem, node);
15421570
};
15431571
VALIDATE_AND_RETURN(impl, GetTypeInfo, type,
15441572
(ReconstructType(type), nullptr));
@@ -1593,7 +1621,7 @@ TypeSystemSwiftTypeRef::GetCanonicalType(opaque_compiler_type_t type) {
15931621
using namespace swift::Demangle;
15941622
Demangler dem;
15951623
NodePointer canonical =
1596-
GetCanonicalDemangleTree(GetModule(), dem, AsMangledName(type));
1624+
GetCanonicalDemangleTree(m_swift_ast_context, dem, AsMangledName(type));
15971625
ConstString mangled(mangleNode(canonical));
15981626
return GetTypeFromMangledTypename(mangled);
15991627
};
@@ -1831,7 +1859,7 @@ CompilerType TypeSystemSwiftTypeRef::GetAsClangTypeOrNull(
18311859
node->getNumChildren() == 2 && node->getChild(0)->hasText() &&
18321860
node->getChild(0)->getText() == swift::MANGLING_MODULE_OBJC &&
18331861
node->getChild(1)->hasText()) {
1834-
auto node_clangtype = ResolveTypeAlias(GetModule(), dem, node,
1862+
auto node_clangtype = ResolveTypeAlias(m_swift_ast_context, dem, node,
18351863
/*prefer_clang_types*/ true);
18361864
if (node_clangtype.second)
18371865
return node_clangtype.second;
@@ -1853,7 +1881,7 @@ bool TypeSystemSwiftTypeRef::IsImportedType(opaque_compiler_type_t type,
18531881
if (ident.empty())
18541882
return {};
18551883
if (original_type && GetModule())
1856-
if (TypeSP clang_type = LookupClangType(*GetModule(), ident))
1884+
if (TypeSP clang_type = LookupClangType(m_swift_ast_context, ident))
18571885
*original_type = clang_type->GetForwardCompilerType();
18581886
return true;
18591887
};

lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class TypeSystemSwiftTypeRef : public TypeSystemSwift {
4949
/// \}
5050

5151
TypeSystemSwiftTypeRef(SwiftASTContext *swift_ast_context);
52+
SwiftASTContext *GetSwiftASTContext() override { return m_swift_ast_context; }
5253

5354
Module *GetModule() const override;
5455
swift::CanType GetCanonicalSwiftType(CompilerType compiler_type);
@@ -268,7 +269,7 @@ class TypeSystemSwiftTypeRef : public TypeSystemSwift {
268269

269270
/// Return the canonicalized Demangle tree for a Swift mangled type name.
270271
static swift::Demangle::NodePointer
271-
GetCanonicalDemangleTree(lldb_private::Module *Module,
272+
GetCanonicalDemangleTree(SwiftASTContext *module_holder,
272273
swift::Demangle::Demangler &dem,
273274
llvm::StringRef mangled_name);
274275

lldb/source/Target/SwiftLanguageRuntimeDynamicTypeResolution.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2106,7 +2106,8 @@ lldb::addr_t SwiftLanguageRuntime::FixupAddress(lldb::addr_t addr,
21062106
}
21072107

21082108
const swift::reflection::TypeRef *
2109-
SwiftLanguageRuntimeImpl::GetTypeRef(CompilerType type, Module *module) {
2109+
SwiftLanguageRuntimeImpl::GetTypeRef(CompilerType type,
2110+
SwiftASTContext *module_holder) {
21102111
// Demangle the mangled name.
21112112
swift::Demangle::Demangler dem;
21122113
ConstString mangled_name = type.GetMangledTypeName();
@@ -2115,7 +2116,8 @@ SwiftLanguageRuntimeImpl::GetTypeRef(CompilerType type, Module *module) {
21152116
return nullptr;
21162117
swift::Demangle::NodePointer node =
21172118
TypeSystemSwiftTypeRef::GetCanonicalDemangleTree(
2118-
module ? module : ts->GetModule(), dem, mangled_name.GetStringRef());
2119+
module_holder ? module_holder : ts->GetSwiftASTContext(), dem,
2120+
mangled_name.GetStringRef());
21192121
if (!node)
21202122
return nullptr;
21212123

@@ -2158,7 +2160,7 @@ SwiftLanguageRuntimeImpl::GetTypeInfo(CompilerType type,
21582160
// context, but we need to resolve (any DWARF links in) the typeref
21592161
// in the original module.
21602162
const swift::reflection::TypeRef *type_ref =
2161-
GetTypeRef(type, ts->GetModule());
2163+
GetTypeRef(type, ts->GetSwiftASTContext());
21622164
if (!type_ref)
21632165
return nullptr;
21642166

lldb/source/Target/SwiftLanguageRuntimeImpl.h

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -148,19 +148,8 @@ class SwiftLanguageRuntimeImpl {
148148

149149
protected:
150150
/// Use the reflection context to build a TypeRef object.
151-
///
152-
/// \param module can be used to specify a module to look up DWARF
153-
/// type references (such as type aliases and Clang types)
154-
/// in. Module only needs to be specified when it is different from
155-
/// \c type.GetTypeSystem().GetModule(). The only situation where it
156-
/// is necessary to specify the module explicitly is if a type has
157-
/// been imported into the scratch context. This is always the
158-
/// module of the outermost type. Even for bound generic types,
159-
/// we're only interested in the module the bound generic type came
160-
/// from, the bound generic parameters can be resolved from their
161-
/// type metadata alone.
162151
const swift::reflection::TypeRef *GetTypeRef(CompilerType type,
163-
Module *module = nullptr);
152+
SwiftASTContext *module_holder);
164153

165154
/// If \p instance points to a Swift object, retrieve its
166155
/// RecordTypeInfo pass it to the callback \p fn. Repeat the process

0 commit comments

Comments
 (0)