[func-sig-opts] Add a new mangling for the guaranteed->owned transformation.

I followed the example of the owned->guaranteed transformation.

rdar://38196046
This commit is contained in:
Michael Gottesman
2018-04-26 16:27:49 -07:00
parent ff6febca17
commit afc98b34e9
10 changed files with 60 additions and 0 deletions

View File

@@ -94,6 +94,7 @@ enum class FunctionSigSpecializationParamKind : unsigned {
Dead = 1 << 6, Dead = 1 << 6,
OwnedToGuaranteed = 1 << 7, OwnedToGuaranteed = 1 << 7,
SROA = 1 << 8, SROA = 1 << 8,
GuaranteedToOwned = 1 << 9,
}; };
/// The pass that caused the specialization to occur. We use this to make sure /// The pass that caused the specialization to occur. We use this to make sure

View File

@@ -127,6 +127,7 @@ class FunctionSignatureSpecializationMangler : public SpecializationMangler {
Dead=32, Dead=32,
OwnedToGuaranteed=64, OwnedToGuaranteed=64,
SROA=128, SROA=128,
GuaranteedToOwned=256,
First_OptionSetEntry=32, LastOptionSetEntry=32768, First_OptionSetEntry=32, LastOptionSetEntry=32768,
}; };
@@ -149,6 +150,7 @@ public:
ThinToThickFunctionInst *TTTFI); ThinToThickFunctionInst *TTTFI);
void setArgumentDead(unsigned OrigArgIdx); void setArgumentDead(unsigned OrigArgIdx);
void setArgumentOwnedToGuaranteed(unsigned OrigArgIdx); void setArgumentOwnedToGuaranteed(unsigned OrigArgIdx);
void setArgumentGuaranteedToOwned(unsigned OrigArgIdx);
void setArgumentSROA(unsigned OrigArgIdx); void setArgumentSROA(unsigned OrigArgIdx);
void setArgumentBoxToValue(unsigned OrigArgIdx); void setArgumentBoxToValue(unsigned OrigArgIdx);
void setArgumentBoxToStack(unsigned OrigArgIdx); void setArgumentBoxToStack(unsigned OrigArgIdx);

View File

