Skip to content

Commit e215abc

Browse files
author
Raj Barik
committed
Add ExistentialToGeneric mangling and demangling code
1 parent 60b6789 commit e215abc

File tree

7 files changed

+59
-3
lines changed

7 files changed

+59
-3
lines changed

docs/ABI/Mangling.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -789,6 +789,7 @@ Some kinds need arguments, which precede ``Tf``.
789789
ARG-SPEC-KIND ::= 'c' // Consumes n 'type' arguments which are closed over types in argument order
790790
// and one 'identifier' argument which is the closure symbol name
791791
ARG-SPEC-KIND ::= 'p' CONST-PROP // Constant propagated argument
792+
ARG-SPEC-KIND ::= 'e' 'D'? 'G'? 'X'? // Generic argument, with optional dead, owned=>guaranteed or exploded-specifier
792793
ARG-SPEC-KIND ::= 'd' 'G'? 'X'? // Dead argument, with optional owned=>guaranteed or exploded-specifier
793794
ARG-SPEC-KIND ::= 'g' 'X'? // Owned => Guaranteed,, with optional exploded-specifier
794795
ARG-SPEC-KIND ::= 'x' // Exploded

include/swift/Demangling/Demangle.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ enum class FunctionSigSpecializationParamKind : unsigned {
9595
OwnedToGuaranteed = 1 << 7,
9696
SROA = 1 << 8,
9797
GuaranteedToOwned = 1 << 9,
98+
ExistentialToGeneric = 1 << 10,
9899
};
99100

100101
/// The pass that caused the specialization to occur. We use this to make sure

include/swift/SILOptimizer/Utils/SpecializationMangler.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ class FunctionSignatureSpecializationMangler : public SpecializationMangler {
128128
OwnedToGuaranteed=64,
129129
SROA=128,
130130
GuaranteedToOwned=256,
131+
ExistentialToGeneric=512,
131132
First_OptionSetEntry=32, LastOptionSetEntry=32768,
132133
};
133134

