diff --git a/docs/ABI/Mangling.rst b/docs/ABI/Mangling.rst index 95accf67aa5..9754ceb5883 100644 --- a/docs/ABI/Mangling.rst +++ b/docs/ABI/Mangling.rst @@ -789,6 +789,7 @@ Some kinds need arguments, which precede ``Tf``. ARG-SPEC-KIND ::= 'c' // Consumes n 'type' arguments which are closed over types in argument order // and one 'identifier' argument which is the closure symbol name ARG-SPEC-KIND ::= 'p' CONST-PROP // Constant propagated argument + ARG-SPEC-KIND ::= 'e' 'D'? 'G'? 'X'? // Generic argument, with optional dead, owned=>guaranteed or exploded-specifier ARG-SPEC-KIND ::= 'd' 'G'? 'X'? // Dead argument, with optional owned=>guaranteed or exploded-specifier ARG-SPEC-KIND ::= 'g' 'X'? // Owned => Guaranteed,, with optional exploded-specifier ARG-SPEC-KIND ::= 'x' // Exploded diff --git a/include/swift/Demangling/Demangle.h b/include/swift/Demangling/Demangle.h index 11868c69b5f..41a3f953bea 100644 --- a/include/swift/Demangling/Demangle.h +++ b/include/swift/Demangling/Demangle.h @@ -95,6 +95,7 @@ enum class FunctionSigSpecializationParamKind : unsigned { OwnedToGuaranteed = 1 << 7, SROA = 1 << 8, GuaranteedToOwned = 1 << 9, + ExistentialToGeneric = 1 << 10, }; /// 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 1d21522ed99..f78fd3af560 100644 --- a/include/swift/SILOptimizer/Utils/SpecializationMangler.h +++ b/include/swift/SILOptimizer/Utils/SpecializationMangler.h @@ -128,6 +128,7 @@ class FunctionSignatureSpecializationMangler : public SpecializationMangler { OwnedToGuaranteed=64, SROA=128, GuaranteedToOwned=256, + ExistentialToGeneric=512, First_OptionSetEntry=32, LastOptionSetEntry=32768, }; @@ -151,6 +152,7 @@ public: void setArgumentDead(unsigned OrigArgIdx); void setArgumentOwnedToGuaranteed(unsigned OrigArgIdx); void setArgumentGuaranteedToOwned(unsigned OrigArgIdx); + void setArgumentExistentialToGeneric(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 df85e5fbe4a..2e69e307e91 100644 --- a/lib/Demangling/Demangler.cpp +++ b/lib/Demangling/Demangler.cpp @@ -1982,6 +1982,24 @@ NodePointer Demangler::demangleFuncSpecParam(Node::IndexType ParamIdx) { return nullptr; } } + case 'e': { + unsigned Value = + unsigned(FunctionSigSpecializationParamKind::ExistentialToGeneric); + if (nextIf('D')) + 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(Node::Kind::FunctionSignatureSpecializationParamKind, + Value)); + } case 'd': { unsigned Value = unsigned(FunctionSigSpecializationParamKind::Dead); if (nextIf('G')) diff --git a/lib/Demangling/NodePrinter.cpp b/lib/Demangling/NodePrinter.cpp index 39e3eaf282b..98e81beebff 100644 --- a/lib/Demangling/NodePrinter.cpp +++ b/lib/Demangling/NodePrinter.cpp @@ -816,7 +816,9 @@ unsigned NodePrinter::printFunctionSigSpecializationParam(NodePointer Node, ((V & unsigned(FunctionSigSpecializationParamKind::OwnedToGuaranteed)) || (V & unsigned(FunctionSigSpecializationParamKind::GuaranteedToOwned)) || (V & unsigned(FunctionSigSpecializationParamKind::SROA)) || - (V & unsigned(FunctionSigSpecializationParamKind::Dead))) && + (V & unsigned(FunctionSigSpecializationParamKind::Dead))|| + (V & unsigned( + FunctionSigSpecializationParamKind::ExistentialToGeneric))) && "Invalid OptionSet"); print(Node->getChild(Idx++)); return Idx; @@ -1215,11 +1217,18 @@ NodePointer NodePrinter::print(NodePointer Node, bool asPrefixContext) { uint64_t raw = Node->getIndex(); bool printedOptionSet = false; + if (raw & + uint64_t(FunctionSigSpecializationParamKind::ExistentialToGeneric)) { + printedOptionSet = true; + Printer << "Existential To Protocol Constrained Generic"; + } + if (raw & uint64_t(FunctionSigSpecializationParamKind::Dead)) { + if (printedOptionSet) + Printer << " and "; printedOptionSet = true; Printer << "Dead"; } - if (raw & uint64_t(FunctionSigSpecializationParamKind::OwnedToGuaranteed)) { if (printedOptionSet) Printer << " and "; @@ -1269,6 +1278,7 @@ NodePointer NodePrinter::print(NodePointer Node, bool asPrefixContext) { case FunctionSigSpecializationParamKind::ClosureProp: Printer << "Closure Propagated"; return nullptr; + case FunctionSigSpecializationParamKind::ExistentialToGeneric: case FunctionSigSpecializationParamKind::Dead: case FunctionSigSpecializationParamKind::OwnedToGuaranteed: case FunctionSigSpecializationParamKind::GuaranteedToOwned: diff --git a/lib/Demangling/Remangler.cpp b/lib/Demangling/Remangler.cpp index 2505ff5f52d..6639c7c6212 100644 --- a/lib/Demangling/Remangler.cpp +++ b/lib/Demangling/Remangler.cpp @@ -1019,7 +1019,20 @@ void Remangler::mangleFunctionSignatureSpecializationParam(Node *node) { Buffer << 'x'; return; default: - if (kindValue & unsigned(FunctionSigSpecializationParamKind::Dead)) { + if (kindValue & + unsigned( + FunctionSigSpecializationParamKind::ExistentialToGeneric)) { + Buffer << 'e'; + if (kindValue & unsigned(FunctionSigSpecializationParamKind::Dead)) + Buffer << 'D'; + if (kindValue & + unsigned(FunctionSigSpecializationParamKind::OwnedToGuaranteed)) + Buffer << 'G'; + if (kindValue & + unsigned(FunctionSigSpecializationParamKind::GuaranteedToOwned)) + Buffer << 'O'; + } else if (kindValue & + unsigned(FunctionSigSpecializationParamKind::Dead)) { Buffer << 'd'; if (kindValue & unsigned(FunctionSigSpecializationParamKind::OwnedToGuaranteed)) diff --git a/lib/SILOptimizer/Utils/SpecializationMangler.cpp b/lib/SILOptimizer/Utils/SpecializationMangler.cpp index cc25ef16fa8..38fd628db62 100644 --- a/lib/SILOptimizer/Utils/SpecializationMangler.cpp +++ b/lib/SILOptimizer/Utils/SpecializationMangler.cpp @@ -162,6 +162,12 @@ void FunctionSignatureSpecializationMangler::setArgumentGuaranteedToOwned( ArgumentModifierIntBase(ArgumentModifier::GuaranteedToOwned); } +void FunctionSignatureSpecializationMangler::setArgumentExistentialToGeneric( + unsigned OrigArgIdx) { + OrigArgs[OrigArgIdx].first |= + ArgumentModifierIntBase(ArgumentModifier::ExistentialToGeneric); +} + void FunctionSignatureSpecializationMangler::setArgumentBoxToValue( unsigned OrigArgIdx) { OrigArgs[OrigArgIdx].first = @@ -287,6 +293,11 @@ void FunctionSignatureSpecializationMangler::mangleArgument( } bool hasSomeMod = false; + if (ArgMod & ArgumentModifierIntBase(ArgumentModifier::ExistentialToGeneric)) { + ArgOpBuffer << 'e'; + hasSomeMod = true; + } + if (ArgMod & ArgumentModifierIntBase(ArgumentModifier::Dead)) { ArgOpBuffer << 'd'; hasSomeMod = true;