2
2
//
3
3
// This source file is part of the Swift.org open source project
4
4
//
5
- // Copyright (c) 2014 - 2020 Apple Inc. and the Swift project authors
5
+ // Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
6
6
// Licensed under Apache License v2.0 with Runtime Library Exception
7
7
//
8
8
// See https://swift.org/LICENSE.txt for license information
30
30
#include " llvm/ADT/ArrayRef.h"
31
31
#include " swift/Strings.h"
32
32
#include " swift/Runtime/Config.h"
33
+ #include " swift/Runtime/Once.h"
33
34
#include " swift/ABI/MetadataValues.h"
34
35
#include " swift/ABI/System.h"
35
36
#include " swift/ABI/TrailingObjects.h"
@@ -2295,28 +2296,37 @@ struct TargetTypeMetadataRecord {
2295
2296
union {
2296
2297
// / A direct reference to a nominal type descriptor.
2297
2298
RelativeDirectPointerIntPair<TargetContextDescriptor<Runtime>,
2298
- TypeMetadataRecordKind >
2299
+ TypeReferenceKind >
2299
2300
DirectNominalTypeDescriptor;
2300
2301
2301
2302
// / An indirect reference to a nominal type descriptor.
2302
2303
RelativeDirectPointerIntPair<TargetSignedPointer<Runtime, TargetContextDescriptor<Runtime> * __ptrauth_swift_type_descriptor>,
2303
- TypeMetadataRecordKind >
2304
+ TypeReferenceKind >
2304
2305
IndirectNominalTypeDescriptor;
2306
+
2307
+ // We only allow a subset of the TypeReferenceKinds here.
2308
+ // Should we just acknowledge that this is a different enum?
2305
2309
};
2306
2310
2307
2311
public:
2308
- TypeMetadataRecordKind getTypeKind () const {
2312
+ TypeReferenceKind getTypeKind () const {
2309
2313
return DirectNominalTypeDescriptor.getInt ();
2310
2314
}
2311
2315
2312
2316
const TargetContextDescriptor<Runtime> *
2313
2317
getContextDescriptor () const {
2314
2318
switch (getTypeKind ()) {
2315
- case TypeMetadataRecordKind ::DirectTypeDescriptor:
2319
+ case TypeReferenceKind ::DirectTypeDescriptor:
2316
2320
return DirectNominalTypeDescriptor.getPointer ();
2317
2321
2318
- case TypeMetadataRecordKind ::IndirectTypeDescriptor:
2322
+ case TypeReferenceKind ::IndirectTypeDescriptor:
2319
2323
return *IndirectNominalTypeDescriptor.getPointer ();
2324
+
2325
+ // These types (and any others we might add to TypeReferenceKind
2326
+ // in the future) are just never used in these lists.
2327
+ case TypeReferenceKind::DirectObjCClassName:
2328
+ case TypeReferenceKind::IndirectObjCClass:
2329
+ return nullptr ;
2320
2330
}
2321
2331
2322
2332
return nullptr ;
@@ -2406,9 +2416,6 @@ struct TargetTypeReference {
2406
2416
// / A direct reference to an Objective-C class name.
2407
2417
RelativeDirectPointer<const char >
2408
2418
DirectObjCClassName;
2409
-
2410
- // / A "reference" to some metadata kind, e.g. tuple.
2411
- MetadataKind MetadataKind;
2412
2419
};
2413
2420
2414
2421
const TargetContextDescriptor<Runtime> *
@@ -2422,18 +2429,12 @@ struct TargetTypeReference {
2422
2429
2423
2430
case TypeReferenceKind::DirectObjCClassName:
2424
2431
case TypeReferenceKind::IndirectObjCClass:
2425
- case TypeReferenceKind::MetadataKind:
2426
2432
return nullptr ;
2427
2433
}
2428
2434
2429
2435
return nullptr ;
2430
2436
}
2431
2437
2432
- enum MetadataKind getMetadataKind (TypeReferenceKind kind) const {
2433
- assert (kind == TypeReferenceKind::MetadataKind);
2434
- return MetadataKind;
2435
- }
2436
-
2437
2438
#if SWIFT_OBJC_INTEROP
2438
2439
// / If this type reference is one of the kinds that supports ObjC
2439
2440
// / references,
@@ -2519,10 +2520,6 @@ struct TargetProtocolConformanceDescriptor final
2519
2520
return Flags.getTypeReferenceKind ();
2520
2521
}
2521
2522
2522
- enum MetadataKind getMetadataKind () const {
2523
- return TypeRef.getMetadataKind (getTypeKind ());
2524
- }
2525
-
2526
2523
const char *getDirectObjCClassName () const {
2527
2524
return TypeRef.getDirectObjCClassName (getTypeKind ());
2528
2525
}
@@ -2550,11 +2547,6 @@ struct TargetProtocolConformanceDescriptor final
2550
2547
TargetRelativeContextPointer<Runtime>>();
2551
2548
}
2552
2549
2553
- // / Whether this conformance is builtin by the compiler + runtime.
2554
- bool isBuiltin () const {
2555
- return getTypeKind () == TypeReferenceKind::MetadataKind;
2556
- }
2557
-
2558
2550
// / Whether this conformance is non-unique because it has been synthesized
2559
2551
// / for a foreign type.
2560
2552
bool isSynthesizedNonUnique () const {
@@ -3796,6 +3788,11 @@ struct TargetCanonicalSpecializedMetadataAccessorsListEntry {
3796
3788
TargetRelativeDirectPointer<Runtime, MetadataResponse(MetadataRequest), /* Nullable*/ false > accessor;
3797
3789
};
3798
3790
3791
+ template <typename Runtime>
3792
+ struct TargetCanonicalSpecializedMetadatasCachingOnceToken {
3793
+ TargetRelativeDirectPointer<Runtime, swift_once_t , /* Nullable*/ false > token;
3794
+ };
3795
+
3799
3796
template <typename Runtime>
3800
3797
class TargetTypeContextDescriptor
3801
3798
: public TargetContextDescriptor<Runtime> {
@@ -3882,7 +3879,9 @@ class TargetTypeContextDescriptor
3882
3879
}
3883
3880
3884
3881
const llvm::ArrayRef<TargetRelativeDirectPointer<Runtime, TargetMetadata<Runtime>, /* Nullable*/ false >>
3885
- getCanonicicalMetadataPrespecializations () const ;
3882
+ getCanonicicalMetadataPrespecializations () const ;
3883
+
3884
+ swift_once_t *getCanonicalMetadataPrespecializationCachingOnceToken () const ;
3886
3885
3887
3886
static bool classof (const TargetContextDescriptor<Runtime> *cd) {
3888
3887
return cd->getKind () >= ContextDescriptorKind::Type_First
@@ -4024,7 +4023,8 @@ class TargetClassDescriptor final
4024
4023
TargetObjCResilientClassStubInfo<Runtime>,
4025
4024
TargetCanonicalSpecializedMetadatasListCount<Runtime>,
4026
4025
TargetCanonicalSpecializedMetadatasListEntry<Runtime>,
4027
- TargetCanonicalSpecializedMetadataAccessorsListEntry<Runtime>> {
4026
+ TargetCanonicalSpecializedMetadataAccessorsListEntry<Runtime>,
4027
+ TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>> {
4028
4028
private:
4029
4029
using TrailingGenericContextObjects =
4030
4030
swift::TrailingGenericContextObjects<TargetClassDescriptor<Runtime>,
@@ -4039,7 +4039,8 @@ class TargetClassDescriptor final
4039
4039
TargetObjCResilientClassStubInfo<Runtime>,
4040
4040
TargetCanonicalSpecializedMetadatasListCount<Runtime>,
4041
4041
TargetCanonicalSpecializedMetadatasListEntry<Runtime>,
4042
- TargetCanonicalSpecializedMetadataAccessorsListEntry<Runtime>>;
4042
+ TargetCanonicalSpecializedMetadataAccessorsListEntry<Runtime>,
4043
+ TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>>;
4043
4044
4044
4045
using TrailingObjects =
4045
4046
typename TrailingGenericContextObjects::TrailingObjects;
@@ -4067,6 +4068,8 @@ class TargetClassDescriptor final
4067
4068
TargetRelativeDirectPointer<Runtime, MetadataResponse(MetadataRequest), /* Nullable*/ false >;
4068
4069
using MetadataAccessorListEntry =
4069
4070
TargetCanonicalSpecializedMetadataAccessorsListEntry<Runtime>;
4071
+ using MetadataCachingOnceToken =
4072
+ TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>;
4070
4073
4071
4074
using StoredPointer = typename Runtime::StoredPointer;
4072
4075
using StoredPointerDifference = typename Runtime::StoredPointerDifference;
@@ -4204,6 +4207,10 @@ class TargetClassDescriptor final
4204
4207
: 0 ;
4205
4208
}
4206
4209
4210
+ size_t numTrailingObjects (OverloadToken<MetadataCachingOnceToken>) const {
4211
+ return this ->hasCanonicicalMetadataPrespecializations () ? 1 : 0 ;
4212
+ }
4213
+
4207
4214
public:
4208
4215
const TargetRelativeDirectPointer<Runtime, const void , /* nullable*/ true > &
4209
4216
getResilientSuperclass () const {
@@ -4367,6 +4374,14 @@ class TargetClassDescriptor final
4367
4374
);
4368
4375
}
4369
4376
4377
+ swift_once_t *getCanonicalMetadataPrespecializationCachingOnceToken () const {
4378
+ if (!this ->hasCanonicicalMetadataPrespecializations ()) {
4379
+ return nullptr ;
4380
+ }
4381
+ auto box = this ->template getTrailingObjects <MetadataCachingOnceToken>();
4382
+ return box->token .get ();
4383
+ }
4384
+
4370
4385
static bool classof (const TargetContextDescriptor<Runtime> *cd) {
4371
4386
return cd->getKind () == ContextDescriptorKind::Class;
4372
4387
}
@@ -4394,7 +4409,8 @@ class TargetStructDescriptor final
4394
4409
TargetForeignMetadataInitialization<Runtime>,
4395
4410
TargetSingletonMetadataInitialization<Runtime>,
4396
4411
TargetCanonicalSpecializedMetadatasListCount<Runtime>,
4397
- TargetCanonicalSpecializedMetadatasListEntry<Runtime>> {
4412
+ TargetCanonicalSpecializedMetadatasListEntry<Runtime>,
4413
+ TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>> {
4398
4414
public:
4399
4415
using ForeignMetadataInitialization =
4400
4416
TargetForeignMetadataInitialization<Runtime>;
@@ -4406,6 +4422,8 @@ class TargetStructDescriptor final
4406
4422
TargetCanonicalSpecializedMetadatasListCount<Runtime>;
4407
4423
using MetadataListEntry =
4408
4424
TargetCanonicalSpecializedMetadatasListEntry<Runtime>;
4425
+ using MetadataCachingOnceToken =
4426
+ TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>;
4409
4427
4410
4428
private:
4411
4429
using TrailingGenericContextObjects =
@@ -4414,7 +4432,8 @@ class TargetStructDescriptor final
4414
4432
ForeignMetadataInitialization,
4415
4433
SingletonMetadataInitialization,
4416
4434
MetadataListCount,
4417
- MetadataListEntry>;
4435
+ MetadataListEntry,
4436
+ MetadataCachingOnceToken>;
4418
4437
4419
4438
using TrailingObjects =
4420
4439
typename TrailingGenericContextObjects::TrailingObjects;
@@ -4444,6 +4463,10 @@ class TargetStructDescriptor final
4444
4463
: 0 ;
4445
4464
}
4446
4465
4466
+ size_t numTrailingObjects (OverloadToken<MetadataCachingOnceToken>) const {
4467
+ return this ->hasCanonicicalMetadataPrespecializations () ? 1 : 0 ;
4468
+ }
4469
+
4447
4470
public:
4448
4471
using TrailingGenericContextObjects::getGenericContext;
4449
4472
using TrailingGenericContextObjects::getGenericContextHeader;
@@ -4489,6 +4512,14 @@ class TargetStructDescriptor final
4489
4512
);
4490
4513
}
4491
4514
4515
+ swift_once_t *getCanonicalMetadataPrespecializationCachingOnceToken () const {
4516
+ if (!this ->hasCanonicicalMetadataPrespecializations ()) {
4517
+ return nullptr ;
4518
+ }
4519
+ auto box = this ->template getTrailingObjects <MetadataCachingOnceToken>();
4520
+ return box->token .get ();
4521
+ }
4522
+
4492
4523
static bool classof (const TargetContextDescriptor<Runtime> *cd) {
4493
4524
return cd->getKind () == ContextDescriptorKind::Struct;
4494
4525
}
@@ -4505,7 +4536,8 @@ class TargetEnumDescriptor final
4505
4536
TargetForeignMetadataInitialization<Runtime>,
4506
4537
TargetSingletonMetadataInitialization<Runtime>,
4507
4538
TargetCanonicalSpecializedMetadatasListCount<Runtime>,
4508
- TargetCanonicalSpecializedMetadatasListEntry<Runtime>> {
4539
+ TargetCanonicalSpecializedMetadatasListEntry<Runtime>,
4540
+ TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>> {
4509
4541
public:
4510
4542
using SingletonMetadataInitialization =
4511
4543
TargetSingletonMetadataInitialization<Runtime>;
@@ -4517,6 +4549,8 @@ class TargetEnumDescriptor final
4517
4549
TargetCanonicalSpecializedMetadatasListCount<Runtime>;
4518
4550
using MetadataListEntry =
4519
4551
TargetCanonicalSpecializedMetadatasListEntry<Runtime>;
4552
+ using MetadataCachingOnceToken =
4553
+ TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>;
4520
4554
4521
4555
private:
4522
4556
using TrailingGenericContextObjects =
@@ -4525,7 +4559,8 @@ class TargetEnumDescriptor final
4525
4559
ForeignMetadataInitialization,
4526
4560
SingletonMetadataInitialization,
4527
4561
MetadataListCount,
4528
- MetadataListEntry>;
4562
+ MetadataListEntry,
4563
+ MetadataCachingOnceToken>;
4529
4564
4530
4565
using TrailingObjects =
4531
4566
typename TrailingGenericContextObjects::TrailingObjects;
@@ -4555,6 +4590,10 @@ class TargetEnumDescriptor final
4555
4590
: 0 ;
4556
4591
}
4557
4592
4593
+ size_t numTrailingObjects (OverloadToken<MetadataCachingOnceToken>) const {
4594
+ return this ->hasCanonicicalMetadataPrespecializations () ? 1 : 0 ;
4595
+ }
4596
+
4558
4597
public:
4559
4598
using TrailingGenericContextObjects::getGenericContext;
4560
4599
using TrailingGenericContextObjects::getGenericContextHeader;
@@ -4614,6 +4653,14 @@ class TargetEnumDescriptor final
4614
4653
);
4615
4654
}
4616
4655
4656
+ swift_once_t *getCanonicalMetadataPrespecializationCachingOnceToken () const {
4657
+ if (!this ->hasCanonicicalMetadataPrespecializations ()) {
4658
+ return nullptr ;
4659
+ }
4660
+ auto box = this ->template getTrailingObjects <MetadataCachingOnceToken>();
4661
+ return box->token .get ();
4662
+ }
4663
+
4617
4664
static bool classof (const TargetContextDescriptor<Runtime> *cd) {
4618
4665
return cd->getKind () == ContextDescriptorKind::Enum;
4619
4666
}
@@ -4766,6 +4813,24 @@ TargetTypeContextDescriptor<Runtime>::getCanonicicalMetadataPrespecializations()
4766
4813
}
4767
4814
}
4768
4815
4816
+ template <typename Runtime>
4817
+ inline swift_once_t *TargetTypeContextDescriptor<
4818
+ Runtime>::getCanonicalMetadataPrespecializationCachingOnceToken() const {
4819
+ switch (this ->getKind ()) {
4820
+ case ContextDescriptorKind::Enum:
4821
+ return llvm::cast<TargetEnumDescriptor<Runtime>>(this )
4822
+ ->getCanonicalMetadataPrespecializationCachingOnceToken ();
4823
+ case ContextDescriptorKind::Struct:
4824
+ return llvm::cast<TargetStructDescriptor<Runtime>>(this )
4825
+ ->getCanonicalMetadataPrespecializationCachingOnceToken ();
4826
+ case ContextDescriptorKind::Class:
4827
+ return llvm::cast<TargetClassDescriptor<Runtime>>(this )
4828
+ ->getCanonicalMetadataPrespecializationCachingOnceToken ();
4829
+ default :
4830
+ swift_unreachable (" Not a type context descriptor." );
4831
+ }
4832
+ }
4833
+
4769
4834
// / An entry in the chain of dynamic replacement functions.
4770
4835
struct DynamicReplacementChainEntry {
4771
4836
void *implementationFunction;
0 commit comments