Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 1d65ca1

Browse files
committed
Disable AST type caching for SILFunctionTypes since the mapping isn't
bijective, and relax check in TypeSystemSwiftTypeRef to take this fact into account. rdar://70552614
1 parent c37c368 commit 1d65ca1

File tree

2 files changed

+17
-7
lines changed

2 files changed

+17
-7
lines changed

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

+11-7
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

+6
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)