|
36 | 36 | // offset so that it's still correct when the weak reference resolves to zero. |
37 | 37 | .weak_reference __swift_retainRelease_slowpath_mask_v1 |
38 | 38 |
|
| 39 | +// preservemost retain/release entrypoints in the runtime |
| 40 | +.weak_reference _swift_retain_preservemost |
| 41 | +.weak_reference _swift_release_preservemost |
| 42 | + |
| 43 | + |
39 | 44 | // Grab our own copy of the slowpath mask. This mask is a value which indicates |
40 | 45 | // when we must call into the runtime slowpath. If the object's refcount field |
41 | 46 | // has any bits set that are in the mask, then we must take the slow path. The |
|
87 | 92 | // limits, in addition to the usual x19 and up. Any calls to functions that use |
88 | 93 | // the standard calling convention need to save/restore x9-x15. |
89 | 94 |
|
90 | | -.globl _swift_retain_preservemost |
91 | | -.weak_definition _swift_retain_preservemost |
92 | | -_swift_retain_preservemost: |
93 | | - maybe_pacibsp |
94 | | - stp x0, x9, [sp, #-0x50]! |
95 | | - stp x10, x11, [sp, #0x10] |
96 | | - stp x12, x13, [sp, #0x20] |
97 | | - stp x14, x15, [sp, #0x30] |
98 | | - stp fp, lr, [sp, #0x40]; |
99 | | - add fp, sp, #0x40 |
100 | | - |
101 | | - // Clear the unused bits from the pointer |
102 | | - and x0, x0, #BRIDGEOBJECT_POINTER_BITS |
103 | | - bl _swift_retain |
104 | | - |
105 | | - ldp fp, lr, [sp, #0x40] |
106 | | - ldp x14, x15, [sp, #0x30] |
107 | | - ldp x12, x13, [sp, #0x20] |
108 | | - ldp x10, x11, [sp, #0x10] |
109 | | - ldp x0, x9, [sp], #0x50 |
110 | | - ret_maybe_ab |
111 | | - |
112 | | -.globl _swift_release_preservemost |
113 | | -.weak_definition _swift_release_preservemost |
114 | | -_swift_release_preservemost: |
115 | | - maybe_pacibsp |
116 | | - str x9, [sp, #-0x50]! |
117 | | - stp x10, x11, [sp, #0x10] |
118 | | - stp x12, x13, [sp, #0x20] |
119 | | - stp x14, x15, [sp, #0x30] |
120 | | - stp fp, lr, [sp, #0x40]; |
121 | | - add fp, sp, #0x40 |
122 | | - |
123 | | - // Clear the unused bits from the pointer |
124 | | - and x0, x0, #BRIDGEOBJECT_POINTER_BITS |
125 | | - bl _swift_release |
126 | | - |
127 | | - ldp fp, lr, [sp, #0x40] |
128 | | - ldp x14, x15, [sp, #0x30] |
129 | | - ldp x12, x13, [sp, #0x20] |
130 | | - ldp x10, x11, [sp, #0x10] |
131 | | - ldr x9, [sp], #0x50 |
132 | | - ret_maybe_ab |
133 | | - |
134 | 95 | .private_extern _swift_bridgeObjectReleaseClient |
135 | 96 | #if SWIFT_OBJC_INTEROP |
136 | 97 | _swift_bridgeObjectReleaseClient: |
137 | 98 | tbz x0, #63, LbridgeObjectReleaseNotTagged |
138 | 99 | ret |
139 | 100 | LbridgeObjectReleaseNotTagged: |
140 | | - tbnz x0, #62, _bridgeObjectReleaseClientObjC |
| 101 | + tbnz x0, #62, LbridgeObjectReleaseClientObjC |
141 | 102 | and x0, x0, 0x0ffffffffffffff8 |
142 | 103 |
|
143 | 104 | #else |
@@ -221,10 +182,35 @@ Lrelease_ret: |
221 | 182 | Lslowpath_release: |
222 | 183 | CONDITIONAL USE_LDX_STX, \ |
223 | 184 | clrex |
| 185 | +// If the weak preservemost symbol is NULL, call our helper. Otherwise call the |
| 186 | +// runtime directly. |
| 187 | + adrp x17, _swift_release_preservemost@GOTPAGE |
| 188 | + ldr x17, [x17, _swift_release_preservemost@GOTPAGEOFF] |
| 189 | + cbz x17, Lcall_swift_release |
224 | 190 | b _swift_release_preservemost |
225 | 191 |
|
226 | | -.alt_entry _bridgeObjectReleaseClientObjC |
227 | | -_bridgeObjectReleaseClientObjC: |
| 192 | +// Save/restore the preservemost registers and call swift_retain. |
| 193 | +Lcall_swift_release: |
| 194 | + maybe_pacibsp |
| 195 | + str x9, [sp, #-0x50]! |
| 196 | + stp x10, x11, [sp, #0x10] |
| 197 | + stp x12, x13, [sp, #0x20] |
| 198 | + stp x14, x15, [sp, #0x30] |
| 199 | + stp fp, lr, [sp, #0x40]; |
| 200 | + add fp, sp, #0x40 |
| 201 | + |
| 202 | + // Clear the unused bits from the pointer |
| 203 | + and x0, x0, #BRIDGEOBJECT_POINTER_BITS |
| 204 | + bl _swift_release |
| 205 | + |
| 206 | + ldp fp, lr, [sp, #0x40] |
| 207 | + ldp x14, x15, [sp, #0x30] |
| 208 | + ldp x12, x13, [sp, #0x20] |
| 209 | + ldp x10, x11, [sp, #0x10] |
| 210 | + ldr x9, [sp], #0x50 |
| 211 | + ret_maybe_ab |
| 212 | + |
| 213 | +LbridgeObjectReleaseClientObjC: |
228 | 214 | maybe_pacibsp |
229 | 215 | stp x0, x9, [sp, #-0x50]! |
230 | 216 | stp x10, x11, [sp, #0x10] |
@@ -252,7 +238,7 @@ _swift_bridgeObjectRetainClient: |
252 | 238 | tbz x0, #63, LbridgeObjectRetainNotTagged |
253 | 239 | ret |
254 | 240 | LbridgeObjectRetainNotTagged: |
255 | | - tbnz x0, #62, _swift_bridgeObjectRetainClientObjC |
| 241 | + tbnz x0, #62, Lswift_bridgeObjectRetainClientObjC |
256 | 242 |
|
257 | 243 | .alt_entry _swift_retainClient |
258 | 244 | #else |
@@ -334,10 +320,35 @@ Lretain_ret: |
334 | 320 | Lslowpath_retain: |
335 | 321 | CONDITIONAL USE_LDX_STX, \ |
336 | 322 | clrex |
| 323 | +// If the weak preservemost symbol is NULL, call our helper. Otherwise call the |
| 324 | +// runtime directly. |
| 325 | + adrp x17, _swift_retain_preservemost@GOTPAGE |
| 326 | + ldr x17, [x17, _swift_retain_preservemost@GOTPAGEOFF] |
| 327 | + cbz x17, Lcall_swift_retain |
337 | 328 | b _swift_retain_preservemost |
338 | 329 |
|
339 | | -.alt_entry _swift_bridgeObjectRetainClientObjC |
340 | | -_swift_bridgeObjectRetainClientObjC: |
| 330 | +// Save/restore the preservemost registers and call swift_retain. |
| 331 | +Lcall_swift_retain: |
| 332 | + maybe_pacibsp |
| 333 | + stp x0, x9, [sp, #-0x50]! |
| 334 | + stp x10, x11, [sp, #0x10] |
| 335 | + stp x12, x13, [sp, #0x20] |
| 336 | + stp x14, x15, [sp, #0x30] |
| 337 | + stp fp, lr, [sp, #0x40]; |
| 338 | + add fp, sp, #0x40 |
| 339 | + |
| 340 | + // Clear the unused bits from the pointer |
| 341 | + and x0, x0, #BRIDGEOBJECT_POINTER_BITS |
| 342 | + bl _swift_retain |
| 343 | + |
| 344 | + ldp fp, lr, [sp, #0x40] |
| 345 | + ldp x14, x15, [sp, #0x30] |
| 346 | + ldp x12, x13, [sp, #0x20] |
| 347 | + ldp x10, x11, [sp, #0x10] |
| 348 | + ldp x0, x9, [sp], #0x50 |
| 349 | + ret_maybe_ab |
| 350 | + |
| 351 | +Lswift_bridgeObjectRetainClientObjC: |
341 | 352 | maybe_pacibsp |
342 | 353 | stp x0, x9, [sp, #-0x50]! |
343 | 354 | stp x10, x11, [sp, #0x10] |
|
0 commit comments