Skip to content

Commit 13d2b1f

Browse files
committed
mangling: add a mangling for constant propagating keypaths in capture propagation.
This is not ABI affecting.
1 parent fb8ee0e commit 13d2b1f

File tree

6 files changed

+33
-1
lines changed

6 files changed

+33
-1
lines changed

docs/ABI/Mangling.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1139,6 +1139,7 @@ Some kinds need arguments, which precede ``Tf``.
11391139
CONST-PROP ::= 'i' NATURAL_ZERO // 64-bit-integer
11401140
CONST-PROP ::= 'd' NATURAL_ZERO // float-as-64-bit-integer
11411141
CONST-PROP ::= 's' ENCODING // string literal. Consumes one identifier argument.
1142+
CONST-PROP ::= 'k' // keypath. Consumes one identifier - the SHA1 of the keypath and two types (root and value).
11421143

11431144
ENCODING ::= 'b' // utf8
11441145
ENCODING ::= 'w' // utf16

include/swift/Demangling/Demangle.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ enum class FunctionSigSpecializationParamKind : unsigned {
109109
BoxToValue = 6,
110110
BoxToStack = 7,
111111
InOutToOut = 8,
112+
ConstantPropKeyPath = 9,
112113

113114
// Option Set Flags use bits 6-31. This gives us 26 bits to use for option
114115
// flags.

lib/Demangling/Demangler.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2816,10 +2816,12 @@ NodePointer Demangler::demangleFunctionSpecialization() {
28162816
case FunctionSigSpecializationParamKind::ConstantPropFunction:
28172817
case FunctionSigSpecializationParamKind::ConstantPropGlobal:
28182818
case FunctionSigSpecializationParamKind::ConstantPropString:
2819+
case FunctionSigSpecializationParamKind::ConstantPropKeyPath:
28192820
case FunctionSigSpecializationParamKind::ClosureProp: {
28202821
size_t FixedChildren = Param->getNumChildren();
28212822
while (NodePointer Ty = popNode(Node::Kind::Type)) {
2822-
if (ParamKind != FunctionSigSpecializationParamKind::ClosureProp)
2823+
if (ParamKind != FunctionSigSpecializationParamKind::ClosureProp &&
2824+
ParamKind != FunctionSigSpecializationParamKind::ConstantPropKeyPath)
28232825
return nullptr;
28242826
Param = addChild(Param, Ty);
28252827
}
@@ -2901,6 +2903,14 @@ NodePointer Demangler::demangleFuncSpecParam(Node::Kind Kind) {
29012903
Node::Kind::FunctionSignatureSpecializationParamPayload,
29022904
Encoding));
29032905
}
2906+
case 'k': {
2907+
// Consumes two types and a SHA1 identifier.
2908+
return addChild(
2909+
Param,
2910+
createNode(Node::Kind::FunctionSignatureSpecializationParamKind,
2911+
Node::IndexType(FunctionSigSpecializationParamKind::
2912+
ConstantPropKeyPath)));
2913+
}
29042914
default:
29052915
return nullptr;
29062916
}

lib/Demangling/NodePrinter.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1054,6 +1054,17 @@ void NodePrinter::printFunctionSigSpecializationParams(NodePointer Node,
10541054
Printer << "'";
10551055
Printer << "]";
10561056
break;
1057+
case FunctionSigSpecializationParamKind::ConstantPropKeyPath:
1058+
Printer << "[";
1059+
print(Node->getChild(Idx++), depth + 1);
1060+
Printer << " : ";
1061+
print(Node->getChild(Idx++), depth + 1);
1062+
Printer << "<";
1063+
print(Node->getChild(Idx++), depth + 1);
1064+
Printer << ",";
1065+
print(Node->getChild(Idx++), depth + 1);
1066+
Printer << ">]";
1067+
break;
10571068
case FunctionSigSpecializationParamKind::ClosureProp:
10581069
Printer << "[";
10591070
print(Node->getChild(Idx++), depth + 1);
@@ -1611,6 +1622,9 @@ NodePointer NodePrinter::print(NodePointer Node, unsigned depth,
16111622
case FunctionSigSpecializationParamKind::ConstantPropString:
16121623
Printer << "Constant Propagated String";
16131624
return nullptr;
1625+
case FunctionSigSpecializationParamKind::ConstantPropKeyPath:
1626+
Printer << "Constant Propagated KeyPath";
1627+
return nullptr;
16141628
case FunctionSigSpecializationParamKind::ClosureProp:
16151629
Printer << "Closure Propagated";
16161630
return nullptr;

lib/Demangling/Remangler.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1322,6 +1322,7 @@ ManglingError Remangler::mangleFunctionSignatureSpecialization(Node *node,
13221322
break;
13231323
}
13241324
case FunctionSigSpecializationParamKind::ClosureProp:
1325+
case FunctionSigSpecializationParamKind::ConstantPropKeyPath:
13251326
RETURN_IF_ERROR(mangleIdentifier(Param->getChild(1), depth + 1));
13261327
for (unsigned i = 2, e = Param->getNumChildren(); i != e; ++i) {
13271328
RETURN_IF_ERROR(mangleType(Param->getChild(i), depth + 1));
@@ -1399,6 +1400,9 @@ Remangler::mangleFunctionSignatureSpecializationParam(Node *node,
13991400
}
14001401
break;
14011402
}
1403+
case FunctionSigSpecializationParamKind::ConstantPropKeyPath:
1404+
Buffer << "pk";
1405+
break;
14021406
case FunctionSigSpecializationParamKind::ClosureProp:
14031407
Buffer << 'c';
14041408
break;

test/Demangle/Inputs/manglings.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,3 +424,5 @@ $s17distributed_thunk2DAC1fyyFTE ---> distributed thunk for distributed_thunk.DA
424424
$s16distributed_test1XC7computeyS2iFTF ---> distributed accessor for distributed_test.X.compute(Swift.Int) -> Swift.Int
425425
$s27distributed_actor_accessors7MyActorC7simple2ySSSiFTETFHF ---> accessible function runtime record for distributed accessor for distributed thunk for distributed_actor_accessors.MyActor.simple2(Swift.Int) -> Swift.String
426426
$s1A3bar1aySSYt_tF ---> A.bar(a: _const Swift.String) -> ()
427+
$s1t1fyyFSiAA3StrVcs7KeyPathCyADSiGcfu_SiADcfu0_33_556644b740b1b333fecb81e55a7cce98ADSiTf3npk_n ---> function signature specialization <Arg[1] = [Constant Propagated KeyPath : _556644b740b1b333fecb81e55a7cce98<t.Str,Swift.Int>]> of implicit closure #2 (t.Str) -> Swift.Int in implicit closure #1 (Swift.KeyPath<t.Str, Swift.Int>) -> (t.Str) -> Swift.Int in t.f() -> ()
428+

0 commit comments

Comments
 (0)