Skip to content

Commit 6c485cd

Browse files
committed
[lldb] Recursively resolve type aliases when canonicalizing types
A type alias that resolved to a type containing more type aliase can now also be handled. To safeguard against broken debug info with cyclic aliases a limit to this is also enforced. rdar://143156979 (cherry picked from commit ef05764) Conflicts: lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.cpp lldb/source/Plugins/TypeSystem/Swift/TypeSystemSwiftTypeRef.h
1 parent 97aa9dd commit 6c485cd

File tree

5 files changed

+66
-18
lines changed

5 files changed

+66
-18
lines changed

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

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -943,13 +943,6 @@ IsClangImportedType(NodePointer node,
943943
}
944944
}
945945

946-
/// Resolve a type alias node and return a demangle tree for the
947-
/// resolved type. If the type alias resolves to a Clang type, return
948-
/// a Clang CompilerType.
949-
///
950-
/// \param prefer_clang_types if this is true, type aliases in the
951-
/// __C module are resolved as Clang types.
952-
///
953946
std::pair<swift::Demangle::NodePointer, CompilerType>
954947
TypeSystemSwiftTypeRef::ResolveTypeAlias(swift::Demangle::Demangler &dem,
955948
swift::Demangle::NodePointer node,
@@ -1202,7 +1195,7 @@ TypeSystemSwiftTypeRef::Canonicalize(swift::Demangle::Demangler &dem,
12021195
Node::Kind::Structure, "Array");
12031196
}
12041197
case Node::Kind::SugaredDictionary:
1205-
// FIXME: This isnt covered by any test.
1198+
// FIXME: This isn't covered by any test.
12061199
assert(node->getNumChildren() == 2);
12071200
if (node->getNumChildren() != 2)
12081201
return node;
@@ -1216,15 +1209,27 @@ TypeSystemSwiftTypeRef::Canonicalize(swift::Demangle::Demangler &dem,
12161209

12171210
case Node::Kind::BoundGenericTypeAlias:
12181211
case Node::Kind::TypeAlias: {
1219-
auto node_clangtype = ResolveTypeAlias(dem, node, flavor);
1220-
if (CompilerType clang_type = node_clangtype.second) {
1221-
if (auto result = GetClangTypeNode(clang_type, dem))
1222-
return result;
1223-
else
1212+
// Safeguard against cyclic aliases.
1213+
for (unsigned alias_depth = 0; alias_depth < 64; ++alias_depth) {
1214+
auto node_clangtype = ResolveTypeAlias(dem, node, flavor);
1215+
if (CompilerType clang_type = node_clangtype.second) {
1216+
if (auto result = GetClangTypeNode(clang_type, dem))
1217+
return result;
1218+
// Failed to convert that clang type into a demangle node.
1219+
return node;
1220+
}
1221+
if (!node_clangtype.first)
1222+
return node;
1223+
if (node_clangtype.first == node)
12241224
return node;
1225+
node = node_clangtype.first;
1226+
if (node->getKind() != Node::Kind::BoundGenericTypeAlias &&
1227+
node->getKind() != Node::Kind::TypeAlias)
1228+
// Resolve any type aliases in the resolved type.
1229+
return GetCanonicalNode(dem, node);
1230+
// This type alias resolved to another type alias.
12251231
}
1226-
if (node_clangtype.first)
1227-
return node_clangtype.first;
1232+
// Hit the safeguard limit.
12281233
return node;
12291234
}
12301235
default:

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

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -502,9 +502,23 @@ class TypeSystemSwiftTypeRef : public TypeSystemSwift {
502502
CompilerType LookupClangForwardType(llvm::StringRef name,
503503
llvm::ArrayRef<CompilerContext> decl_context);
504504

505-
std::pair<swift::Demangle::NodePointer, CompilerType> ResolveTypeAlias(
506-
swift::Demangle::Demangler &dem, swift::Demangle::NodePointer node,
507-
swift::Mangle::ManglingFlavor flavor, bool prefer_clang_types = false);
505+
/// Recursively resolves all type aliases.
506+
swift::Demangle::NodePointer
507+
ResolveAllTypeAliases(swift::Demangle::Demangler &dem,
508+
swift::Demangle::NodePointer node);
509+
510+
/// Resolve a type alias node and return a demangle tree for the
511+
/// resolved type. If the type alias resolves to a Clang type, return
512+
/// a Clang CompilerType.
513+
///
514+
/// \param prefer_clang_types if this is true, type aliases in the
515+
/// __C module are resolved as Clang types.
516+
///
517+
std::pair<swift::Demangle::NodePointer, CompilerType>
518+
ResolveTypeAlias(swift::Demangle::Demangler &dem,
519+
swift::Demangle::NodePointer node,
520+
swift::Mangle::ManglingFlavor flavor,
521+
bool prefer_clang_types = false);
508522

509523
swift::Demangle::NodePointer
510524
GetCanonicalNode(swift::Demangle::Demangler &dem,
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
SWIFT_SOURCES = main.swift
2+
3+
include Makefile.rules
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from lldbsuite.test.lldbtest import *
2+
from lldbsuite.test.decorators import *
3+
import lldbsuite.test.lldbutil as lldbutil
4+
5+
class TestSwiftTypeAliasRecurtsive(TestBase):
6+
@swiftTest
7+
def test(self):
8+
"""Test that type aliases of type aliases can be resolved"""
9+
self.build()
10+
self.runCmd("settings set symbols.swift-validate-typesystem false")
11+
self.expect("log enable lldb types")
12+
target, process, _, _ = lldbutil.run_to_source_breakpoint(
13+
self, "break here", lldb.SBFileSpec("main.swift"))
14+
self.expect("frame variable cls", substrs=["ClassAlias?", "0x"])
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
open class MyClass<A, B> {}
2+
public typealias LocalAlias = Bool
3+
let anchor : LocalAlias = true
4+
public typealias ClassAlias = MyClass<LocalAlias, Bool>
5+
class Repro {
6+
let field: ClassAlias?
7+
init(cls: ClassAlias?) {
8+
self.field = cls // break here
9+
}
10+
}
11+
12+
Repro(cls: ClassAlias())

0 commit comments

Comments
 (0)