Skip to content

Commit 8858137

Browse files
authored
Merge pull request #7651 from eeckstein/fix-fs-demangling
Demangler: fix the function specialization de-mangling
2 parents bd6959b + 8542e13 commit 8858137

File tree

5 files changed

+77
-53
lines changed

5 files changed

+77
-53
lines changed

include/swift/Basic/Demangler.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -224,9 +224,6 @@ class Demangler {
224224
NodePointer demangleGenericSpecialization(Node::Kind SpecKind);
225225
NodePointer demangleFunctionSpecialization();
226226
NodePointer demangleFuncSpecParam(Node::IndexType ParamIdx);
227-
NodePointer addFuncSpecParamIdentifier(NodePointer Param,
228-
FunctionSigSpecializationParamKind Kind,
229-
StringRef FirstParam = StringRef());
230227
NodePointer addFuncSpecParamNumber(NodePointer Param,
231228
FunctionSigSpecializationParamKind Kind);
232229

lib/Basic/Demangler.cpp

Lines changed: 65 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1184,6 +1184,53 @@ NodePointer Demangler::demangleFunctionSpecialization() {
11841184
}
11851185
if (!nextIf('n'))
11861186
Spec = addChild(Spec, demangleFuncSpecParam(Node::IndexType(~0)));
1187+
1188+
if (!Spec)
1189+
return nullptr;
1190+
1191+
// Add the required parameters in reverse order.
1192+
for (size_t Idx = 0, Num = Spec->getNumChildren(); Idx < Num; ++Idx) {
1193+
NodePointer Param = Spec->getChild(Num - Idx - 1);
1194+
if (Param->getKind() != Node::Kind::FunctionSignatureSpecializationParam)
1195+
continue;
1196+
1197+
if (Param->getNumChildren() == 0)
1198+
continue;
1199+
NodePointer KindNd = Param->getFirstChild();
1200+
assert(KindNd->getKind() ==
1201+
Node::Kind::FunctionSignatureSpecializationParamKind);
1202+
auto ParamKind = (FunctionSigSpecializationParamKind)KindNd->getIndex();
1203+
switch (ParamKind) {
1204+
case FunctionSigSpecializationParamKind::ConstantPropFunction:
1205+
case FunctionSigSpecializationParamKind::ConstantPropGlobal:
1206+
case FunctionSigSpecializationParamKind::ConstantPropString:
1207+
case FunctionSigSpecializationParamKind::ClosureProp: {
1208+
std::vector<NodePointer> Types;
1209+
while (NodePointer Ty = popNode(Node::Kind::Type)) {
1210+
assert(ParamKind == FunctionSigSpecializationParamKind::ClosureProp);
1211+
Types.push_back(Ty);
1212+
}
1213+
NodePointer Name = popNode(Node::Kind::Identifier);
1214+
if (!Name)
1215+
return nullptr;
1216+
StringRef Text = Name->getText();
1217+
if (ParamKind ==
1218+
FunctionSigSpecializationParamKind::ConstantPropString &&
1219+
Text.size() > 0 && Text[0] == '_') {
1220+
// A '_' escapes a leading digit or '_' of a string constant.
1221+
Text = Text.drop_front(1);
1222+
}
1223+
addChild(Param, NodeFactory::create(
1224+
Node::Kind::FunctionSignatureSpecializationParamPayload, Text));
1225+
while (NodePointer Ty = pop_back_val(Types)) {
1226+
Param = addChild(Param, Ty);
1227+
}
1228+
break;
1229+
}
1230+
default:
1231+
break;
1232+
}
1233+
}
11871234
return Spec;
11881235
}
11891236