@@ -151,6 +152,7 @@ class FunctionSignatureSpecializationMangler : public SpecializationMangler {
151152
void setArgumentDead(unsigned OrigArgIdx);
152153
void setArgumentOwnedToGuaranteed(unsigned OrigArgIdx);
153154
void setArgumentGuaranteedToOwned(unsigned OrigArgIdx);
155+
void setArgumentExistentialToGeneric(unsigned OrigArgIdx);
154156
void setArgumentSROA(unsigned OrigArgIdx);
155157
void setArgumentBoxToValue(unsigned OrigArgIdx);
156158
void setArgumentBoxToStack(unsigned OrigArgIdx);

lib/Demangling/Demangler.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1982,6 +1982,24 @@ NodePointer Demangler::demangleFuncSpecParam(Node::IndexType ParamIdx) {
19821982
return nullptr;
19831983
}
19841984
}
1985+
case 'e': {
1986+
unsigned Value =
1987+
unsigned(FunctionSigSpecializationParamKind::ExistentialToGeneric);
1988+
if (nextIf('D'))
1989+
Value |= unsigned(FunctionSigSpecializationParamKind::Dead);
1990+
if (nextIf('G'))
1991+
Value |=
1992+
unsigned(FunctionSigSpecializationParamKind::OwnedToGuaranteed);
1993+
if (nextIf('O'))
1994+
Value |=
1995+
unsigned(FunctionSigSpecializationParamKind::GuaranteedToOwned);
1996+
if (nextIf('X'))
1997+
Value |= unsigned(FunctionSigSpecializationParamKind::SROA);
1998+
return addChild(
1999+
Param,
2000+
createNode(Node::Kind::FunctionSignatureSpecializationParamKind,
2001+
Value));
2002+
}
19852003
case 'd': {
19862004
unsigned Value = unsigned(FunctionSigSpecializationParamKind::Dead);
19872005
if (nextIf('G'))

lib/Demangling/NodePrinter.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -816,7 +816,9 @@ unsigned NodePrinter::printFunctionSigSpecializationParam(NodePointer Node,
816816
((V & unsigned(FunctionSigSpecializationParamKind::OwnedToGuaranteed)) ||
817817
(V & unsigned(FunctionSigSpecializationParamKind::GuaranteedToOwned)) ||
818818
(V & unsigned(FunctionSigSpecializationParamKind::SROA)) ||
819-
(V & unsigned(FunctionSigSpecializationParamKind::Dead))) &&
819+
(V & unsigned(FunctionSigSpecializationParamKind::Dead))||
820+
(V & unsigned(
821+
FunctionSigSpecializationParamKind::ExistentialToGeneric))) &&
820822
"Invalid OptionSet");
821823
print(Node->getChild(Idx++));
822824
return Idx;
@@ -1215,11 +1217,18 @@ NodePointer NodePrinter::print(NodePointer Node, bool asPrefixContext) {
12151217
uint64_t raw = Node->getIndex();
12161218

12171219
bool printedOptionSet = false;
1220+
if (raw &
1221+
uint64_t(FunctionSigSpecializationParamKind::ExistentialToGeneric)) {
1222+
printedOptionSet = true;
1223+
Printer << "Existential To Protocol Constrained Generic";
1224+
}
1225+
12181226
if (raw & uint64_t(FunctionSigSpecializationParamKind::Dead)) {
1227+
if (printedOptionSet)
1228+
Printer << " and ";
12191229
printedOptionSet = true;
12201230
Printer << "Dead";
12211231
}
1222-
12231232
if (raw & uint64_t(FunctionSigSpecializationParamKind::OwnedToGuaranteed)) {
12241233
if (printedOptionSet)
12251234
Printer << " and ";
@@ -1269,6 +1278,7 @@ NodePointer NodePrinter::print(NodePointer Node, bool asPrefixContext) {
12691278
case FunctionSigSpecializationParamKind::ClosureProp:
12701279
Printer << "Closure Propagated";
12711280
return nullptr;
1281+
case FunctionSigSpecializationParamKind::ExistentialToGeneric:
12721282
case FunctionSigSpecializationParamKind::Dead:
12731283
case FunctionSigSpecializationParamKind::OwnedToGuaranteed:
12741284
case FunctionSigSpecializationParamKind::GuaranteedToOwned:

lib/Demangling/Remangler.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1019,7 +1019,20 @@ void Remangler::mangleFunctionSignatureSpecializationParam(Node *node) {
10191019
Buffer << 'x';
10201020
return;
10211021
default:
1022-
if (kindValue & unsigned(FunctionSigSpecializationParamKind::Dead)) {
1022+
if (kindValue &
1023+
unsigned(
1024+
FunctionSigSpecializationParamKind::ExistentialToGeneric)) {
1025+
Buffer << 'e';
1026+
if (kindValue & unsigned(FunctionSigSpecializationParamKind::Dead))
1027+
Buffer << 'D';
1028+
if (kindValue &
1029+
unsigned(FunctionSigSpecializationParamKind::OwnedToGuaranteed))
1030+
Buffer << 'G';
1031+
if (kindValue &
1032+
unsigned(FunctionSigSpecializationParamKind::GuaranteedToOwned))
1033+
Buffer << 'O';
1034+
} else if (kindValue &
1035+
unsigned(FunctionSigSpecializationParamKind::Dead)) {
10231036
Buffer << 'd';
10241037
if (kindValue &
10251038
unsigned(FunctionSigSpecializationParamKind::OwnedToGuaranteed))

lib/SILOptimizer/Utils/SpecializationMangler.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,12 @@ void FunctionSignatureSpecializationMangler::setArgumentGuaranteedToOwned(
162162
ArgumentModifierIntBase(ArgumentModifier::GuaranteedToOwned);
163163
}
164164

165+
void FunctionSignatureSpecializationMangler::setArgumentExistentialToGeneric(
166+
unsigned OrigArgIdx) {
167+
OrigArgs[OrigArgIdx].first |=
168+
ArgumentModifierIntBase(ArgumentModifier::ExistentialToGeneric);
169+
}
170+
165171
void FunctionSignatureSpecializationMangler::setArgumentBoxToValue(
166172
unsigned OrigArgIdx) {
167173
OrigArgs[OrigArgIdx].first =
@@ -287,6 +293,11 @@ void FunctionSignatureSpecializationMangler::mangleArgument(
287293
}
288294

289295
bool hasSomeMod = false;
296+
if (ArgMod & ArgumentModifierIntBase(ArgumentModifier::ExistentialToGeneric)) {
297+
ArgOpBuffer << 'e';
298+
hasSomeMod = true;
299+
}
300+
290301
if (ArgMod & ArgumentModifierIntBase(ArgumentModifier::Dead)) {
291302
ArgOpBuffer << 'd';
292303
hasSomeMod = true;

0 commit comments

Comments
 (0)