Skip to content

Commit 21ba292

Browse files
committed
Use the new mangling for reflection.
For this we are linking the new re-mangler instead of the old one into the swift runtime library. Also we are linking the new de-mangling into the swift runtime library. It also switches to the new mangling for class names of generic swift classes in the metadata. Note that for non-generic class we still have to use the old mangling, because the ObjC runtime in the OS depends on it (it de-mangles the class names). But names of generic classes are not handled by the ObjC runtime anyway, so there should be no problem to change the mangling for those. The reason for this change is that it avoids linking the old re-mangler into the runtime library.
1 parent fd62be5 commit 21ba292

28 files changed

+195
-205
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 mangleNode(const NodePointer &root);
326+
std::string mangleNodeOld(const NodePointer &root);
327327

328-
std::string mangleNodeNew(const NodePointer &root);
328+
std::string mangleNode(const NodePointer &root);
329329

330330
inline std::string mangleNode(const NodePointer &root, bool NewMangling) {
331331
if (NewMangling)
332-
return mangleNodeNew(root);
333-
return mangleNode(root);
332+
return mangleNode(root);
333+
return mangleNodeOld(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 == "Ps9AnyObject_";
400+
return MangledName == "s9AnyObject_p";
401401
}
402402

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

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

lib/Basic/Demangle.cpp

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

1717
#include "swift/Basic/Demangle.h"
1818
#include "swift/Basic/Fallthrough.h"
19-
#ifndef NO_NEW_DEMANGLING
2019
#include "swift/Basic/Demangler.h"
2120
#include "swift/Basic/ManglingMacros.h"
22-
#endif
2321
#include "swift/Strings.h"
2422
#include "swift/Basic/LLVM.h"
2523
#include "swift/Basic/Punycode.h"
@@ -325,12 +323,10 @@ class Demangler {
325323
///
326324
/// \return true if the mangling succeeded
327325
NodePointer demangleTopLevel() {
328-
#ifndef NO_NEW_DEMANGLING
329326
if (Mangled.str().startswith(MANGLING_PREFIX_STR)) {
330327
NewMangling::Demangler D(Mangled.str());
331328
return D.demangleTopLevel();
332329
}
333-
#endif
334330
if (!Mangled.nextIf("_T"))
335331
return nullptr;
336332

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

2347-
#ifndef NO_NEW_DEMANGLING
23482343
// The new mangling.
23492344
if (Name.startswith(MANGLING_PREFIX_STR))
23502345
return true;
2351-
#endif // !NO_NEW_DEMANGLING
23522346
return false;
23532347
}
23542348

23552349
bool
23562350
swift::Demangle::isThunkSymbol(const char *mangledName,
23572351
size_t mangledNameLength) {
23582352
StringRef Name(mangledName, mangledNameLength);
2359-
#ifndef NO_NEW_DEMANGLING
23602353
if (Name.startswith(MANGLING_PREFIX_STR)) {
23612354
// First do a quick check
23622355
if (Name.endswith("TA") || // partial application forwarder
@@ -2382,7 +2375,6 @@ swift::Demangle::isThunkSymbol(const char *mangledName,
23822375
}
23832376
return false;
23842377
}
2385-
#endif // !NO_NEW_DEMANGLING
23862378

23872379
if (Name.startswith("_T")) {
23882380
// Old mangling.
@@ -2408,8 +2400,8 @@ NodePointer
24082400
swift::Demangle::demangleTypeAsNode(const char *MangledName,
24092401
size_t MangledNameLength,
24102402
const DemangleOptions &Options) {
2411-
Demangler demangler(StringRef(MangledName, MangledNameLength));
2412-
return demangler.demangleTypeName();
2403+
NewMangling::Demangler D(StringRef(MangledName, MangledNameLength));
2404+
return D.demangleType();
24132405
}
24142406

24152407
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 = mangleNodeNew(NewNode);
227+
std::string Remangled = mangleNode(NewNode);
228228
if (New != Remangled) {
229229
bool isEqual = false;
230230
if (treeContains(NewNode,

lib/Basic/Remangle.cpp

Lines changed: 1 addition & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -319,67 +319,6 @@ 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-
383322
bool Remangler::trySubstitution(Node *node, SubstitutionEntry &entry) {
384323
if (Demangle::mangleStandardSubstitution(node, Out))
385324
return true;
@@ -1518,60 +1457,6 @@ void Remangler::mangleProtocolWithoutPrefix(Node *node) {
15181457
mangleNominalType(node, '\0', ctx);
15191458
}
15201459

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-
15751460
void Remangler::mangleGenericArgs(Node *node, EntityContext &ctx) {
15761461
switch (node->getKind()) {
15771462
case Node::Kind::Structure:
@@ -1769,7 +1654,7 @@ void Remangler::mangleSILBoxImmutableField(Node *node) {
17691654
}
17701655

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

17751660
DemanglerPrinter printer;

lib/Basic/Remangler.cpp

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

16891689
/// The top-level interface to the remangler.
1690-
std::string Demangle::mangleNodeNew(const NodePointer &node) {
1690+
std::string Demangle::mangleNode(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,6 +51,7 @@
5151
#include "StructMetadataLayout.h"
5252
#include "StructLayout.h"
5353
#include "EnumMetadataLayout.h"
54+
#include "IRGenMangler.h"
5455

5556
#include "GenMeta.h"
5657

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

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

0 commit comments

Comments
 (0)