Skip to content

Commit 254f36a

Browse files
committed
Revert "Use the new mangling for reflection."
This needs some changes in lldb. Disabled for now until lldb supports the new mangling. This reverts commit 21ba292.
1 parent 6a1ff02 commit 254f36a

28 files changed

+205
-195
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)