11
11
// ===----------------------------------------------------------------------===//
12
12
13
13
#include " Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.h"
14
+ #include " Plugins/TypeSystem/Swift/SwiftASTContext.h"
14
15
15
16
#include " lldb/Symbol/CompileUnit.h"
16
17
#include " lldb/Symbol/TypeList.h"
@@ -52,23 +53,39 @@ static ConstString GetTypeAlias(swift::Demangle::Demangler &dem,
52
53
return ConstString (mangleNode (global));
53
54
}
54
55
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)
65
76
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;
67
83
}
68
84
69
85
// / 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))
72
89
return type->GetForwardCompilerType ();
73
90
return {};
74
91
}
@@ -119,22 +136,28 @@ GetDemangledType(swift::Demangle::Demangler &dem, StringRef name) {
119
136
// / __C module are resolved as Clang types.
120
137
// /
121
138
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,
123
141
swift::Demangle::NodePointer node,
124
142
bool prefer_clang_types = false ) {
125
143
// Try to look this up as a Swift type alias. For each *Swift*
126
144
// type alias there is a debug info entry that has the mangled
127
145
// name as name and the aliased type as a type.
128
146
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
- }
134
147
TypeList types;
135
148
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
+ }
138
161
}
139
162
if (prefer_clang_types || types.Empty ()) {
140
163
// No Swift type found -- this could be a Clang typedef. This
@@ -146,7 +169,7 @@ ResolveTypeAlias(lldb_private::Module *M, swift::Demangle::Demangler &dem,
146
169
node->getChild (1 )->hasText ()) {
147
170
// Resolve the typedef within the Clang debug info.
148
171
auto clang_type =
149
- LookupClangForwardType (*M , node->getChild (1 )->getText ());
172
+ LookupClangForwardType (module_holder , node->getChild (1 )->getText ());
150
173
if (!clang_type)
151
174
return {{}, {}};
152
175
return {{}, clang_type.GetCanonicalType ()};
@@ -214,7 +237,8 @@ swift::Demangle::NodePointer TypeSystemSwiftTypeRef::Transform(
214
237
// / Iteratively resolve all type aliases in \p node by looking up their
215
238
// / desugared types in the debug info of module \p M.
216
239
static swift::Demangle::NodePointer
217
- GetCanonicalNode (lldb_private::Module *M, swift::Demangle::Demangler &dem,
240
+ GetCanonicalNode (SwiftASTContext *module_holder,
241
+ swift::Demangle::Demangler &dem,
218
242
swift::Demangle::NodePointer node) {
219
243
using namespace swift ::Demangle;
220
244
return TypeSystemSwiftTypeRef::Transform (dem, node, [&](NodePointer node) {
@@ -317,7 +341,7 @@ GetCanonicalNode(lldb_private::Module *M, swift::Demangle::Demangler &dem,
317
341
318
342
case Node::Kind::BoundGenericTypeAlias:
319
343
case Node::Kind::TypeAlias: {
320
- auto node_clangtype = ResolveTypeAlias (M , dem, node);
344
+ auto node_clangtype = ResolveTypeAlias (module_holder , dem, node);
321
345
if (CompilerType clang_type = node_clangtype.second )
322
346
return GetClangTypeNode (clang_type, dem);
323
347
if (node_clangtype.first )
@@ -334,10 +358,10 @@ GetCanonicalNode(lldb_private::Module *M, swift::Demangle::Demangler &dem,
334
358
// / Return the demangle tree representation of this type's canonical
335
359
// / (type aliases resolved) type.
336
360
swift::Demangle::NodePointer TypeSystemSwiftTypeRef::GetCanonicalDemangleTree (
337
- lldb_private::Module *Module , swift::Demangle::Demangler &dem,
361
+ SwiftASTContext *module_holder , swift::Demangle::Demangler &dem,
338
362
StringRef mangled_name) {
339
363
NodePointer node = dem.demangleSymbol (mangled_name);
340
- NodePointer canonical = GetCanonicalNode (Module , dem, node);
364
+ NodePointer canonical = GetCanonicalNode (module_holder , dem, node);
341
365
return canonical;
342
366
}
343
367
@@ -504,7 +528,7 @@ TypeSystemSwiftTypeRef::GetSwiftified(swift::Demangle::Demangler &dem,
504
528
505
529
// This is an imported Objective-C type; look it up in the
506
530
// debug info.
507
- TypeSP clang_type = LookupClangType (*Module , ident);
531
+ TypeSP clang_type = LookupClangType (m_swift_ast_context , ident);
508
532
if (!clang_type)
509
533
return node;
510
534
@@ -680,7 +704,8 @@ swift::Demangle::NodePointer TypeSystemSwiftTypeRef::GetDemangleTreeForPrinting(
680
704
// / determine whether a node is generic or not, it needs to visit all
681
705
// / nodes. The \p generic_walk argument specifies that the primary
682
706
// / 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,
684
709
swift::Demangle::NodePointer node,
685
710
bool generic_walk = false ) {
686
711
if (!node)
@@ -724,6 +749,7 @@ static uint32_t collectTypeInfo(Module *M, swift::Demangle::Demangler &dem,
724
749
}
725
750
else
726
751
switch (node->getKind ()) {
752
+
727
753
case Node::Kind::SugaredOptional:
728
754
swift_flags |= eTypeIsGeneric | eTypeIsBound | eTypeHasChildren |
729
755
eTypeHasValue | eTypeIsEnumeration;
@@ -793,7 +819,8 @@ static uint32_t collectTypeInfo(Module *M, swift::Demangle::Demangler &dem,
793
819
if (node->getNumChildren () != 2 )
794
820
break ;
795
821
// Bug-for-bug compatibility.
796
- if (!(collectTypeInfo (M, dem, node->getChild (1 )) & eTypeIsGenericTypeParam))
822
+ if (!(collectTypeInfo (module_holder, dem, node->getChild (1 )) &
823
+ eTypeIsGenericTypeParam))
797
824
swift_flags |= eTypeHasValue | eTypeHasChildren;
798
825
auto module = node->getChild (0 );
799
826
if (module->hasText () &&
@@ -827,10 +854,9 @@ static uint32_t collectTypeInfo(Module *M, swift::Demangle::Demangler &dem,
827
854
if (ident->getKind () != Node::Kind::Identifier || !ident->hasText ())
828
855
break ;
829
856
830
- if (!M)
831
- break ;
832
857
// 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 ());
834
860
collect_clang_type (clang_type.GetCanonicalType ());
835
861
return swift_flags;
836
862
}
@@ -879,12 +905,14 @@ static uint32_t collectTypeInfo(Module *M, swift::Demangle::Demangler &dem,
879
905
case Node::Kind::TypeAlias: {
880
906
// Bug-for-bug compatibility.
881
907
// swift_flags |= eTypeIsTypedef;
882
- auto node_clangtype = ResolveTypeAlias (M, dem, node);
908
+ auto node_clangtype =
909
+ ResolveTypeAlias (module_holder, dem, node);
883
910
if (CompilerType clang_type = node_clangtype.second ) {
884
911
collect_clang_type (clang_type);
885
912
return swift_flags;
886
913
}
887
- swift_flags |= collectTypeInfo (M, dem, node_clangtype.first , generic_walk);
914
+ swift_flags |= collectTypeInfo (module_holder, dem, node_clangtype.first ,
915
+ generic_walk);
888
916
return swift_flags;
889
917
}
890
918
default :
@@ -897,7 +925,7 @@ static uint32_t collectTypeInfo(Module *M, swift::Demangle::Demangler &dem,
897
925
898
926
// Visit the child nodes.
899
927
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);
901
929
902
930
return swift_flags;
903
931
}
@@ -1276,8 +1304,8 @@ TypeSystemSwiftTypeRef::RemangleAsType(swift::Demangle::Demangler &dem,
1276
1304
swift::Demangle::NodePointer TypeSystemSwiftTypeRef::DemangleCanonicalType (
1277
1305
swift::Demangle::Demangler &dem, opaque_compiler_type_t opaque_type) {
1278
1306
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));
1281
1309
return GetType (node);
1282
1310
}
1283
1311
@@ -1538,7 +1566,7 @@ uint32_t TypeSystemSwiftTypeRef::GetTypeInfo(
1538
1566
using namespace swift ::Demangle;
1539
1567
Demangler dem;
1540
1568
NodePointer node = dem.demangleSymbol (AsMangledName (type));
1541
- return collectTypeInfo (GetModule () , dem, node);
1569
+ return collectTypeInfo (m_swift_ast_context , dem, node);
1542
1570
};
1543
1571
VALIDATE_AND_RETURN (impl, GetTypeInfo, type,
1544
1572
(ReconstructType (type), nullptr ));
@@ -1593,7 +1621,7 @@ TypeSystemSwiftTypeRef::GetCanonicalType(opaque_compiler_type_t type) {
1593
1621
using namespace swift ::Demangle;
1594
1622
Demangler dem;
1595
1623
NodePointer canonical =
1596
- GetCanonicalDemangleTree (GetModule () , dem, AsMangledName (type));
1624
+ GetCanonicalDemangleTree (m_swift_ast_context , dem, AsMangledName (type));
1597
1625
ConstString mangled (mangleNode (canonical));
1598
1626
return GetTypeFromMangledTypename (mangled);
1599
1627
};
@@ -1831,7 +1859,7 @@ CompilerType TypeSystemSwiftTypeRef::GetAsClangTypeOrNull(
1831
1859
node->getNumChildren () == 2 && node->getChild (0 )->hasText () &&
1832
1860
node->getChild (0 )->getText () == swift::MANGLING_MODULE_OBJC &&
1833
1861
node->getChild (1 )->hasText ()) {
1834
- auto node_clangtype = ResolveTypeAlias (GetModule () , dem, node,
1862
+ auto node_clangtype = ResolveTypeAlias (m_swift_ast_context , dem, node,
1835
1863
/* prefer_clang_types*/ true );
1836
1864
if (node_clangtype.second )
1837
1865
return node_clangtype.second ;
@@ -1853,7 +1881,7 @@ bool TypeSystemSwiftTypeRef::IsImportedType(opaque_compiler_type_t type,
1853
1881
if (ident.empty ())
1854
1882
return {};
1855
1883
if (original_type && GetModule ())
1856
- if (TypeSP clang_type = LookupClangType (* GetModule () , ident))
1884
+ if (TypeSP clang_type = LookupClangType (m_swift_ast_context , ident))
1857
1885
*original_type = clang_type->GetForwardCompilerType ();
1858
1886
return true ;
1859
1887
};
0 commit comments