13
13
#include " SwiftLanguageRuntimeImpl.h"
14
14
#include " lldb/Utility/LLDBLog.h"
15
15
#include " lldb/Utility/Log.h"
16
+ #include " swift/Demangling/Demangle.h"
16
17
17
18
using namespace lldb ;
18
19
using namespace lldb_private ;
@@ -26,12 +27,14 @@ template <typename ReflectionContext>
26
27
class TargetReflectionContext
27
28
: public SwiftLanguageRuntimeImpl::ReflectionContextInterface {
28
29
ReflectionContext m_reflection_ctx;
30
+ swift::reflection::TypeConverter m_type_converter;
29
31
30
32
public:
31
33
TargetReflectionContext (
32
34
std::shared_ptr<swift::reflection::MemoryReader> reader,
33
35
SwiftMetadataCache *swift_metadata_cache)
34
- : m_reflection_ctx(reader, swift_metadata_cache) {}
36
+ : m_reflection_ctx(reader, swift_metadata_cache),
37
+ m_type_converter (m_reflection_ctx.getBuilder()) {}
35
38
36
39
llvm::Optional<uint32_t > AddImage (
37
40
llvm::function_ref<std::pair<swift::remote::RemoteRef<void >, uint64_t >(
@@ -55,6 +58,39 @@ class TargetReflectionContext
55
58
likely_module_names);
56
59
}
57
60
61
+ const swift::reflection::TypeRef *
62
+ GetTypeRefOrNull (StringRef mangled_type_name) override {
63
+ swift::Demangle::Demangler dem;
64
+ swift::Demangle::NodePointer node = dem.demangleSymbol (mangled_type_name);
65
+ const swift::reflection::TypeRef *type_ref = GetTypeRefOrNull (dem, node);
66
+ if (!type_ref)
67
+ LLDB_LOG (GetLog (LLDBLog::Types), " Could not find typeref for type: {0}" ,
68
+ mangled_type_name);
69
+ return type_ref;
70
+ }
71
+
72
+ virtual const swift::reflection::TypeRef *
73
+ GetTypeRefOrNull (swift::Demangle::Demangler &dem,
74
+ swift::Demangle::NodePointer node) override {
75
+ auto type_ref_or_err =
76
+ swift::Demangle::decodeMangledType (m_reflection_ctx.getBuilder (), node);
77
+ if (type_ref_or_err.isError ()) {
78
+ LLDB_LOG (GetLog (LLDBLog::Types),
79
+ " Could not find typeref: decode mangled type failed. Error: {0}" ,
80
+ type_ref_or_err.getError ()->copyErrorString ());
81
+ return nullptr ;
82
+ }
83
+ return type_ref_or_err.getType ();
84
+ }
85
+
86
+ const swift::reflection::TypeInfo *
87
+ GetClassInstanceTypeInfo (const swift::reflection::TypeRef *type_ref,
88
+ swift::remote::TypeInfoProvider *provider) override {
89
+ if (!type_ref)
90
+ return nullptr ;
91
+ return m_type_converter.getClassInstanceTypeInfo (type_ref, 0 , provider);
92
+ }
93
+
58
94
const swift::reflection::TypeInfo *
59
95
GetTypeInfo (const swift::reflection::TypeRef *type_ref,
60
96
swift::remote::TypeInfoProvider *provider) override {
@@ -95,6 +131,11 @@ class TargetReflectionContext
95
131
return m_reflection_ctx.getReader ();
96
132
}
97
133
134
+ const swift::reflection::TypeRef *
135
+ LookupSuperclass (const swift::reflection::TypeRef *tr) override {
136
+ return m_reflection_ctx.getBuilder ().lookupSuperclass (tr);
137
+ }
138
+
98
139
bool ForEachSuperClassType (
99
140
swift::remote::TypeInfoProvider *tip, lldb::addr_t pointer,
100
141
std::function<bool (SwiftLanguageRuntimeImpl::SuperClassType)> fn)
@@ -160,18 +201,20 @@ class TargetReflectionContext
160
201
skip_artificial_subclasses);
161
202
}
162
203
163
- swift::reflection::TypeRefBuilder &GetBuilder () override {
164
- return m_reflection_ctx.getBuilder ();
165
- }
166
-
167
204
llvm::Optional<bool > IsValueInlinedInExistentialContainer (
168
205
swift::remote::RemoteAddress existential_address) override {
169
206
return m_reflection_ctx.isValueInlinedInExistentialContainer (
170
207
existential_address);
171
208
}
172
209
173
- swift::remote::RemoteAbsolutePointer
174
- StripSignedPointer (swift::remote::RemoteAbsolutePointer pointer) override {
210
+ const swift::reflection::TypeRef *ApplySubstitutions (
211
+ const swift::reflection::TypeRef *type_ref,
212
+ swift::reflection::GenericArgumentMap substitutions) override {
213
+ return type_ref->subst (m_reflection_ctx.getBuilder (), substitutions);
214
+ }
215
+
216
+ swift::remote::RemoteAbsolutePointer StripSignedPointer (
217
+ swift::remote::RemoteAbsolutePointer pointer) override {
175
218
return m_reflection_ctx.stripSignedPointer (pointer);
176
219
}
177
220
};
0 commit comments