35
35
36
36
using namespace swift ;
37
37
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
-
43
38
static const size_t layoutStringHeaderSize = sizeof (size_t );
44
39
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
-
57
40
// / Given a pointer and an offset, read the requested data and increment the
58
41
// / offset
59
42
template <typename T>
@@ -74,7 +57,7 @@ Metadata *getExistentialTypeMetadata(OpaqueValue *object) {
74
57
return reinterpret_cast <Metadata**>(object)[NumWords_ValueBuffer];
75
58
}
76
59
77
- typedef Metadata* (*MetadataAccessor)(Metadata**);
60
+ typedef Metadata* (*MetadataAccessor)(const Metadata* const *);
78
61
79
62
const Metadata *getResilientTypeMetadata (Metadata* metadata, const uint8_t *layoutStr, size_t &offset) {
80
63
auto absolute = layoutStr + offset;
@@ -89,7 +72,7 @@ const Metadata *getResilientTypeMetadata(Metadata* metadata, const uint8_t *layo
89
72
fn = (MetadataAccessor)((uintptr_t ) + absolute + relativeOffset);
90
73
#endif
91
74
92
- return fn (getGenericArgs (metadata ));
75
+ return fn (metadata-> getGenericArgs ());
93
76
}
94
77
95
78
typedef void (*DestrFn)(void *);
@@ -135,7 +118,7 @@ const DestroyFuncAndMask destroyTable[] = {
135
118
{(DestrFn)&existential_destroy, UINTPTR_MAX, false },
136
119
};
137
120
138
- __attribute__ ((weak)) extern "C" void
121
+ extern " C" void
139
122
swift_generic_destroy (void *address, void *metadata) {
140
123
uint8_t *addr = (uint8_t *)address;
141
124
Metadata *typedMetadata = (Metadata *)metadata;
@@ -161,12 +144,11 @@ swift_generic_destroy(void *address, void *metadata) {
161
144
} else if (SWIFT_UNLIKELY (tag == RefCountingKind::Resilient)) {
162
145
auto *type = getResilientTypeMetadata (typedMetadata, typeLayout, offset);
163
146
type->vw_destroy ((OpaqueValue *)(addr + addrOffset));
164
- // addrOffset += type->vw_size();
165
147
} else {
166
148
const auto &destroyFunc = destroyTable[static_cast <uint8_t >(tag)];
167
149
if (SWIFT_LIKELY (destroyFunc.isIndirect )) {
168
150
destroyFunc.fn (
169
- (void *)((*(uintptr_t *)(addr + addrOffset))));// & destroyFunc.mask));
151
+ (void *)((*(uintptr_t *)(addr + addrOffset))));
170
152
} else {
171
153
destroyFunc.fn (((void *)(addr + addrOffset)));
172
154
}
@@ -220,7 +202,7 @@ const RetainFuncAndMask retainTable[] = {
220
202
{(void *)&existential_initializeWithCopy, UINTPTR_MAX, false },
221
203
};
222
204
223
- __attribute__ ((weak)) extern "C" void *
205
+ extern " C" void *
224
206
swift_generic_initWithCopy (void *dest, void *src, void *metadata) {
225
207
uintptr_t addrOffset = 0 ;
226
208
Metadata *typedMetadata = (Metadata *)metadata;
@@ -245,24 +227,22 @@ swift_generic_initWithCopy(void *dest, void *src, void *metadata) {
245
227
auto *type = reinterpret_cast <Metadata*>(typePtr);
246
228
type->vw_initializeWithCopy ((OpaqueValue*)((uintptr_t )dest + addrOffset),
247
229
(OpaqueValue*)((uintptr_t )src + addrOffset));
248
- // addrOffset += type->vw_size();
249
230
} else if (SWIFT_UNLIKELY (tag == RefCountingKind::Resilient)) {
250
231
auto *type = getResilientTypeMetadata (typedMetadata, typeLayout, offset);
251
232
type->vw_initializeWithCopy ((OpaqueValue*)((uintptr_t )dest + addrOffset),
252
233
(OpaqueValue*)((uintptr_t )src + addrOffset));
253
- // addrOffset += type->vw_size();
254
234
} else {
255
235
const auto &retainFunc = retainTable[static_cast <uint8_t >(tag)];
256
236
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)));
258
238
} else {
259
239
((CopyInitFn)retainFunc.fn )((void *)((uintptr_t )dest + addrOffset), (void *)((uintptr_t )src + addrOffset));
260
240
}
261
241
}
262
242
}
263
243
}
264
244
265
- __attribute__ ((weak)) extern "C" void *
245
+ extern " C" void *
266
246
swift_generic_initWithTake (void *dest, void *src, void *metadata) {
267
247
Metadata *typedMetadata = (Metadata *)metadata;
268
248
const uint8_t *typeLayout = typedMetadata->getLayoutString ();
@@ -323,19 +303,19 @@ swift_generic_initWithTake(void *dest, void *src, void *metadata) {
323
303
return dest;
324
304
}
325
305
326
- __attribute__ ((weak)) extern "C" void *
306
+ extern " C" void *
327
307
swift_generic_assignWithCopy (void *dest, void *src, void *metadata) {
328
308
swift_generic_destroy (dest, metadata);
329
309
return swift_generic_initWithCopy (dest, src, metadata);
330
310
}
331
311
332
- __attribute__ ((weak)) extern "C" void *
312
+ extern " C" void *
333
313
swift_generic_assignWithTake (void *dest, void *src, void *metadata) {
334
314
swift_generic_destroy (dest, metadata);
335
315
return swift_generic_initWithTake (dest, src, metadata);
336
316
}
337
317
338
- __attribute__ ((weak)) extern "C" void
318
+ extern " C" void
339
319
swift_generic_instantiateLayoutString (const uint8_t * layoutStr,
340
320
Metadata* type) {
341
321
size_t offset = 0 ;
@@ -357,12 +337,12 @@ swift_generic_instantiateLayoutString(const uint8_t* layoutStr,
357
337
const Metadata *genericType;
358
338
if (tag == 2 ) {
359
339
auto index = readBytes<uint32_t >(layoutStr, offset);
360
- genericType = getGenericArgs (type )[index];
340
+ genericType = type-> getGenericArgs ()[index];
361
341
} else {
362
342
genericType = getResilientTypeMetadata (type, layoutStr, offset);
363
343
}
364
344
365
- if (( false )) { // genericType->getTypeContextDescriptor()->hasLayoutString()) {
345
+ if (genericType->getTypeContextDescriptor ()->hasLayoutString ()) {
366
346
const uint8_t *genericLayoutStr = genericType->getLayoutString ();
367
347
size_t countOffset = 0 ;
368
348
genericRefCountSize += readBytes<size_t >(genericLayoutStr, countOffset);
@@ -416,12 +396,12 @@ swift_generic_instantiateLayoutString(const uint8_t* layoutStr,
416
396
const Metadata *genericType;
417
397
if (tag == 2 ) {
418
398
auto index = readBytes<uint32_t >(layoutStr, offset);
419
- genericType = getGenericArgs (type )[index];
399
+ genericType = type-> getGenericArgs ()[index];
420
400
} else {
421
401
genericType = getResilientTypeMetadata (type, layoutStr, offset);
422
402
}
423
403
424
- if (( false )) { // genericType->getTypeContextDescriptor()->hasLayoutString()) {
404
+ if (genericType->getTypeContextDescriptor ()->hasLayoutString ()) {
425
405
const uint8_t *genericLayoutStr = genericType->getLayoutString ();
426
406
size_t countOffset = 0 ;
427
407
auto genericRefCountSize = readBytes<size_t >(genericLayoutStr, countOffset);
@@ -486,7 +466,3 @@ swift_generic_instantiateLayoutString(const uint8_t* layoutStr,
486
466
487
467
type->setLayoutString (instancedLayoutStr);
488
468
}
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