11 .thumb_func __a2a3_tramphead
12 .thumb_func __a2a3_firsttramp
13 .thumb_func __a2a3_nexttramp
14 .thumb_func __a2a3_trampend
21 .private_extern __a2a3_tramphead
26 r2 == pc of trampoline's first instruction + 4
27 lr == original return address
30 // calculate the trampoline's index (512 entries, 8 bytes each)
32 // PC bias is only 4, no need to correct with 8-byte trampolines
35 sub r2, r2, #8 // correct PC bias
40 // load block pointer from trampoline's data
41 adr r12, __a2a3_tramphead // text page
42 sub r12, r12, #4096 // data page precedes text page
43 ldr r12, [r12, r2, LSL #3] // load block pointer from data + index*8
46 mov r2, r1 // _cmd = self
47 mov r1, r12 // self = block pointer
49 // tail call block->invoke
53 // Make v6 and v7 match so they have the same number of TrampolineEntry
54 // below. Debug asserts in objc-block-trampoline.m check this.
59 .macro TrampolineEntry
66 .private_extern __a2a3_firsttramp
70 .private_extern __a2a3_nexttramp
579 .private_extern __a2a3_trampend