|
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