Skip to content

Commit 947996c

Browse files
committed
Mangling: encode an optional unique ID in the function specialization mangling, instead of appending _unique_suffix
1 parent 268436a commit 947996c

File tree

8 files changed

+49
-12
lines changed

8 files changed

+49
-12
lines changed

docs/ABI.rst

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1343,7 +1343,7 @@ The type is the function type of the specialized function.
13431343

13441344
::
13451345

1346-
specialization ::= spec-arg* 'Tf' SPEC-INFO ARG-SPEC-KIND* '_' ARG-SPEC-KIND // Function signature specialization kind
1346+
specialization ::= spec-arg* 'Tf' SPEC-INFO UNIQUE-ID? ARG-SPEC-KIND* '_' ARG-SPEC-KIND // Function signature specialization kind
13471347

13481348
The ``<ARG-SPEC-KIND>`` describes how arguments are specialized.
13491349
Some kinds need arguments, which precede ``Tf``.
@@ -1364,6 +1364,8 @@ Some kinds need arguments, which precede ``Tf``.
13641364

13651365
FRAGILE ::= 'q'
13661366

1367+
UNIQUE-ID ::= NATURAL // Used to make unique function names
1368+
13671369
ARG-SPEC-KIND ::= 'n' // Unmodified argument
13681370
ARG-SPEC-KIND ::= 'c' // Consumes n 'type' arguments which are closed over types in argument order
13691371
// and one 'identifier' argument which is the closure symbol name

include/swift/Basic/Demangler.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,8 @@ class Demangler {
223223
NodePointer addFuncSpecParamNumber(NodePointer Param,
224224
FunctionSigSpecializationParamKind Kind);
225225

226-
NodePointer demangleSpecAttributes(Node::Kind SpecKind);
226+
NodePointer demangleSpecAttributes(Node::Kind SpecKind,
227+
bool demangleUniqueID = false);
227228

228229
NodePointer demangleWitness();
229230
NodePointer demangleSpecialType();

include/swift/SILOptimizer/Utils/SpecializationMangler.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ class FunctionSignatureSpecializationMangler : public SpecializationMangler {
150150
void setArgumentBoxToStack(unsigned ArgNo);
151151
void setReturnValueOwnedToUnowned();
152152

153-
std::string mangle();
153+
std::string mangle(int UniqueID = 0);
154154

155155
private:
156156
void mangleConstantProp(LiteralInst *LI);

lib/Basic/Demangler.cpp

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1093,7 +1093,7 @@ NodePointer Demangler::demangleGenericSpecialization(Node::Kind SpecKind) {
10931093

10941094
NodePointer Demangler::demangleFunctionSpecialization() {
10951095
NodePointer Spec = demangleSpecAttributes(
1096-
Node::Kind::FunctionSignatureSpecialization);
1096+
Node::Kind::FunctionSignatureSpecialization, /*demangleUniqueID*/ true);
10971097
unsigned ParamIdx = 0;
10981098
while (Spec && !nextIf('_')) {
10991099
Spec = addChild(Spec, demangleFuncSpecParam(ParamIdx));
@@ -1230,15 +1230,27 @@ NodePointer Demangler::addFuncSpecParamNumber(NodePointer Param,
12301230
Node::Kind::FunctionSignatureSpecializationParamPayload, Str));
12311231
}
12321232

1233-
NodePointer Demangler::demangleSpecAttributes(Node::Kind SpecKind) {
1234-
NodePointer SpecNd = NodeFactory::create(SpecKind);
1235-
if (nextIf('q'))
1236-
SpecNd->addChild(NodeFactory::create(Node::Kind::SpecializationIsFragile));
1233+
NodePointer Demangler::demangleSpecAttributes(Node::Kind SpecKind,
1234+
bool demangleUniqueID) {
1235+
bool isFragile = nextIf('q');
12371236

12381237
int PassID = (int)nextChar() - '0';
12391238
if (PassID < 0 || PassID > 9)
12401239
return nullptr;
12411240

1241+
int Idx = -1;
1242+
if (demangleUniqueID)
1243+
Idx = demangleNatural();
1244+
1245+
NodePointer SpecNd;
1246+
if (Idx >= 0) {
1247+
SpecNd = NodeFactory::create(SpecKind, Idx);
1248+
} else {
1249+
SpecNd = NodeFactory::create(SpecKind);
1250+
}
1251+
if (isFragile)
1252+
SpecNd->addChild(NodeFactory::create(Node::Kind::SpecializationIsFragile));
1253+
12421254
SpecNd->addChild(NodeFactory::create(Node::Kind::SpecializationPassID,
12431255
PassID));
12441256
return SpecNd;

lib/Basic/Mangler.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,11 @@ void NewMangling::printManglingStats() {
269269
}
270270

271271
void Mangler::beginMangling() {
272+
Storage.clear();
273+
Substitutions.clear();
274+
StringSubstitutions.clear();
275+
lastSubstIdx = -2;
276+
Words.clear();
272277
Buffer << MANGLING_PREFIX_STR;
273278
}
274279

lib/Basic/Remangler.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -860,6 +860,11 @@ void Remangler::mangleFunctionSignatureSpecialization(Node *node) {
860860
}
861861
}
862862
mangle(Child.get());
863+
864+
if (Child->getKind() == Node::Kind::SpecializationPassID &&
865+
node->hasIndex()) {
866+
Buffer << node->getIndex();
867+
}
863868
}
864869
if (!returnValMangled)
865870
Buffer << "_n";

lib/SILOptimizer/Transforms/FunctionSignatureOpts.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -364,8 +364,16 @@ std::string FunctionSignatureTransform::createOptimizedSILFunctionName() {
364364
}
365365

366366
OldFM.mangle();
367-
std::string Old = OldFM.getMangler().finalize();
368-
std::string New = NewFM.mangle();
367+
SILModule &M = F->getModule();
368+
std::string Old = getUniqueName(OldFM.getMangler().finalize(), M);
369+
370+
int UniqueID = 0;
371+
std::string New;
372+
do {
373+
New = NewFM.mangle(UniqueID);
374+
++UniqueID;
375+
} while (M.lookUpFunction(New));
376+
369377
return NewMangling::selectMangling(Old, New);
370378
}
371379

@@ -472,7 +480,7 @@ CanSILFunctionType FunctionSignatureTransform::createOptimizedSILFunctionType()
472480
void FunctionSignatureTransform::createFunctionSignatureOptimizedFunction() {
473481
// Create the optimized function !
474482
SILModule &M = F->getModule();
475-
std::string Name = getUniqueName(createOptimizedSILFunctionName(), M);
483+
std::string Name = createOptimizedSILFunctionName();
476484
SILLinkage linkage = F->getLinkage();
477485
if (isAvailableExternally(linkage))
478486
linkage = SILLinkage::Shared;

lib/SILOptimizer/Utils/SpecializationMangler.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,9 +309,13 @@ mangleReturnValue(ReturnValueModifierIntBase RetMod) {
309309
}
310310
}
311311

312-
std::string FunctionSignatureSpecializationMangler::mangle() {
312+
std::string FunctionSignatureSpecializationMangler::mangle(int UniqueID) {
313+
ArgOpStorage.clear();
313314
beginMangling();
314315

316+
if (UniqueID)
317+
ArgOpBuffer << UniqueID;
318+
315319
for (unsigned i : indices(Args)) {
316320
ArgumentModifierIntBase ArgMod;
317321
NullablePtr<SILInstruction> Inst;

0 commit comments

Comments
 (0)