Skip to content

Commit 2e252e1

Browse files
authored
Merge pull request #22386 from rjmccall/init-class-metadata-depedencies-runtime
Add new runtime functions for handling dependencies when initializing class metadata
2 parents 0a07619 + a074bc2 commit 2e252e1

File tree

11 files changed

+261
-141
lines changed

11 files changed

+261
-141
lines changed

include/swift/Runtime/Metadata.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -597,6 +597,14 @@ void swift_initClassMetadata(ClassMetadata *self,
597597
const TypeLayout * const *fieldTypes,
598598
size_t *fieldOffsets);
599599

600+
SWIFT_RUNTIME_EXPORT SWIFT_CC(swift)
601+
MetadataDependency
602+
swift_initClassMetadata2(ClassMetadata *self,
603+
ClassLayoutFlags flags,
604+
size_t numFields,
605+
const TypeLayout * const *fieldTypes,
606+
size_t *fieldOffsets);
607+
600608
#if SWIFT_OBJC_INTEROP
601609
/// Initialize various fields of the class metadata.
602610
///
@@ -612,6 +620,14 @@ void swift_updateClassMetadata(ClassMetadata *self,
612620
size_t numFields,
613621
const TypeLayout * const *fieldTypes,
614622
size_t *fieldOffsets);
623+
624+
SWIFT_RUNTIME_EXPORT SWIFT_CC(swift)
625+
MetadataDependency
626+
swift_updateClassMetadata2(ClassMetadata *self,
627+
ClassLayoutFlags flags,
628+
size_t numFields,
629+
const TypeLayout * const *fieldTypes,
630+
size_t *fieldOffsets);
615631
#endif
616632

617633
/// Given class metadata, a class descriptor and a method descriptor, look up

include/swift/Runtime/RuntimeFunctions.def

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -808,6 +808,34 @@ FUNCTION(UpdateClassMetadata,
808808
SizeTy->getPointerTo()),
809809
ATTRS(NoUnwind))
810810

811+
// struct FieldInfo { size_t Size; size_t AlignMask; };
812+
// MetadataDependency swift_initClassMetadata2(Metadata *self,
813+
// ClassLayoutFlags flags,
814+
// size_t numFields,
815+
// TypeLayout * const *fieldTypes,
816+
// size_t *fieldOffsets);
817+
FUNCTION(InitClassMetadata2,
818+
swift_initClassMetadata2, SwiftCC,
819+
RETURNS(TypeMetadataDependencyTy),
820+
ARGS(TypeMetadataPtrTy, SizeTy, SizeTy,
821+
Int8PtrPtrTy->getPointerTo(),
822+
SizeTy->getPointerTo()),
823+
ATTRS(NoUnwind))
824+
825+
// struct FieldInfo { size_t Size; size_t AlignMask; };
826+
// MetadataDependency swift_updateClassMetadata2(Metadata *self,
827+
// ClassLayoutFlags flags,
828+
// size_t numFields,
829+
// TypeLayout * const *fieldTypes,
830+
// size_t *fieldOffsets);
831+
FUNCTION(UpdateClassMetadata2,
832+
swift_updateClassMetadata2, SwiftCC,
833+
RETURNS(TypeMetadataDependencyTy),
834+
ARGS(TypeMetadataPtrTy, SizeTy, SizeTy,
835+
Int8PtrPtrTy->getPointerTo(),
836+
SizeTy->getPointerTo()),
837+
ATTRS(NoUnwind))
838+
811839
// void *swift_lookUpClassMethod(Metadata *metadata,
812840
// ClassDescriptor *description,
813841
// MethodDescriptor *method);

stdlib/public/runtime/CompatibilityOverride.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ using namespace swift;
3838
struct OverrideSection {
3939
uintptr_t version;
4040

41-
#define OVERRIDE(name, ret, attrs, namespace, typedArgs, namedArgs) \
41+
#define OVERRIDE(name, ret, attrs, ccAttrs, namespace, typedArgs, namedArgs) \
4242
Override_ ## name name;
4343
#include "CompatibilityOverride.def"
4444
};
@@ -61,7 +61,7 @@ static OverrideSection *getOverrideSectionPtr() {
6161
return OverrideSectionPtr;
6262
}
6363

