Skip to content

Commit 9c77074

Browse files
committed
[Mangling] Establish a new mangling prefix for Embedded Swift: $e
1 parent 6f4ae28 commit 9c77074

File tree

62 files changed

+365
-233
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+365
-233
lines changed

include/swift/AST/ASTDemangler.h

+8-2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#ifndef SWIFT_AST_ASTDEMANGLER_H
2323
#define SWIFT_AST_ASTDEMANGLER_H
2424

25+
#include "swift/AST/ASTContext.h"
2526
#include "swift/AST/Types.h"
2627
#include "swift/Demangling/Demangler.h"
2728
#include "swift/Demangling/NamespaceMacros.h"
@@ -53,6 +54,7 @@ TypeDecl *getTypeDeclForUSR(ASTContext &ctx,
5354
/// just finds and builds things in the AST.
5455
class ASTBuilder {
5556
ASTContext &Ctx;
57+
Mangle::ManglingFlavor ManglingFlavor;
5658
Demangle::NodeFactory Factory;
5759

5860
/// The notional context in which we're writing and type-checking code.
@@ -97,8 +99,11 @@ class ASTBuilder {
9799

98100
static constexpr bool needsToPrecomputeParentGenericContextShapes = false;
99101

100-
explicit ASTBuilder(ASTContext &ctx, GenericSignature genericSig)
101-
: Ctx(ctx) {
102+
explicit ASTBuilder(ASTContext &ctx, GenericSignature genericSig) : Ctx(ctx) {
103+
ManglingFlavor = ctx.LangOpts.hasFeature(Feature::Embedded)
104+
? Mangle::ManglingFlavor::Embedded
105+
: Mangle::ManglingFlavor::Default;
106+
102107
for (auto *paramTy : genericSig.getGenericParams()) {
103108
if (paramTy->isParameterPack())
104109
ParameterPacks.emplace_back(paramTy->getDepth(), paramTy->getIndex());
@@ -112,6 +117,7 @@ class ASTBuilder {
112117
}
113118

114119
ASTContext &getASTContext() { return Ctx; }
120+
Mangle::ManglingFlavor getManglingFlavor() { return ManglingFlavor; }
115121
DeclContext *getNotionalDC();
116122

117123
Demangle::NodeFactory &getNodeFactory() { return Factory; }

include/swift/AST/ASTMangler.h

+3
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,9 @@ class ASTMangler : public Mangler {
193193
DWARFMangling = true;
194194
RespectOriginallyDefinedIn = false;
195195
}
196+
Flavor = Ctx.LangOpts.hasFeature(Feature::Embedded)
197+
? ManglingFlavor::Embedded
198+
: ManglingFlavor::Default;
196199
}
197200

198201
const ASTContext &getASTContext() { return Context; }

include/swift/Basic/Mangler.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#ifndef SWIFT_BASIC_MANGLER_H
1414
#define SWIFT_BASIC_MANGLER_H
1515

16+
#include "swift/Demangling/ManglingFlavor.h"
1617
#include "swift/Demangling/ManglingUtils.h"
1718
#include "swift/Demangling/NamespaceMacros.h"
1819
#include "swift/Basic/Debug.h"
@@ -70,6 +71,8 @@ class Mangler {
7071

7172
size_t MaxNumWords = 26;
7273

74+
ManglingFlavor Flavor = ManglingFlavor::Default;
75+
7376
/// If enabled, non-ASCII names are encoded in modified Punycode.
7477
bool UsePunycode = true;
7578

@@ -135,7 +138,7 @@ class Mangler {
135138
void finalize(llvm::raw_ostream &stream);
136139

137140
/// Verify that demangling and remangling works.
138-
static void verify(StringRef mangledName);
141+
static void verify(StringRef mangledName, ManglingFlavor Flavor);
139142

140143
SWIFT_DEBUG_DUMP;
141144

include/swift/Demangling/Demangle.h

+12-7
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#define SWIFT_DEMANGLING_DEMANGLE_H
2121

2222
#include "swift/Demangling/Errors.h"
23+
#include "swift/Demangling/ManglingFlavor.h"
2324
#include "swift/Demangling/NamespaceMacros.h"
2425
#include "llvm/ADT/StringRef.h"
2526
#include "llvm/Support/Compiler.h"
@@ -673,15 +674,17 @@ class [[nodiscard]] ManglingErrorOr {
673674
};
674675

675676
/// Remangle a demangled parse tree.
676-
ManglingErrorOr<std::string> mangleNode(NodePointer root);
677+
ManglingErrorOr<std::string> mangleNode(NodePointer root,
678+
Mangle::ManglingFlavor Flavor);
677679

678-
using SymbolicResolver =
679-
llvm::function_ref<Demangle::NodePointer (SymbolicReferenceKind,
680-
const void *)>;
680+
using SymbolicResolver = llvm::function_ref<Demangle::NodePointer(
681+
SymbolicReferenceKind, const void *)>;
681682

682683
/// Remangle a demangled parse tree, using a callback to resolve
683684
/// symbolic references.
684-
ManglingErrorOr<std::string> mangleNode(NodePointer root, SymbolicResolver resolver);
685+
ManglingErrorOr<std::string> mangleNode(NodePointer root,
686+
SymbolicResolver resolver,
687+
Mangle::ManglingFlavor Flavor);
685688

686689
/// Remangle a demangled parse tree, using a callback to resolve
687690
/// symbolic references.
@@ -690,7 +693,8 @@ ManglingErrorOr<std::string> mangleNode(NodePointer root, SymbolicResolver resol
690693
/// alive as long as the returned string is used.
691694
ManglingErrorOr<llvm::StringRef> mangleNode(NodePointer root,
692695
SymbolicResolver resolver,
693-
NodeFactory &Factory);
696+
NodeFactory &Factory,
697+
Mangle::ManglingFlavor Flavor);
694698

695699
/// Remangle in the old mangling scheme.
696700
///
@@ -812,7 +816,8 @@ llvm::StringRef makeSymbolicMangledNameStringRef(const char *base);
812816
/// referenced by its module and type name.
813817
std::string mangledNameForTypeMetadataAccessor(llvm::StringRef moduleName,
814818
llvm::StringRef typeName,
815-
Node::Kind typeKind);
819+
Node::Kind typeKind,
820+
Mangle::ManglingFlavor Flavor);
816821

817822
SWIFT_END_INLINE_NAMESPACE
818823
} // end namespace Demangle

include/swift/Demangling/Demangler.h

+3
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#define SWIFT_DEMANGLING_DEMANGLER_H
2121

2222
#include "swift/Demangling/Demangle.h"
23+
#include "swift/Demangling/ManglingFlavor.h"
2324
#include "swift/Demangling/NamespaceMacros.h"
2425

2526
//#define NODE_FACTORY_DEBUGGING
@@ -405,6 +406,8 @@ class Demangler : public NodeFactory {
405406
/// as part of the name.
406407
bool IsOldFunctionTypeMangling = false;
407408

409+
Mangle::ManglingFlavor Flavor = Mangle::ManglingFlavor::Default;
410+
408411
Vector<NodePointer> NodeStack;
409412
Vector<NodePointer> Substitutions;
410413

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
//===--- ManglingUtils.h - Utilities for Swift name mangling ----*- C++ -*-===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
#ifndef SWIFT_DEMANGLING_MANGLINGFLAVOR_H
14+
#define SWIFT_DEMANGLING_MANGLINGFLAVOR_H
15+
16+
#include "swift/Demangling/NamespaceMacros.h"
17+
18+
#include <cstdint>
19+
20+
namespace swift {
21+
namespace Mangle {
22+
SWIFT_BEGIN_INLINE_NAMESPACE
23+
24+
/// Which mangling style and prefix to use.
25+
enum class ManglingFlavor: uint8_t {
26+
/// Default manling with the ABI stable $s prefix
27+
Default,
28+
/// Embedded Swift's mangling with $e prefix
29+
Embedded,
30+
};
31+
32+
SWIFT_END_INLINE_NAMESPACE
33+
} // end namespace Mangle
34+
} // end namespace swift
35+
36+
#endif // SWIFT_DEMANGLING_MANGLINGFLAVOR_H

include/swift/Demangling/ManglingMacros.h

+2
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,13 @@ _Pragma("clang diagnostic push")
2222
_Pragma("clang diagnostic ignored \"-Wdollar-in-identifier-extension\"")
2323
#endif
2424
#define MANGLING_PREFIX $s
25+
#define MANGLING_PREFIX_EMBEDDED $e
2526
#if defined(__clang__)
2627
_Pragma("clang diagnostic pop")
2728
#endif
2829

2930
#define MANGLING_PREFIX_STR MANGLE_AS_STRING(MANGLING_PREFIX)
31+
#define MANGLING_PREFIX_EMBEDDED_STR MANGLE_AS_STRING(MANGLING_PREFIX_EMBEDDED)
3032

3133
// The following macros help to create symbol manglings. They can be used
3234
// if a mangled name is needed at compile-time, e.g. for variable names in the

include/swift/Demangling/TypeDecoder.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -720,7 +720,7 @@ class TypeDecoder {
720720
return decodeMangledType(genericArgs->getChild(0), depth + 1);
721721
}
722722
case NodeKind::BuiltinTypeName: {
723-
auto mangling = Demangle::mangleNode(Node);
723+
auto mangling = Demangle::mangleNode(Node, Builder.getManglingFlavor());
724724
if (!mangling.isSuccess()) {
725725
return MAKE_NODE_TYPE_ERROR(Node,
726726
"failed to mangle node (%d:%u)",

include/swift/Remote/MetadataReader.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -1220,7 +1220,8 @@ class MetadataReader {
12201220
if (!node || node->getKind() != Node::Kind::Type)
12211221
return BuiltType();
12221222

1223-
auto mangling = Demangle::mangleNode(node);
1223+
auto mangling =
1224+
Demangle::mangleNode(node, Mangle::ManglingFlavor::Default);
12241225
if (!mangling.isSuccess())
12251226
return BuiltType();
12261227
auto name = mangling.result();

include/swift/RemoteInspection/TypeRefBuilder.h

+16-8
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#ifndef SWIFT_REFLECTION_TYPEREFBUILDER_H
1919
#define SWIFT_REFLECTION_TYPEREFBUILDER_H
2020

21+
#include "swift/Demangling/ManglingFlavor.h"
2122
#include "swift/Remote/ExternalTypeRefCache.h"
2223
#include "swift/Remote/MetadataReader.h"
2324
#include "swift/RemoteInspection/DescriptorFinder.h"
@@ -400,6 +401,10 @@ class TypeRefBuilder {
400401
TypeRefBuilder(const TypeRefBuilder &other) = delete;
401402
TypeRefBuilder &operator=(const TypeRefBuilder &other) = delete;
402403

404+
Mangle::ManglingFlavor getManglingFlavor() {
405+
return Mangle::ManglingFlavor::Default;
406+
}
407+
403408
private:
404409
Demangle::Demangler Dem;
405410

@@ -851,7 +856,7 @@ class TypeRefBuilder {
851856
}
852857

853858
BuiltTypeDecl createTypeDecl(Node *node, std::vector<size_t> paramsPerLevel) {
854-
auto mangling = Demangle::mangleNode(node);
859+
auto mangling = Demangle::mangleNode(node, getManglingFlavor());
855860
if (!mangling.isSuccess()) {
856861
return std::nullopt;
857862
}
@@ -864,7 +869,7 @@ class TypeRefBuilder {
864869
}
865870

866871
BuiltTypeDecl createTypeDecl(Node *node, bool &typeAlias) {
867-
auto mangling = Demangle::mangleNode(node);
872+
auto mangling = Demangle::mangleNode(node, getManglingFlavor());
868873
if (!mangling.isSuccess()) {
869874
return std::nullopt;
870875
}
@@ -876,7 +881,7 @@ class TypeRefBuilder {
876881
}
877882

878883
BuiltProtocolDecl createProtocolDecl(Node *node) {
879-
auto mangling = Demangle::mangleNode(node);
884+
auto mangling = Demangle::mangleNode(node, getManglingFlavor());
880885
if (!mangling.isSuccess()) {
881886
return std::nullopt;
882887
}
@@ -979,7 +984,7 @@ class TypeRefBuilder {
979984
auto argBegin = args.begin();
980985
for (size_t i = 0; i < nodes.size(); i++) {
981986
// Get the mangling for this node
982-
auto mangling = Demangle::mangleNode(nodes[i]);
987+
auto mangling = Demangle::mangleNode(nodes[i], getManglingFlavor());
983988
if (!mangling.isSuccess()) {
984989
return nullptr;
985990
}
@@ -1022,7 +1027,7 @@ class TypeRefBuilder {
10221027
return nullptr;
10231028
}
10241029
auto startNode = node->getFirstChild();
1025-
auto mangling = Demangle::mangleNode(startNode);
1030+
auto mangling = Demangle::mangleNode(startNode, getManglingFlavor());
10261031
if (!mangling.isSuccess()) {
10271032
return nullptr;
10281033
}
@@ -1107,7 +1112,8 @@ class TypeRefBuilder {
11071112
return underlyingTy->subst(*this, subs);
11081113
}
11091114

1110-
auto mangling = mangleNode(opaqueDescriptor, SymbolicResolver(), Dem);
1115+
auto mangling = mangleNode(opaqueDescriptor, SymbolicResolver(), Dem,
1116+
getManglingFlavor());
11111117
if (!mangling.isSuccess())
11121118
return nullptr;
11131119

@@ -2161,7 +2167,8 @@ class TypeRefBuilder {
21612167
std::string demangledTypeName =
21622168
nodeToString(demangleTypeRef(typeTypeRef));
21632169
std::string mangledTypeName;
2164-
auto typeMangling = Demangle::mangleNode(demangleTypeRef(typeTypeRef));
2170+
auto typeMangling = Demangle::mangleNode(demangleTypeRef(typeTypeRef),
2171+
getManglingFlavor());
21652172
if (!typeMangling.isSuccess())
21662173
mangledTypeName = "";
21672174
else
@@ -2256,7 +2263,8 @@ class TypeRefBuilder {
22562263
auto typeRoot = nomTypeDescriptorRoot->getChild(0);
22572264
typeName = nodeToString(typeRoot);
22582265

2259-
auto typeMangling = Demangle::mangleNode(typeRoot);
2266+
auto typeMangling =
2267+
Demangle::mangleNode(typeRoot, Mangle::ManglingFlavor::Default);
22602268
if (!typeMangling.isSuccess())
22612269
mangledTypeName = "";
22622270
else

lib/AST/ASTDemangler.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ Type ASTBuilder::resolveOpaqueType(NodePointer opaqueDescriptor,
256256
auto definingDecl = opaqueDescriptor->getChild(0);
257257
auto definingGlobal = Factory.createNode(Node::Kind::Global);
258258
definingGlobal->addChild(definingDecl, Factory);
259-
auto mangling = mangleNode(definingGlobal);
259+
auto mangling = mangleNode(definingGlobal, ManglingFlavor);
260260
if (!mangling.isSuccess())
261261
return Type();
262262
auto mangledName = mangling.result();
@@ -1286,7 +1286,7 @@ ASTBuilder::findDeclContext(NodePointer node) {
12861286
return nullptr;
12871287

12881288
// Look up the local type by its mangling.
1289-
auto mangling = Demangle::mangleNode(node);
1289+
auto mangling = Demangle::mangleNode(node, ManglingFlavor);
12901290
if (!mangling.isSuccess())
12911291
return nullptr;
12921292
auto mangledName = mangling.result();

lib/AST/ASTMangler.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -621,7 +621,7 @@ std::string ASTMangler::mangleSILDifferentiabilityWitness(StringRef originalName
621621
Demangler demangler;
622622
auto *node = mangleSILDifferentiabilityWitnessAsNode(
623623
originalName, kind, config, demangler, this);
624-
auto mangling = mangleNode(node);
624+
auto mangling = mangleNode(node, Flavor);
625625
if (!mangling.isSuccess()) {
626626
llvm_unreachable("unexpected mangling failure");
627627
}
@@ -879,7 +879,7 @@ ASTMangler::mangleAnyDecl(const ValueDecl *Decl,
879879
// We have a custom prefix, so finalize() won't verify for us. If we're not
880880
// in invalid code (coming from an IDE caller) verify manually.
881881
if (!Decl->isInvalid())
882-
verify(Storage.str());
882+
verify(Storage.str(), Flavor);
883883
return finalize();
884884
}
885885

@@ -899,7 +899,7 @@ std::string ASTMangler::mangleAccessorEntityAsUSR(AccessorKind kind,
899899
// We have a custom prefix, so finalize() won't verify for us. If we're not
900900
// in invalid code (coming from an IDE caller) verify manually.
901901
if (!decl->isInvalid())
902-
verify(Storage.str().drop_front(USRPrefix.size()));
902+
verify(Storage.str().drop_front(USRPrefix.size()), Flavor);
903903
return finalize();
904904
}
905905

0 commit comments

Comments
 (0)