Skip to content

Commit 14f8784

Browse files
committed
[Mangling] Establish a new mangling prefix for Embedded Swift: $e
1 parent 84b5c86 commit 14f8784

File tree

60 files changed

+362
-231
lines changed

Some content is hidden

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

60 files changed

+362
-231
lines changed

include/swift/AST/ASTDemangler.h

Lines changed: 8 additions & 2 deletions
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.
@@ -88,15 +90,19 @@ class ASTBuilder {
8890

8991
static constexpr bool needsToPrecomputeParentGenericContextShapes = false;
9092

91-
explicit ASTBuilder(ASTContext &ctx, GenericSignature genericSig)
92-
: Ctx(ctx) {
93+
explicit ASTBuilder(ASTContext &ctx, GenericSignature genericSig) : Ctx(ctx) {
94+
ManglingFlavor = ctx.LangOpts.hasFeature(Feature::Embedded)
95+
? Mangle::ManglingFlavor::Embedded
96+
: Mangle::ManglingFlavor::Default;
97+
9398
for (auto *paramTy : genericSig.getGenericParams()) {
9499
if (paramTy->isParameterPack())
95100
ParameterPacks.emplace_back(paramTy->getDepth(), paramTy->getIndex());
96101
}
97102
}
98103

99104
ASTContext &getASTContext() { return Ctx; }
105+
Mangle::ManglingFlavor getManglingFlavor() { return ManglingFlavor; }
100106
DeclContext *getNotionalDC();
101107

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

include/swift/AST/ASTMangler.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,9 @@ class ASTMangler : public Mangler {
192192
DWARFMangling = true;
193193
RespectOriginallyDefinedIn = false;
194194
}
195+
Flavor = Ctx.LangOpts.hasFeature(Feature::Embedded)
196+
? ManglingFlavor::Embedded
197+
: ManglingFlavor::Default;
195198
}
196199

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

include/swift/Basic/Mangler.h

Lines changed: 4 additions & 1 deletion
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

Lines changed: 12 additions & 7 deletions
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"
@@ -667,15 +668,17 @@ class [[nodiscard]] ManglingErrorOr {
667668
};
668669

669670
/// Remangle a demangled parse tree.
670-
ManglingErrorOr<std::string> mangleNode(NodePointer root);
671+
ManglingErrorOr<std::string> mangleNode(NodePointer root,
672+
Mangle::ManglingFlavor Flavor);
671673

672-
using SymbolicResolver =
673-
llvm::function_ref<Demangle::NodePointer (SymbolicReferenceKind,
674-
const void *)>;
674+
using SymbolicResolver = llvm::function_ref<Demangle::NodePointer(
675+
SymbolicReferenceKind, const void *)>;
675676

676677
/// Remangle a demangled parse tree, using a callback to resolve
677678
/// symbolic references.
678-
ManglingErrorOr<std::string> mangleNode(NodePointer root, SymbolicResolver resolver);
679+
ManglingErrorOr<std::string> mangleNode(NodePointer root,
680+
SymbolicResolver resolver,
681+
Mangle::ManglingFlavor Flavor);
679682

680683
/// Remangle a demangled parse tree, using a callback to resolve
681684
/// symbolic references.
@@ -684,7 +687,8 @@ ManglingErrorOr<std::string> mangleNode(NodePointer root, SymbolicResolver resol
684687
/// alive as long as the returned string is used.
685688
ManglingErrorOr<llvm::StringRef> mangleNode(NodePointer root,
686689
SymbolicResolver resolver,
687-
NodeFactory &Factory);
690+
NodeFactory &Factory,
691+
Mangle::ManglingFlavor Flavor);
688692

689693
/// Remangle in the old mangling scheme.
690694
///
@@ -806,7 +810,8 @@ llvm::StringRef makeSymbolicMangledNameStringRef(const char *base);
806810
/// referenced by its module and type name.
807811
std::string mangledNameForTypeMetadataAccessor(llvm::StringRef moduleName,
808812
llvm::StringRef typeName,
809-
Node::Kind typeKind);
813+
Node::Kind typeKind,
814+
Mangle::ManglingFlavor Flavor);
810815

811816
SWIFT_END_INLINE_NAMESPACE
812817
} // end namespace Demangle

include/swift/Demangling/Demangler.h

Lines changed: 3 additions & 0 deletions
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

Lines changed: 36 additions & 0 deletions
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

Lines changed: 2 additions & 0 deletions
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

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

include/swift/Remote/MetadataReader.h

Lines changed: 2 additions & 1 deletion
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

