Skip to content

Commit ae14c16

Browse files
authored
Merge pull request #16196 from gottesmm/pr-b7bd0c9de669757c7b00339a8f30e79f6ff1e7c2
[func-sig-opts] Add a new mangling for the guaranteed->owned transfor…
2 parents 1b8a489 + afc98b3 commit ae14c16

File tree

10 files changed

+60
-0
lines changed

10 files changed

+60
-0
lines changed

include/swift/Demangling/Demangle.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ enum class FunctionSigSpecializationParamKind : unsigned {
9494
Dead = 1 << 6,
9595
OwnedToGuaranteed = 1 << 7,
9696
SROA = 1 << 8,
97+
GuaranteedToOwned = 1 << 9,
9798
};
9899

99100
/// 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
@@ -127,6 +127,7 @@ class FunctionSignatureSpecializationMangler : public SpecializationMangler {
127127
Dead=32,
128128
OwnedToGuaranteed=64,
129129
SROA=128,
130+
GuaranteedToOwned=256,
130131
First_OptionSetEntry=32, LastOptionSetEntry=32768,
131132
};
132133

@@ -149,6 +150,7 @@ class FunctionSignatureSpecializationMangler : public SpecializationMangler {
149150
ThinToThickFunctionInst *TTTFI);
150151
void setArgumentDead(unsigned OrigArgIdx);
151152
void setArgumentOwnedToGuaranteed(unsigned OrigArgIdx);
153+
void setArgumentGuaranteedToOwned(unsigned OrigArgIdx);
152154
void setArgumentSROA(unsigned OrigArgIdx);
153155
void setArgumentBoxToValue(unsigned OrigArgIdx);
154156
void setArgumentBoxToStack(unsigned OrigArgIdx);

