Skip to content

Commit 01df0ca

Browse files
Merge pull request #71092 from aschwaighofer/outline_enum_addr_insts
IRGen: Outline by-address SIL enum instructions
2 parents 4bf5a34 + 49e8ffb commit 01df0ca

File tree

12 files changed

+373
-25
lines changed

12 files changed

+373
-25
lines changed

Diff for: docs/ABI/Mangling.rst

+3
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,9 @@ with a differentiable function used for differentiable programming.
331331
global ::= generic-signature? type 'WOd' // Outlined assignWithTake
332332
global ::= generic-signature? type 'WOf' // Outlined assignWithCopy
333333
global ::= generic-signature? type 'WOh' // Outlined destroy
334+
global ::= generic-signature? type 'WOi` // Outlined store enum tag
335+
global ::= generic-signature? type 'WOj` // Outlined enum destructive project
336+
global ::= generic-signature? type 'WOg` // Outlined enum get tag
334337

335338
Entities
336339
~~~~~~~~

Diff for: include/swift/Demangling/DemangleNodes.def

+4
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,10 @@ NODE(HasSymbolQuery)
371371
NODE(OpaqueReturnTypeIndex)
372372
NODE(OpaqueReturnTypeParent)
373373

374+
// Addedn in Swift 5.11
375+
NODE(OutlinedEnumTagStore)
376+
NODE(OutlinedEnumProjectDataForLoad)
377+
NODE(OutlinedEnumGetTag)
374378
// Added in Swift 5.9 + 1
375379
NODE(AsyncRemoved)
376380

Diff for: lib/Demangling/Demangler.cpp

+27
Original file line numberDiff line numberDiff line change
@@ -3490,6 +3490,33 @@ NodePointer Demangler::demangleWitness() {
34903490
return createWithChild(Node::Kind::OutlinedDestroy,
34913491
popNode(Node::Kind::Type));
34923492
}
3493+
case 'g': {
3494+
if (auto sig = popNode(Node::Kind::DependentGenericSignature))
3495+
return createWithChildren(Node::Kind::OutlinedEnumGetTag,
3496+
popNode(Node::Kind::Type), sig);
3497+
return createWithChild(Node::Kind::OutlinedEnumGetTag,
3498+
popNode(Node::Kind::Type));
3499+
}
3500+
3501+
case 'i': {
3502+
auto enumCaseIdx = demangleIndexAsNode();
3503+
if (auto sig = popNode(Node::Kind::DependentGenericSignature))
3504+
return createWithChildren(Node::Kind::OutlinedEnumTagStore,
3505+
popNode(Node::Kind::Type), sig,
3506+
enumCaseIdx);
3507+
return createWithChildren(Node::Kind::OutlinedEnumTagStore,
3508+
popNode(Node::Kind::Type), enumCaseIdx);
3509+
}
3510+
case 'j': {
3511+
auto enumCaseIdx = demangleIndexAsNode();
3512+
if (auto sig = popNode(Node::Kind::DependentGenericSignature))
3513+
return createWithChildren(Node::Kind::OutlinedEnumProjectDataForLoad,
3514+
popNode(Node::Kind::Type), sig,
3515+
enumCaseIdx);
3516+
return createWithChildren(Node::Kind::OutlinedEnumProjectDataForLoad,
3517+
popNode(Node::Kind::Type), enumCaseIdx);
3518+
}
3519+
34933520
default:
34943521
return nullptr;
34953522
}

Diff for: lib/Demangling/NodePrinter.cpp