@@ -1193,57 +1240,47 @@ NodePointer Demangler::demangleFuncSpecParam(Node::IndexType ParamIdx) {
11931240
switch (nextChar()) {
11941241
case 'n':
11951242
return Param;
1196-
case 'c': {
1197-
std::vector<NodePointer> Types;
1198-
while (NodePointer Ty = popNode(Node::Kind::Type)) {
1199-
Types.push_back(Ty);
1200-
}
1201-
Param = addFuncSpecParamIdentifier(Param,
1202-
swift::Demangle::FunctionSigSpecializationParamKind::ClosureProp);
1203-
while (NodePointer Ty = pop_back_val(Types)) {
1204-
Param = addChild(Param, Ty);
1205-
}
1206-
return Param;
1207-
}
1243+
case 'c':
1244+
// Consumes an identifier and multiple type parameters.
1245+
// The parameters will be added later.
1246+
return addChild(Param, NodeFactory::create(
1247+
Node::Kind::FunctionSignatureSpecializationParamKind,
1248+
unsigned(FunctionSigSpecializationParamKind::ClosureProp)));
12081249
case 'p': {
12091250
switch (nextChar()) {
12101251
case 'f':
1211-
return addFuncSpecParamIdentifier(Param,
1212-
FunctionSigSpecializationParamKind::ConstantPropFunction);
1252+
// Consumes an identifier parameter, which will be added later.
1253+
return addChild(Param, NodeFactory::create(
1254+
Node::Kind::FunctionSignatureSpecializationParamKind,
1255+
unsigned(FunctionSigSpecializationParamKind::ConstantPropFunction)));
12131256
case 'g':
1214-
return addFuncSpecParamIdentifier(Param,
1215-
FunctionSigSpecializationParamKind::ConstantPropGlobal);
1257+
// Consumes an identifier parameter, which will be added later.
1258+
return addChild(Param, NodeFactory::create(
1259+
Node::Kind::FunctionSignatureSpecializationParamKind,
1260+
unsigned(FunctionSigSpecializationParamKind::ConstantPropGlobal)));
12161261
case 'i':
12171262
return addFuncSpecParamNumber(Param,
12181263
FunctionSigSpecializationParamKind::ConstantPropInteger);
12191264
case 'd':
12201265
return addFuncSpecParamNumber(Param,
12211266
FunctionSigSpecializationParamKind::ConstantPropFloat);
12221267
case 's': {
1268+
// Consumes an identifier parameter (the string constant),
1269+
// which will be added later.
12231270
StringRef Encoding;
12241271
switch (nextChar()) {
12251272
case 'b': Encoding = "u8"; break;
12261273
case 'w': Encoding = "u16"; break;
12271274
case 'c': Encoding = "objc"; break;
12281275
default: return nullptr;
12291276
}
1230-
NodePointer Str = popNode(Node::Kind::Identifier);
1231-
if (!Str)
1232-
return nullptr;
1233-
StringRef Text = Str->getText();
1234-
if (Text.size() > 0 && Text[0] == '_')
1235-
Text = Text.drop_front(1);
1236-
1237-
Param->addChild(NodeFactory::create(
1277+
addChild(Param, NodeFactory::create(
12381278
Node::Kind::FunctionSignatureSpecializationParamKind,
12391279
unsigned(swift::Demangle::FunctionSigSpecializationParamKind::
12401280
ConstantPropString)));
1241-
Param->addChild(NodeFactory::create(
1242-
Node::Kind::FunctionSignatureSpecializationParamPayload,
1243-
Encoding));
12441281
return addChild(Param, NodeFactory::create(
12451282
Node::Kind::FunctionSignatureSpecializationParamPayload,
1246-
Text));
1283+
Encoding));
12471284
}
12481285
default:
12491286
return nullptr;
@@ -1283,22 +1320,6 @@ NodePointer Demangler::demangleFuncSpecParam(Node::IndexType ParamIdx) {
12831320
}
12841321
}
12851322

1286-
NodePointer Demangler::addFuncSpecParamIdentifier(NodePointer Param,
1287-
FunctionSigSpecializationParamKind Kind,
1288-
StringRef FirstParam) {
1289-
NodePointer Name = popNode(Node::Kind::Identifier);
1290-
if (!Name)
1291-
return nullptr;
1292-
Param->addChild(NodeFactory::create(
1293-
Node::Kind::FunctionSignatureSpecializationParamKind, unsigned(Kind)));
1294-
if (!FirstParam.empty()) {
1295-
Param->addChild(NodeFactory::create(
1296-
Node::Kind::FunctionSignatureSpecializationParamPayload, FirstParam));
1297-
}
1298-
return addChild(Param, NodeFactory::create(
1299-
Node::Kind::FunctionSignatureSpecializationParamPayload, Name->getText()));
1300-
}
1301-
13021323
NodePointer Demangler::addFuncSpecParamNumber(NodePointer Param,
13031324
FunctionSigSpecializationParamKind Kind) {
13041325
Param->addChild(NodeFactory::create(

lib/Basic/Mangler.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -235,16 +235,12 @@ std::string NewMangling::selectMangling(const std::string &Old,
235235
NodePointer RemangledNode = demangleSymbolAsNode(Remangled);
236236
isEqual = areTreesEqual(NewNode, RemangledNode);
237237
}
238-
239-
// TODO: Check disabled until rdar://problem/30592808 is fixed.
240-
#if 0
241238
if (!isEqual) {
242239
llvm::errs() << "Remangling failed at #" << numCmp << ":\n"
243240
"original: " << New << "\n"
244241
"remangled: " << Remangled << "\n";
245242
assert(false);
246243
}
247-
#endif
248244
}
249245
}
250246
}

lib/Basic/Remangler.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -830,9 +830,17 @@ void Remangler::mangleFunctionSignatureSpecialization(Node *node) {
830830
case FunctionSigSpecializationParamKind::ConstantPropGlobal:
831831
mangleIdentifier(Param->getChild(1).get());
832832
break;
833-
case FunctionSigSpecializationParamKind::ConstantPropString:
834-
mangleIdentifier(Param->getChild(2).get());
833+
case FunctionSigSpecializationParamKind::ConstantPropString: {
834+
NodePointer TextNd = Param->getChild(2);
835+
StringRef Text = TextNd->getText();
836+
if (Text.size() > 0 && (isDigit(Text[0]) || Text[0] == '_')) {
837+
std::string Buffer = "_";
838+
Buffer.append(Text.data(), Text.size());
839+
TextNd = NodeFactory::create(Node::Kind::Identifier, Buffer);
840+
}
841+
mangleIdentifier(TextNd.get());
835842
break;
843+
}
836844
case FunctionSigSpecializationParamKind::ClosureProp:
837845
mangleIdentifier(Param->getChild(1).get());
838846
for (unsigned i = 2, e = Param->getNumChildren(); i != e; ++i) {

test/Demangle/Inputs/manglings.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,5 +239,7 @@ _TFVFE15nested_genericsSS3fooFT_T_L_6CheeseCfT8materialx_GS0_x_ ---> (extension
239239
_TTWOE5imojiCSo5Imoji14ImojiMatchRankS_9RankValueS_FS2_g9rankValueqq_Ss16RawRepresentable8RawValue ---> _TTWOE5imojiCSo5Imoji14ImojiMatchRankS_9RankValueS_FS2_g9rankValueqq_Ss16RawRepresentable8RawValue
240240
_TtFzas4VoidGC16FusionXBaseUtils6FutureQq_ZFVS_7Futures6futureurFFzT_GS0_x_GS0_x__ ---> _TtFzas4VoidGC16FusionXBaseUtils6FutureQq_ZFVS_7Futures6futureurFFzT_GS0_x_GS0_x__
241241
_T0s17MutableCollectionP1asAARzs012RandomAccessB0RzsAA11SubSequences013BidirectionalB0PRpzsAdHRQlE06rotatecD05Indexs01_A9IndexablePQzAM15shiftingToStart_tFAJs01_J4BasePQzAQcfU_ ---> (extension in a):Swift.MutableCollection<A where A: Swift.MutableCollection, A: Swift.RandomAccessCollection, A.SubSequence: Swift.MutableCollection, A.SubSequence: Swift.RandomAccessCollection>.(rotateRandomAccess (shiftingToStart : A.Index) -> A.Index).(closure #1)
242+
_T03foo4_123ABTf3psbpsb_n ---> function signature specialization <Arg[0] = [Constant Propagated String : u8'123'], Arg[1] = [Constant Propagated String : u8'123']> of foo
242243
_T04main5innerys5Int32Vz_yADctF25closure_with_box_argumentxz_Bi32__lXXTf1nc_n ---> function signature specialization <Arg[1] = [Closure Propagated : closure_with_box_argument, Argument Types : [<A> { var A } <Builtin.Int32>]> of main.inner (inout Swift.Int32, (Swift.Int32) -> ()) -> ()
244+
_T03foo6testityyyc_yyctF1a1bTf3pfpf_n ---> function signature specialization <Arg[0] = [Constant Propagated Function : a], Arg[1] = [Constant Propagated Function : b]> of foo.testit (() -> (), () -> ()) -> ()
243245

0 commit comments

Comments
 (0)