@@ -97,6 +97,16 @@ static uint64_t readTagBytes(const uint8_t *addr, uint8_t byteCount) {
97
97
}
98
98
}
99
99
100
+ // This check is used to determine whether or not ObjC references can
101
+ // be tagged pointers. If they can't, they have the same spare bits
102
+ // as swift references, and we have to mask them out before passing the
103
+ // reference to ref counting operations.
104
+ static constexpr bool platformSupportsTaggedPointers () {
105
+ // Platforms that don't reserve bits for ObjC, don't support tagged
106
+ // pointers.
107
+ return _swift_abi_ObjCReservedBitsMask != 0 ;
108
+ }
109
+
100
110
#if defined(__APPLE__) && defined(__arm64__)
101
111
102
112
#define CONTINUE_WITH_COPY (METADATA, READER, ADDR_OFFSET, DEST, SRC ) \
@@ -281,9 +291,12 @@ static void weakDestroy(const Metadata *metadata, LayoutStringReader1 &reader,
281
291
static void unknownDestroy (const Metadata *metadata,
282
292
LayoutStringReader1 &reader, uintptr_t &addrOffset,
283
293
uint8_t *addr) {
284
- void * object = *(void * *)(addr + addrOffset);
294
+ uintptr_t object = *(uintptr_t *)(addr + addrOffset);
285
295
addrOffset += sizeof (void *);
286
- swift_unknownObjectRelease (object);
296
+ if (!platformSupportsTaggedPointers ()) {
297
+ object &= ~_swift_abi_SwiftSpareBitsMask;
298
+ }
299
+ swift_unknownObjectRelease ((void *)object);
287
300
}
288
301
289
302
static void unknownUnownedDestroy (const Metadata *metadata,
@@ -769,9 +782,10 @@ multiPayloadEnumGeneric(const Metadata *metadata, LayoutStringReader1 &reader,
769
782
static void blockDestroy (const Metadata *metadata, LayoutStringReader1 &reader,
770
783
uintptr_t &addrOffset, uint8_t *addr) {
771
784
#if SWIFT_OBJC_INTEROP
772
- void * object = (void *)(addr + addrOffset);
785
+ uintptr_t object = *(uintptr_t *)(addr + addrOffset);
786
+ object &= ~_swift_abi_SwiftSpareBitsMask;
773
787
addrOffset += sizeof (void *);
774
- _Block_release (object);
788
+ _Block_release (( void *) object);
775
789
#else
776
790
swift_unreachable (" Blocks are not available on this platform" );
777
791
#endif
@@ -783,6 +797,11 @@ static void objcStrongDestroy(const Metadata *metadata,
783
797
#if SWIFT_OBJC_INTEROP
784
798
uintptr_t object = *(uintptr_t *)(addr + addrOffset);
785
799
addrOffset += sizeof (objc_object*);
800
+
801
+ if (!platformSupportsTaggedPointers ()) {
802
+ object &= ~_swift_abi_SwiftSpareBitsMask;
803
+ }
804
+
786
805
objc_release ((objc_object *)object);
787
806
#else
788
807
swift_unreachable (" ObjC interop is not available on this platform" );
@@ -959,10 +978,13 @@ static void weakCopyInit(const Metadata *metadata, LayoutStringReader1 &reader,
959
978
static void unknownRetain (const Metadata *metadata, LayoutStringReader1 &reader,
960
979
uintptr_t &addrOffset, uint8_t *dest, uint8_t *src) {
961
980
uintptr_t _addrOffset = addrOffset;
962
- void * object = *(void * *)(src + _addrOffset);
981
+ uintptr_t object = *(uintptr_t *)(src + _addrOffset);
963
982
memcpy (dest + _addrOffset, &object, sizeof (void *));
964
983
addrOffset = _addrOffset + sizeof (void *);
965
- swift_unknownObjectRetain (object);
984
+ if (!platformSupportsTaggedPointers ()) {
985
+ object &= ~_swift_abi_SwiftSpareBitsMask;
986
+ }
987
+ swift_unknownObjectRetain ((void *)object);
966
988
}
967
989
968
990
static void unknownUnownedCopyInit (const Metadata *metadata,
@@ -1000,9 +1022,11 @@ static void blockCopy(const Metadata *metadata, LayoutStringReader1 &reader,
1000
1022
uintptr_t &addrOffset, uint8_t *dest, uint8_t *src) {
1001
1023
#if SWIFT_OBJC_INTEROP
1002
1024
uintptr_t _addrOffset = addrOffset;
1003
- auto *copy = _Block_copy (*( void ** )(src + _addrOffset) );
1004
- memcpy (dest + _addrOffset, © , sizeof (void *));
1025
+ uintptr_t object = *( uintptr_t * )(src + _addrOffset);
1026
+ memcpy (dest + _addrOffset, &object , sizeof (void *));
1005
1027
addrOffset = _addrOffset + sizeof (void *);
1028
+ object &= ~_swift_abi_SwiftSpareBitsMask;
1029
+ _Block_copy ((void *)object);
1006
1030
#else
1007
1031
swift_unreachable (" Blocks are not available on this platform" );
1008
1032
#endif
@@ -1016,6 +1040,11 @@ static void objcStrongRetain(const Metadata *metadata,
1016
1040
uintptr_t object = *(uintptr_t *)(src + _addrOffset);
1017
1041
memcpy (dest + _addrOffset, &object, sizeof (objc_object *));
1018
1042
addrOffset = _addrOffset + sizeof (objc_object *);
1043
+
1044
+ if (!platformSupportsTaggedPointers ()) {
1045
+ object &= ~_swift_abi_SwiftSpareBitsMask;
1046
+ }
1047
+
1019
1048
objc_retain ((objc_object *)object);
1020
1049
#else
1021
1050
swift_unreachable (" ObjC interop is not available on this platform" );
@@ -1368,12 +1397,16 @@ static void unknownAssignWithCopy(const Metadata *metadata,
1368
1397
uintptr_t &addrOffset, uint8_t *dest,
1369
1398
uint8_t *src) {
1370
1399
uintptr_t _addrOffset = addrOffset;
1371
- void * destObject = *(void * *)(dest + _addrOffset);
1372
- void * srcObject = *(void * *)(src + _addrOffset);
1400
+ uintptr_t destObject = *(uintptr_t *)(dest + _addrOffset);
1401
+ uintptr_t srcObject = *(uintptr_t *)(src + _addrOffset);
1373
1402
memcpy (dest + _addrOffset, &srcObject, sizeof (void *));
1374
1403
addrOffset = _addrOffset + sizeof (void *);
1375
- swift_unknownObjectRelease (destObject);
1376
- swift_unknownObjectRetain (srcObject);
1404
+ if (!platformSupportsTaggedPointers ()) {
1405
+ destObject &= ~_swift_abi_SwiftSpareBitsMask;
1406
+ srcObject &= ~_swift_abi_SwiftSpareBitsMask;
1407
+ }
1408
+ swift_unknownObjectRelease ((void *)destObject);
1409
+ swift_unknownObjectRetain ((void *)srcObject);
1377
1410
}
1378
1411
1379
1412
static void bridgeAssignWithCopy (const Metadata *metadata,
@@ -1431,10 +1464,14 @@ static void blockAssignWithCopy(const Metadata *metadata,
1431
1464
uint8_t *src) {
1432
1465
#if SWIFT_OBJC_INTEROP
1433
1466
uintptr_t _addrOffset = addrOffset;
1434
- _Block_release (*( void ** )(dest + _addrOffset) );
1435
- auto *copy = _Block_copy (*( void ** )(src + _addrOffset) );
1436
- memcpy (dest + _addrOffset, © , sizeof (void *));
1467
+ uintptr_t destObject = *( uintptr_t * )(dest + _addrOffset);
1468
+ uintptr_t srcObject = *( uintptr_t * )(src + _addrOffset);
1469
+ memcpy (dest + _addrOffset, &srcObject , sizeof (void *));
1437
1470
addrOffset = _addrOffset + sizeof (void *);
1471
+ destObject &= ~_swift_abi_SwiftSpareBitsMask;
1472
+ srcObject &= ~_swift_abi_SwiftSpareBitsMask;
1473
+ _Block_release ((void *)destObject);
1474
+ _Block_copy ((void *)srcObject);
1438
1475
#else
1439
1476
swift_unreachable (" Blocks are not available on this platform" );
1440
1477
#endif
@@ -1452,6 +1489,11 @@ static void objcStrongAssignWithCopy(const Metadata *metadata,
1452
1489
memcpy (dest + _addrOffset, &srcObject, sizeof (objc_object*));
1453
1490
addrOffset = _addrOffset + sizeof (objc_object*);
1454
1491
1492
+ if (!platformSupportsTaggedPointers ()) {
1493
+ destObject &= ~_swift_abi_SwiftSpareBitsMask;
1494
+ srcObject &= ~_swift_abi_SwiftSpareBitsMask;
1495
+ }
1496
+
1455
1497
objc_release ((objc_object *)destObject);
1456
1498
objc_retain ((objc_object *)srcObject);
1457
1499
#else
0 commit comments