Skip to content

Commit 0e91d05

Browse files
authored
Merge pull request #9918 from eeckstein/no-suffix-demangling
2 parents 451600c + 6a478ca commit 0e91d05

File tree

17 files changed

+108
-70
lines changed

17 files changed

+108
-70
lines changed

docs/ABI.rst

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -826,7 +826,8 @@ types where the metadata itself has unknown layout.)
826826
global ::= protocol-conformance entity 'TW' // protocol witness thunk
827827
global ::= context identifier identifier 'TB' // property behavior initializer thunk (not used currently)
828828
global ::= context identifier identifier 'Tb' // property behavior setter thunk (not used currently)
829-
global ::= global 'T_' specialization // reset substitutions before demangling specialization
829+
global ::= global specialization // function specialization
830+
global ::= global 'Tm' // merged function
830831
global ::= entity // some identifiable thing
831832
global ::= type type generic-signature? 'T' REABSTRACT-THUNK-TYPE // reabstraction thunk helper function
832833

include/swift/Basic/Mangler.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,10 @@ class Mangler {
9494

9595
Mangler() : Buffer(Storage) { }
9696

97-
/// Adds the mangling prefix.
97+
/// Begins a new mangling but does not add the mangling prefix.
98+
void beginManglingWithoutPrefix();
99+
100+
/// Begins a new mangling but and adds the mangling prefix.
98101
void beginMangling();
99102

100103
/// Finish the mangling of the symbol and return the mangled name.

include/swift/Demangling/DemangleNodes.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ NODE(LazyProtocolWitnessTableAccessor)
101101
NODE(LazyProtocolWitnessTableCacheVariable)
102102
NODE(LocalDeclName)
103103
CONTEXT_NODE(MaterializeForSet)
104+
NODE(MergedFunction)
104105
NODE(Metatype)
105106
NODE(MetatypeRepresentation)
106107
NODE(Metaclass)

include/swift/Demangling/Demangler.h

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -286,16 +286,11 @@ class CharVector : public Vector<char> {
286286
/// It de-mangles a string and it also owns the returned node-tree. This means
287287
/// The nodes of the tree only live as long as the Demangler itself.
288288
class Demangler : public NodeFactory {
289-
private:
289+
protected:
290290
StringRef Text;
291291
size_t Pos = 0;
292292

293-
struct NodeWithPos {
294-
NodePointer Node;
295-
size_t Pos;
296-
};
297-
298-
Vector<NodeWithPos> NodeStack;
293+
Vector<NodePointer> NodeStack;
299294
Vector<NodePointer> Substitutions;
300295
Vector<unsigned> PendingSubstitutions;
301296

@@ -334,18 +329,18 @@ class Demangler : public NodeFactory {
334329
}
335330

336331
void pushNode(NodePointer Nd) {
337-
NodeStack.push_back({ Nd, Pos }, *this);
332+
NodeStack.push_back(Nd, *this);
338333
}
339334

340335
NodePointer popNode() {
341-
return NodeStack.pop_back_val().Node;
336+
return NodeStack.pop_back_val();
342337
}
343338

344339
NodePointer popNode(Node::Kind kind) {
345340
if (NodeStack.empty())
346341
return nullptr;
347342

348-
Node::Kind NdKind = NodeStack.back().Node->getKind();
343+
Node::Kind NdKind = NodeStack.back()->getKind();
349344
if (NdKind != kind)
350345
return nullptr;
351346

@@ -356,7 +351,7 @@ class Demangler : public NodeFactory {
356351
if (NodeStack.empty())
357352
return nullptr;
358353

359-
Node::Kind NdKind = NodeStack.back().Node->getKind();
354+
Node::Kind NdKind = NodeStack.back()->getKind();
360355
if (!pred(NdKind))
361356
return nullptr;
362357

@@ -381,7 +376,7 @@ class Demangler : public NodeFactory {
381376
return createWithChild(kind, popNode(Node::Kind::Type));
382377
}
383378

384-
void parseAndPushNodes();
379+
bool parseAndPushNodes();
385380

386381
NodePointer changeKind(NodePointer Node, Node::Kind NewKind);
387382

lib/AST/ASTMangler.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,13 +386,15 @@ std::string ASTMangler::mangleObjCRuntimeName(const NominalTypeDecl *Nominal) {
386386
}
387387

388388
std::string ASTMangler::mangleTypeAsContextUSR(const NominalTypeDecl *type) {
389+
beginManglingWithoutPrefix();
389390
llvm::SaveAndRestore<bool> allowUnnamedRAII(AllowNamelessEntities, true);
390391
appendContext(type);
391392
return finalize();
392393
}
393394

394395
std::string ASTMangler::mangleDeclAsUSR(const ValueDecl *Decl,
395396
StringRef USRPrefix) {
397+
beginManglingWithoutPrefix();
396398
llvm::SaveAndRestore<bool> allowUnnamedRAII(AllowNamelessEntities, true);
397399
Buffer << USRPrefix;
398400
bindGenericParameters(Decl->getDeclContext());
@@ -419,6 +421,7 @@ std::string ASTMangler::mangleAccessorEntityAsUSR(AccessorKind kind,
419421
AddressorKind addressorKind,
420422
const ValueDecl *decl,
421423
StringRef USRPrefix) {
424+
beginManglingWithoutPrefix();
422425
llvm::SaveAndRestore<bool> allowUnnamedRAII(AllowNamelessEntities, true);
423426
Buffer << USRPrefix;
424427
appendAccessorEntity(kind, addressorKind, decl, /*isStatic*/ false);

lib/Basic/Mangler.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,12 +110,16 @@ void Mangle::printManglingStats() {
110110
#endif
111111
}
112112

113-
void Mangler::beginMangling() {
113+
void Mangler::beginManglingWithoutPrefix() {
114114
Storage.clear();
115115
Substitutions.clear();
116116
StringSubstitutions.clear();
117117
Words.clear();
118118
SubstMerging.clear();
119+
}
120+
121+
void Mangler::beginMangling() {
122+
beginManglingWithoutPrefix();
119123
Buffer << MANGLING_PREFIX_STR;
120124
}
121125

lib/Demangling/Demangler.cpp

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ static bool isFunctionAttr(Node::Kind kind) {
100100
case Node::Kind::VTableAttribute:
101101
case Node::Kind::PartialApplyForwarder:
102102
case Node::Kind::PartialApplyObjCForwarder:
103+
case Node::Kind::MergedFunction:
103104
return true;
104105
default:
105106
return false;
@@ -233,14 +234,10 @@ NodePointer Demangler::demangleSymbol(StringRef MangledName) {
233234

234235
// If any other prefixes are accepted, please update Mangler::verify.
235236

236-
NodePointer topLevel = createNode(Node::Kind::Global);
237-
238-
parseAndPushNodes();
239-
240-
// Let a trailing '_' be part of the not demangled suffix.
241-
popNode(Node::Kind::FirstElementMarker);
237+
if (!parseAndPushNodes())
238+
return nullptr;
242239

243-
size_t EndPos = (NodeStack.empty() ? 0 : NodeStack.back().Pos);
240+
NodePointer topLevel = createNode(Node::Kind::Global);
244241

245242
NodePointer Parent = topLevel;
246243
while (NodePointer FuncAttr = popNode(isFunctionAttr)) {
@@ -249,8 +246,7 @@ NodePointer Demangler::demangleSymbol(StringRef MangledName) {
249246
FuncAttr->getKind() == Node::Kind::PartialApplyObjCForwarder)
250247
Parent = FuncAttr;
251248
}
252-
for (const NodeWithPos &NWP : NodeStack) {
253-
NodePointer Nd = NWP.Node;
249+
for (Node *Nd : NodeStack) {
254250
switch (Nd->getKind()) {
255251
case Node::Kind::Type:
256252
Parent->addChild(Nd->getFirstChild(), *this);
@@ -263,10 +259,6 @@ NodePointer Demangler::demangleSymbol(StringRef MangledName) {
263259
if (topLevel->getNumChildren() == 0)
264260
return nullptr;
265261

266-
if (EndPos < Text.size()) {
267-
topLevel->addChild(createNode(Node::Kind::Suffix, Text.substr(EndPos)), *this);
268-
}
269-
270262
return topLevel;
271263
}
272264

@@ -281,15 +273,16 @@ NodePointer Demangler::demangleType(StringRef MangledName) {
281273
return createNode(Node::Kind::Suffix, Text);
282274
}
283275

284-
void Demangler::parseAndPushNodes() {
276+
bool Demangler::parseAndPushNodes() {
285277
int Idx = 0;
286-
while (!Text.empty()) {
278+
while (Pos < Text.size()) {
287279
NodePointer Node = demangleOperator();
288280
if (!Node)
289-
break;
281+
return false;
290282
pushNode(Node);
291283
Idx++;
292284
}
285+
return true;
293286
}
294287

295288
NodePointer Demangler::addChild(NodePointer Parent, NodePointer Child) {
@@ -1219,6 +1212,7 @@ NodePointer Demangler::demangleThunkOrSpecialization() {
12191212
case 'd': return createNode(Node::Kind::DirectMethodReferenceAttribute);
12201213
case 'a': return createNode(Node::Kind::PartialApplyObjCForwarder);
12211214
case 'A': return createNode(Node::Kind::PartialApplyForwarder);
1215+
case 'm': return createNode(Node::Kind::MergedFunction);
12221216
case 'V': {
12231217
NodePointer Base = popNode(isEntity);
12241218
NodePointer Derived = popNode(isEntity);

lib/Demangling/NodeDumper.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ void swift::Demangle::Node::dump() {
6262

6363
void Demangler::dump() {
6464
for (unsigned Idx = 0; Idx < NodeStack.size(); ++Idx) {
65-
fprintf(stderr, "NodeStack[%u] at position %zd:\n", Idx, NodeStack[Idx].Pos);
66-
NodeStack[Idx].Node->dump();
65+
fprintf(stderr, "NodeStack[%u]:\n", Idx);
66+
NodeStack[Idx]->dump();
6767
fprintf(stderr, "\n");
6868
}
6969
fprintf(stderr, "Position = %zd:\n%.*s\n%*s\n", Pos,

lib/Demangling/NodePrinter.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,7 @@ class NodePrinter {
347347
case Node::Kind::LocalDeclName:
348348
case Node::Kind::PrivateDeclName:
349349
case Node::Kind::MaterializeForSet:
350+
case Node::Kind::MergedFunction:
350351
case Node::Kind::Metaclass:
351352
case Node::Kind::NativeOwningAddressor:
352353
case Node::Kind::NativeOwningMutableAddressor:
@@ -1238,6 +1239,11 @@ NodePointer NodePrinter::print(NodePointer Node, bool asPrefixContext) {
12381239
print(Node->getChild(Node->getNumChildren() - 1));
12391240
return nullptr;
12401241
}
1242+
case Node::Kind::MergedFunction:
1243+
if (!Options.ShortenThunk) {
1244+
Printer << "merged ";
1245+
}
1246+
return nullptr;
12411247
case Node::Kind::GenericTypeMetadataPattern:
12421248
Printer << "generic type metadata pattern for ";
12431249
print(Node->getChild(0));

lib/Demangling/OldRemangler.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -653,6 +653,10 @@ void Remangler::manglePartialApplyObjCForwarder(Node *node) {
653653
mangleSingleChildNode(node); // global
654654
}
655655

656+
void Remangler::mangleMergedFunction(Node *node) {
657+
Out << "Tm";
658+
}
659+
656660
void Remangler::mangleDirectness(Node *node) {
657661
auto getChar = [](Directness d) -> char {
658662
switch (d) {

lib/Demangling/Remangler.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1063,6 +1063,7 @@ void Remangler::mangleGlobal(Node *node) {
10631063
case Node::Kind::DynamicAttribute:
10641064
case Node::Kind::VTableAttribute:
10651065
case Node::Kind::DirectMethodReferenceAttribute:
1066+
case Node::Kind::MergedFunction:
10661067
mangleInReverseOrder = true;
10671068
break;
10681069
default:
@@ -1368,6 +1369,10 @@ void Remangler::manglePartialApplyObjCForwarder(Node *node) {
13681369
Buffer << "Ta";
13691370
}
13701371

1372+
void Remangler::mangleMergedFunction(Node *node) {
1373+
Buffer << "Tm";
1374+
}
1375+
13711376
void Remangler::manglePostfixOperator(Node *node) {
13721377
mangleIdentifierImpl(node, /*isOperator*/ true);
13731378
Buffer << "oP";

lib/LLVMPasses/LLVMMergeFunctions.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -861,7 +861,7 @@ void SwiftMergeFunctions::mergeWithParams(const FunctionInfos &FInfos,
861861
// a name which can be demangled in a meaningful way.
862862
Function *NewFunction = Function::Create(funcType,
863863
FirstF->getLinkage(),
864-
FirstF->getName() + "_merged");
864+
FirstF->getName() + "Tm");
865865
NewFunction->copyAttributesFrom(FirstF);
866866
// NOTE: this function is not externally available, do ensure that we reset
867867
// the DLL storage

lib/SILOptimizer/Utils/SpecializationMangler.cpp

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,37 @@ using namespace swift;
1919
using namespace Mangle;
2020

2121
void SpecializationMangler::beginMangling() {
22-
ASTMangler::beginMangling();
22+
ASTMangler::beginManglingWithoutPrefix();
2323
if (Serialized)
2424
ArgOpBuffer << 'q';
2525
ArgOpBuffer << char(uint8_t(Pass) + '0');
2626
}
2727

28+
namespace {
29+
30+
/// Utility class for demangling specialization attributes.
31+
class AttributeDemangler : public Demangle::Demangler {
32+
public:
33+
void demangleAndAddAsChildren(StringRef MangledSpecialization,
34+
NodePointer Parent) {
35+
init(MangledSpecialization);
36+
if (!parseAndPushNodes()) {
37+
llvm::errs() << "Can't demangle: " << MangledSpecialization << '\n';
38+
abort();
39+
}
40+
for (Node *Nd : NodeStack) {
41+
addChild(Parent, Nd);
42+
}
43+
}
44+
};
45+
46+
} // namespace
47+
2848
std::string SpecializationMangler::finalize() {
2949
StringRef MangledSpecialization(Storage.data(), Storage.size());
30-
Demangle::Demangler D;
31-
NodePointer TopLevel = D.demangleSymbol(MangledSpecialization);
50+
AttributeDemangler D;
51+
NodePointer TopLevel = D.createNode(Node::Kind::Global);
52+
D.demangleAndAddAsChildren(MangledSpecialization, TopLevel);
3253

3354
StringRef FuncName = Function->getName();
3455
NodePointer FuncTopLevel = nullptr;
@@ -41,8 +62,6 @@ std::string SpecializationMangler::finalize() {
4162
FuncTopLevel->addChild(D.createNode(Node::Kind::Identifier, FuncName), D);
4263
}
4364
for (NodePointer FuncChild : *FuncTopLevel) {
44-
assert(FuncChild->getKind() != Node::Kind::Suffix ||
45-
FuncChild->getText() == "merged");
4665
TopLevel->addChild(FuncChild, D);
4766
}
4867
std::string mangledName = Demangle::mangleNode(TopLevel);

test/Demangle/Inputs/manglings.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,4 +258,5 @@ _T0Rml ---> _T0Rml
258258
_T0Tk ---> _T0Tk
259259
_T0A8 ---> _T0A8
260260
_T0s30ReversedRandomAccessCollectionVyxGTfq3nnpf_nTfq1cn_nTfq4x_n ---> _T0s30ReversedRandomAccessCollectionVyxGTfq3nnpf_nTfq1cn_nTfq4x_n
261+
_T03abc6testitySiFTm ---> merged abc.testit(Swift.Int) -> ()
261262

test/Demangle/Inputs/simplified-manglings.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,3 +203,5 @@ _TFC4testP33_83378C430F65473055F1BD53F3ADCDB71C5doFoofT_T_ ---> C.doFoo()
203203
_TTRXFo_oCSo13SKPhysicsBodydVSC7CGPointdVSC8CGVectordGSpV10ObjectiveC8ObjCBool___XFdCb_dS_dS0_dS1_dGSpS3____ ---> thunk for @callee_owned (@owned SKPhysicsBody, @unowned CGPoint, @unowned CGVector, @unowned UnsafeMutablePointer<ObjCBool>) -> ()
204204
_T0So13SKPhysicsBodyCSC7CGPointVSC8CGVectorVSpy10ObjectiveC8ObjCBoolVGIxxyyy_AbdFSpyAIGIyByyyy_TR ---> thunk for @callee_owned (@owned SKPhysicsBody, @unowned CGPoint, @unowned CGVector, @unowned UnsafeMutablePointer<ObjCBool>) -> ()
205205
_T04main1_yyF ---> _()
206+
_T03abc6testitySiFTm ---> testit(_:)
207+

0 commit comments

Comments
 (0)