lib/Demangling/Demangler.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1980,6 +1980,9 @@ NodePointer Demangler::demangleFuncSpecParam(Node::IndexType ParamIdx) {
19801980
unsigned Value = unsigned(FunctionSigSpecializationParamKind::Dead);
19811981
if (nextIf('G'))
19821982
Value |= unsigned(FunctionSigSpecializationParamKind::OwnedToGuaranteed);
1983+
if (nextIf('O'))
1984+
Value |=
1985+
unsigned(FunctionSigSpecializationParamKind::GuaranteedToOwned);
19831986
if (nextIf('X'))
19841987
Value |= unsigned(FunctionSigSpecializationParamKind::SROA);
19851988
return addChild(Param, createNode(
@@ -1993,6 +1996,16 @@ NodePointer Demangler::demangleFuncSpecParam(Node::IndexType ParamIdx) {
19931996
return addChild(Param, createNode(
19941997
Node::Kind::FunctionSignatureSpecializationParamKind, Value));
19951998
}
1999+
case 'o': {
2000+
unsigned Value =
2001+
unsigned(FunctionSigSpecializationParamKind::GuaranteedToOwned);
2002+
if (nextIf('X'))
2003+
Value |= unsigned(FunctionSigSpecializationParamKind::SROA);
2004+
return addChild(
2005+
Param,
2006+
createNode(Node::Kind::FunctionSignatureSpecializationParamKind,
2007+
Value));
2008+
}
19962009
case 'x':
19972010
return addChild(Param, createNode(
19982011
Node::Kind::FunctionSignatureSpecializationParamKind,

lib/Demangling/NodePrinter.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -813,6 +813,7 @@ unsigned NodePrinter::printFunctionSigSpecializationParam(NodePointer Node,
813813

814814
assert(
815815
((V & unsigned(FunctionSigSpecializationParamKind::OwnedToGuaranteed)) ||
816+
(V & unsigned(FunctionSigSpecializationParamKind::GuaranteedToOwned)) ||
816817
(V & unsigned(FunctionSigSpecializationParamKind::SROA)) ||
817818
(V & unsigned(FunctionSigSpecializationParamKind::Dead))) &&
818819
"Invalid OptionSet");
@@ -1225,6 +1226,13 @@ NodePointer NodePrinter::print(NodePointer Node, bool asPrefixContext) {
12251226
Printer << "Owned To Guaranteed";
12261227
}
12271228

1229+
if (raw & uint64_t(FunctionSigSpecializationParamKind::GuaranteedToOwned)) {
1230+
if (printedOptionSet)
1231+
Printer << " and ";
1232+
printedOptionSet = true;
1233+
Printer << "Guaranteed To Owned";
1234+
}
1235+
12281236
if (raw & uint64_t(FunctionSigSpecializationParamKind::SROA)) {
12291237
if (printedOptionSet)
12301238
Printer << " and ";
@@ -1262,6 +1270,7 @@ NodePointer NodePrinter::print(NodePointer Node, bool asPrefixContext) {
12621270
return nullptr;
12631271
case FunctionSigSpecializationParamKind::Dead:
12641272
case FunctionSigSpecializationParamKind::OwnedToGuaranteed:
1273+
case FunctionSigSpecializationParamKind::GuaranteedToOwned:
12651274
case FunctionSigSpecializationParamKind::SROA:
12661275
printer_unreachable("option sets should have been handled earlier");
12671276
}

lib/Demangling/OldDemangler.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -641,6 +641,11 @@ class OldDemangler {
641641
unsigned(FunctionSigSpecializationParamKind::OwnedToGuaranteed);
642642
}
643643

644+
if (Mangled.nextIf('o')) {
645+
Value |=
646+
unsigned(FunctionSigSpecializationParamKind::GuaranteedToOwned);
647+
}
648+
644649
if (Mangled.nextIf('s')) {
645650
Value |= unsigned(FunctionSigSpecializationParamKind::SROA);
646651
}

lib/Demangling/OldRemangler.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -641,6 +641,9 @@ void Remangler::mangleFunctionSignatureSpecializationParam(Node *node) {
641641
if (kindValue &
642642
unsigned(FunctionSigSpecializationParamKind::OwnedToGuaranteed))
643643
Out << 'g';
644+
if (kindValue &
645+
unsigned(FunctionSigSpecializationParamKind::GuaranteedToOwned))
646+
Out << 'o';
644647
if (kindValue & unsigned(FunctionSigSpecializationParamKind::SROA))
645648
Out << 's';
646649
Out << '_';

lib/Demangling/Remangler.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1018,9 +1018,16 @@ void Remangler::mangleFunctionSignatureSpecializationParam(Node *node) {
10181018
if (kindValue &
10191019
unsigned(FunctionSigSpecializationParamKind::OwnedToGuaranteed))
10201020
Buffer << 'G';
1021+
if (kindValue &
1022+
unsigned(FunctionSigSpecializationParamKind::GuaranteedToOwned))
1023+
Buffer << 'O';
10211024
} else if (kindValue &
10221025
unsigned(FunctionSigSpecializationParamKind::OwnedToGuaranteed)) {
10231026
Buffer << 'g';
1027+
} else if (kindValue &
1028+
unsigned(
1029+
FunctionSigSpecializationParamKind::GuaranteedToOwned)) {
1030+
Buffer << 'o';
10241031
}
10251032
if (kindValue & unsigned(FunctionSigSpecializationParamKind::SROA))
10261033
Buffer << 'X';

lib/SILOptimizer/Utils/SpecializationMangler.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,12 @@ void FunctionSignatureSpecializationMangler::setArgumentSROA(
157157
OrigArgs[OrigArgIdx].first |= ArgumentModifierIntBase(ArgumentModifier::SROA);
158158
}
159159

160+
void FunctionSignatureSpecializationMangler::setArgumentGuaranteedToOwned(
161+
unsigned OrigArgIdx) {
162+
OrigArgs[OrigArgIdx].first |=
163+
ArgumentModifierIntBase(ArgumentModifier::GuaranteedToOwned);
164+
}
165+
160166
void FunctionSignatureSpecializationMangler::setArgumentBoxToValue(
161167
unsigned OrigArgIdx) {
162168
OrigArgs[OrigArgIdx].first =
@@ -291,6 +297,12 @@ void FunctionSignatureSpecializationMangler::mangleArgument(
291297
ArgOpBuffer << (hasSomeMod ? 'G' : 'g');
292298
hasSomeMod = true;
293299
}
300+
301+
if (ArgMod & ArgumentModifierIntBase(ArgumentModifier::GuaranteedToOwned)) {
302+
ArgOpBuffer << (hasSomeMod ? 'O' : 'o');
303+
hasSomeMod = true;
304+
}
305+
294306
if (ArgMod & ArgumentModifierIntBase(ArgumentModifier::SROA)) {
295307
ArgOpBuffer << (hasSomeMod ? 'X' : 'x');
296308
hasSomeMod = true;

test/Demangle/Inputs/manglings.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,3 +310,7 @@ $SSC9SomeErrorLeVD ---> __C_Synthesized.related decl 'e' for SomeError
310310
$S20mangling_retroactive5test0yyAA1ZVy12RetroactiveB1XVSiAE1YVAG0D1A1PAAg_AiJ1QAAg1_GF -> mangling_retroactive.test0(mangling_retroactive.Z<RetroactiveB.X, Swift.Int, RetroactiveB.Y>) -> ()
311311
_T0LiteralAByxGxd_tcfC ---> _T0LiteralAByxGxd_tcfC
312312
_T0XZ ---> _T0XZ
313+
_TTSf0os___TFVs17_LegacyStringCore15_invariantCheckfT_T_ ---> function signature specialization <Arg[0] = Guaranteed To Owned and Exploded> of Swift._LegacyStringCore._invariantCheck() -> ()
314+
_TTSf2o___TTSf2s_d___TFVs17_LegacyStringCoreCfVs13_StringBufferS_ ---> function signature specialization <Arg[0] = Guaranteed To Owned> of function signature specialization <Arg[0] = Exploded, Arg[1] = Dead> of Swift._LegacyStringCore.init(Swift._StringBuffer) -> Swift._LegacyStringCore
315+
_TTSf2do___TTSf2s_d___TFVs17_LegacyStringCoreCfVs13_StringBufferS_ ---> function signature specialization <Arg[0] = Dead and Guaranteed To Owned> of function signature specialization <Arg[0] = Exploded, Arg[1] = Dead> of Swift._LegacyStringCore.init(Swift._StringBuffer) -> Swift._LegacyStringCore
316+
_TTSf2dos___TTSf2s_d___TFVs17_LegacyStringCoreCfVs13_StringBufferS_ ---> function signature specialization <Arg[0] = Dead and Guaranteed To Owned and Exploded> of function signature specialization <Arg[0] = Exploded, Arg[1] = Dead> of Swift._LegacyStringCore.init(Swift._StringBuffer) -> Swift._LegacyStringCore

test/Demangle/Inputs/simplified-manglings.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,3 +207,7 @@ _T03abc6testitySiFTm ---> testit(_:)
207207
_T04main4TestCACSi1x_tc6_PRIV_Llfc ---> Test.init(x:)
208208
_$S3abc6testityySiFTm ---> testit(_:)
209209
_$S4main4TestC1xACSi_tc6_PRIV_Llfc ---> Test.init(x:)
210+
_TTSf0os___TFVs17_LegacyStringCore15_invariantCheckfT_T_ ---> specialized _LegacyStringCore._invariantCheck()
211+
_TTSf2o___TTSf2s_d___TFVs17_LegacyStringCoreCfVs13_StringBufferS_ ---> specialized _LegacyStringCore.init(_:)
212+
_TTSf2do___TTSf2s_d___TFVs17_LegacyStringCoreCfVs13_StringBufferS_ ---> specialized _LegacyStringCore.init(_:)
213+
_TTSf2dos___TTSf2s_d___TFVs17_LegacyStringCoreCfVs13_StringBufferS_ ---> specialized _LegacyStringCore.init(_:)

0 commit comments

Comments
 (0)