Skip to content

Commit d608cb5

Browse files
Merge pull request #36429 from aschwaighofer/mangling_for_async_resume_functions
Mangling for suspend/await resume partial functions
2 parents 8c2a040 + 00f495f commit d608cb5

File tree

7 files changed

+50
-0
lines changed

7 files changed

+50
-0
lines changed

docs/ABI/Mangling.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,8 @@ Globals
148148
global ::= mangled-name 'TA' // partial application forwarder
149149
global ::= mangled-name 'Ta' // ObjC partial application forwarder
150150
global ::= mangled-name 'Tw' index // async partial apply thunk for a non-constant function
151+
global ::= mangled-name 'TQ' index // Async await continuation partial function
152+
global ::= mangled-name 'TY' index // Async suspend continuation partial function
151153

152154
global ::= type 'w' VALUE-WITNESS-KIND // value witness
153155

include/swift/Demangling/DemangleNodes.def

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,8 @@ NODE(AutoDiffDerivativeVTableThunk)
317317
NODE(DifferentiabilityWitness)
318318
NODE(IndexSubset)
319319
NODE(AsyncNonconstantPartialApplyThunk)
320+
NODE(AsyncAwaitResumePartialFunction)
321+
NODE(AsyncSuspendResumePartialFunction)
320322

321323
#undef CONTEXT_NODE
322324
#undef NODE

lib/Demangling/Demangler.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,8 @@ bool swift::Demangle::isFunctionAttr(Node::Kind kind) {
124124
case Node::Kind::DynamicallyReplaceableFunctionVar:
125125
case Node::Kind::AsyncFunctionPointer:
126126
case Node::Kind::AsyncNonconstantPartialApplyThunk:
127+
case Node::Kind::AsyncAwaitResumePartialFunction:
128+
case Node::Kind::AsyncSuspendResumePartialFunction:
127129
return true;
128130
default:
129131
return false;
@@ -2297,6 +2299,14 @@ NodePointer Demangler::demangleThunkOrSpecialization() {
22972299
case 'X': return createNode(Node::Kind::DynamicallyReplaceableFunctionVar);
22982300
case 'x': return createNode(Node::Kind::DynamicallyReplaceableFunctionKey);
22992301
case 'I': return createNode(Node::Kind::DynamicallyReplaceableFunctionImpl);
2302+
case 'Y':
2303+
case 'Q': {
2304+
NodePointer discriminator = demangleIndexAsNode();
2305+
return createWithChild(
2306+
c == 'Q' ? Node::Kind::AsyncAwaitResumePartialFunction :
2307+
/*'Y'*/ Node::Kind::AsyncSuspendResumePartialFunction,
2308+
discriminator);
2309+
}
23002310
case 'C': {
23012311
NodePointer type = popNode(Node::Kind::Type);
23022312
return createWithChild(Node::Kind::CoroutineContinuationPrototype, type);

lib/Demangling/NodePrinter.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -574,6 +574,8 @@ class NodePrinter {
574574
case Node::Kind::DifferentiabilityWitness:
575575
case Node::Kind::IndexSubset:
576576
case Node::Kind::AsyncNonconstantPartialApplyThunk:
577+
case Node::Kind::AsyncAwaitResumePartialFunction:
578+
case Node::Kind::AsyncSuspendResumePartialFunction:
577579
return false;
578580
}
579581
printer_unreachable("bad node kind");
@@ -2781,7 +2783,20 @@ NodePointer NodePrinter::print(NodePointer Node, bool asPrefixContext) {
27812783
Printer << ")";
27822784
Printer << " thunk for non-constant partial apply in ";
27832785
return nullptr;
2786+
case Node::Kind::AsyncAwaitResumePartialFunction:
2787+
Printer << "(";
2788+
print(Node->getChild(0));
2789+
Printer << ")";
2790+
Printer << " await resume partial function for ";
2791+
return nullptr;
2792+
case Node::Kind::AsyncSuspendResumePartialFunction:
2793+
Printer << "(";
2794+
print(Node->getChild(0));
2795+
Printer << ")";
2796+
Printer << " suspend resume partial function for ";
2797+
return nullptr;
27842798
}
2799+
27852800
printer_unreachable("bad node kind!");
27862801
}
27872802

lib/Demangling/OldRemangler.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -610,6 +610,13 @@ void Remangler::mangleAsyncNonconstantPartialApplyThunk(Node *node) {
610610
unreachable("unsupported");
611611
}
612612

613+
void Remangler::mangleAsyncAwaitResumePartialFunction(Node *node) {
614+
unreachable("unsupported");
615+
}
616+
void Remangler::mangleAsyncSuspendResumePartialFunction(Node *node) {
617+
unreachable("unsupported");
618+
}
619+
613620
void Remangler::mangleDirectness(Node *node) {
614621
auto getChar = [](Directness d) -> char {
615622
switch (d) {

lib/Demangling/Remangler.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1397,6 +1397,8 @@ void Remangler::mangleGlobal(Node *node) {
13971397
case Node::Kind::DynamicallyReplaceableFunctionVar:
13981398
case Node::Kind::AsyncFunctionPointer:
13991399
case Node::Kind::AsyncNonconstantPartialApplyThunk:
1400+
case Node::Kind::AsyncAwaitResumePartialFunction:
1401+
case Node::Kind::AsyncSuspendResumePartialFunction:
14001402
mangleInReverseOrder = true;
14011403
break;
14021404
default:
@@ -1910,6 +1912,16 @@ void Remangler::mangleAsyncNonconstantPartialApplyThunk(Node *node) {
19101912
mangleChildNode(node, 0);
19111913
}
19121914

1915+
void Remangler::mangleAsyncAwaitResumePartialFunction(Node *node) {
1916+
Buffer << "TQ";
1917+
mangleChildNode(node, 0);
1918+
}
1919+
1920+
void Remangler::mangleAsyncSuspendResumePartialFunction(Node *node) {
1921+
Buffer << "TY";
1922+
mangleChildNode(node, 0);
1923+
}
1924+
19131925
void Remangler::manglePostfixOperator(Node *node) {
19141926
mangleIdentifierImpl(node, /*isOperator*/ true);
19151927
Buffer << "oP";

test/Demangle/Inputs/manglings.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,3 +390,5 @@ $s13test_mangling3fooyS2f_xq_t16_Differentiation14DifferentiableR_r0_lFAcDRzAcDR
390390
$s5async1hyyS2iJXEF ---> async.h(@concurrent (Swift.Int) -> Swift.Int) -> ()
391391
$s12create_pa_f2Tw_ ---> (0) thunk for non-constant partial apply in create_pa_f2
392392
$s12create_pa_f2Tw0_ ---> (1) thunk for non-constant partial apply in create_pa_f2
393+
$s5Actor02MyA0C17testAsyncFunctionyyYKFTY0_ ---> (1) suspend resume partial function for Actor.MyActor.testAsyncFunction() async throws -> ()
394+
$s5Actor02MyA0C17testAsyncFunctionyyYKFTQ1_ ---> (2) await resume partial function for Actor.MyActor.testAsyncFunction() async throws -> ()

0 commit comments

Comments
 (0)