Skip to content

Commit d5e57ee

Browse files
authored
Merge pull request #7337 from eeckstein/revert-reflection-mangling
2 parents e6863c4 + 254f36a commit d5e57ee

29 files changed

+206
-196
lines changed

include/swift/Basic/Demangle.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -323,14 +323,14 @@ void mangleIdentifier(const char *data, size_t length,
323323
/// \brief Remangle a demangled parse tree.
324324
///
325325
/// This should always round-trip perfectly with demangleSymbolAsNode.
326-
std::string mangleNodeOld(const NodePointer &root);
327-
328326
std::string mangleNode(const NodePointer &root);
329327

328+
std::string mangleNodeNew(const NodePointer &root);
329+
330330
inline std::string mangleNode(const NodePointer &root, bool NewMangling) {
331331
if (NewMangling)
332-
return mangleNode(root);
333-
return mangleNodeOld(root);
332+
return mangleNodeNew(root);
333+
return mangleNode(root);
334334
}
335335

336336
/// \brief Transform the node structure to a string.

include/swift/Reflection/TypeRef.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -397,11 +397,11 @@ class ProtocolTypeRef final : public TypeRef {
397397
}
398398

399399
bool isAnyObject() const {
400-
return MangledName == "s9AnyObject_p";
400+
return MangledName == "Ps9AnyObject_";
401401
}
402402

403403
bool isError() const {
404-
return MangledName == "s5Error_p";
404+
return MangledName == "Ps5Error_";
405405
}
406406

407407
const std::string &getMangledName() const {

lib/Basic/Demangle.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@
1616

1717
#include "swift/Basic/Demangle.h"
1818
#include "swift/Basic/Fallthrough.h"
19+
#ifndef NO_NEW_DEMANGLING
1920
#include "swift/Basic/Demangler.h"
2021
#include "swift/Basic/ManglingMacros.h"
22+
#endif
2123
#include "swift/Strings.h"
2224
#include "swift/Basic/LLVM.h"
2325
#include "swift/Basic/Punycode.h"
@@ -323,10 +325,12 @@ class Demangler {
323325
///
324326
/// \return true if the mangling succeeded
325327
NodePointer demangleTopLevel() {
328+
#ifndef NO_NEW_DEMANGLING
326329
if (Mangled.str().startswith(MANGLING_PREFIX_STR)) {
327330
NewMangling::Demangler D(Mangled.str());
328331
return D.demangleTopLevel();
329332
}
333+
#endif
330334
if (!Mangled.nextIf("_T"))
331335
return nullptr;
332336

@@ -2340,16 +2344,19 @@ swift::Demangle::isSwiftSymbol(const char *mangledName,
23402344
if (Name.startswith("_T"))
23412345
return true;
23422346

2347+
#ifndef NO_NEW_DEMANGLING
23432348
// The new mangling.
23442349
if (Name.startswith(MANGLING_PREFIX_STR))
23452350
return true;
2351+
#endif // !NO_NEW_DEMANGLING
23462352
return false;
23472353
}
23482354

23492355
bool
23502356
swift::Demangle::isThunkSymbol(const char *mangledName,
23512357
size_t mangledNameLength) {
23522358
StringRef Name(mangledName, mangledNameLength);
2359+
#ifndef NO_NEW_DEMANGLING
23532360
if (Name.startswith(MANGLING_PREFIX_STR)) {
23542361
// First do a quick check
23552362
if (Name.endswith("TA") || // partial application forwarder
@@ -2375,6 +2382,7 @@ swift::Demangle::isThunkSymbol(const char *mangledName,
23752382
}
23762383
return false;
23772384
}
2385+
#endif // !NO_NEW_DEMANGLING
23782386

23792387
if (Name.startswith("_T")) {
23802388
// Old mangling.
@@ -2400,8 +2408,8 @@ NodePointer
24002408
swift::Demangle::demangleTypeAsNode(const char *MangledName,
24012409
size_t MangledNameLength,
24022410
const DemangleOptions &Options) {
2403-
NewMangling::Demangler D(StringRef(MangledName, MangledNameLength));
2404-
return D.demangleType();
2411+
Demangler demangler(StringRef(MangledName, MangledNameLength));
2412+
return demangler.demangleTypeName();
24052413
}
24062414

24072415
namespace {

lib/Basic/Mangler.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ std::string NewMangling::selectMangling(const std::string &Old,
224224
assert(false);
225225
}
226226
if (StringRef(New).startswith(MANGLING_PREFIX_STR)) {
227-
std::string Remangled = mangleNode(NewNode);
227+
std::string Remangled = mangleNodeNew(NewNode);
228228
if (New != Remangled) {
229229
bool isEqual = false;
230230
if (treeContains(NewNode,

lib/Basic/Remangle.cpp

Lines changed: 116 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,67 @@ void Remangler::resetSubstitutions() {
319319
Substitutions.clear();
320320
}
321321

322+
static bool isInSwiftModule(Node *node) {
323+
auto context = node->begin()->get();
324+
return (context->getKind() == Node::Kind::Module &&
325+
context->getText() == STDLIB_NAME);
326+
};
327+
328+
bool Demangle::mangleStandardSubstitution(Node *node, DemanglerPrinter &Out) {
329+
// Look for known substitutions.
330+
switch (node->getKind()) {
331+
#define SUCCESS_IF_IS(VALUE, EXPECTED, SUBSTITUTION) \
332+
do { \
333+
if ((VALUE) == (EXPECTED)) { \
334+
Out << SUBSTITUTION; \
335+
return true; \
336+
} \
337+
} while (0)
338+
#define SUCCESS_IF_TEXT_IS(EXPECTED, SUBSTITUTION) \
339+
SUCCESS_IF_IS(node->getText(), EXPECTED, SUBSTITUTION)
340+
#define SUCCESS_IF_DECLNAME_IS(EXPECTED, SUBSTITUTION) \
341+
SUCCESS_IF_IS(node->getChild(1)->getText(), EXPECTED, SUBSTITUTION)
342+
343+
case Node::Kind::Module:
344+
SUCCESS_IF_TEXT_IS(STDLIB_NAME, "s");
345+
SUCCESS_IF_TEXT_IS(MANGLING_MODULE_OBJC, "So");
346+
SUCCESS_IF_TEXT_IS(MANGLING_MODULE_C, "SC");
347+
break;
348+
case Node::Kind::Structure:
349+
if (isInSwiftModule(node)) {
350+
SUCCESS_IF_DECLNAME_IS("Array", "Sa");
351+
SUCCESS_IF_DECLNAME_IS("Bool", "Sb");
352+
SUCCESS_IF_DECLNAME_IS("UnicodeScalar", "Sc");
353+
SUCCESS_IF_DECLNAME_IS("Double", "Sd");
354+
SUCCESS_IF_DECLNAME_IS("Float", "Sf");
355+
SUCCESS_IF_DECLNAME_IS("Int", "Si");
356+
SUCCESS_IF_DECLNAME_IS("UnsafeRawPointer", "SV");
357+
SUCCESS_IF_DECLNAME_IS("UnsafeMutableRawPointer", "Sv");
358+
SUCCESS_IF_DECLNAME_IS("UnsafePointer", "SP");
359+
SUCCESS_IF_DECLNAME_IS("UnsafeMutablePointer", "Sp");
360+
SUCCESS_IF_DECLNAME_IS("UnsafeBufferPointer", "SR");
361+
SUCCESS_IF_DECLNAME_IS("UnsafeMutableBufferPointer", "Sr");
362+
SUCCESS_IF_DECLNAME_IS("String", "SS");
363+
SUCCESS_IF_DECLNAME_IS("UInt", "Su");
364+
}
365+
break;
366+
case Node::Kind::Enum:
367+
if (isInSwiftModule(node)) {
368+
SUCCESS_IF_DECLNAME_IS("Optional", "Sq");
369+
SUCCESS_IF_DECLNAME_IS("ImplicitlyUnwrappedOptional", "SQ");
370+
}
371+
break;
372+
373+
default:
374+
break;
375+
376+
#undef SUCCESS_IF_DECLNAME_IS
377+
#undef SUCCESS_IF_TEXT_IS
378+
#undef SUCCESS_IF_IS
379+
}
380+
return false;
381+
}
382+
322383
bool Remangler::trySubstitution(Node *node, SubstitutionEntry &entry) {
323384
if (Demangle::mangleStandardSubstitution(node, Out))
324385
return true;
@@ -1457,6 +1518,60 @@ void Remangler::mangleProtocolWithoutPrefix(Node *node) {
14571518
mangleNominalType(node, '\0', ctx);
14581519
}
14591520

1521+
bool Demangle::isSpecialized(Node *node) {
1522+
switch (node->getKind()) {
1523+
case Node::Kind::BoundGenericStructure:
1524+
case Node::Kind::BoundGenericEnum:
1525+
case Node::Kind::BoundGenericClass:
1526+
return true;
1527+
1528+
case Node::Kind::Structure:
1529+
case Node::Kind::Enum:
1530+
case Node::Kind::Class: {
1531+
Node *parentOrModule = node->getChild(0).get();
1532+
if (isSpecialized(parentOrModule))
1533+
return true;
1534+
1535+
return false;
1536+
}
1537+
1538+
default:
1539+
return false;
1540+
}
1541+
}
1542+
1543+
NodePointer Demangle::getUnspecialized(Node *node) {
1544+
switch (node->getKind()) {
1545+
case Node::Kind::Structure:
1546+
case Node::Kind::Enum:
1547+
case Node::Kind::Class: {
1548+
NodePointer result = NodeFactory::create(node->getKind());
1549+
NodePointer parentOrModule = node->getChild(0);
1550+
if (isSpecialized(parentOrModule.get()))
1551+
result->addChild(getUnspecialized(parentOrModule.get()));
1552+
else
1553+
result->addChild(parentOrModule);
1554+
result->addChild(node->getChild(1));
1555+
return result;
1556+
}
1557+
1558+
case Node::Kind::BoundGenericStructure:
1559+
case Node::Kind::BoundGenericEnum:
1560+
case Node::Kind::BoundGenericClass: {
1561+
NodePointer unboundType = node->getChild(0);
1562+
assert(unboundType->getKind() == Node::Kind::Type);
1563+
NodePointer nominalType = unboundType->getChild(0);
1564+
if (isSpecialized(nominalType.get()))
1565+
return getUnspecialized(nominalType.get());
1566+
else
1567+
return nominalType;
1568+
}
1569+
1570+
default:
1571+
unreachable("bad nominal type kind");
1572+
}
1573+
}
1574+
14601575
void Remangler::mangleGenericArgs(Node *node, EntityContext &ctx) {
14611576
switch (node->getKind()) {
14621577
case Node::Kind::Structure:
@@ -1654,7 +1769,7 @@ void Remangler::mangleSILBoxImmutableField(Node *node) {
16541769
}
16551770

16561771
/// The top-level interface to the remangler.
1657-
std::string Demangle::mangleNodeOld(const NodePointer &node) {
1772+
std::string Demangle::mangleNode(const NodePointer &node) {
16581773
if (!node) return "";
16591774

16601775
DemanglerPrinter printer;

lib/Basic/Remangler.cpp

Lines changed: 1 addition & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -1687,126 +1687,11 @@ void Remangler::mangleSILBoxImmutableField(Node *node) {
16871687
} // anonymous namespace
16881688

16891689
/// The top-level interface to the remangler.
1690-
std::string Demangle::mangleNode(const NodePointer &node) {
1690+
std::string Demangle::mangleNodeNew(const NodePointer &node) {
16911691
if (!node) return "";
16921692

16931693
DemanglerPrinter printer;
16941694
Remangler(printer).mangle(node.get());
16951695

16961696
return std::move(printer).str();
16971697
}
1698-
1699-
static bool isInSwiftModule(Node *node) {
1700-
auto context = node->begin()->get();
1701-
return (context->getKind() == Node::Kind::Module &&
1702-
context->getText() == STDLIB_NAME);
1703-
};
1704-
1705-
bool Demangle::mangleStandardSubstitution(Node *node, DemanglerPrinter &Out) {
1706-
// Look for known substitutions.
1707-
switch (node->getKind()) {
1708-
#define SUCCESS_IF_IS(VALUE, EXPECTED, SUBSTITUTION) \
1709-
do { \
1710-
if ((VALUE) == (EXPECTED)) { \
1711-
Out << SUBSTITUTION; \
1712-
return true; \
1713-
} \
1714-
} while (0)
1715-
#define SUCCESS_IF_TEXT_IS(EXPECTED, SUBSTITUTION) \
1716-
SUCCESS_IF_IS(node->getText(), EXPECTED, SUBSTITUTION)
1717-
#define SUCCESS_IF_DECLNAME_IS(EXPECTED, SUBSTITUTION) \
1718-
SUCCESS_IF_IS(node->getChild(1)->getText(), EXPECTED, SUBSTITUTION)
1719-
1720-
case Node::Kind::Module:
1721-
SUCCESS_IF_TEXT_IS(STDLIB_NAME, "s");
1722-
SUCCESS_IF_TEXT_IS(MANGLING_MODULE_OBJC, "So");
1723-
SUCCESS_IF_TEXT_IS(MANGLING_MODULE_C, "SC");
1724-
break;
1725-
case Node::Kind::Structure:
1726-
if (isInSwiftModule(node)) {
1727-
SUCCESS_IF_DECLNAME_IS("Array", "Sa");
1728-
SUCCESS_IF_DECLNAME_IS("Bool", "Sb");
1729-
SUCCESS_IF_DECLNAME_IS("UnicodeScalar", "Sc");
1730-
SUCCESS_IF_DECLNAME_IS("Double", "Sd");
1731-
SUCCESS_IF_DECLNAME_IS("Float", "Sf");
1732-
SUCCESS_IF_DECLNAME_IS("Int", "Si");
1733-
SUCCESS_IF_DECLNAME_IS("UnsafeRawPointer", "SV");
1734-
SUCCESS_IF_DECLNAME_IS("UnsafeMutableRawPointer", "Sv");
1735-
SUCCESS_IF_DECLNAME_IS("UnsafePointer", "SP");
1736-
SUCCESS_IF_DECLNAME_IS("UnsafeMutablePointer", "Sp");
1737-
SUCCESS_IF_DECLNAME_IS("UnsafeBufferPointer", "SR");
1738-
SUCCESS_IF_DECLNAME_IS("UnsafeMutableBufferPointer", "Sr");
1739-
SUCCESS_IF_DECLNAME_IS("String", "SS");
1740-
SUCCESS_IF_DECLNAME_IS("UInt", "Su");
1741-
}
1742-
break;
1743-
case Node::Kind::Enum:
1744-
if (isInSwiftModule(node)) {
1745-
SUCCESS_IF_DECLNAME_IS("Optional", "Sq");
1746-
SUCCESS_IF_DECLNAME_IS("ImplicitlyUnwrappedOptional", "SQ");
1747-
}
1748-
break;
1749-
1750-
default:
1751-
break;
1752-
1753-
#undef SUCCESS_IF_DECLNAME_IS
1754-
#undef SUCCESS_IF_TEXT_IS
1755-
#undef SUCCESS_IF_IS
1756-
}
1757-
return false;
1758-
}
1759-
1760-
bool Demangle::isSpecialized(Node *node) {
1761-
switch (node->getKind()) {
1762-
case Node::Kind::BoundGenericStructure:
1763-
case Node::Kind::BoundGenericEnum:
1764-
case Node::Kind::BoundGenericClass:
1765-
return true;
1766-
1767-
case Node::Kind::Structure:
1768-
case Node::Kind::Enum:
1769-
case Node::Kind::Class: {
1770-
Node *parentOrModule = node->getChild(0).get();
1771-
if (isSpecialized(parentOrModule))
1772-
return true;
1773-
1774-
return false;
1775-
}
1776-
1777-
default:
1778-
return false;
1779-
}
1780-
}
1781-
1782-
NodePointer Demangle::getUnspecialized(Node *node) {
1783-
switch (node->getKind()) {
1784-
case Node::Kind::Structure:
1785-
case Node::Kind::Enum:
1786-
case Node::Kind::Class: {
1787-
NodePointer result = NodeFactory::create(node->getKind());
1788-
NodePointer parentOrModule = node->getChild(0);
1789-
if (isSpecialized(parentOrModule.get()))
1790-
result->addChild(getUnspecialized(parentOrModule.get()));
1791-
else
1792-
result->addChild(parentOrModule);
1793-
result->addChild(node->getChild(1));
1794-
return result;
1795-
}
1796-
1797-
case Node::Kind::BoundGenericStructure:
1798-
case Node::Kind::BoundGenericEnum:
1799-
case Node::Kind::BoundGenericClass: {
1800-
NodePointer unboundType = node->getChild(0);
1801-
assert(unboundType->getKind() == Node::Kind::Type);
1802-
NodePointer nominalType = unboundType->getChild(0);
1803-
if (isSpecialized(nominalType.get()))
1804-
return getUnspecialized(nominalType.get());
1805-
else
1806-
return nominalType;
1807-
}
1808-
1809-
default:
1810-
unreachable("bad nominal type kind");
1811-
}
1812-
}

lib/IRGen/GenMeta.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@
5151
#include "StructMetadataLayout.h"
5252
#include "StructLayout.h"
5353
#include "EnumMetadataLayout.h"
54-
#include "IRGenMangler.h"
5554

5655
#include "GenMeta.h"
5756

@@ -123,9 +122,10 @@ static Address createPointerSizedGEP(IRGenFunction &IGF,
123122
// It should be removed when fixed. rdar://problem/22674524
124123
static llvm::Constant *getMangledTypeName(IRGenModule &IGM, CanType type,
125124
bool willBeRelativelyAddressed = false) {
126-
IRGenMangler Mangler;
127-
std::string Name = Mangler.mangleTypeForMetadata(type);
128-
return IGM.getAddrOfGlobalString(Name, willBeRelativelyAddressed);
125+
auto name = LinkEntity::forTypeMangling(type);
126+
llvm::SmallString<32> mangling;
127+
name.mangle(mangling);
128+
return IGM.getAddrOfGlobalString(mangling, willBeRelativelyAddressed);
129129
}
130130

131131
llvm::Value *irgen::emitObjCMetadataRefForMetadata(IRGenFunction &IGF,

0 commit comments

Comments
 (0)