+15
Original file line numberDiff line numberDiff line change
@@ -573,6 +573,9 @@ class NodePrinter {
573573
case Node::Kind::OutlinedAssignWithTake:
574574
case Node::Kind::OutlinedAssignWithCopy:
575575
case Node::Kind::OutlinedDestroy:
576+
case Node::Kind::OutlinedEnumTagStore:
577+
case Node::Kind::OutlinedEnumGetTag:
578+
case Node::Kind::OutlinedEnumProjectDataForLoad:
576579
case Node::Kind::OutlinedVariable:
577580
case Node::Kind::OutlinedReadOnlyObject:
578581
case Node::Kind::AssocTypePath:
@@ -1393,6 +1396,18 @@ NodePointer NodePrinter::print(NodePointer Node, unsigned depth,
13931396
Printer << "outlined destroy of ";
13941397
print(Node->getChild(0), depth + 1);
13951398
return nullptr;
1399+
case Node::Kind::OutlinedEnumProjectDataForLoad:
1400+
Printer << "outlined enum project data for load of ";
1401+
print(Node->getChild(0), depth + 1);
1402+
return nullptr;
1403+
case Node::Kind::OutlinedEnumTagStore:
1404+
Printer << "outlined enum tag store of ";
1405+
print(Node->getChild(0), depth + 1);
1406+
return nullptr;
1407+
case Node::Kind::OutlinedEnumGetTag:
1408+
Printer << "outlined enum get tag of ";
1409+
print(Node->getChild(0), depth + 1);
1410+
return nullptr;
13961411
case Node::Kind::OutlinedVariable:
13971412
Printer << "outlined variable #" << Node->getIndex() << " of ";
13981413
return nullptr;

Diff for: lib/Demangling/OldRemangler.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -2549,6 +2549,18 @@ ManglingError Remangler::mangleOutlinedDestroy(Node *node, unsigned depth) {
25492549
Buffer << "Wh";
25502550
return mangleSingleChildNode(node, depth + 1);
25512551
}
2552+
ManglingError Remangler::mangleOutlinedEnumTagStore(Node *node, unsigned depth) {
2553+
Buffer << "Wi";
2554+
return mangleSingleChildNode(node, depth + 1);
2555+
}
2556+
ManglingError Remangler::mangleOutlinedEnumGetTag(Node *node, unsigned depth) {
2557+
Buffer << "Wg";
2558+
return mangleSingleChildNode(node, depth + 1);
2559+
}
2560+
ManglingError Remangler::mangleOutlinedEnumProjectDataForLoad(Node *node, unsigned depth) {
2561+
Buffer << "Wj";
2562+
return mangleSingleChildNode(node, depth + 1);
2563+
}
25522564

25532565
ManglingError Remangler::mangleOutlinedVariable(Node *node, unsigned depth) {
25542566
Buffer << "Tv" << node->getIndex();

Diff for: lib/Demangling/Remangler.cpp

+39-1
Original file line numberDiff line numberDiff line change
@@ -3315,7 +3315,45 @@ ManglingError Remangler::mangleOutlinedDestroy(Node *node, unsigned depth) {
33153315
Buffer << "WOh";
33163316
return ManglingError::Success;
33173317
}
3318-
3318+
ManglingError Remangler::mangleOutlinedEnumGetTag(Node *node, unsigned depth) {
3319+
RETURN_IF_ERROR(mangleChildNodes(node, depth + 1));
3320+
Buffer << "WOg";
3321+
return ManglingError::Success;
3322+
}
3323+
ManglingError Remangler::mangleOutlinedEnumProjectDataForLoad(Node *node, unsigned depth) {
3324+
if (node->getNumChildren() == 2) {
3325+
auto ty = node->getChild(0);
3326+
RETURN_IF_ERROR(mangle(ty, depth + 1));
3327+
Buffer << "WOj";
3328+
mangleIndex(node->getChild(1)->getIndex());
3329+
return ManglingError::Success;
3330+
} else {
3331+
auto ty = node->getChild(0);
3332+
RETURN_IF_ERROR(mangle(ty, depth + 1));
3333+
auto sig = node->getChild(1);
3334+
RETURN_IF_ERROR(mangle(sig, depth + 1));
3335+
Buffer << "WOj";
3336+
mangleIndex(node->getChild(2)->getIndex());
3337+
return ManglingError::Success;
3338+
}
3339+
}
3340+
ManglingError Remangler::mangleOutlinedEnumTagStore(Node *node, unsigned depth) {
3341+
if (node->getNumChildren() == 2) {
3342+
auto ty = node->getChild(0);
3343+
RETURN_IF_ERROR(mangle(ty, depth + 1));
3344+
Buffer << "WOi";
3345+
mangleIndex(node->getChild(1)->getIndex());
3346+
return ManglingError::Success;
3347+
} else {
3348+
auto ty = node->getChild(0);
3349+
RETURN_IF_ERROR(mangle(ty, depth + 1));
3350+
auto sig = node->getChild(1);
3351+
RETURN_IF_ERROR(mangle(sig, depth + 1));
3352+
Buffer << "WOi";
3353+
mangleIndex(node->getChild(2)->getIndex());
3354+
return ManglingError::Success;
3355+
}
3356+
}
33193357
ManglingError Remangler::mangleOutlinedVariable(Node *node, unsigned depth) {
33203358
Buffer << "Tv";
33213359
mangleIndex(node->getIndex());

0 commit comments

Comments
 (0)