Skip to content

Commit 4db201c

Browse files
committed
Mangling: introduce an alternative mangling for generic specializations.
"TB" is used instead of "Tg" in case the specialized function has a resilient argument type and this argument is re-abstracted (from indirect to direct passing). It can be re-abstracted in case the specialization is compiled in the type's resilience domain (i.e. in it's module). We need a separate mangling for this to distinguish from specializations - with the same type - but in different resilience domains. Note that this change does not affect the ABI: it's only used for generated module-internal specializations.
1 parent f702be9 commit 4db201c

File tree

7 files changed

+29
-20
lines changed

7 files changed

+29
-20
lines changed

docs/ABI/Mangling.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1008,6 +1008,8 @@ Function Specializations
10081008
::
10091009

10101010
specialization ::= type '_' type* 'Tg' SPEC-INFO // Generic re-abstracted specialization
1011+
specialization ::= type '_' type* 'TB' SPEC-INFO // Alternative mangling for generic re-abstracted specializations,
1012+
// used for functions with re-abstracted resilient parameter types.
10111013
specialization ::= type '_' type* 'Ts' SPEC-INFO // Generic re-abstracted prespecialization
10121014
specialization ::= type '_' type* 'TG' SPEC-INFO // Generic not re-abstracted specialization
10131015
specialization ::= type '_' type* 'Ti' SPEC-INFO // Inlined function with generic substitutions.

include/swift/Demangling/DemangleNodes.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ NODE(GenericProtocolWitnessTableInstantiationFunction)
104104
NODE(ResilientProtocolWitnessTable)
105105
NODE(GenericSpecialization)
106106
NODE(GenericSpecializationNotReAbstracted)
107+
NODE(GenericSpecializationInResilienceDomain)
107108
NODE(GenericSpecializationParam)
108109
NODE(GenericSpecializationPrespecialized)
109110
NODE(InlinedGenericFunction)

