diff --git a/include/swift/Demangling/Demangle.h b/include/swift/Demangling/Demangle.h index 83a79712e4a..11868c69b5f 100644 --- a/include/swift/Demangling/Demangle.h +++ b/include/swift/Demangling/Demangle.h @@ -94,6 +94,7 @@ enum class FunctionSigSpecializationParamKind : unsigned { Dead = 1 << 6, OwnedToGuaranteed = 1 << 7, SROA = 1 << 8, + GuaranteedToOwned = 1 << 9, }; /// The pass that caused the specialization to occur. We use this to make sure diff --git a/include/swift/SILOptimizer/Utils/SpecializationMangler.h b/include/swift/SILOptimizer/Utils/SpecializationMangler.h index 2df199748a7..8593be5e12b 100644 --- a/include/swift/SILOptimizer/Utils/SpecializationMangler.h +++ b/include/swift/SILOptimizer/Utils/SpecializationMangler.h @@ -127,6 +127,7 @@ class FunctionSignatureSpecializationMangler : public SpecializationMangler { Dead=32, OwnedToGuaranteed=64, SROA=128, + GuaranteedToOwned=256, First_OptionSetEntry=32, LastOptionSetEntry=32768, }; @@ -149,6 +150,7 @@ public: ThinToThickFunctionInst *TTTFI); void setArgumentDead(unsigned OrigArgIdx); void setArgumentOwnedToGuaranteed(unsigned OrigArgIdx); + void setArgumentGuaranteedToOwned(unsigned OrigArgIdx); void setArgumentSROA(unsigned OrigArgIdx); void setArgumentBoxToValue(unsigned OrigArgIdx); void setArgumentBoxToStack(unsigned OrigArgIdx); diff --git a/lib/Demangling/Demangler.cpp b/lib/Demangling/Demangler.cpp index dfd2300e76c..6fbfba574a3 100644 --- a/lib/Demangling/Demangler.cpp +++ b/lib/Demangling/Demangler.cpp @@ -1980,6 +1980,9 @@ NodePointer Demangler::demangleFuncSpecParam(Node::IndexType ParamIdx) { unsigned Value = unsigned(FunctionSigSpecializationParamKind::Dead); if (nextIf('G')) Value |= unsigned(FunctionSigSpecializationParamKind::OwnedToGuaranteed); + if (nextIf('O')) + Value |= + unsigned(FunctionSigSpecializationParamKind::GuaranteedToOwned); if (nextIf('X')) Value |= unsigned(FunctionSigSpecializationParamKind::SROA); return addChild(Param, createNode( @@ -1993,6 +1996,16 @@ NodePointer Demangler::demangleFuncSpecParam(Node::IndexType ParamIdx) { return addChild(Param, createNode( 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': return addChild(Param, createNode( Node::Kind::FunctionSignatureSpecializationParamKind, diff --git a/lib/Demangling/NodePrinter.cpp b/lib/Demangling/NodePrinter.cpp index 7703600722c..e210cc1aea2 100644 --- a/lib/Demangling/NodePrinter.cpp +++ b/lib/Demangling/NodePrinter.cpp @@ -813,6 +813,7 @@ unsigned NodePrinter::printFunctionSigSpecializationParam(NodePointer Node, assert( ((V & unsigned(FunctionSigSpecializationParamKind::OwnedToGuaranteed)) || + (V & unsigned(FunctionSigSpecializationParamKind::GuaranteedToOwned)) || (V & unsigned(FunctionSigSpecializationParamKind::SROA)) || (V & unsigned(FunctionSigSpecializationParamKind::Dead))) && "Invalid OptionSet"); @@ -1225,6 +1226,13 @@ NodePointer NodePrinter::print(NodePointer Node, bool asPrefixContext) { 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 (printedOptionSet) Printer << " and "; @@ -1262,6 +1270,7 @@ NodePointer NodePrinter::print(NodePointer Node, bool asPrefixContext) { return nullptr; case FunctionSigSpecializationParamKind::Dead: case FunctionSigSpecializationParamKind::OwnedToGuaranteed: + case FunctionSigSpecializationParamKind::GuaranteedToOwned: case FunctionSigSpecializationParamKind::SROA: printer_unreachable("option sets should have been handled earlier"); } diff --git a/lib/Demangling/OldDemangler.cpp b/lib/Demangling/OldDemangler.cpp index 75e25ad89b6..bc3212fd812 100644 --- a/lib/Demangling/OldDemangler.cpp +++ b/lib/Demangling/OldDemangler.cpp @@ -641,6 +641,11 @@ private: unsigned(FunctionSigSpecializationParamKind::OwnedToGuaranteed); } + if (Mangled.nextIf('o')) { + Value |= + unsigned(FunctionSigSpecializationParamKind::GuaranteedToOwned); + } + if (Mangled.nextIf('s')) { Value |= unsigned(FunctionSigSpecializationParamKind::SROA); } diff --git a/lib/Demangling/OldRemangler.cpp b/lib/Demangling/OldRemangler.cpp index 4b3cce6eb3c..b2d6717d154 100644 --- a/lib/Demangling/OldRemangler.cpp +++ b/lib/Demangling/OldRemangler.cpp @@ -641,6 +641,9 @@ void Remangler::mangleFunctionSignatureSpecializationParam(Node *node) { if (kindValue & unsigned(FunctionSigSpecializationParamKind::OwnedToGuaranteed)) Out << 'g'; + if (kindValue & + unsigned(FunctionSigSpecializationParamKind::GuaranteedToOwned)) + Out << 'o'; if (kindValue & unsigned(FunctionSigSpecializationParamKind::SROA)) Out << 's'; Out << '_'; diff --git a/lib/Demangling/Remangler.cpp b/lib/Demangling/Remangler.cpp index 7b825e1f4b7..d680ff5e997 100644 --- a/lib/Demangling/Remangler.cpp +++ b/lib/Demangling/Remangler.cpp @@ -1018,9 +1018,16 @@ void Remangler::mangleFunctionSignatureSpecializationParam(Node *node) { if (kindValue & unsigned(FunctionSigSpecializationParamKind::OwnedToGuaranteed)) Buffer << 'G'; + if (kindValue & + unsigned(FunctionSigSpecializationParamKind::GuaranteedToOwned)) + Buffer << 'O'; } else if (kindValue & unsigned(FunctionSigSpecializationParamKind::OwnedToGuaranteed)) { Buffer << 'g'; + } else if (kindValue & + unsigned( + FunctionSigSpecializationParamKind::GuaranteedToOwned)) { + Buffer << 'o'; } if (kindValue & unsigned(FunctionSigSpecializationParamKind::SROA)) Buffer << 'X'; diff --git a/lib/SILOptimizer/Utils/SpecializationMangler.cpp b/lib/SILOptimizer/Utils/SpecializationMangler.cpp index 591a1eae107..33fe0bbe419 100644 --- a/lib/SILOptimizer/Utils/SpecializationMangler.cpp +++ b/lib/SILOptimizer/Utils/SpecializationMangler.cpp @@ -157,6 +157,12 @@ void FunctionSignatureSpecializationMangler::setArgumentSROA( OrigArgs[OrigArgIdx].first |= ArgumentModifierIntBase(ArgumentModifier::SROA); } +void FunctionSignatureSpecializationMangler::setArgumentGuaranteedToOwned( + unsigned OrigArgIdx) { + OrigArgs[OrigArgIdx].first |= + ArgumentModifierIntBase(ArgumentModifier::GuaranteedToOwned); +} + void FunctionSignatureSpecializationMangler::setArgumentBoxToValue( unsigned OrigArgIdx) { OrigArgs[OrigArgIdx].first = @@ -291,6 +297,12 @@ void FunctionSignatureSpecializationMangler::mangleArgument( ArgOpBuffer << (hasSomeMod ? 'G' : 'g'); hasSomeMod = true; } + + if (ArgMod & ArgumentModifierIntBase(ArgumentModifier::GuaranteedToOwned)) { + ArgOpBuffer << (hasSomeMod ? 'O' : 'o'); + hasSomeMod = true; + } + if (ArgMod & ArgumentModifierIntBase(ArgumentModifier::SROA)) { ArgOpBuffer << (hasSomeMod ? 'X' : 'x'); hasSomeMod = true; diff --git a/test/Demangle/Inputs/manglings.txt b/test/Demangle/Inputs/manglings.txt index d4d409516e3..ea87d019b33 100644 --- a/test/Demangle/Inputs/manglings.txt +++ b/test/Demangle/Inputs/manglings.txt @@ -310,3 +310,7 @@ $SSC9SomeErrorLeVD ---> __C_Synthesized.related decl 'e' for SomeError $S20mangling_retroactive5test0yyAA1ZVy12RetroactiveB1XVSiAE1YVAG0D1A1PAAg_AiJ1QAAg1_GF -> mangling_retroactive.test0(mangling_retroactive.Z) -> () _T0LiteralAByxGxd_tcfC ---> _T0LiteralAByxGxd_tcfC _T0XZ ---> _T0XZ +_TTSf0os___TFVs17_LegacyStringCore15_invariantCheckfT_T_ ---> function signature specialization of Swift._LegacyStringCore._invariantCheck() -> () +_TTSf2o___TTSf2s_d___TFVs17_LegacyStringCoreCfVs13_StringBufferS_ ---> function signature specialization of function signature specialization of Swift._LegacyStringCore.init(Swift._StringBuffer) -> Swift._LegacyStringCore +_TTSf2do___TTSf2s_d___TFVs17_LegacyStringCoreCfVs13_StringBufferS_ ---> function signature specialization of function signature specialization of Swift._LegacyStringCore.init(Swift._StringBuffer) -> Swift._LegacyStringCore +_TTSf2dos___TTSf2s_d___TFVs17_LegacyStringCoreCfVs13_StringBufferS_ ---> function signature specialization of function signature specialization of Swift._LegacyStringCore.init(Swift._StringBuffer) -> Swift._LegacyStringCore diff --git a/test/Demangle/Inputs/simplified-manglings.txt b/test/Demangle/Inputs/simplified-manglings.txt index 74803720bec..fa125fae635 100644 --- a/test/Demangle/Inputs/simplified-manglings.txt +++ b/test/Demangle/Inputs/simplified-manglings.txt @@ -207,3 +207,7 @@ _T03abc6testitySiFTm ---> testit(_:) _T04main4TestCACSi1x_tc6_PRIV_Llfc ---> Test.init(x:) _$S3abc6testityySiFTm ---> testit(_:) _$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(_:)