@@ -1980,6 +1980,9 @@ NodePointer Demangler::demangleFuncSpecParam(Node::IndexType ParamIdx) {
unsigned Value = unsigned(FunctionSigSpecializationParamKind::Dead); unsigned Value = unsigned(FunctionSigSpecializationParamKind::Dead);
if (nextIf('G')) if (nextIf('G'))
Value |= unsigned(FunctionSigSpecializationParamKind::OwnedToGuaranteed); Value |= unsigned(FunctionSigSpecializationParamKind::OwnedToGuaranteed);
if (nextIf('O'))
Value |=
unsigned(FunctionSigSpecializationParamKind::GuaranteedToOwned);
if (nextIf('X')) if (nextIf('X'))
Value |= unsigned(FunctionSigSpecializationParamKind::SROA); Value |= unsigned(FunctionSigSpecializationParamKind::SROA);
return addChild(Param, createNode( return addChild(Param, createNode(
@@ -1993,6 +1996,16 @@ NodePointer Demangler::demangleFuncSpecParam(Node::IndexType ParamIdx) {
return addChild(Param, createNode( return addChild(Param, createNode(
Node::Kind::FunctionSignatureSpecializationParamKind, Value)); Node::Kind::FunctionSignatureSpecializationParamKind, Value));
} }
case 'o': {
unsigned Value =
unsigned(FunctionSigSpecializationParamKind::GuaranteedToOwned);
if (nextIf('X'))
Value |= unsigned(FunctionSigSpecializationParamKind::SROA);
return addChild(
Param,
createNode(Node::Kind::FunctionSignatureSpecializationParamKind,
Value));
}
case 'x': case 'x':
return addChild(Param, createNode( return addChild(Param, createNode(
Node::Kind::FunctionSignatureSpecializationParamKind, Node::Kind::FunctionSignatureSpecializationParamKind,

View File

@@ -813,6 +813,7 @@ unsigned NodePrinter::printFunctionSigSpecializationParam(NodePointer Node,
assert( assert(
((V & unsigned(FunctionSigSpecializationParamKind::OwnedToGuaranteed)) || ((V & unsigned(FunctionSigSpecializationParamKind::OwnedToGuaranteed)) ||
(V & unsigned(FunctionSigSpecializationParamKind::GuaranteedToOwned)) ||
(V & unsigned(FunctionSigSpecializationParamKind::SROA)) || (V & unsigned(FunctionSigSpecializationParamKind::SROA)) ||
(V & unsigned(FunctionSigSpecializationParamKind::Dead))) && (V & unsigned(FunctionSigSpecializationParamKind::Dead))) &&
"Invalid OptionSet"); "Invalid OptionSet");
@@ -1225,6 +1226,13 @@ NodePointer NodePrinter::print(NodePointer Node, bool asPrefixContext) {
Printer << "Owned To Guaranteed"; Printer << "Owned To Guaranteed";
} }
if (raw & uint64_t(FunctionSigSpecializationParamKind::GuaranteedToOwned)) {
if (printedOptionSet)
Printer << " and ";
printedOptionSet = true;
Printer << "Guaranteed To Owned";
}
if (raw & uint64_t(FunctionSigSpecializationParamKind::SROA)) { if (raw & uint64_t(FunctionSigSpecializationParamKind::SROA)) {
if (printedOptionSet) if (printedOptionSet)
Printer << " and "; Printer << " and ";
@@ -1262,6 +1270,7 @@ NodePointer NodePrinter::print(NodePointer Node, bool asPrefixContext) {
return nullptr; return nullptr;
case FunctionSigSpecializationParamKind::Dead: case FunctionSigSpecializationParamKind::Dead:
case FunctionSigSpecializationParamKind::OwnedToGuaranteed: case FunctionSigSpecializationParamKind::OwnedToGuaranteed:
case FunctionSigSpecializationParamKind::GuaranteedToOwned:
case FunctionSigSpecializationParamKind::SROA: case FunctionSigSpecializationParamKind::SROA:
printer_unreachable("option sets should have been handled earlier"); printer_unreachable("option sets should have been handled earlier");
} }

View File

@@ -641,6 +641,11 @@ private:
unsigned(FunctionSigSpecializationParamKind::OwnedToGuaranteed); unsigned(FunctionSigSpecializationParamKind::OwnedToGuaranteed);
} }
if (Mangled.nextIf('o')) {
Value |=
unsigned(FunctionSigSpecializationParamKind::GuaranteedToOwned);
}
if (Mangled.nextIf('s')) { if (Mangled.nextIf('s')) {
Value |= unsigned(FunctionSigSpecializationParamKind::SROA); Value |= unsigned(FunctionSigSpecializationParamKind::SROA);
} }

View File

@@ -641,6 +641,9 @@ void Remangler::mangleFunctionSignatureSpecializationParam(Node *node) {
if (kindValue & if (kindValue &
unsigned(FunctionSigSpecializationParamKind::OwnedToGuaranteed)) unsigned(FunctionSigSpecializationParamKind::OwnedToGuaranteed))
Out << 'g'; Out << 'g';
if (kindValue &
unsigned(FunctionSigSpecializationParamKind::GuaranteedToOwned))
Out << 'o';
if (kindValue & unsigned(FunctionSigSpecializationParamKind::SROA)) if (kindValue & unsigned(FunctionSigSpecializationParamKind::SROA))
Out << 's'; Out << 's';
Out << '_'; Out << '_';

View File

@@ -1018,9 +1018,16 @@ void Remangler::mangleFunctionSignatureSpecializationParam(Node *node) {
if (kindValue & if (kindValue &
unsigned(FunctionSigSpecializationParamKind::OwnedToGuaranteed)) unsigned(FunctionSigSpecializationParamKind::OwnedToGuaranteed))
Buffer << 'G'; Buffer << 'G';
if (kindValue &
unsigned(FunctionSigSpecializationParamKind::GuaranteedToOwned))
Buffer << 'O';
} else if (kindValue & } else if (kindValue &
unsigned(FunctionSigSpecializationParamKind::OwnedToGuaranteed)) { unsigned(FunctionSigSpecializationParamKind::OwnedToGuaranteed)) {
Buffer << 'g'; Buffer << 'g';
} else if (kindValue &
unsigned(
FunctionSigSpecializationParamKind::GuaranteedToOwned)) {
Buffer << 'o';
} }
if (kindValue & unsigned(FunctionSigSpecializationParamKind::SROA)) if (kindValue & unsigned(FunctionSigSpecializationParamKind::SROA))
Buffer << 'X'; Buffer << 'X';

View File

@@ -157,6 +157,12 @@ void FunctionSignatureSpecializationMangler::setArgumentSROA(
OrigArgs[OrigArgIdx].first |= ArgumentModifierIntBase(ArgumentModifier::SROA); OrigArgs[OrigArgIdx].first |= ArgumentModifierIntBase(ArgumentModifier::SROA);
} }
void FunctionSignatureSpecializationMangler::setArgumentGuaranteedToOwned(
unsigned OrigArgIdx) {
OrigArgs[OrigArgIdx].first |=
ArgumentModifierIntBase(ArgumentModifier::GuaranteedToOwned);
}
void FunctionSignatureSpecializationMangler::setArgumentBoxToValue( void FunctionSignatureSpecializationMangler::setArgumentBoxToValue(
unsigned OrigArgIdx) { unsigned OrigArgIdx) {
OrigArgs[OrigArgIdx].first = OrigArgs[OrigArgIdx].first =
@@ -291,6 +297,12 @@ void FunctionSignatureSpecializationMangler::mangleArgument(
ArgOpBuffer << (hasSomeMod ? 'G' : 'g'); ArgOpBuffer << (hasSomeMod ? 'G' : 'g');
hasSomeMod = true; hasSomeMod = true;
} }
if (ArgMod & ArgumentModifierIntBase(ArgumentModifier::GuaranteedToOwned)) {
ArgOpBuffer << (hasSomeMod ? 'O' : 'o');
hasSomeMod = true;
}
if (ArgMod & ArgumentModifierIntBase(ArgumentModifier::SROA)) { if (ArgMod & ArgumentModifierIntBase(ArgumentModifier::SROA)) {
ArgOpBuffer << (hasSomeMod ? 'X' : 'x'); ArgOpBuffer << (hasSomeMod ? 'X' : 'x');
hasSomeMod = true; hasSomeMod = true;

View File

@@ -310,3 +310,7 @@ $SSC9SomeErrorLeVD ---> __C_Synthesized.related decl 'e' for SomeError
$S20mangling_retroactive5test0yyAA1ZVy12RetroactiveB1XVSiAE1YVAG0D1A1PAAg_AiJ1QAAg1_GF -> mangling_retroactive.test0(mangling_retroactive.Z<RetroactiveB.X, Swift.Int, RetroactiveB.Y>) -> () $S20mangling_retroactive5test0yyAA1ZVy12RetroactiveB1XVSiAE1YVAG0D1A1PAAg_AiJ1QAAg1_GF -> mangling_retroactive.test0(mangling_retroactive.Z<RetroactiveB.X, Swift.Int, RetroactiveB.Y>) -> ()
_T0LiteralAByxGxd_tcfC ---> _T0LiteralAByxGxd_tcfC _T0LiteralAByxGxd_tcfC ---> _T0LiteralAByxGxd_tcfC
_T0XZ ---> _T0XZ _T0XZ ---> _T0XZ
_TTSf0os___TFVs17_LegacyStringCore15_invariantCheckfT_T_ ---> function signature specialization <Arg[0] = Guaranteed To Owned and Exploded> of Swift._LegacyStringCore._invariantCheck() -> ()
_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
_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
_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

View File

@@ -207,3 +207,7 @@ _T03abc6testitySiFTm ---> testit(_:)
_T04main4TestCACSi1x_tc6_PRIV_Llfc ---> Test.init(x:) _T04main4TestCACSi1x_tc6_PRIV_Llfc ---> Test.init(x:)
_$S3abc6testityySiFTm ---> testit(_:) _$S3abc6testityySiFTm ---> testit(_:)
_$S4main4TestC1xACSi_tc6_PRIV_Llfc ---> Test.init(x:) _$S4main4TestC1xACSi_tc6_PRIV_Llfc ---> Test.init(x:)
_TTSf0os___TFVs17_LegacyStringCore15_invariantCheckfT_T_ ---> specialized _LegacyStringCore._invariantCheck()
_TTSf2o___TTSf2s_d___TFVs17_LegacyStringCoreCfVs13_StringBufferS_ ---> specialized _LegacyStringCore.init(_:)
_TTSf2do___TTSf2s_d___TFVs17_LegacyStringCoreCfVs13_StringBufferS_ ---> specialized _LegacyStringCore.init(_:)
_TTSf2dos___TTSf2s_d___TFVs17_LegacyStringCoreCfVs13_StringBufferS_ ---> specialized _LegacyStringCore.init(_:)