Skip to content

Commit 372857b

Browse files
Merge pull request #10036 from adrian-prantl/144884987
[lldb] Change the type alias resolution algorithm
2 parents a1d5a03 + b16a454 commit 372857b

File tree

4 files changed

+76
-28
lines changed

4 files changed

+76
-28
lines changed

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

Lines changed: 54 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1264,22 +1264,69 @@ TypeSystemSwiftTypeRef::Canonicalize(swift::Demangle::Demangler &dem,
12641264
// Hit the safeguard limit.
12651265
return node;
12661266
}
1267-
default:
1268-
break;
1267+
default: {
1268+
llvm::SmallVector<NodePointer, 2> children;
1269+
bool changed = false;
1270+
for (NodePointer child : *node) {
1271+
NodePointer transformed = GetCanonicalNode(dem, child, flavor);
1272+
changed |= (child != transformed);
1273+
children.push_back(transformed);
1274+
}
1275+
if (changed) {
1276+
// Create a new node with the transformed children.
1277+
auto kind = node->getKind();
1278+
if (node->hasText())
1279+
node = dem.createNodeWithAllocatedText(kind, node->getText());
1280+
else if (node->hasIndex())
1281+
node = dem.createNode(kind, node->getIndex());
1282+
else
1283+
node = dem.createNode(kind);
1284+
for (NodePointer transformed_child : children)
1285+
node->addChild(transformed_child, dem);
1286+
}
1287+
return node;
1288+
}
12691289
}
12701290
return node;
12711291
}
12721292

1273-
/// Iteratively resolve all type aliases in \p node by looking up their
1274-
/// desugared types in the debug info of module \p M.
12751293
swift::Demangle::NodePointer
12761294
TypeSystemSwiftTypeRef::GetCanonicalNode(swift::Demangle::Demangler &dem,
12771295
swift::Demangle::NodePointer node,
12781296
swift::Mangle::ManglingFlavor flavor) {
1297+
if (!node)
1298+
return nullptr;
1299+
// This is a pre-order traversal, which is necessary to resolve
1300+
// generic type aliases that bind other type aliases in one go,
1301+
// instead of first resolving the bound type aliases. Debug Info
1302+
// will have a record for SomeAlias<SomeOtherAlias> but not
1303+
// SomeAlias<WhatSomeOtherAliasResolvesTo> because it tries to
1304+
// preserve all sugar.
12791305
using namespace swift::Demangle;
1280-
return TypeSystemSwiftTypeRef::Transform(dem, node, [&](NodePointer node) {
1281-
return Canonicalize(dem, node, flavor);
1282-
});
1306+
NodePointer transformed = Canonicalize(dem, node, flavor);
1307+
if (node != transformed)
1308+
return transformed;
1309+
1310+
llvm::SmallVector<NodePointer, 2> children;
1311+
bool changed = false;
1312+
for (NodePointer child : *node) {
1313+
NodePointer transformed_child = GetCanonicalNode(dem, child, flavor);
1314+
changed |= (child != transformed_child);
1315+
children.push_back(transformed_child);
1316+
}
1317+
if (changed) {
1318+
// Create a new node with the transformed children.
1319+
auto kind = node->getKind();
1320+
if (node->hasText())
1321+
node = dem.createNodeWithAllocatedText(kind, node->getText());
1322+
else if (node->hasIndex())
1323+
node = dem.createNode(kind, node->getIndex());
1324+
else
1325+
node = dem.createNode(kind);
1326+
for (NodePointer transformed_child : children)
1327+
node->addChild(transformed_child, dem);
1328+
}
1329+
return node;
12831330
}
12841331