lib/Demangling/Demangler.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ bool swift::Demangle::isFunctionAttr(Node::Kind kind) {
108108
case Node::Kind::GenericSpecializationNotReAbstracted:
109109
case Node::Kind::GenericPartialSpecialization:
110110
case Node::Kind::GenericPartialSpecializationNotReAbstracted:
111+
case Node::Kind::GenericSpecializationInResilienceDomain:
111112
case Node::Kind::ObjCAttribute:
112113
case Node::Kind::NonObjCAttribute:
113114
case Node::Kind::DynamicAttribute:
@@ -2317,6 +2318,9 @@ NodePointer Demangler::popProtocolConformance() {
23172318
case 'G':
23182319
return demangleGenericSpecialization(Node::Kind::
23192320
GenericSpecializationNotReAbstracted);
2321+
case 'B':
2322+
return demangleGenericSpecialization(Node::Kind::
2323+
GenericSpecializationInResilienceDomain);
23202324
case 's':
23212325
return demangleGenericSpecialization(
23222326
Node::Kind::GenericSpecializationPrespecialized);

lib/Demangling/NodePrinter.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,7 @@ class NodePrinter {
388388
case Node::Kind::GenericPartialSpecializationNotReAbstracted:
389389
case Node::Kind::GenericSpecialization:
390390
case Node::Kind::GenericSpecializationNotReAbstracted:
391+
case Node::Kind::GenericSpecializationInResilienceDomain:
391392
case Node::Kind::GenericSpecializationParam:
392393
case Node::Kind::GenericSpecializationPrespecialized:
393394
case Node::Kind::InlinedGenericFunction:
@@ -1415,6 +1416,7 @@ NodePointer NodePrinter::print(NodePointer Node, bool asPrefixContext) {
14151416
"generic not-reabstracted partial specialization", "Signature = ");
14161417
return nullptr;
14171418
case Node::Kind::GenericSpecialization:
1419+
case Node::Kind::GenericSpecializationInResilienceDomain:
14181420
printSpecializationPrefix(Node, "generic specialization");
14191421
return nullptr;
14201422
case Node::Kind::GenericSpecializationPrespecialized:

lib/Demangling/OldRemangler.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,9 @@ void Remangler::mangleGenericSpecializationPrespecialized(Node *node) {
369369
void Remangler::mangleGenericSpecializationNotReAbstracted(Node *node) {
370370
unreachable("unsupported");
371371
}
372+
void Remangler::mangleGenericSpecializationInResilienceDomain(Node *node) {
373+
unreachable("unsupported");
374+
}
372375

373376
void Remangler::mangleInlinedGenericFunction(Node *node) {
374377
unreachable("unsupported");

lib/Demangling/Remangler.cpp

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,7 @@ class Remangler : public RemanglerBase {
300300
mangleChildNodesReversed(FuncType);
301301
}
302302

303+
void mangleGenericSpecializationNode(Node *node, const char *operatorStr);
303304
void mangleAnyNominalType(Node *node);
304305
void mangleAnyGenericType(Node *node, StringRef TypeOp);
305306
void mangleGenericArgs(Node *node, char &Separator,
@@ -1298,7 +1299,8 @@ void Remangler::mangleGenericPartialSpecializationNotReAbstracted(Node *node) {
12981299
mangleGenericPartialSpecialization(node);
12991300
}
13001301

1301-
void Remangler::mangleGenericSpecialization(Node *node) {
1302+
void Remangler::
1303+
mangleGenericSpecializationNode(Node *node, const char *operatorStr) {
13021304
bool FirstParam = true;
13031305
for (NodePointer Child : *node) {
13041306
if (Child->getKind() == Node::Kind::GenericSpecializationParam) {
@@ -1308,39 +1310,32 @@ void Remangler::mangleGenericSpecialization(Node *node) {
13081310
}
13091311
assert(!FirstParam && "generic specialization with no substitutions");
13101312

1311-
switch (node->getKind()) {
1312-
case Node::Kind::GenericSpecialization:
1313-
Buffer << "Tg";
1314-
break;
1315-
case Node::Kind::GenericSpecializationPrespecialized:
1316-
Buffer << "Ts";
1317-
break;
1318-
case Node::Kind::GenericSpecializationNotReAbstracted:
1319-
Buffer << "TG";
1320-
break;
1321-
case Node::Kind::InlinedGenericFunction:
1322-
Buffer << "Ti";
1323-
break;
1324-
default:
1325-
unreachable("unsupported node");
1326-
}
1313+
Buffer << operatorStr;
13271314

13281315
for (NodePointer Child : *node) {
13291316
if (Child->getKind() != Node::Kind::GenericSpecializationParam)
13301317
mangle(Child);
13311318
}
13321319
}
13331320

1321+
void Remangler::mangleGenericSpecialization(Node *node) {
1322+
mangleGenericSpecializationNode(node, "Tg");
1323+
}
1324+
13341325
void Remangler::mangleGenericSpecializationPrespecialized(Node *node) {
1335-
mangleGenericSpecialization(node);
1326+
mangleGenericSpecializationNode(node, "Ts");
13361327
}
13371328

13381329
void Remangler::mangleGenericSpecializationNotReAbstracted(Node *node) {
1339-
mangleGenericSpecialization(node);
1330+
mangleGenericSpecializationNode(node, "TG");
1331+
}
1332+
1333+
void Remangler::mangleGenericSpecializationInResilienceDomain(Node *node) {
1334+
mangleGenericSpecializationNode(node, "TB");
13401335
}
13411336

13421337
void Remangler::mangleInlinedGenericFunction(Node *node) {
1343-
mangleGenericSpecialization(node);
1338+
mangleGenericSpecializationNode(node, "Ti");
13441339
}
13451340

13461341

@@ -1372,6 +1367,7 @@ void Remangler::mangleGlobal(Node *node) {
13721367
case Node::Kind::GenericSpecialization:
13731368
case Node::Kind::GenericSpecializationPrespecialized:
13741369
case Node::Kind::GenericSpecializationNotReAbstracted:
1370+
case Node::Kind::GenericSpecializationInResilienceDomain:
13751371
case Node::Kind::InlinedGenericFunction:
13761372
case Node::Kind::GenericPartialSpecialization:
13771373
case Node::Kind::GenericPartialSpecializationNotReAbstracted:

test/Demangle/Inputs/manglings.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,7 @@ $S1T19protocol_resilience17ResilientProtocolPTl ---> associated type descriptor
349349
$S18resilient_protocol21ResilientBaseProtocolTL ---> protocol requirements base descriptor for resilient_protocol.ResilientBaseProtocol
350350
$S1t1PP10AssocType2_AA1QTn ---> associated conformance descriptor for t.P.AssocType2: t.Q
351351
$S1t1PP10AssocType2_AA1QTN ---> default associated conformance accessor for t.P.AssocType2: t.Q
352+
$s4Test6testityyxlFAA8MystructV_TB5 ---> generic specialization <Test.Mystruct> of Test.testit<A>(A) -> ()
352353
$sSD5IndexVy__GD ---> $sSD5IndexVy__GD
353354
$s4test3StrCACycfC ---> {T:$s4test3StrCACycfc} test.Str.__allocating_init() -> test.Str
354355
$s18keypaths_inlinable13KeypathStructV8computedSSvpACTKq ---> key path getter for keypaths_inlinable.KeypathStruct.computed : Swift.String : keypaths_inlinable.KeypathStruct, serialized

0 commit comments

Comments
 (0)