64-
#define OVERRIDE(name, ret, attrs, namespace, typedArgs, namedArgs) \
64+
#define OVERRIDE(name, ret, attrs, ccAttrs, namespace, typedArgs, namedArgs) \
6565
Override_ ## name swift::getOverride_ ## name() { \
6666
auto *Section = getOverrideSectionPtr(); \
6767
if (Section == nullptr) \

stdlib/public/runtime/CompatibilityOverride.def

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -69,104 +69,106 @@
6969
# endif
7070
#endif
7171

72-
OVERRIDE_CASTING(dynamicCast, bool, , swift::,
72+
OVERRIDE_CASTING(dynamicCast, bool, , , swift::,
7373
(OpaqueValue *dest, OpaqueValue *src,
7474
const Metadata *srcType,
7575
const Metadata *targetType,
7676
DynamicCastFlags flags),
7777
(dest, src, srcType, targetType, flags))
7878

7979

80-
OVERRIDE_CASTING(dynamicCastClass, const void *, , swift::,
80+
OVERRIDE_CASTING(dynamicCastClass, const void *, , , swift::,
8181
(const void *object,
8282
const ClassMetadata *targetType),
8383
(object, targetType))
8484

8585

86-
OVERRIDE_CASTING(dynamicCastClassUnconditional, const void *, , swift::,
86+
OVERRIDE_CASTING(dynamicCastClassUnconditional, const void *, , , swift::,
8787
(const void *object,
8888
const ClassMetadata *targetType,
8989
const char *file, unsigned line, unsigned column),
9090
(object, targetType, file, line, column))
9191

9292

9393

94-
OVERRIDE_CASTING(dynamicCastUnknownClass, const void *, , swift::,
94+
OVERRIDE_CASTING(dynamicCastUnknownClass, const void *, , , swift::,
9595
(const void *object, const Metadata *targetType),
9696
(object, targetType))
9797

9898

99-
OVERRIDE_CASTING(dynamicCastUnknownClassUnconditional, const void *, , swift::,
99+
OVERRIDE_CASTING(dynamicCastUnknownClassUnconditional, const void *, , , swift::,
100100
(const void *object, const Metadata *targetType,
101101
const char *file, unsigned line, unsigned column),
102102
(object, targetType, file, line, column))
103103

104104

105-
OVERRIDE_CASTING(dynamicCastMetatype, const Metadata *, , swift::,
105+
OVERRIDE_CASTING(dynamicCastMetatype, const Metadata *, , , swift::,
106106
(const Metadata *sourceType,
107107
const Metadata *targetType),
108108
(sourceType, targetType))
109109

110110

111-
OVERRIDE_CASTING(dynamicCastMetatypeUnconditional, const Metadata *, , swift::,
111+
OVERRIDE_CASTING(dynamicCastMetatypeUnconditional, const Metadata *, , , swift::,
112112
(const Metadata *sourceType,
113113
const Metadata *targetType,
114114
const char *file, unsigned line, unsigned column),
115115
(sourceType, targetType, file, line, column))
116116

117117

118-
OVERRIDE_FOREIGN(dynamicCastForeignClassMetatype, const ClassMetadata *, , swift::,
118+
OVERRIDE_FOREIGN(dynamicCastForeignClassMetatype, const ClassMetadata *, , , swift::,
119119
(const ClassMetadata *sourceType,
120120
const ClassMetadata *targetType),
121121
(sourceType, targetType))
122122

123123

124124
OVERRIDE_FOREIGN(dynamicCastForeignClassMetatypeUnconditional,
125-
const ClassMetadata *, , swift::,
125+
const ClassMetadata *, , , swift::,
126126
(const ClassMetadata *sourceType,
127127
const ClassMetadata *targetType,
128128
const char *file, unsigned line, unsigned column),
129129
(sourceType, targetType, file, line, column))
130130

131131

132-
OVERRIDE_PROTOCOLCONFORMANCE(conformsToProtocol, const WitnessTable *, , swift::,
132+
OVERRIDE_PROTOCOLCONFORMANCE(conformsToProtocol, const WitnessTable *, , , swift::,
133133
(const Metadata * const type,
134134
const ProtocolDescriptor *protocol),
135135
(type, protocol))
136136

137137
OVERRIDE_PROTOCOLCONFORMANCE(conformsToSwiftProtocol,
138-
const ProtocolConformanceDescriptor *, , swift::,
138+
const ProtocolConformanceDescriptor *, , , swift::,
139139
(const Metadata * const type,
140140
const ProtocolDescriptor *protocol,
141141
StringRef moduleName),
142142
(type, protocol, moduleName))
143143

144-
OVERRIDE_KEYPATH(getKeyPath, const HeapObject *, , swift::,
144+
OVERRIDE_KEYPATH(getKeyPath, const HeapObject *, , , swift::,
145145
(const void *pattern, const void *arguments),
146146
(pattern, arguments))
147147

148-
OVERRIDE_METADATALOOKUP(getTypeByMangledNode, TypeInfo, , swift::,
149-
(Demangler &demangler,
148+
OVERRIDE_METADATALOOKUP(getTypeByMangledNode, TypeInfo, , SWIFT_CC(swift), swift::,
149+
(MetadataRequest request,
150+
Demangler &demangler,
150151
Demangle::NodePointer node,
151152
SubstGenericParameterFn substGenericParam,
152153
SubstDependentWitnessTableFn substWitnessTable),
153-
(demangler, node, substGenericParam, substWitnessTable))
154-
OVERRIDE_METADATALOOKUP(getTypeByMangledName, TypeInfo, , swift::,
155-
(StringRef typeName,
154+
(request, demangler, node, substGenericParam, substWitnessTable))
155+
OVERRIDE_METADATALOOKUP(getTypeByMangledName, TypeInfo, , SWIFT_CC(swift), swift::,
156+
(MetadataRequest request,
157+
StringRef typeName,
156158
SubstGenericParameterFn substGenericParam,
157159
SubstDependentWitnessTableFn substWitnessTable),
158-
(typeName, substGenericParam, substWitnessTable))
160+
(request, typeName, substGenericParam, substWitnessTable))
159161

160162
OVERRIDE_WITNESSTABLE(getAssociatedTypeWitnessSlow, MetadataResponse,
161-
SWIFT_CC(swift) SWIFT_RUNTIME_STDLIB_INTERNAL, swift::,
163+
SWIFT_RUNTIME_STDLIB_INTERNAL, SWIFT_CC(swift), swift::,
162164
(MetadataRequest request, WitnessTable *wtable,
163165
const Metadata *conformingType,
164166
const ProtocolRequirement *reqBase,
165167
const ProtocolRequirement *assocType),
166168
(request, wtable, conformingType, reqBase, assocType))
167169

168170
OVERRIDE_WITNESSTABLE(getAssociatedConformanceWitnessSlow, const WitnessTable *,
169-
SWIFT_CC(swift) SWIFT_RUNTIME_STDLIB_INTERNAL, swift::,
171+
SWIFT_RUNTIME_STDLIB_INTERNAL, SWIFT_CC(swift), swift::,
170172
(WitnessTable *wtable, const Metadata *conformingType,
171173
const Metadata *assocType,
172174
const ProtocolRequirement *reqBase,
@@ -175,37 +177,37 @@ OVERRIDE_WITNESSTABLE(getAssociatedConformanceWitnessSlow, const WitnessTable *,
175177
assocConformance))
176178
#if SWIFT_OBJC_INTEROP
177179

178-
OVERRIDE_OBJC(dynamicCastObjCClass, const void *, , swift::,
180+
OVERRIDE_OBJC(dynamicCastObjCClass, const void *, , , swift::,
179181
(const void *object,
180182
const ClassMetadata *targetType),
181183
(object, targetType))
182184

183185

184-
OVERRIDE_OBJC(dynamicCastObjCClassUnconditional, const void *, , swift::,
186+
OVERRIDE_OBJC(dynamicCastObjCClassUnconditional, const void *, , , swift::,
185187
(const void *object,
186188
const ClassMetadata *targetType,
187189
const char *file, unsigned line, unsigned column),
188190
(object, targetType, file, line, column))
189191

190-
OVERRIDE_OBJC(dynamicCastObjCClassMetatype, const ClassMetadata *, , swift::,
192+
OVERRIDE_OBJC(dynamicCastObjCClassMetatype, const ClassMetadata *, , , swift::,
191193
(const ClassMetadata *sourceType,
192194
const ClassMetadata *targetType),
193195
(sourceType, targetType))
194196

195197

196-
OVERRIDE_OBJC(dynamicCastObjCClassMetatypeUnconditional, const ClassMetadata *, , swift::,
198+
OVERRIDE_OBJC(dynamicCastObjCClassMetatypeUnconditional, const ClassMetadata *, , , swift::,
197199
(const ClassMetadata *sourceType, const ClassMetadata *targetType,
198200
const char *file, unsigned line, unsigned column),
199201
(sourceType, targetType, file, line, column))
200202

201203

202-
OVERRIDE_FOREIGN(dynamicCastForeignClass, const void *, , swift::,
204+
OVERRIDE_FOREIGN(dynamicCastForeignClass, const void *, , , swift::,
203205
(const void *object,
204206
const ForeignClassMetadata *targetType),
205207
(object, targetType))
206208

207209

208-
OVERRIDE_FOREIGN(dynamicCastForeignClassUnconditional, const void *, , swift::,
210+
OVERRIDE_FOREIGN(dynamicCastForeignClassUnconditional, const void *, , , swift::,
209211
(const void *object, const ForeignClassMetadata *targetType,
210212
const char *file, unsigned line, unsigned column),
211213
(object, targetType, file, line, column))

stdlib/public/runtime/CompatibilityOverride.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,16 @@ namespace swift {
2626

2727
#define COMPATIBILITY_UNPAREN(...) __VA_ARGS__
2828

29-
#define OVERRIDE(name, ret, attrs, namespace, typedArgs, namedArgs) \
30-
typedef ret (*Original_ ## name) typedArgs;
29+
#define OVERRIDE(name, ret, attrs, ccAttrs, namespace, typedArgs, namedArgs) \
30+
ccAttrs typedef ret (*Original_ ## name) typedArgs;
3131
#include "CompatibilityOverride.def"
3232

33-
#define OVERRIDE(name, ret, attrs, namespace, typedArgs, namedArgs) \
34-
typedef ret (*Override_ ## name)(COMPATIBILITY_UNPAREN typedArgs, \
35-
Original_ ## name originalImpl);
33+
#define OVERRIDE(name, ret, attrs, ccAttrs, namespace, typedArgs, namedArgs) \
34+
ccAttrs typedef ret (*Override_ ## name)(COMPATIBILITY_UNPAREN typedArgs, \
35+
Original_ ## name originalImpl);
3636
#include "CompatibilityOverride.def"
3737

38-
#define OVERRIDE(name, ret, attrs, namespace, typedArgs, namedArgs) \
38+
#define OVERRIDE(name, ret, attrs, ccAttrs, namespace, typedArgs, namedArgs) \
3939
Override_ ## name getOverride_ ## name();
4040
#include "CompatibilityOverride.def"
4141

@@ -44,8 +44,8 @@ namespace swift {
4444
/// OVERRIDE macro from CompatibilityOverride.def to this macro, then includes
4545
/// the file to generate the override points. The original implementation of the
4646
/// functionality must be available as swift_funcNameHereImpl.
47-
#define COMPATIBILITY_OVERRIDE(name, ret, attrs, namespace, typedArgs, namedArgs) \
48-
attrs ret namespace swift_ ## name typedArgs { \
47+
#define COMPATIBILITY_OVERRIDE(name, ret, attrs, ccAttrs, namespace, typedArgs, namedArgs) \
48+
attrs ccAttrs ret namespace swift_ ## name typedArgs { \
4949
static Override_ ## name Override; \
5050
static swift_once_t Predicate; \
5151
swift_once(&Predicate, [](void *) { \

0 commit comments

Comments
 (0)