Skip to content

Commit d15c592

Browse files
committed
Demangler: Add support for SILPackType
1 parent d7a1f6d commit d15c592

File tree

6 files changed

+68
-1
lines changed

6 files changed

+68
-1
lines changed

include/swift/Demangling/DemangleNodes.def

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,8 @@ NODE(Tuple)
236236
NODE(TupleElement)
237237
NODE(TupleElementName)
238238
NODE(Pack)
239+
NODE(SILPackDirect)
240+
NODE(SILPackIndirect)
239241
NODE(PackExpansion)
240242
NODE(Type)
241243
CONTEXT_NODE(TypeSymbolicReference)

include/swift/Demangling/Demangler.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,7 @@ class Demangler : public NodeFactory {
530530
NodePointer popTuple();
531531
NodePointer popTypeList();
532532
NodePointer popPack();
533+
NodePointer popSILPack();
533534
NodePointer popProtocol();
534535
NodePointer demangleBoundGenericType();
535536
NodePointer demangleBoundGenericArgs(NodePointer nominalType,

lib/Demangling/Demangler.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1564,6 +1564,38 @@ NodePointer Demangler::popPack() {
15641564
return createType(Root);
15651565
}
15661566

1567+
NodePointer Demangler::popSILPack() {
1568+
NodePointer Root;
1569+
1570+
switch (nextChar()) {
1571+
case 'd':
1572+
Root = createNode(Node::Kind::SILPackDirect);
1573+
break;
1574+
1575+
case 'i':
1576+
Root = createNode(Node::Kind::SILPackIndirect);
1577+
break;
1578+
1579+
default:
1580+
return nullptr;
1581+
}
1582+
1583+
if (!popNode(Node::Kind::EmptyList)) {
1584+
bool firstElem = false;
1585+
do {
1586+
firstElem = (popNode(Node::Kind::FirstElementMarker) != nullptr);
1587+
NodePointer Ty = popNode(Node::Kind::Type);
1588+
if (!Ty)
1589+
return nullptr;
1590+
Root->addChild(Ty, *this);
1591+
} while (!firstElem);
1592+
1593+
Root->reverseChildren();
1594+
}
1595+
1596+
return createType(Root);
1597+
}
1598+
15671599
NodePointer Demangler::popTypeList() {
15681600
NodePointer Root = createNode(Node::Kind::TypeList);
15691601

@@ -2364,6 +2396,8 @@ NodePointer Demangler::demangleArchetype() {
23642396
}
23652397
case 'P':
23662398
return popPack();
2399+
case 'S':
2400+
return popSILPack();
23672401
default:
23682402
return nullptr;
23692403
}

lib/Demangling/NodePrinter.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,8 @@ class NodePrinter {
308308
case Node::Kind::Module:
309309
case Node::Kind::Tuple:
310310
case Node::Kind::Pack:
311+
case Node::Kind::SILPackDirect:
312+
case Node::Kind::SILPackIndirect:
311313
case Node::Kind::ConstrainedExistential:
312314
case Node::Kind::ConstrainedExistentialRequirementList:
313315
case Node::Kind::ConstrainedExistentialSelf:
@@ -1511,9 +1513,17 @@ NodePointer NodePrinter::print(NodePointer Node, unsigned depth,
15111513
Printer << "}";
15121514
return nullptr;
15131515
}
1516+
case Node::Kind::SILPackDirect:
1517+
case Node::Kind::SILPackIndirect: {
1518+
Printer << (kind == Node::Kind::SILPackDirect ? "@direct" : "@indirect");
1519+
Printer << " Pack{";
1520+
printChildren(Node, depth, ", ");
1521+
Printer << "}";
1522+
return nullptr;
1523+
}
15141524
case Node::Kind::PackExpansion: {
1525+
Printer << "repeat ";
15151526
print(Node->getChild(0), depth + 1);
1516-
Printer << "...";
15171527
return nullptr;
15181528
}
15191529
case Node::Kind::ReturnType:

lib/Demangling/OldRemangler.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1911,6 +1911,14 @@ ManglingError Remangler::manglePack(Node *node, unsigned depth) {
19111911
return MANGLING_ERROR(ManglingError::UnsupportedNodeKind, node);
19121912
}
19131913

1914+
ManglingError Remangler::mangleSILPackDirect(Node *node, unsigned depth) {
1915+
return MANGLING_ERROR(ManglingError::UnsupportedNodeKind, node);
1916+
}
1917+
1918+
ManglingError Remangler::mangleSILPackIndirect(Node *node, unsigned depth) {
1919+
return MANGLING_ERROR(ManglingError::UnsupportedNodeKind, node);
1920+
}
1921+
19141922
ManglingError Remangler::manglePackExpansion(Node *node, unsigned depth) {
19151923
return MANGLING_ERROR(ManglingError::UnsupportedNodeKind, node);
19161924
}

lib/Demangling/Remangler.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2278,6 +2278,18 @@ ManglingError Remangler::manglePack(Node *node, unsigned depth) {
22782278
return ManglingError::Success;
22792279
}
22802280

2281+
ManglingError Remangler::mangleSILPackDirect(Node *node, unsigned depth) {
2282+
RETURN_IF_ERROR(mangleTypeList(node, depth + 1));
2283+
Buffer << "QSd";
2284+
return ManglingError::Success;
2285+
}
2286+
2287+
ManglingError Remangler::mangleSILPackIndirect(Node *node, unsigned depth) {
2288+
RETURN_IF_ERROR(mangleTypeList(node, depth + 1));
2289+
Buffer << "QSi";
2290+
return ManglingError::Success;
2291+
}
2292+
22812293
ManglingError Remangler::manglePackExpansion(Node *node, unsigned depth) {
22822294
RETURN_IF_ERROR(mangleChildNodes(node, depth + 1));
22832295
Buffer << "Qp";

0 commit comments

Comments
 (0)