Skip to content

Commit 1e4ded8

Browse files
Merge pull request #2245 from adrian-prantl/70552614
Disable AST type caching for SILFunctionTypes since the mapping isn't
2 parents 70537e5 + 1d65ca1 commit 1e4ded8

File tree

2 files changed

+17
-7
lines changed

2 files changed

+17
-7
lines changed

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

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4180,7 +4180,7 @@ void SwiftASTContext::CacheDemangledTypeFailure(ConstString name) {
41804180
/// What we should really do is only mangle AST types in DebugInfo, but that
41814181
/// requires some more plumbing on the Swift side to properly handle generic
41824182
/// specializations.
4183-
swift::Type convertSILFunctionTypesToASTFunctionTypes(swift::Type t) {
4183+
static swift::Type ConvertSILFunctionTypesToASTFunctionTypes(swift::Type t) {
41844184
return t.transform([](swift::Type t) -> swift::Type {
41854185
if (auto *silFn = t->getAs<swift::SILFunctionType>())
41864186
return swift::FunctionType::get({}, t->getASTContext().TheEmptyTupleType);
@@ -4300,14 +4300,18 @@ swift::TypeBase *SwiftASTContext::ReconstructType(ConstString mangled_typename,
43004300
.getPointer();
43014301

43024302
if (found_type) {
4303-
found_type =
4304-
convertSILFunctionTypesToASTFunctionTypes(found_type).getPointer();
4305-
CacheDemangledType(mangled_typename, found_type);
4306-
CompilerType result_type = ToCompilerType(found_type);
4307-
assert(&found_type->getASTContext() == ast_ctx);
4303+
swift::TypeBase *ast_type =
4304+
ConvertSILFunctionTypesToASTFunctionTypes(found_type).getPointer();
4305+
// This transformation is lossy: all SILFunction types are mapped
4306+
// to the same AST type. We thus cannot cache the result, since
4307+
// the mapping isn't bijective.
4308+
if (ast_type == found_type)
4309+
CacheDemangledType(mangled_typename, ast_type);
4310+
CompilerType result_type = ToCompilerType(ast_type);
4311+
assert(&ast_type->getASTContext() == ast_ctx);
43084312
LOG_PRINTF(LIBLLDB_LOG_TYPES, "(\"%s\") -- found %s", mangled_cstr,
43094313
result_type.GetTypeName().GetCString());
4310-
return found_type;
4314+
return ast_type;
43114315
}
43124316

43134317
LOG_PRINTF(LIBLLDB_LOG_TYPES, "(\"%s\") -- not found", mangled_cstr);

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1420,6 +1420,12 @@ static bool ContainsSugaredParen(swift::Demangle::NodePointer node) {
14201420
/// Compare two swift types from different type systems by comparing their
14211421
/// (canonicalized) mangled name.
14221422
template <> bool Equivalent<CompilerType>(CompilerType l, CompilerType r) {
1423+
// See comments in SwiftASTContext::ReconstructType(). For
1424+
// SILFunctionTypes the mapping isn't bijective.
1425+
auto *ast_ctx = llvm::cast<SwiftASTContext>(r.GetTypeSystem());
1426+
if (((void *)ast_ctx->ReconstructType(l.GetMangledTypeName())) ==
1427+
r.GetOpaqueQualType())
1428+
return true;
14231429
ConstString lhs = l.GetMangledTypeName();
14241430
ConstString rhs = r.GetMangledTypeName();
14251431
if (lhs == ConstString("$sSiD") && rhs == ConstString("$sSuD"))

0 commit comments

Comments
 (0)