Skip to content

Commit e15ca51

Browse files
committed
Update Runtime Generalized Existential Metadata
Tidy up the metadata definitions. * Generalize a number of metadata kinds for out-of-process clients * Introduce conveniences to make runtime lookups easier * Introduce TargetExistentialTypeExpression to TrailingObjects stops complaining about OverloadTokens being ambiguous Note that there is no impact on the layout of the metadata - the changes here are all ABI-compatible.
1 parent 9773a3c commit e15ca51

File tree

6 files changed

+97
-47
lines changed

6 files changed

+97
-47
lines changed

include/swift/ABI/GenericContext.h

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ struct TargetGenericContextDescriptorHeader {
5858
/// Key arguments include generic parameters and conformance
5959
/// requirements which are part of the identity of the context.
6060
///
61-
/// The key area of the argument layout considers of a sequence
61+
/// The key area of the argument layout consists of a sequence
6262
/// of type metadata pointers (in the same order as the parameter
6363
/// descriptors, for those parameters which satisfy hasKeyArgument())
6464
/// followed by a sequence of witness table pointers (in the same
@@ -191,25 +191,29 @@ using GenericRequirementDescriptor =
191191
extern const GenericParamDescriptor
192192
ImplicitGenericParamDescriptors[MaxNumImplicitGenericParamDescriptors];
193193

194+
template <class Runtime>
195+
const GenericParamDescriptor *targetImplicitGenericParamDescriptors();
196+
194197
/// A runtime description of a generic signature.
198+
template<typename Runtime>
195199
class RuntimeGenericSignature {
196-
GenericContextDescriptorHeader Header;
200+
TargetGenericContextDescriptorHeader<Runtime> Header;
197201
const GenericParamDescriptor *Params;
198-
const GenericRequirementDescriptor *Requirements;
202+
const TargetGenericRequirementDescriptor<Runtime> *Requirements;
199203
public:
200204
RuntimeGenericSignature()
201205
: Header{0, 0, 0, 0}, Params(nullptr), Requirements(nullptr) {}
202206

203-
RuntimeGenericSignature(const GenericContextDescriptorHeader &header,
207+
RuntimeGenericSignature(const TargetGenericContextDescriptorHeader<Runtime> &header,
204208
const GenericParamDescriptor *params,
205-
const GenericRequirementDescriptor *requirements)
209+
const TargetGenericRequirementDescriptor<Runtime> *requirements)
206210
: Header(header), Params(params), Requirements(requirements) {}
207211

208212
llvm::ArrayRef<GenericParamDescriptor> getParams() const {
209213
return llvm::makeArrayRef(Params, Header.NumParams);
210214
}
211215

212-
llvm::ArrayRef<GenericRequirementDescriptor> getRequirements() const {
216+
llvm::ArrayRef<TargetGenericRequirementDescriptor<Runtime>> getRequirements() const {
213217
return llvm::makeArrayRef(Requirements, Header.NumRequirements);
214218
}
215219

@@ -375,8 +379,8 @@ class TrailingGenericContextObjects<TargetSelf<Runtime>,
375379
* sizeof(StoredPointer);
376380
}
377381

378-
RuntimeGenericSignature getGenericSignature() const {
379-
if (!asSelf()->isGeneric()) return RuntimeGenericSignature();
382+
RuntimeGenericSignature<Runtime> getGenericSignature() const {
383+
if (!asSelf()->isGeneric()) return RuntimeGenericSignature<Runtime>();
380384
return {getGenericContextHeader(),
381385
getGenericParams().data(),
382386
getGenericRequirements().data()};

include/swift/ABI/Metadata.h

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1735,6 +1735,12 @@ struct TargetExistentialTypeMetadata
17351735
using ExistentialTypeMetadata
17361736
= TargetExistentialTypeMetadata<InProcess>;
17371737

1738+
template<typename Runtime>
1739+
struct TargetExistentialTypeExpression {
1740+
/// The type expression.
1741+
TargetRelativeDirectPointer<Runtime, const char, /*nullable*/ false> name;
1742+
};
1743+
17381744
/// A description of the shape of an existential type.
17391745
///
17401746
/// An existential type has the general form:
@@ -1791,7 +1797,7 @@ struct TargetExtendedExistentialTypeShape
17911797
// Optional generalization signature header
17921798
TargetGenericContextDescriptorHeader<Runtime>,
17931799
// Optional type subexpression
1794-
TargetRelativeDirectPointer<Runtime, const char, /*nullable*/ false>,
1800+
TargetExistentialTypeExpression<Runtime>,
17951801
// Optional suggested value witnesses
17961802
TargetRelativeIndirectablePointer<Runtime, const TargetValueWitnessTable<Runtime>,
17971803
/*nullable*/ false>,
@@ -1802,8 +1808,6 @@ struct TargetExtendedExistentialTypeShape
18021808
// for generalization signature
18031809
TargetGenericRequirementDescriptor<Runtime>> {
18041810
private:
1805-
using RelativeStringPointer =
1806-
TargetRelativeDirectPointer<Runtime, const char, /*nullable*/ false>;
18071811
using RelativeValueWitnessTablePointer =
18081812
TargetRelativeIndirectablePointer<Runtime,
18091813
const TargetValueWitnessTable<Runtime>,
@@ -1812,7 +1816,7 @@ struct TargetExtendedExistentialTypeShape
18121816
swift::ABI::TrailingObjects<
18131817
TargetExtendedExistentialTypeShape<Runtime>,
18141818
TargetGenericContextDescriptorHeader<Runtime>,
1815-
RelativeStringPointer,
1819+
TargetExistentialTypeExpression<Runtime>,
18161820
RelativeValueWitnessTablePointer,
18171821
GenericParamDescriptor,
18181822
TargetGenericRequirementDescriptor<Runtime>>;
@@ -1825,7 +1829,7 @@ struct TargetExtendedExistentialTypeShape
18251829
return Flags.hasGeneralizationSignature();
18261830
}
18271831

1828-
size_t numTrailingObjects(OverloadToken<RelativeStringPointer>) const {
1832+
size_t numTrailingObjects(OverloadToken<TargetExistentialTypeExpression<Runtime>>) const {
18291833
return Flags.hasTypeExpression();
18301834
}
18311835

@@ -1879,12 +1883,13 @@ struct TargetExtendedExistentialTypeShape
18791883
/// we nonetheless distinguish at compile time. Storing this also
18801884
/// allows us to far more easily produce a formal type from this
18811885
/// shape reflectively.
1882-
RelativeStringPointer ExistentialType;
1886+
TargetRelativeDirectPointer<Runtime, const char, /*nullable*/ false>
1887+
ExistentialType;
18831888

18841889
/// The header describing the requirement signature of the existential.
18851890
TargetGenericContextDescriptorHeader<Runtime> ReqSigHeader;
18861891

1887-
RuntimeGenericSignature getRequirementSignature() const {
1892+
RuntimeGenericSignature<Runtime> getRequirementSignature() const {
18881893
return {ReqSigHeader, getReqSigParams(), getReqSigRequirements()};
18891894
}
18901895

@@ -1894,8 +1899,8 @@ struct TargetExtendedExistentialTypeShape
18941899

18951900
const GenericParamDescriptor *getReqSigParams() const {
18961901
return Flags.hasImplicitReqSigParams()
1897-
? ImplicitGenericParamDescriptors
1898-
: this->template getTrailingObjects<GenericParamDescriptor>();
1902+
? swift::targetImplicitGenericParamDescriptors<Runtime>()
1903+
: this->template getTrailingObjects<GenericParamDescriptor>();
18991904
}
19001905

19011906
unsigned getNumReqSigRequirements() const {
@@ -1911,10 +1916,11 @@ struct TargetExtendedExistentialTypeShape
19111916
/// The type expression of the existential, as a symbolic mangled type
19121917
/// string. Must be null if the header is just the (single)
19131918
/// requirement type parameter.
1914-
TargetPointer<Runtime, const char> getTypeExpression() const {
1919+
const TargetExistentialTypeExpression<Runtime> *getTypeExpression() const {
19151920
return Flags.hasTypeExpression()
1916-
? this->template getTrailingObjects<RelativeStringPointer>()->get()
1917-
: nullptr;
1921+
? this->template getTrailingObjects<
1922+
TargetExistentialTypeExpression<Runtime>>()
1923+
: nullptr;
19181924
}
19191925

19201926
bool isTypeExpressionOpaque() const {
@@ -1961,8 +1967,8 @@ struct TargetExtendedExistentialTypeShape
19611967
return Flags.hasGeneralizationSignature();
19621968
}
19631969

1964-
RuntimeGenericSignature getGeneralizationSignature() const {
1965-
if (!hasGeneralizationSignature()) return RuntimeGenericSignature();
1970+
RuntimeGenericSignature<Runtime> getGeneralizationSignature() const {
1971+
if (!hasGeneralizationSignature()) return RuntimeGenericSignature<Runtime>();
19661972
return {*getGenSigHeader(), getGenSigParams(), getGenSigRequirements()};
19671973
}
19681974

@@ -1974,7 +1980,7 @@ struct TargetExtendedExistentialTypeShape
19741980
const GenericParamDescriptor *getGenSigParams() const {
19751981
assert(hasGeneralizationSignature());
19761982
if (Flags.hasImplicitGenSigParams())
1977-
return ImplicitGenericParamDescriptors;
1983+
return swift::targetImplicitGenericParamDescriptors<Runtime>();
19781984
auto base = this->template getTrailingObjects<GenericParamDescriptor>();
19791985
if (!Flags.hasImplicitReqSigParams())
19801986
base += getNumReqSigParams();
@@ -2086,6 +2092,8 @@ struct TargetExtendedExistentialTypeMetadata
20862092
swift::ABI::TrailingObjects<
20872093
TargetExtendedExistentialTypeMetadata<Runtime>,
20882094
ConstTargetPointer<Runtime, void>> {
2095+
using StoredSize = typename Runtime::StoredSize;
2096+
20892097
private:
20902098
using TrailingObjects =
20912099
swift::ABI::TrailingObjects<
@@ -2097,9 +2105,12 @@ struct TargetExtendedExistentialTypeMetadata
20972105
using OverloadToken = typename TrailingObjects::template OverloadToken<T>;
20982106

20992107
size_t numTrailingObjects(OverloadToken<ConstTargetPointer<Runtime, void>>) const {
2100-
return Shape->getGenSigLayoutSizeInWords();
2108+
return Shape->getGenSigArgumentLayoutSizeInWords();
21012109
}
21022110

2111+
public:
2112+
static constexpr StoredSize OffsetToArguments = sizeof(TargetMetadata<Runtime>);
2113+
21032114
public:
21042115
explicit constexpr
21052116
TargetExtendedExistentialTypeMetadata(const ExtendedExistentialTypeShape *shape)
@@ -2113,6 +2124,11 @@ struct TargetExtendedExistentialTypeMetadata
21132124
ConstTargetPointer<Runtime, void> const *getGeneralizationArguments() const {
21142125
return this->template getTrailingObjects<ConstTargetPointer<Runtime, void>>();
21152126
}
2127+
2128+
public:
2129+
static bool classof(const TargetMetadata<Runtime> *metadata) {
2130+
return metadata->getKind() == MetadataKind::ExtendedExistential;
2131+
}
21162132
};
21172133
using ExtendedExistentialTypeMetadata
21182134
= TargetExtendedExistentialTypeMetadata<InProcess>;

lib/RemoteAST/RemoteAST.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,19 @@ using namespace swift::remoteAST;
5151
using irgen::Alignment;
5252
using irgen::Size;
5353

54+
template <class Runtime>
55+
const GenericParamDescriptor *swift::targetImplicitGenericParamDescriptors() {
56+
static const GenericParamDescriptor
57+
buffer[MaxNumImplicitGenericParamDescriptors] = {
58+
#define D GenericParamDescriptor::implicit()
59+
D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D,
60+
D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D,
61+
D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D
62+
#undef D
63+
};
64+
return buffer;
65+
}
66+
5467
static inline RemoteAddress operator+(RemoteAddress address, Size offset) {
5568
return RemoteAddress(address.getAddressData() + offset.getValue());
5669
}

stdlib/public/SwiftRemoteMirror/SwiftRemoteMirror.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,19 @@ using Runtime = External<NoObjCInterop<RuntimeTarget<sizeof(uintptr_t)>>>;
4343
#endif
4444
using NativeReflectionContext = swift::reflection::ReflectionContext<Runtime>;
4545

46+
template <class Runtime>
47+
const GenericParamDescriptor *swift::targetImplicitGenericParamDescriptors() {
48+
static const GenericParamDescriptor
49+
buffer[MaxNumImplicitGenericParamDescriptors] = {
50+
#define D GenericParamDescriptor::implicit()
51+
D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D,
52+
D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D,
53+
D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D, D
54+
#undef D
55+
};
56+
return buffer;
57+
}
58+
4659
struct SwiftReflectionContext {
4760
NativeReflectionContext *nativeContext;
4861
std::vector<std::function<void()>> freeFuncs;

stdlib/public/runtime/Metadata.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ using namespace metadataimpl;
7777
// GenericParamDescriptor is a single byte, so while it's difficult to
7878
// imagine needing even a quarter this many generic params, there's very
7979
// little harm in doing it.
80-
constexpr GenericParamDescriptor
80+
const GenericParamDescriptor
8181
swift::ImplicitGenericParamDescriptors[MaxNumImplicitGenericParamDescriptors] = {
8282
#define D GenericParamDescriptor::implicit()
8383
D,D,D,D, D,D,D,D, D,D,D,D, D,D,D,D, D,D,D,D, D,D,D,D, D,D,D,D, D,D,D,D,
@@ -86,6 +86,12 @@ swift::ImplicitGenericParamDescriptors[MaxNumImplicitGenericParamDescriptors] =
8686
};
8787
static_assert(MaxNumImplicitGenericParamDescriptors == 64, "length mismatch");
8888

89+
template <>
90+
const GenericParamDescriptor *
91+
swift::targetImplicitGenericParamDescriptors<InProcess>() {
92+
return ImplicitGenericParamDescriptors;
93+
}
94+
8995
static ClassMetadata *
9096
_swift_relocateClassMetadata(const ClassDescriptor *description,
9197
const ResilientClassMetadataPattern *pattern);
@@ -378,7 +384,7 @@ namespace {
378384
class GenericMetadataCache :
379385
public MetadataCache<GenericCacheEntry, GenericMetadataCacheTag> {
380386
public:
381-
GenericSignatureLayout SigLayout;
387+
GenericSignatureLayout<InProcess> SigLayout;
382388

383389
GenericMetadataCache(const TargetGenericContext<InProcess> &genericContext)
384390
: SigLayout(genericContext.getGenericSignature()) {
@@ -4364,7 +4370,8 @@ ExtendedExistentialTypeCacheEntry::getOrCreateVWT(Key key) {
43644370
auto sigSizeInWords = shape->ReqSigHeader.getArgumentLayoutSizeInWords();
43654371

43664372
#ifndef NDEBUG
4367-
auto layout = GenericSignatureLayout(shape->getRequirementSignature());
4373+
auto layout =
4374+
GenericSignatureLayout<InProcess>(shape->getRequirementSignature());
43684375
assert(layout.NumKeyParameters == shape->ReqSigHeader.NumParams &&
43694376
"requirement signature for existential includes a "
43704377
"redundant parameter?");

stdlib/public/runtime/MetadataCache.h

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -401,11 +401,12 @@ class SimpleLockingCacheEntryBase {
401401

402402
/// A summary of the information from a generic signature that's
403403
/// sufficient to compare arguments.
404+
template<typename Runtime>
404405
struct GenericSignatureLayout {
405406
uint16_t NumKeyParameters = 0;
406407
uint16_t NumWitnessTables = 0;
407408

408-
GenericSignatureLayout(const RuntimeGenericSignature &sig) {
409+
GenericSignatureLayout(const RuntimeGenericSignature<Runtime> &sig) {
409410
for (const auto &gp : sig.getParams()) {
410411
if (gp.hasKeyArgument())
411412
++NumKeyParameters;
@@ -421,21 +422,21 @@ struct GenericSignatureLayout {
421422
return NumKeyParameters + NumWitnessTables;
422423
}
423424

424-
friend bool operator==(const GenericSignatureLayout &lhs,
425-
const GenericSignatureLayout &rhs) {
425+
friend bool operator==(const GenericSignatureLayout<Runtime> &lhs,
426+
const GenericSignatureLayout<Runtime> &rhs) {
426427
return lhs.NumKeyParameters == rhs.NumKeyParameters &&
427428
lhs.NumWitnessTables == rhs.NumWitnessTables;
428429
}
429-
friend bool operator!=(const GenericSignatureLayout &lhs,
430-
const GenericSignatureLayout &rhs) {
430+
friend bool operator!=(const GenericSignatureLayout<Runtime> &lhs,
431+
const GenericSignatureLayout<Runtime> &rhs) {
431432
return !(lhs == rhs);
432433
}
433434
};
434435

435436
/// A key value as provided to the concurrent map.
436437
class MetadataCacheKey {
437438
const void * const *Data;
438-
GenericSignatureLayout Layout;
439+
GenericSignatureLayout<InProcess> Layout;
439440
uint32_t Hash;
440441

441442
/// Compare two witness tables, which may involving checking the
@@ -476,9 +477,8 @@ class MetadataCacheKey {
476477

477478
private:
478479
/// Compare the content from two keys.
479-
static int compareContent(const void * const *adata,
480-
const void * const *bdata,
481-
const GenericSignatureLayout &layout) {
480+
static int compareContent(const void *const *adata, const void *const *bdata,
481+
const GenericSignatureLayout<InProcess> &layout) {
482482
// Compare generic arguments for key parameters.
483483
for (unsigned i = 0; i != layout.NumKeyParameters; ++i) {
484484
if (auto result = comparePointers(*adata++, *bdata++))
@@ -497,14 +497,13 @@ class MetadataCacheKey {
497497
}
498498

499499
public:
500-
MetadataCacheKey(const GenericSignatureLayout &layout,
501-
const void * const *data)
502-
: Data(data), Layout(layout), Hash(computeHash()) { }
500+
MetadataCacheKey(const GenericSignatureLayout<InProcess> &layout,
501+
const void *const *data)
502+
: Data(data), Layout(layout), Hash(computeHash()) {}
503503

504-
MetadataCacheKey(const GenericSignatureLayout &layout,
505-
const void * const *data,
506-
uint32_t hash)
507-
: Data(data), Layout(layout), Hash(hash) {}
504+
MetadataCacheKey(const GenericSignatureLayout<InProcess> &layout,
505+
const void *const *data, uint32_t hash)
506+
: Data(data), Layout(layout), Hash(hash) {}
508507

509508
bool operator==(MetadataCacheKey rhs) const {
510509
// Compare the hashes.
@@ -545,9 +544,7 @@ class MetadataCacheKey {
545544
return Hash;
546545
}
547546

548-
const GenericSignatureLayout &layout() const {
549-
return Layout;
550-
}
547+
const GenericSignatureLayout<InProcess> &layout() const { return Layout; }
551548

552549
friend llvm::hash_code hash_value(const MetadataCacheKey &key) {
553550
return key.Hash;
@@ -1378,7 +1375,7 @@ class VariadicMetadataCacheEntryBase :
13781375

13791376
private:
13801377
/// These are set during construction and never changed.
1381-
const GenericSignatureLayout Layout;
1378+
const GenericSignatureLayout<InProcess> Layout;
13821379
const uint32_t Hash;
13831380

13841381
/// Valid if TrackingInfo.getState() >= PrivateMetadataState::Abstract.

0 commit comments

Comments
 (0)