|
56 | 56 | /// ``pointer & SWIFT_ABI_XXX_OBJC_RESERVED_BITS_MASK == 0 &&
|
57 | 57 | /// pointer & SWIFT_ABI_XXX_SWIFT_SPARE_BITS_MASK != 0``.
|
58 | 58 |
|
| 59 | +// Weak references use a marker to tell when they are controlled by |
| 60 | +// the ObjC runtime and when they are controlled by the Swift runtime. |
| 61 | +// Non-ObjC platforms don't use this marker. |
| 62 | +#define SWIFT_ABI_DEFAULT_OBJC_WEAK_REFERENCE_MARKER_MASK 0 |
| 63 | +#define SWIFT_ABI_DEFAULT_OBJC_WEAK_REFERENCE_MARKER_VALUE 0 |
| 64 | + |
59 | 65 | /*********************************** i386 *************************************/
|
60 | 66 |
|
61 | 67 | // Heap objects are pointer-aligned, so the low two bits are unused.
|
62 | 68 | #define SWIFT_ABI_I386_SWIFT_SPARE_BITS_MASK 0x00000003U
|
63 | 69 |
|
| 70 | +// ObjC weak reference discriminator is the LSB. |
| 71 | +#define SWIFT_ABI_I386_OBJC_WEAK_REFERENCE_MARKER_MASK \ |
| 72 | + (SWIFT_ABI_DEFAULT_OBJC_RESERVED_BITS_MASK | \ |
| 73 | + 1<<SWIFT_ABI_DEFAULT_OBJC_NUM_RESERVED_LOW_BITS) |
| 74 | +#define SWIFT_ABI_I386_OBJC_WEAK_REFERENCE_MARKER_VALUE \ |
| 75 | + (1<<SWIFT_ABI_DEFAULT_OBJC_NUM_RESERVED_LOW_BITS) |
| 76 | + |
64 | 77 | /*********************************** arm **************************************/
|
65 | 78 |
|
66 | 79 | // Heap objects are pointer-aligned, so the low two bits are unused.
|
67 | 80 | #define SWIFT_ABI_ARM_SWIFT_SPARE_BITS_MASK 0x00000003U
|
68 | 81 |
|
| 82 | +// ObjC weak reference discriminator is the LSB. |
| 83 | +#define SWIFT_ABI_ARM_OBJC_WEAK_REFERENCE_MARKER_MASK \ |
| 84 | + (SWIFT_ABI_DEFAULT_OBJC_RESERVED_BITS_MASK | \ |
| 85 | + 1<<SWIFT_ABI_DEFAULT_OBJC_NUM_RESERVED_LOW_BITS) |
| 86 | +#define SWIFT_ABI_ARM_OBJC_WEAK_REFERENCE_MARKER_VALUE \ |
| 87 | + (1<<SWIFT_ABI_DEFAULT_OBJC_NUM_RESERVED_LOW_BITS) |
| 88 | + |
69 | 89 | /*********************************** x86-64 ***********************************/
|
70 | 90 |
|
71 | 91 | /// Darwin reserves the low 4GB of address space.
|
|
79 | 99 | #define SWIFT_ABI_X86_64_OBJC_RESERVED_BITS_MASK 0x8000000000000001ULL
|
80 | 100 | #define SWIFT_ABI_X86_64_OBJC_NUM_RESERVED_LOW_BITS 1
|
81 | 101 |
|
| 102 | +// ObjC weak reference discriminator is the two bits |
| 103 | +// reserved for ObjC tagged pointers plus one more low bit. |
| 104 | +#define SWIFT_ABI_X86_64_OBJC_WEAK_REFERENCE_MARKER_MASK \ |
| 105 | + (SWIFT_ABI_X86_64_OBJC_RESERVED_BITS_MASK | \ |
| 106 | + 1<<SWIFT_ABI_X86_64_OBJC_NUM_RESERVED_LOW_BITS) |
| 107 | +#define SWIFT_ABI_X86_64_OBJC_WEAK_REFERENCE_MARKER_VALUE \ |
| 108 | + (1<<SWIFT_ABI_X86_64_OBJC_NUM_RESERVED_LOW_BITS) |
| 109 | + |
82 | 110 | /*********************************** arm64 ************************************/
|
83 | 111 |
|
84 | 112 | /// Darwin reserves the low 4GB of address space.
|
|
92 | 120 | #define SWIFT_ABI_ARM64_OBJC_RESERVED_BITS_MASK 0x8000000000000000ULL
|
93 | 121 | #define SWIFT_ABI_ARM64_OBJC_NUM_RESERVED_LOW_BITS 0
|
94 | 122 |
|
| 123 | +// ObjC weak reference discriminator is the high bit |
| 124 | +// reserved for ObjC tagged pointers plus the LSB. |
| 125 | +#define SWIFT_ABI_ARM64_OBJC_WEAK_REFERENCE_MARKER_MASK \ |
| 126 | + (SWIFT_ABI_ARM64_OBJC_RESERVED_BITS_MASK | \ |
| 127 | + 1<<SWIFT_ABI_ARM64_OBJC_NUM_RESERVED_LOW_BITS) |
| 128 | +#define SWIFT_ABI_ARM64_OBJC_WEAK_REFERENCE_MARKER_VALUE \ |
| 129 | + (1<<SWIFT_ABI_ARM64_OBJC_NUM_RESERVED_LOW_BITS) |
| 130 | + |
95 | 131 | /*********************************** powerpc64 ********************************/
|
96 | 132 |
|
97 | 133 | // Heap objects are pointer-aligned, so the low three bits are unused.
|
|
0 commit comments