Skip to content

Commit 9f8b68a

Browse files
committed
Mangling: use macros instead of hard-coded swift symbol names.
This makes it easier to switch between the old and new mangling scheme.
1 parent 684092d commit 9f8b68a

File tree

12 files changed

+209
-190
lines changed

12 files changed

+209
-190
lines changed

Diff for: include/swift/Runtime/Metadata.h

+37-33
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include "swift/Basic/Malloc.h"
3333
#include "swift/Basic/FlaggedPointer.h"
3434
#include "swift/Basic/RelativePointer.h"
35+
#include "swift/Basic/ManglingMacros.h"
3536
#include "../../../stdlib/public/SwiftShims/HeapObject.h"
3637

3738
namespace swift {
@@ -886,73 +887,75 @@ inline unsigned TypeLayout::getNumExtraInhabitants() const {
886887
// The "Int" tables are used for arbitrary POD data with the matching
887888
// size/alignment characteristics.
888889
SWIFT_RUNTIME_EXPORT
889-
extern "C" const ValueWitnessTable _TWVBi8_; // Builtin.Int8
890+
extern "C" const ValueWitnessTable VALUE_WITNESS_SYM(Bi8_); // Builtin.Int8
890891
SWIFT_RUNTIME_EXPORT
891-
extern "C" const ValueWitnessTable _TWVBi16_; // Builtin.Int16
892+
extern "C" const ValueWitnessTable VALUE_WITNESS_SYM(Bi16_); // Builtin.Int16
892893
SWIFT_RUNTIME_EXPORT
893-
extern "C" const ValueWitnessTable _TWVBi32_; // Builtin.Int32
894+
extern "C" const ValueWitnessTable VALUE_WITNESS_SYM(Bi32_); // Builtin.Int32
894895
SWIFT_RUNTIME_EXPORT
895-
extern "C" const ValueWitnessTable _TWVBi64_; // Builtin.Int64
896+
extern "C" const ValueWitnessTable VALUE_WITNESS_SYM(Bi64_); // Builtin.Int64
896897
SWIFT_RUNTIME_EXPORT
897-
extern "C" const ValueWitnessTable _TWVBi128_; // Builtin.Int128
898+
extern "C" const ValueWitnessTable VALUE_WITNESS_SYM(Bi128_); // Builtin.Int128
898899
SWIFT_RUNTIME_EXPORT
899-
extern "C" const ValueWitnessTable _TWVBi256_; // Builtin.Int256
900+
extern "C" const ValueWitnessTable VALUE_WITNESS_SYM(Bi256_); // Builtin.Int256
900901

901902
// The object-pointer table can be used for arbitrary Swift refcounted
902903
// pointer types.
903904
SWIFT_RUNTIME_EXPORT
904-
extern "C" const ExtraInhabitantsValueWitnessTable _TWVBo; // Builtin.NativeObject
905+
extern "C" const ExtraInhabitantsValueWitnessTable VALUE_WITNESS_SYM(Bo); // Builtin.NativeObject
905906
SWIFT_RUNTIME_EXPORT
906-
extern "C" const ExtraInhabitantsValueWitnessTable _TWVXoBo; // unowned Builtin.NativeObject
907+
extern "C" const ExtraInhabitantsValueWitnessTable UNOWNED_VALUE_WITNESS_SYM(Bo); // unowned Builtin.NativeObject
907908
SWIFT_RUNTIME_EXPORT
908-
extern "C" const ValueWitnessTable _TWVXwGSqBo_; // weak Builtin.NativeObject?
909+
extern "C" const ValueWitnessTable WEAK_VALUE_WITNESS_SYM(Bo); // weak Builtin.NativeObject?
909910

910911
SWIFT_RUNTIME_EXPORT
911-
extern "C" const ExtraInhabitantsValueWitnessTable _TWVBb; // Builtin.BridgeObject
912+
extern "C" const ExtraInhabitantsValueWitnessTable VALUE_WITNESS_SYM(Bb); // Builtin.BridgeObject
912913

913914
SWIFT_RUNTIME_EXPORT
914-
extern "C" const ExtraInhabitantsValueWitnessTable _TWVBp; // Builtin.RawPointer
915+
extern "C" const ExtraInhabitantsValueWitnessTable VALUE_WITNESS_SYM(Bp); // Builtin.RawPointer
915916

916917
#if SWIFT_OBJC_INTEROP
917918
// The ObjC-pointer table can be used for arbitrary ObjC pointer types.
918919
SWIFT_RUNTIME_EXPORT
919-
extern "C" const ExtraInhabitantsValueWitnessTable _TWVBO; // Builtin.UnknownObject
920+
extern "C" const ExtraInhabitantsValueWitnessTable VALUE_WITNESS_SYM(BO); // Builtin.UnknownObject
920921
SWIFT_RUNTIME_EXPORT
921-
extern "C" const ExtraInhabitantsValueWitnessTable _TWVXoBO; // unowned Builtin.UnknownObject
922+
extern "C" const ExtraInhabitantsValueWitnessTable UNOWNED_VALUE_WITNESS_SYM(BO); // unowned Builtin.UnknownObject
922923
SWIFT_RUNTIME_EXPORT
923-
extern "C" const ValueWitnessTable _TWVXwGSqBO_; // weak Builtin.UnknownObject?
924+
extern "C" const ValueWitnessTable WEAK_VALUE_WITNESS_SYM(BO); // weak Builtin.UnknownObject?
924925
#endif
925926

926927
// The () -> () table can be used for arbitrary function types.
927928
SWIFT_RUNTIME_EXPORT
928-
extern "C" const ExtraInhabitantsValueWitnessTable _TWVFT_T_; // () -> ()
929+
extern "C" const ExtraInhabitantsValueWitnessTable
930+
VALUE_WITNESS_SYM(FUNCTION_MANGLING); // () -> ()
929931

930932
// The @convention(thin) () -> () table can be used for arbitrary thin function types.
931933
SWIFT_RUNTIME_EXPORT
932-
extern "C" const ExtraInhabitantsValueWitnessTable _TWVXfT_T_; // @convention(thin) () -> ()
934+
extern "C" const ExtraInhabitantsValueWitnessTable
935+
VALUE_WITNESS_SYM(THIN_FUNCTION_MANGLING); // @convention(thin) () -> ()
933936

934937
// The () table can be used for arbitrary empty types.
935938
SWIFT_RUNTIME_EXPORT
936-
extern "C" const ValueWitnessTable _TWVT_; // ()
939+
extern "C" const ValueWitnessTable VALUE_WITNESS_SYM(EMPTY_TUPLE_MANGLING); // ()
937940

938941
// The table for aligned-pointer-to-pointer types.
939942
SWIFT_RUNTIME_EXPORT
940-
extern "C" const ExtraInhabitantsValueWitnessTable _TWVMBo; // Builtin.NativeObject.Type
943+
extern "C" const ExtraInhabitantsValueWitnessTable METATYPE_VALUE_WITNESS_SYM(Bo); // Builtin.NativeObject.Type
941944

942945
/// Return the value witnesses for unmanaged pointers.
943946
static inline const ValueWitnessTable &getUnmanagedPointerValueWitnesses() {
944947
#ifdef __LP64__
945-
return _TWVBi64_;
948+
return VALUE_WITNESS_SYM(Bi64_);
946949
#else
947-
return _TWVBi32_;
950+
return VALUE_WITNESS_SYM(Bi32_);
948951
#endif
949952
}
950953

951954
/// Return value witnesses for a pointer-aligned pointer type.
952955
static inline
953956
const ExtraInhabitantsValueWitnessTable &
954957
getUnmanagedPointerPointerValueWitnesses() {
955-
return _TWVMBo;
958+
return METATYPE_VALUE_WITNESS_SYM(Bo);
956959
}
957960

958961
/// The header before a metadata object which appears on all type
@@ -1295,28 +1298,28 @@ using OpaqueMetadata = TargetOpaqueMetadata<InProcess>;
12951298
// matching characteristics.
12961299
using FullOpaqueMetadata = FullMetadata<OpaqueMetadata>;
12971300
SWIFT_RUNTIME_EXPORT
1298-
extern "C" const FullOpaqueMetadata _TMBi8_; // Builtin.Int8
1301+
extern "C" const FullOpaqueMetadata METADATA_SYM(Bi8_); // Builtin.Int8
12991302
SWIFT_RUNTIME_EXPORT
1300-
extern "C" const FullOpaqueMetadata _TMBi16_; // Builtin.Int16
1303+
extern "C" const FullOpaqueMetadata METADATA_SYM(Bi16_); // Builtin.Int16
13011304
SWIFT_RUNTIME_EXPORT
1302-
extern "C" const FullOpaqueMetadata _TMBi32_; // Builtin.Int32
1305+
extern "C" const FullOpaqueMetadata METADATA_SYM(Bi32_); // Builtin.Int32
13031306
SWIFT_RUNTIME_EXPORT
1304-
extern "C" const FullOpaqueMetadata _TMBi64_; // Builtin.Int64
1307+
extern "C" const FullOpaqueMetadata METADATA_SYM(Bi64_); // Builtin.Int64
13051308
SWIFT_RUNTIME_EXPORT
1306-
extern "C" const FullOpaqueMetadata _TMBi128_; // Builtin.Int128
1309+
extern "C" const FullOpaqueMetadata METADATA_SYM(Bi128_); // Builtin.Int128
13071310
SWIFT_RUNTIME_EXPORT
1308-
extern "C" const FullOpaqueMetadata _TMBi256_; // Builtin.Int256
1311+
extern "C" const FullOpaqueMetadata METADATA_SYM(Bi256_); // Builtin.Int256
13091312
SWIFT_RUNTIME_EXPORT
1310-
extern "C" const FullOpaqueMetadata _TMBo; // Builtin.NativeObject
1313+
extern "C" const FullOpaqueMetadata METADATA_SYM(Bo); // Builtin.NativeObject
13111314
SWIFT_RUNTIME_EXPORT
1312-
extern "C" const FullOpaqueMetadata _TMBb; // Builtin.BridgeObject
1315+
extern "C" const FullOpaqueMetadata METADATA_SYM(Bb); // Builtin.BridgeObject
13131316
SWIFT_RUNTIME_EXPORT
1314-
extern "C" const FullOpaqueMetadata _TMBp; // Builtin.RawPointer
1317+
extern "C" const FullOpaqueMetadata METADATA_SYM(Bp); // Builtin.RawPointer
13151318
SWIFT_RUNTIME_EXPORT
1316-
extern "C" const FullOpaqueMetadata _TMBB; // Builtin.UnsafeValueBuffer
1319+
extern "C" const FullOpaqueMetadata METADATA_SYM(BB); // Builtin.UnsafeValueBuffer
13171320
#if SWIFT_OBJC_INTEROP
13181321
SWIFT_RUNTIME_EXPORT
1319-
extern "C" const FullOpaqueMetadata _TMBO; // Builtin.UnknownObject
1322+
extern "C" const FullOpaqueMetadata METADATA_SYM(BO); // Builtin.UnknownObject
13201323
#endif
13211324

13221325
/// The prefix on a heap metadata.
@@ -2180,7 +2183,8 @@ using TupleTypeMetadata = TargetTupleTypeMetadata<InProcess>;
21802183

21812184
/// The standard metadata for the empty tuple type.
21822185
SWIFT_RUNTIME_EXPORT
2183-
extern "C" const FullMetadata<TupleTypeMetadata> _TMT_;
2186+
extern "C" const
2187+
FullMetadata<TupleTypeMetadata> METADATA_SYM(EMPTY_TUPLE_MANGLING);
21842188

21852189
template <typename Runtime> struct TargetProtocolDescriptor;
21862190

Diff for: lib/IRGen/IRGenModule.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "swift/AST/DiagnosticsIRGen.h"
2020
#include "swift/AST/IRGenOptions.h"
2121
#include "swift/Basic/Dwarf.h"
22+
#include "swift/Basic/ManglingMacros.h"
2223
#include "swift/ClangImporter/ClangImporter.h"
2324
#include "swift/Runtime/RuntimeFnWrappersGen.h"
2425
#include "swift/Runtime/Config.h"
@@ -642,8 +643,9 @@ llvm::Constant *IRGenModule::getEmptyTupleMetadata() {
642643
if (EmptyTupleMetadata)
643644
return EmptyTupleMetadata;
644645

645-
EmptyTupleMetadata =
646-
Module.getOrInsertGlobal("_TMT_", FullTypeMetadataStructTy);
646+
EmptyTupleMetadata = Module.getOrInsertGlobal(
647+
MANGLE_AS_STRING(METADATA_SYM(EMPTY_TUPLE_MANGLING)),
648+
FullTypeMetadataStructTy);
647649
if (Triple.isOSBinFormatCOFF())
648650
cast<llvm::GlobalVariable>(EmptyTupleMetadata)
649651
->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);

Diff for: stdlib/public/runtime/Casting.cpp

+22-18
Original file line numberDiff line numberDiff line change
@@ -684,10 +684,10 @@ extern "C" id swift_stdlib_getErrorEmbeddedNSErrorIndirect(
684684
/******************************************************************************/
685685

686686
/// Nominal type descriptor for Swift.AnyHashable.
687-
extern "C" const NominalTypeDescriptor _TMnVs11AnyHashable;
687+
extern "C" const NominalTypeDescriptor STRUCT_TYPE_DESCR_SYM(s11AnyHashable);
688688

689689
static bool isAnyHashableType(const StructMetadata *type) {
690-
return type->getDescription() == &_TMnVs11AnyHashable;
690+
return type->getDescription() == &STRUCT_TYPE_DESCR_SYM(s11AnyHashable);
691691
}
692692

693693
static bool isAnyHashableType(const Metadata *type) {
@@ -1436,10 +1436,10 @@ static bool _dynamicCastUnknownClassIndirect(OpaqueValue *dest,
14361436
/******************************************************************************/
14371437

14381438
#if SWIFT_OBJC_INTEROP
1439-
extern "C" const ProtocolDescriptor _TMps5Error;
1439+
extern "C" const ProtocolDescriptor PROTOCOL_DESCR_SYM(s5Error);
14401440

14411441
static const WitnessTable *findErrorWitness(const Metadata *srcType) {
1442-
return swift_conformsToProtocol(srcType, &_TMps5Error);
1442+
return swift_conformsToProtocol(srcType, &PROTOCOL_DESCR_SYM(s5Error));
14431443
}
14441444
#endif
14451445

@@ -2138,13 +2138,13 @@ static bool tryDynamicCastBoxedSwiftValue(OpaqueValue *dest,
21382138
/******************************************************************************/
21392139

21402140
/// Nominal type descriptor for Swift.Array.
2141-
extern "C" const NominalTypeDescriptor _TMnSa;
2141+
extern "C" const NominalTypeDescriptor NOMINAL_TYPE_DESCR_SYM(Sa);
21422142

21432143
/// Nominal type descriptor for Swift.Dictionary.
2144-
extern "C" const NominalTypeDescriptor _TMnVs10Dictionary;
2144+
extern "C" const NominalTypeDescriptor STRUCT_TYPE_DESCR_SYM(s10Dictionary);
21452145

21462146
/// Nominal type descriptor for Swift.Set.
2147-
extern "C" const NominalTypeDescriptor _TMnVs3Set;
2147+
extern "C" const NominalTypeDescriptor STRUCT_TYPE_DESCR_SYM(s3Set);
21482148

21492149
SWIFT_CC(swift)
21502150
extern "C"
@@ -2212,10 +2212,10 @@ static bool _dynamicCastStructToStruct(OpaqueValue *destination,
22122212
auto descriptor = sourceType->Description.get();
22132213
auto targetDescriptor = targetType->Description.get();
22142214
if (descriptor != targetDescriptor) {
2215-
if (descriptor == &_TMnVs11AnyHashable) {
2215+
if (descriptor == &STRUCT_TYPE_DESCR_SYM(s11AnyHashable)) {
22162216
return _dynamicCastFromAnyHashable(destination, source,
22172217
sourceType, targetType, flags);
2218-
} else if (targetDescriptor == &_TMnVs11AnyHashable) {
2218+
} else if (targetDescriptor == &STRUCT_TYPE_DESCR_SYM(s11AnyHashable)) {
22192219
return _dynamicCastToAnyHashable(destination, source,
22202220
sourceType, targetType, flags);
22212221
} else {
@@ -2229,7 +2229,7 @@ static bool _dynamicCastStructToStruct(OpaqueValue *destination,
22292229
bool result;
22302230

22312231
// Arrays.
2232-
if (descriptor == &_TMnSa) {
2232+
if (descriptor == &NOMINAL_TYPE_DESCR_SYM(Sa)) {
22332233
if (flags & DynamicCastFlags::Unconditional) {
22342234
_swift_arrayDownCastIndirect(source, destination,
22352235
sourceArgs[0], targetArgs[0]);
@@ -2241,7 +2241,7 @@ static bool _dynamicCastStructToStruct(OpaqueValue *destination,
22412241
}
22422242

22432243
// Dictionaries.
2244-
} else if (descriptor == &_TMnVs10Dictionary) {
2244+
} else if (descriptor == &STRUCT_TYPE_DESCR_SYM(s10Dictionary)) {
22452245
if (flags & DynamicCastFlags::Unconditional) {
22462246
_swift_dictionaryDownCastIndirect(source, destination,
22472247
sourceArgs[0], sourceArgs[1],
@@ -2257,7 +2257,7 @@ static bool _dynamicCastStructToStruct(OpaqueValue *destination,
22572257
}
22582258

22592259
// Sets.
2260-
} else if (descriptor == &_TMnVs3Set) {
2260+
} else if (descriptor == &STRUCT_TYPE_DESCR_SYM(s3Set)) {
22612261
if (flags & DynamicCastFlags::Unconditional) {
22622262
_swift_setDownCastIndirect(source, destination,
22632263
sourceArgs[0], targetArgs[0],
@@ -2707,7 +2707,7 @@ struct _ObjectiveCBridgeableWitnessTable {
27072707

27082708
} // unnamed namespace
27092709

2710-
extern "C" const ProtocolDescriptor _TMps21_ObjectiveCBridgeable;
2710+
extern "C" const ProtocolDescriptor PROTOCOL_DESCR_SYM(s21_ObjectiveCBridgeable);
27112711

27122712
/// Dynamic cast from a value type that conforms to the _ObjectiveCBridgeable
27132713
/// protocol to a class type, first by bridging the value to its Objective-C
@@ -2973,12 +2973,16 @@ id _swift_bridgeAnythingNonVerbatimToObjectiveC(OpaqueValue *src,
29732973
// documentation.
29742974
//===----------------------------------------------------------------------===//
29752975

2976-
extern "C" const _ObjectiveCBridgeableWitnessTable
2977-
_TWPVs19_BridgeableMetatypes21_ObjectiveCBridgeables;
2976+
#define BRIDGING_CONFORMANCE_SYM \
2977+
SELECT_MANGLING(_TWPVs19_BridgeableMetatypes21_ObjectiveCBridgeables, \
2978+
_Ss19_BridgeableMetatypeVs21_ObjectiveCBridgeablesWP)
2979+
2980+
extern "C" const _ObjectiveCBridgeableWitnessTable BRIDGING_CONFORMANCE_SYM;
29782981

29792982
static const _ObjectiveCBridgeableWitnessTable *
29802983
findBridgeWitness(const Metadata *T) {
2981-
auto w = swift_conformsToProtocol(T, &_TMps21_ObjectiveCBridgeable);
2984+
auto w = swift_conformsToProtocol(T,
2985+
&PROTOCOL_DESCR_SYM(s21_ObjectiveCBridgeable));
29822986
if (LLVM_LIKELY(w))
29832987
return reinterpret_cast<const _ObjectiveCBridgeableWitnessTable *>(w);
29842988
// Class and ObjC existential metatypes can be bridged, but metatypes can't
@@ -2988,14 +2992,14 @@ findBridgeWitness(const Metadata *T) {
29882992
case MetadataKind::Metatype: {
29892993
auto metaTy = static_cast<const MetatypeMetadata *>(T);
29902994
if (metaTy->InstanceType->isAnyClass())
2991-
return &_TWPVs19_BridgeableMetatypes21_ObjectiveCBridgeables;
2995+
return &BRIDGING_CONFORMANCE_SYM;
29922996
break;
29932997
}
29942998
case MetadataKind::ExistentialMetatype: {
29952999
auto existentialMetaTy =
29963000
static_cast<const ExistentialMetatypeMetadata *>(T);
29973001
if (existentialMetaTy->isObjC())
2998-
return &_TWPVs19_BridgeableMetatypes21_ObjectiveCBridgeables;
3002+
return &BRIDGING_CONFORMANCE_SYM;
29993003
break;
30003004
}
30013005

0 commit comments

Comments
 (0)