3535
3636using namespace swift ;
3737
38- // Pointers my have spare bits stored in the high and low bits. Mask them out
39- // before we pass them to retain/release functions
40- #define MASK_PTR (x ) \
41- ((__swift_uintptr_t )x & ~heap_object_abi::SwiftSpareBitsMask)
42-
4338static const size_t layoutStringHeaderSize = sizeof (size_t );
4439
45- // / Get the generic argument vector for the passed in metadata
46- // /
47- // / NB: We manually compute the offset instead of using Metadata::getGenericArgs
48- // / because Metadata::getGenericArgs checks the isSwift bit which we cannot do
49- // / in a compatibility library. Once we merge this into the runtime, we can
50- // / safely use Metadata::getGenericArgs. For our purposes right now anyways,
51- // / struct and enums always have their generic argument vector at offset + 2 so
52- // / we can hard code that.
53- Metadata **getGenericArgs (Metadata *metadata) {
54- return ((Metadata **)metadata) + 2 ;
55- }
56-
5740// / Given a pointer and an offset, read the requested data and increment the
5841// / offset
5942template <typename T>
@@ -74,7 +57,7 @@ Metadata *getExistentialTypeMetadata(OpaqueValue *object) {
7457 return reinterpret_cast <Metadata**>(object)[NumWords_ValueBuffer];
7558}
7659
77- typedef Metadata* (*MetadataAccessor)(Metadata**);
60+ typedef Metadata* (*MetadataAccessor)(const Metadata* const *);
7861
7962const Metadata *getResilientTypeMetadata (Metadata* metadata, const uint8_t *layoutStr, size_t &offset) {
8063 auto absolute = layoutStr + offset;
@@ -89,7 +72,7 @@ const Metadata *getResilientTypeMetadata(Metadata* metadata, const uint8_t *layo
8972 fn = (MetadataAccessor)((uintptr_t ) + absolute + relativeOffset);
9073#endif
9174
92- return fn (getGenericArgs (metadata ));
75+ return fn (metadata-> getGenericArgs ());
9376}
9477
9578typedef void (*DestrFn)(void *);
@@ -135,7 +118,7 @@ const DestroyFuncAndMask destroyTable[] = {
135118 {(DestrFn)&existential_destroy, UINTPTR_MAX, false },
136119};
137120
138- __attribute__ ((weak)) extern "C" void
121+ extern " C" void
139122swift_generic_destroy (void *address, void *metadata) {
140123 uint8_t *addr = (uint8_t *)address;
141124 Metadata *typedMetadata = (Metadata *)metadata;
@@ -161,12 +144,11 @@ swift_generic_destroy(void *address, void *metadata) {
161144 } else if (SWIFT_UNLIKELY (tag == RefCountingKind::Resilient)) {
162145 auto *type = getResilientTypeMetadata (typedMetadata, typeLayout, offset);
163146 type->vw_destroy ((OpaqueValue *)(addr + addrOffset));
164- // addrOffset += type->vw_size();
165147 } else {
166148 const auto &destroyFunc = destroyTable[static_cast <uint8_t >(tag)];
167149 if (SWIFT_LIKELY (destroyFunc.isIndirect )) {
168150 destroyFunc.fn (
169- (void *)((*(uintptr_t *)(addr + addrOffset))));// & destroyFunc.mask));
151+ (void *)((*(uintptr_t *)(addr + addrOffset))));
170152 } else {
171153 destroyFunc.fn (((void *)(addr + addrOffset)));
172154 }
@@ -220,7 +202,7 @@ const RetainFuncAndMask retainTable[] = {
220202 {(void *)&existential_initializeWithCopy, UINTPTR_MAX, false },
221203};
222204
223- __attribute__ ((weak)) extern "C" void *
205+ extern " C" void *
224206swift_generic_initWithCopy (void *dest, void *src, void *metadata) {
225207 uintptr_t addrOffset = 0 ;
226208 Metadata *typedMetadata = (Metadata *)metadata;
@@ -245,24 +227,22 @@ swift_generic_initWithCopy(void *dest, void *src, void *metadata) {
245227 auto *type = reinterpret_cast <Metadata*>(typePtr);
246228 type->vw_initializeWithCopy ((OpaqueValue*)((uintptr_t )dest + addrOffset),
247229 (OpaqueValue*)((uintptr_t )src + addrOffset));
248- // addrOffset += type->vw_size();
249230 } else if (SWIFT_UNLIKELY (tag == RefCountingKind::Resilient)) {
250231 auto *type = getResilientTypeMetadata (typedMetadata, typeLayout, offset);
251232 type->vw_initializeWithCopy ((OpaqueValue*)((uintptr_t )dest + addrOffset),
252233 (OpaqueValue*)((uintptr_t )src + addrOffset));
253- // addrOffset += type->vw_size();
254234 } else {
255235 const auto &retainFunc = retainTable[static_cast <uint8_t >(tag)];
256236 if (SWIFT_LIKELY (retainFunc.isSingle )) {
257- ((RetainFn)retainFunc.fn )(*(void **)(((uintptr_t )dest + addrOffset))); // & retainFunc.mask));
237+ ((RetainFn)retainFunc.fn )(*(void **)(((uintptr_t )dest + addrOffset)));
258238 } else {
259239 ((CopyInitFn)retainFunc.fn )((void *)((uintptr_t )dest + addrOffset), (void *)((uintptr_t )src + addrOffset));
260240 }
261241 }
262242 }
263243}
264244
265- __attribute__ ((weak)) extern "C" void *
245+ extern " C" void *
266246swift_generic_initWithTake (void *dest, void *src, void *metadata) {
267247 Metadata *typedMetadata = (Metadata *)metadata;
268248 const uint8_t *typeLayout = typedMetadata->getLayoutString ();
@@ -323,19 +303,19 @@ swift_generic_initWithTake(void *dest, void *src, void *metadata) {
323303 return dest;
324304}
325305
326- __attribute__ ((weak)) extern "C" void *
306+ extern " C" void *
327307swift_generic_assignWithCopy (void *dest, void *src, void *metadata) {
328308 swift_generic_destroy (dest, metadata);
329309 return swift_generic_initWithCopy (dest, src, metadata);
330310}
331311
332- __attribute__ ((weak)) extern "C" void *
312+ extern " C" void *
333313swift_generic_assignWithTake (void *dest, void *src, void *metadata) {
334314 swift_generic_destroy (dest, metadata);
335315 return swift_generic_initWithTake (dest, src, metadata);
336316}
337317
338- __attribute__ ((weak)) extern "C" void
318+ extern " C" void
339319swift_generic_instantiateLayoutString (const uint8_t * layoutStr,
340320 Metadata* type) {
341321 size_t offset = 0 ;
@@ -357,12 +337,12 @@ swift_generic_instantiateLayoutString(const uint8_t* layoutStr,
357337 const Metadata *genericType;
358338 if (tag == 2 ) {
359339 auto index = readBytes<uint32_t >(layoutStr, offset);
360- genericType = getGenericArgs (type )[index];
340+ genericType = type-> getGenericArgs ()[index];
361341 } else {
362342 genericType = getResilientTypeMetadata (type, layoutStr, offset);
363343 }
364344
365- if (( false )) { // genericType->getTypeContextDescriptor()->hasLayoutString()) {
345+ if (genericType->getTypeContextDescriptor ()->hasLayoutString ()) {
366346 const uint8_t *genericLayoutStr = genericType->getLayoutString ();
367347 size_t countOffset = 0 ;
368348 genericRefCountSize += readBytes<size_t >(genericLayoutStr, countOffset);
@@ -416,12 +396,12 @@ swift_generic_instantiateLayoutString(const uint8_t* layoutStr,
416396 const Metadata *genericType;
417397 if (tag == 2 ) {
418398 auto index = readBytes<uint32_t >(layoutStr, offset);
419- genericType = getGenericArgs (type )[index];
399+ genericType = type-> getGenericArgs ()[index];
420400 } else {
421401 genericType = getResilientTypeMetadata (type, layoutStr, offset);
422402 }
423403
424- if (( false )) { // genericType->getTypeContextDescriptor()->hasLayoutString()) {
404+ if (genericType->getTypeContextDescriptor ()->hasLayoutString ()) {
425405 const uint8_t *genericLayoutStr = genericType->getLayoutString ();
426406 size_t countOffset = 0 ;
427407 auto genericRefCountSize = readBytes<size_t >(genericLayoutStr, countOffset);
@@ -486,7 +466,3 @@ swift_generic_instantiateLayoutString(const uint8_t* layoutStr,
486466
487467 type->setLayoutString (instancedLayoutStr);
488468}
489-
490- // Allow this library to get force-loaded by autolinking
491- __attribute__ ((weak, visibility(" hidden" ))) extern "C" char
492- _swift_FORCE_LOAD_$_swiftCompatibilityBytecodeLayouts = 0;
0 commit comments