Skip to content

Commit 535f5bd

Browse files
committed
Remangler: Fix for correct round-tripping
1 parent 68ba134 commit 535f5bd

File tree

4 files changed

+101
-32
lines changed

4 files changed

+101
-32
lines changed

include/swift/Demangling/Demangle.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -564,7 +564,10 @@ const char *getNodeKindString(swift::Demangle::Node::Kind k);
564564
/// Useful for debugging.
565565
std::string getNodeTreeAsString(NodePointer Root);
566566

567+
bool nodeConsumesGenericArgs(Node *node);
568+
567569
bool isSpecialized(Node *node);
570+
568571
NodePointer getUnspecialized(Node *node, NodeFactory &Factory);
569572
std::string archetypeName(Node::IndexType index, Node::IndexType depth);
570573

lib/Demangling/Demangler.cpp

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1458,6 +1458,20 @@ NodePointer Demangler::demangleBoundGenericType() {
14581458
return NTy;
14591459
}
14601460

1461+
bool Demangle::nodeConsumesGenericArgs(Node *node) {
1462+
switch (node->getKind()) {
1463+
case Node::Kind::Variable:
1464+
case Node::Kind::Subscript:
1465+
case Node::Kind::ImplicitClosure:
1466+
case Node::Kind::ExplicitClosure:
1467+
case Node::Kind::DefaultArgumentInitializer:
1468+
case Node::Kind::Initializer:
1469+
return false;
1470+
default:
1471+
return true;
1472+
}
1473+
}
1474+
14611475
NodePointer Demangler::demangleBoundGenericArgs(NodePointer Nominal,
14621476
const Vector<NodePointer> &TypeLists,
14631477
size_t TypeListIdx) {
@@ -1493,18 +1507,7 @@ NodePointer Demangler::demangleBoundGenericArgs(NodePointer Nominal,
14931507
return nullptr;
14941508
NodePointer Context = Nominal->getFirstChild();
14951509

1496-
bool consumesGenericArgs = true;
1497-
switch (Nominal->getKind()) {
1498-
case Node::Kind::Variable:
1499-
case Node::Kind::ExplicitClosure:
1500-
case Node::Kind::Subscript:
1501-
// Those nodes can appear in the context but do not "consume" a generic
1502-
// argument type list.
1503-
consumesGenericArgs = false;
1504-
break;
1505-
default:
1506-
break;
1507-
}
1510+
bool consumesGenericArgs = nodeConsumesGenericArgs(Nominal);
15081511

15091512
NodePointer args = TypeLists[TypeListIdx];
15101513

lib/Demangling/Remangler.cpp

Lines changed: 82 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,18 @@ static void unreachable(const char *Message) {
3939
std::abort();
4040
}
4141

42+
static StringRef getTextForSubstitution(Node *node, std::string &tmp) {
43+
switch (node->getKind()) {
44+
case Node::Kind::InfixOperator:
45+
case Node::Kind::PrefixOperator:
46+
case Node::Kind::PostfixOperator:
47+
tmp = Mangle::translateOperator(node->getText());
48+
return tmp;
49+
default:
50+
return node->getText();
51+
}
52+
}
53+
4254
namespace {
4355

4456
class SubstitutionEntry {
@@ -66,8 +78,11 @@ class SubstitutionEntry {
6678
return false;
6779
if (lhs.treatAsIdentifier != rhs.treatAsIdentifier)
6880
return false;
69-
if (lhs.treatAsIdentifier)
70-
return lhs.TheNode->getText() == rhs.TheNode->getText();
81+
if (lhs.treatAsIdentifier) {
82+
std::string tmp1, tmp2;
83+
return (getTextForSubstitution(lhs.TheNode, tmp1) ==
84+
getTextForSubstitution(rhs.TheNode, tmp2));
85+
}
7186
return lhs.deepEquals(lhs.TheNode, rhs.TheNode);
7287
}
7388

@@ -84,7 +99,8 @@ class SubstitutionEntry {
8499
void deepHash(Node *node) {
85100
if (treatAsIdentifier) {
86101
combineHash((size_t) Node::Kind::Identifier);
87-
combineHash(node->getText());
102+
std::string tmp;
103+
combineHash(getTextForSubstitution(node, tmp));
88104
return;
89105
}
90106
combineHash((size_t) node->getKind());
@@ -279,7 +295,8 @@ class Remangler {
279295

280296
void mangleAnyNominalType(Node *node);
281297
void mangleAnyGenericType(Node *node, StringRef TypeOp);
282-
void mangleGenericArgs(Node *node, char &Separator);
298+
void mangleGenericArgs(Node *node, char &Separator,
299+
bool fullSubstitutionMap=false);
283300
void mangleAnyConstructor(Node *node, char kindOp);
284301
void mangleAbstractStorage(Node *node, StringRef accessorCode);
285302
void mangleAnyProtocolConformance(Node *node);
@@ -473,29 +490,49 @@ void Remangler::mangleAnyNominalType(Node *node) {
473490
}
474491
}
475492

476-
void Remangler::mangleGenericArgs(Node *node, char &Separator) {
493+
void Remangler::mangleGenericArgs(Node *node, char &Separator,
494+
bool fullSubstitutionMap) {
477495
switch (node->getKind()) {
478496
case Node::Kind::Structure:
479497
case Node::Kind::Enum:
480498
case Node::Kind::Class:
481499
case Node::Kind::TypeAlias:
500+
if (node->getKind() == Node::Kind::TypeAlias)
501+
fullSubstitutionMap = true;
502+
503+
mangleGenericArgs(node->getChild(0), Separator,
504+
fullSubstitutionMap);
505+
Buffer << Separator;
506+
Separator = '_';
507+
break;
508+
482509
case Node::Kind::Function:
483510
case Node::Kind::Getter:
484511
case Node::Kind::Setter:
485512
case Node::Kind::WillSet:
486513
case Node::Kind::DidSet:
514+
case Node::Kind::ReadAccessor:
515+
case Node::Kind::ModifyAccessor:
516+
case Node::Kind::UnsafeAddressor:
517+
case Node::Kind::UnsafeMutableAddressor:
518+
case Node::Kind::Allocator:
487519
case Node::Kind::Constructor:
488520
case Node::Kind::Destructor:
489-
mangleGenericArgs(node->getChild(0), Separator);
490-
Buffer << Separator;
491-
Separator = '_';
492-
break;
493-
494521
case Node::Kind::Variable:
495522
case Node::Kind::Subscript:
496523
case Node::Kind::ExplicitClosure:
497524
case Node::Kind::ImplicitClosure:
498-
mangleGenericArgs(node->getChild(0), Separator);
525+
case Node::Kind::DefaultArgumentInitializer:
526+
case Node::Kind::Initializer:
527+
if (!fullSubstitutionMap)
528+
break;
529+
530+
mangleGenericArgs(node->getChild(0), Separator,
531+
fullSubstitutionMap);
532+
if (Demangle::nodeConsumesGenericArgs(node)) {
533+
Buffer << Separator;
534+
Separator = '_';
535+
}
499536
break;
500537

501538
case Node::Kind::BoundGenericOtherNominalType:
@@ -504,31 +541,39 @@ void Remangler::mangleGenericArgs(Node *node, char &Separator) {
504541
case Node::Kind::BoundGenericClass:
505542
case Node::Kind::BoundGenericProtocol:
506543
case Node::Kind::BoundGenericTypeAlias: {
544+
if (node->getKind() == Node::Kind::BoundGenericTypeAlias)
545+
fullSubstitutionMap = true;
546+
507547
NodePointer unboundType = node->getChild(0);
508548
assert(unboundType->getKind() == Node::Kind::Type);
509549
NodePointer nominalType = unboundType->getChild(0);
510550
NodePointer parentOrModule = nominalType->getChild(0);
511-
mangleGenericArgs(parentOrModule, Separator);
551+
mangleGenericArgs(parentOrModule, Separator,
552+
fullSubstitutionMap);
512553
Buffer << Separator;
513554
Separator = '_';
514555
mangleChildNodes(node->getChild(1));
515556
break;
516557
}
517558

518559
case Node::Kind::BoundGenericFunction: {
560+
fullSubstitutionMap = true;
561+
519562
NodePointer unboundFunction = node->getChild(0);
520563
assert(unboundFunction->getKind() == Node::Kind::Function ||
521564
unboundFunction->getKind() == Node::Kind::Constructor);
522565
NodePointer parentOrModule = unboundFunction->getChild(0);
523-
mangleGenericArgs(parentOrModule, Separator);
566+
mangleGenericArgs(parentOrModule, Separator,
567+
fullSubstitutionMap);
524568
Buffer << Separator;
525569
Separator = '_';
526570
mangleChildNodes(node->getChild(1));
527571
break;
528572
}
529573

530574
case Node::Kind::Extension:
531-
mangleGenericArgs(node->getChild(1), Separator);
575+
mangleGenericArgs(node->getChild(1), Separator,
576+
fullSubstitutionMap);
532577
break;
533578

534579
default:
@@ -578,17 +623,22 @@ void Remangler::mangleAssociatedTypeDescriptor(Node *node) {
578623
}
579624

580625
void Remangler::mangleAssociatedConformanceDescriptor(Node *node) {
581-
mangleChildNodes(node);
626+
mangle(node->getChild(0));
627+
mangle(node->getChild(1));
628+
manglePureProtocol(node->getChild(2));
582629
Buffer << "Tn";
583630
}
584631

585632
void Remangler::mangleDefaultAssociatedConformanceAccessor(Node *node) {
586-
mangleChildNodes(node);
633+
mangle(node->getChild(0));
634+
mangle(node->getChild(1));
635+
manglePureProtocol(node->getChild(2));
587636
Buffer << "TN";
588637
}
589638

590639
void Remangler::mangleBaseConformanceDescriptor(Node *node) {
591-
mangleChildNodes(node);
640+
mangle(node->getChild(0));
641+
manglePureProtocol(node->getChild(1));
592642
Buffer << "Tb";
593643
}
594644

@@ -1795,7 +1845,7 @@ void Remangler::mangleProtocolWitness(Node *node) {
17951845
}
17961846

17971847
void Remangler::mangleProtocolSelfConformanceWitnessTable(Node *node) {
1798-
mangleSingleChildNode(node);
1848+
manglePureProtocol(node->getChild(0));
17991849
Buffer << "WS";
18001850
}
18011851

@@ -2295,16 +2345,23 @@ bool Demangle::isSpecialized(Node *node) {
22952345
case Node::Kind::OtherNominalType:
22962346
case Node::Kind::Protocol:
22972347
case Node::Kind::Function:
2348+
case Node::Kind::Allocator:
22982349
case Node::Kind::Constructor:
22992350
case Node::Kind::Destructor:
23002351
case Node::Kind::Variable:
23012352
case Node::Kind::Subscript:
23022353
case Node::Kind::ExplicitClosure:
23032354
case Node::Kind::ImplicitClosure:
2355+
case Node::Kind::Initializer:
2356+
case Node::Kind::DefaultArgumentInitializer:
23042357
case Node::Kind::Getter:
23052358
case Node::Kind::Setter:
23062359
case Node::Kind::WillSet:
23072360
case Node::Kind::DidSet:
2361+
case Node::Kind::ReadAccessor:
2362+
case Node::Kind::ModifyAccessor:
2363+
case Node::Kind::UnsafeAddressor:
2364+
case Node::Kind::UnsafeMutableAddressor:
23082365
return isSpecialized(node->getChild(0));
23092366

23102367
case Node::Kind::Extension:
@@ -2323,12 +2380,19 @@ NodePointer Demangle::getUnspecialized(Node *node, NodeFactory &Factory) {
23232380
case Node::Kind::Setter:
23242381
case Node::Kind::WillSet:
23252382
case Node::Kind::DidSet:
2383+
case Node::Kind::ReadAccessor:
2384+
case Node::Kind::ModifyAccessor:
2385+
case Node::Kind::UnsafeAddressor:
2386+
case Node::Kind::UnsafeMutableAddressor:
2387+
case Node::Kind::Allocator:
23262388
case Node::Kind::Constructor:
23272389
case Node::Kind::Destructor:
23282390
case Node::Kind::Variable:
23292391
case Node::Kind::Subscript:
23302392
case Node::Kind::ExplicitClosure:
23312393
case Node::Kind::ImplicitClosure:
2394+
case Node::Kind::Initializer:
2395+
case Node::Kind::DefaultArgumentInitializer:
23322396
NumToCopy = node->getNumChildren();
23332397
LLVM_FALLTHROUGH;
23342398
case Node::Kind::Structure:

lib/IRGen/IRGenMangler.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,7 @@ class IRGenMangler : public Mangle::ASTMangler {
162162

163163
std::string mangleBareProtocol(const ProtocolDecl *Decl) {
164164
beginMangling();
165-
appendProtocolName(Decl, /*allowStandardSubstitution=*/false);
166-
appendOperator("P");
165+
appendAnyGenericType(Decl);
167166
return finalize();
168167
}
169168

0 commit comments

Comments
 (0)