12851332
/// Return the demangle tree representation of this type's canonical

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

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,7 @@ class TypeSystemSwiftTypeRef : public TypeSystemSwift {
394394
AdjustTypeForOriginallyDefinedInModule(llvm::StringRef mangled_typename);
395395

396396
/// Return the canonicalized Demangle tree for a Swift mangled type name.
397+
/// It resolves all type aliases and removes sugar.
397398
swift::Demangle::NodePointer
398399
GetCanonicalDemangleTree(swift::Demangle::Demangler &dem,
399400
llvm::StringRef mangled_name);
@@ -460,13 +461,6 @@ class TypeSystemSwiftTypeRef : public TypeSystemSwift {
460461
/// Cast \p opaque_type as a mangled name.
461462
static const char *AsMangledName(lldb::opaque_compiler_type_t type);
462463

463-
/// Helper function that canonicalizes node, but doesn't look at its
464-
/// children.
465-
swift::Demangle::NodePointer
466-
Canonicalize(swift::Demangle::Demangler &dem,
467-
swift::Demangle::NodePointer node,
468-
swift::Mangle::ManglingFlavor flavor);
469-
470464
/// Demangle the mangled name of the canonical type of \p type and
471465
/// drill into the Global(TypeMangling(Type())).
472466
///
@@ -484,6 +478,20 @@ class TypeSystemSwiftTypeRef : public TypeSystemSwift {
484478
DemangleCanonicalOutermostType(swift::Demangle::Demangler &dem,
485479
lldb::opaque_compiler_type_t type);
486480

481+
/// Desugar to this node and if it is a type alias resolve it by
482+
/// looking up its type in the debug info.
483+
swift::Demangle::NodePointer
484+
Canonicalize(swift::Demangle::Demangler &dem,
485+
swift::Demangle::NodePointer node,
486+
swift::Mangle::ManglingFlavor flavor);
487+
488+
/// Iteratively desugar and resolve all type aliases in \p node by
489+
/// looking up their types in the debug info.
490+
swift::Demangle::NodePointer
491+
GetCanonicalNode(swift::Demangle::Demangler &dem,
492+
swift::Demangle::NodePointer node,
493+
swift::Mangle::ManglingFlavor flavor);
494+
487495
/// If \p node is a Struct/Class/Typedef in the __C module, return a
488496
/// Swiftified node by looking up the name in the corresponding APINotes and
489497
/// optionally putting it into the correctly named module.
@@ -514,12 +522,6 @@ class TypeSystemSwiftTypeRef : public TypeSystemSwift {
514522
CompilerType LookupClangForwardType(llvm::StringRef name,
515523
llvm::ArrayRef<CompilerContext> decl_context);
516524

517-
/// Recursively resolves all type aliases.
518-
swift::Demangle::NodePointer
519-
ResolveAllTypeAliases(swift::Demangle::Demangler &dem,
520-
swift::Demangle::NodePointer node,
521-
swift::Mangle::ManglingFlavor flavor);
522-
523525
/// Resolve a type alias node and return a demangle tree for the
524526
/// resolved type. If the type alias resolves to a Clang type, return
525527
/// a Clang CompilerType.
@@ -531,11 +533,6 @@ class TypeSystemSwiftTypeRef : public TypeSystemSwift {
531533
swift::Demangle::Demangler &dem, swift::Demangle::NodePointer node,
532534
swift::Mangle::ManglingFlavor flavor, bool prefer_clang_types = false);
533535

534-
swift::Demangle::NodePointer
535-
GetCanonicalNode(swift::Demangle::Demangler &dem,
536-
swift::Demangle::NodePointer node,
537-
swift::Mangle::ManglingFlavor flavor);
538-
539536
uint32_t CollectTypeInfo(swift::Demangle::Demangler &dem,
540537
swift::Demangle::NodePointer node,
541538
swift::Mangle::ManglingFlavor flavor,

lldb/test/API/lang/swift/typealias/TestSwiftTypeAlias.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,14 @@ class TestSwiftTypeAlias(TestBase):
77
def test(self):
88
"""Test type aliases are only searched in the debug info once"""
99
self.build()
10-
log = self.getBuildArtifact("dwarf.log")
11-
self.expect("log enable dwarf lookups -f " + log)
10+
if self.TraceOn():
11+
log = self.getBuildArtifact("dwarf.log")
12+
self.expect("log enable dwarf lookups -f " + log)
1213

1314
target, process, _, _ = lldbutil.run_to_source_breakpoint(
1415
self, "break here", lldb.SBFileSpec("main.swift"), extra_images=['Dylib'])
1516
self.expect("target variable foo", substrs=["(Dylib.MyAlias)", "23"])
1617
self.expect("target variable bar",
1718
substrs=["(Dylib.MyGenericAlias<Dylib.MyAlias>)", "42"])
19+
self.expect("target variable baz",
20+
substrs=["(Dylib.MyGenericAlias<a.LocalAlias>)", "42"])

lldb/test/API/lang/swift/typealias/main.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ typealias LocalAlias = Foo
33
let local = LocalAlias()
44
let foo = MyAlias()
55
let bar = MyGenericAlias<MyAlias>()
6-
print("\(local), \(foo), \(bar)") // break here
6+
let baz = MyGenericAlias<LocalAlias>()
7+
print("\(local), \(foo), \(bar), \(baz)") // break here

0 commit comments

Comments
 (0)