Lines changed: 16 additions & 8 deletions
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
}
@@ -973,7 +978,7 @@ class TypeRefBuilder {
973978
auto argBegin = args.begin();
974979
for (size_t i = 0; i < nodes.size(); i++) {
975980
// Get the mangling for this node
976-
auto mangling = Demangle::mangleNode(nodes[i]);
981+
auto mangling = Demangle::mangleNode(nodes[i], getManglingFlavor());
977982
if (!mangling.isSuccess()) {
978983
return nullptr;
979984
}
@@ -1016,7 +1021,7 @@ class TypeRefBuilder {
10161021
return nullptr;
10171022
}
10181023
auto startNode = node->getFirstChild();
1019-
auto mangling = Demangle::mangleNode(startNode);
1024+
auto mangling = Demangle::mangleNode(startNode, getManglingFlavor());
10201025
if (!mangling.isSuccess()) {
10211026
return nullptr;
10221027
}
@@ -1101,7 +1106,8 @@ class TypeRefBuilder {
11011106
return underlyingTy->subst(*this, subs);
11021107
}
11031108

1104-
auto mangling = mangleNode(opaqueDescriptor, SymbolicResolver(), Dem);
1109+
auto mangling = mangleNode(opaqueDescriptor, SymbolicResolver(), Dem,
1110+
getManglingFlavor());
11051111
if (!mangling.isSuccess())
11061112
return nullptr;
11071113

@@ -2155,7 +2161,8 @@ class TypeRefBuilder {
21552161
std::string demangledTypeName =
21562162
nodeToString(demangleTypeRef(typeTypeRef));
21572163
std::string mangledTypeName;
2158-
auto typeMangling = Demangle::mangleNode(demangleTypeRef(typeTypeRef));
2164+
auto typeMangling = Demangle::mangleNode(demangleTypeRef(typeTypeRef),
2165+
getManglingFlavor());
21592166
if (!typeMangling.isSuccess())
21602167
mangledTypeName = "";
21612168
else
@@ -2250,7 +2257,8 @@ class TypeRefBuilder {
22502257
auto typeRoot = nomTypeDescriptorRoot->getChild(0);
22512258
typeName = nodeToString(typeRoot);
22522259

2253-
auto typeMangling = Demangle::mangleNode(typeRoot);
2260+
auto typeMangling =
2261+
Demangle::mangleNode(typeRoot, Mangle::ManglingFlavor::Default);
22542262
if (!typeMangling.isSuccess())
22552263
mangledTypeName = "";
22562264
else

lib/AST/ASTDemangler.cpp

Lines changed: 2 additions & 2 deletions
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();
@@ -1260,7 +1260,7 @@ ASTBuilder::findDeclContext(NodePointer node) {
12601260
return nullptr;
12611261

12621262
// Look up the local type by its mangling.
1263-
auto mangling = Demangle::mangleNode(node);
1263+
auto mangling = Demangle::mangleNode(node, ManglingFlavor);
12641264
if (!mangling.isSuccess())
12651265
return nullptr;
12661266
auto mangledName = mangling.result();

lib/AST/ASTMangler.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,7 @@ std::string ASTMangler::mangleSILDifferentiabilityWitness(StringRef originalName
617617
Demangler demangler;
618618
auto *node = mangleSILDifferentiabilityWitnessAsNode(
619619
originalName, kind, config, demangler, this);
620-
auto mangling = mangleNode(node);
620+
auto mangling = mangleNode(node, Flavor);
621621
if (!mangling.isSuccess()) {
622622
llvm_unreachable("unexpected mangling failure");
623623
}
@@ -865,7 +865,7 @@ ASTMangler::mangleAnyDecl(const ValueDecl *Decl,
865865
// We have a custom prefix, so finalize() won't verify for us. If we're not
866866
// in invalid code (coming from an IDE caller) verify manually.
867867
if (!Decl->isInvalid())
868-
verify(Storage.str());
868+
verify(Storage.str(), Flavor);
869869
return finalize();
870870
}
871871

@@ -885,7 +885,7 @@ std::string ASTMangler::mangleAccessorEntityAsUSR(AccessorKind kind,
885885
// We have a custom prefix, so finalize() won't verify for us. If we're not
886886
// in invalid code (coming from an IDE caller) verify manually.
887887
if (!decl->isInvalid())
888-
verify(Storage.str().drop_front(USRPrefix.size()));
888+
verify(Storage.str().drop_front(USRPrefix.size()), Flavor);
889889
return finalize();
890890
}
891891

0 commit comments

Comments
 (0)