9 .private_extern __a1a2_tramphead
10 .private_extern __a1a2_firsttramp
11 .private_extern __a1a2_nexttramp
12 .private_extern __a1a2_trampend
16 .thumb_func __a1a2_tramphead
17 .thumb_func __a1a2_firsttramp
18 .thumb_func __a1a2_nexttramp
19 .thumb_func __a1a2_trampend
29 r1 == pc of trampoline's first instruction + PC bias
30 lr == original return address
33 // calculate the trampoline's index (512 entries, 8 bytes each)
35 // PC bias is only 4, no need to correct with 8-byte trampolines
38 sub r1, r1, #8 // correct PC bias
43 // load block pointer from trampoline's data
44 adr r12, __a1a2_tramphead // text page
45 sub r12, r12, #4096 // data page precedes text page
46 ldr r12, [r12, r1, LSL #3] // load block pointer from data + index*8
49 mov r1, r0 // _cmd = self
50 mov r0, r12 // self = block pointer
52 // tail call block->invoke
56 // Make v6 and v7 match so they have the same number of TrampolineEntry
57 // below. Debug asserts in objc-block-trampoline.m check this.
62 .macro TrampolineEntry
69 .private_extern __a1a2_firsttramp
73 .private_extern __a1a2_nexttramp
582 .private_extern __a1a2_trampend