Skip to content

Commit 3a5c7bc

Browse files
authored
Merge pull request #16086 from slavapestov/fix-symbolic-references
Fix symbolic references
2 parents 968aa79 + c86d797 commit 3a5c7bc

File tree

6 files changed

+1027
-936
lines changed

6 files changed

+1027
-936
lines changed

include/swift/Demangling/Demangle.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,14 @@ void mangleIdentifier(const char *data, size_t length,
466466
/// This should always round-trip perfectly with demangleSymbolAsNode.
467467
std::string mangleNode(const NodePointer &root);
468468

469+
using SymbolicResolver = llvm::function_ref<Demangle::NodePointer (const void *)>;
470+
471+
/// \brief Remangle a demangled parse tree, using a callback to resolve
472+
/// symbolic references.
473+
///
474+
/// This should always round-trip perfectly with demangleSymbolAsNode.
475+
std::string mangleNode(const NodePointer &root, SymbolicResolver resolver);
476+
469477
/// Remangle in the old mangling scheme.
470478
///
471479
/// This is only used for objc-runtime names and should be removed as soon as

lib/Demangling/Remangler.cpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,9 @@ class Remangler {
152152
// nested generics. This factory owns them.
153153
NodeFactory Factory;
154154

155+
// A callback for resolving symbolic references.
156+
SymbolicResolver Resolver;
157+
155158
StringRef getBufferStr() const { return Buffer.getStringRef(); }
156159

157160
void resetBuffer(size_t toPos) { Buffer.resetSize(toPos); }
@@ -284,7 +287,8 @@ class Remangler {
284287
#include "swift/Demangling/DemangleNodes.def"
285288

286289
public:
287-
Remangler(DemanglerPrinter &Buffer) : Buffer(Buffer) {}
290+
Remangler(DemanglerPrinter &Buffer,
291+
SymbolicResolver Resolver) : Buffer(Buffer), Resolver(Resolver) {}
288292

289293
void mangle(Node *node) {
290294
switch (node->getKind()) {
@@ -1994,18 +1998,25 @@ void Remangler::mangleUnresolvedSymbolicReference(Node *node) {
19941998
}
19951999

19962000
void Remangler::mangleSymbolicReference(Node *node) {
1997-
unreachable("should not try to mangle a symbolic reference; "
1998-
"resolve it to a non-symbolic demangling tree instead");
2001+
return mangle(Resolver((const void *)node->getIndex()));
19992002
}
20002003

20012004
} // anonymous namespace
20022005

20032006
/// The top-level interface to the remangler.
20042007
std::string Demangle::mangleNode(const NodePointer &node) {
2008+
return mangleNode(node, [](const void *) -> NodePointer {
2009+
unreachable("should not try to mangle a symbolic reference; "
2010+
"resolve it to a non-symbolic demangling tree instead");
2011+
});
2012+
}
2013+
2014+
std::string
2015+
Demangle::mangleNode(const NodePointer &node, SymbolicResolver resolver) {
20052016
if (!node) return "";
20062017

20072018
DemanglerPrinter printer;
2008-
Remangler(printer).mangle(node);
2019+
Remangler(printer, resolver).mangle(node);
20092020

20102021
return std::move(printer).str();
20112022
}

stdlib/public/runtime/MetadataLookup.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,8 @@ _searchTypeMetadataRecords(const TypeMetadataPrivateState &T,
263263
}
264264

265265
static const TypeContextDescriptor *
266-
_findNominalTypeDescriptor(Demangle::NodePointer node) {
266+
_findNominalTypeDescriptor(Demangle::NodePointer node,
267+
Demangle::Demangler &Dem) {
267268
const TypeContextDescriptor *foundNominal = nullptr;
268269
auto &T = TypeMetadataRecords.get();
269270

@@ -275,7 +276,13 @@ _findNominalTypeDescriptor(Demangle::NodePointer node) {
275276
return cast<TypeContextDescriptor>(
276277
(const ContextDescriptor *)symbolicNode->getIndex());
277278

278-
auto mangledName = Demangle::mangleNode(node);
279+
auto mangledName =
280+
Demangle::mangleNode(node,
281+
[&](const void *context) -> NodePointer {
282+
return _buildDemanglingForContext(
283+
(const ContextDescriptor *) context,
284+
{}, false, Dem);
285+
});
279286

280287
// Look for an existing entry.
281288
// Find the bucket for the metadata entry.
@@ -696,7 +703,7 @@ class DecodedMetadataBuilder {
696703
#endif
697704

698705
// Look for a nominal type descriptor based on its mangled name.
699-
return _findNominalTypeDescriptor(node);
706+
return _findNominalTypeDescriptor(node, demangler);
700707
}
701708

702709
BuiltProtocolDecl createProtocolDecl(
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
struct OtherStruct {
2+
let a: OtherOuter.Inner
3+
let b: OtherOuterGeneric<Int>.Inner<String>
4+
}
5+
6+
struct OtherOuter {}
7+
struct OtherOuterGeneric<T> {}

0 commit comments

Comments
 (0)