objc-blocktramps-arm.s 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. #if __arm__
  2. #include <arm/arch.h>
  3. #include <mach/vm_param.h>
  4. .syntax unified
  5. .text
  6. .globl __objc_blockTrampolineImpl
  7. .globl __objc_blockTrampolineStart
  8. .globl __objc_blockTrampolineLast
  9. // Trampoline machinery assumes the trampolines are Thumb function pointers
  10. #if !__thumb2__
  11. # error sorry
  12. #endif
  13. .thumb
  14. // Exported symbols are not marked as functions.
  15. // The trampoline construction code assumes that the Thumb bit is not set.
  16. .thumb_func L__objc_blockTrampolineImpl_func
  17. .align PAGE_MAX_SHIFT
  18. __objc_blockTrampolineImpl:
  19. L__objc_blockTrampolineImpl_func:
  20. /*
  21. r0 == self
  22. r12 == pc of trampoline's first instruction + PC bias
  23. lr == original return address
  24. */
  25. mov r1, r0 // _cmd = self
  26. // Trampoline's data is two pages before the trampoline text.
  27. // Also correct PC bias of 4 bytes.
  28. sub r12, # 2*PAGE_MAX_SIZE
  29. ldr r0, [r12, #-4] // self = block object
  30. ldr pc, [r0, #12] // tail call block->invoke
  31. // not reached
  32. .macro TrampolineEntry
  33. mov r12, pc
  34. b L__objc_blockTrampolineImpl_func
  35. .align 3
  36. .endmacro
  37. .macro TrampolineEntryX16
  38. TrampolineEntry
  39. TrampolineEntry
  40. TrampolineEntry
  41. TrampolineEntry
  42. TrampolineEntry
  43. TrampolineEntry
  44. TrampolineEntry
  45. TrampolineEntry
  46. TrampolineEntry
  47. TrampolineEntry
  48. TrampolineEntry
  49. TrampolineEntry
  50. TrampolineEntry
  51. TrampolineEntry
  52. TrampolineEntry
  53. TrampolineEntry
  54. .endmacro
  55. .macro TrampolineEntryX256
  56. TrampolineEntryX16
  57. TrampolineEntryX16
  58. TrampolineEntryX16
  59. TrampolineEntryX16
  60. TrampolineEntryX16
  61. TrampolineEntryX16
  62. TrampolineEntryX16
  63. TrampolineEntryX16
  64. TrampolineEntryX16
  65. TrampolineEntryX16
  66. TrampolineEntryX16
  67. TrampolineEntryX16
  68. TrampolineEntryX16
  69. TrampolineEntryX16
  70. TrampolineEntryX16
  71. TrampolineEntryX16
  72. .endmacro
  73. .align 5
  74. __objc_blockTrampolineStart:
  75. // 2048-4 trampolines to fill 16K page
  76. TrampolineEntryX256
  77. TrampolineEntryX256
  78. TrampolineEntryX256
  79. TrampolineEntryX256
  80. TrampolineEntryX256
  81. TrampolineEntryX256
  82. TrampolineEntryX256
  83. TrampolineEntryX16
  84. TrampolineEntryX16
  85. TrampolineEntryX16
  86. TrampolineEntryX16
  87. TrampolineEntryX16
  88. TrampolineEntryX16
  89. TrampolineEntryX16
  90. TrampolineEntryX16
  91. TrampolineEntryX16
  92. TrampolineEntryX16
  93. TrampolineEntryX16
  94. TrampolineEntryX16
  95. TrampolineEntryX16
  96. TrampolineEntryX16
  97. TrampolineEntryX16
  98. TrampolineEntry
  99. TrampolineEntry
  100. TrampolineEntry
  101. TrampolineEntry
  102. TrampolineEntry
  103. TrampolineEntry
  104. TrampolineEntry
  105. TrampolineEntry
  106. TrampolineEntry
  107. TrampolineEntry
  108. TrampolineEntry
  109. __objc_blockTrampolineLast:
  110. TrampolineEntry
  111. // TrampolineEntry
  112. // TrampolineEntry
  113. // TrampolineEntry
  114. // TrampolineEntry
  115. .text
  116. .globl __objc_blockTrampolineImpl_stret
  117. .globl __objc_blockTrampolineStart_stret
  118. .globl __objc_blockTrampolineLast_stret
  119. // Trampoline machinery assumes the trampolines are Thumb function pointers
  120. #if !__thumb2__
  121. # error sorry
  122. #endif
  123. .thumb
  124. // Exported symbols are not marked as functions.
  125. // The trampoline construction code assumes that the Thumb bit is not set.
  126. .thumb_func L__objc_blockTrampolineImpl_stret_func
  127. .align PAGE_MAX_SHIFT
  128. __objc_blockTrampolineImpl_stret:
  129. L__objc_blockTrampolineImpl_stret_func:
  130. /*
  131. r1 == self
  132. r12 == pc of trampoline's first instruction + PC bias
  133. lr == original return address
  134. */
  135. mov r2, r1 // _cmd = self
  136. // Trampoline's data is three pages before the trampoline text.
  137. // Also correct PC bias of 4 bytes.
  138. sub r12, # 3*PAGE_MAX_SIZE
  139. ldr r1, [r12, #-4] // self = block object
  140. ldr pc, [r1, #12] // tail call block->invoke
  141. // not reached
  142. .macro TrampolineEntry_stret
  143. mov r12, pc
  144. b L__objc_blockTrampolineImpl_stret_func
  145. .align 3
  146. .endmacro
  147. .macro TrampolineEntryX16_stret
  148. TrampolineEntry_stret
  149. TrampolineEntry_stret
  150. TrampolineEntry_stret
  151. TrampolineEntry_stret
  152. TrampolineEntry_stret
  153. TrampolineEntry_stret
  154. TrampolineEntry_stret
  155. TrampolineEntry_stret
  156. TrampolineEntry_stret
  157. TrampolineEntry_stret
  158. TrampolineEntry_stret
  159. TrampolineEntry_stret
  160. TrampolineEntry_stret
  161. TrampolineEntry_stret
  162. TrampolineEntry_stret
  163. TrampolineEntry_stret
  164. .endmacro
  165. .macro TrampolineEntryX256_stret
  166. TrampolineEntryX16_stret
  167. TrampolineEntryX16_stret
  168. TrampolineEntryX16_stret
  169. TrampolineEntryX16_stret
  170. TrampolineEntryX16_stret
  171. TrampolineEntryX16_stret
  172. TrampolineEntryX16_stret
  173. TrampolineEntryX16_stret
  174. TrampolineEntryX16_stret
  175. TrampolineEntryX16_stret
  176. TrampolineEntryX16_stret
  177. TrampolineEntryX16_stret
  178. TrampolineEntryX16_stret
  179. TrampolineEntryX16_stret
  180. TrampolineEntryX16_stret
  181. TrampolineEntryX16_stret
  182. .endmacro
  183. .align 5
  184. __objc_blockTrampolineStart_stret:
  185. // 2048-4 trampolines to fill 16K page
  186. TrampolineEntryX256_stret
  187. TrampolineEntryX256_stret
  188. TrampolineEntryX256_stret
  189. TrampolineEntryX256_stret
  190. TrampolineEntryX256_stret
  191. TrampolineEntryX256_stret
  192. TrampolineEntryX256_stret
  193. TrampolineEntryX16_stret
  194. TrampolineEntryX16_stret
  195. TrampolineEntryX16_stret
  196. TrampolineEntryX16_stret
  197. TrampolineEntryX16_stret
  198. TrampolineEntryX16_stret
  199. TrampolineEntryX16_stret
  200. TrampolineEntryX16_stret
  201. TrampolineEntryX16_stret
  202. TrampolineEntryX16_stret
  203. TrampolineEntryX16_stret
  204. TrampolineEntryX16_stret
  205. TrampolineEntryX16_stret
  206. TrampolineEntryX16_stret
  207. TrampolineEntryX16_stret
  208. TrampolineEntry_stret
  209. TrampolineEntry_stret
  210. TrampolineEntry_stret
  211. TrampolineEntry_stret
  212. TrampolineEntry_stret
  213. TrampolineEntry_stret
  214. TrampolineEntry_stret
  215. TrampolineEntry_stret
  216. TrampolineEntry_stret
  217. TrampolineEntry_stret
  218. TrampolineEntry_stret
  219. __objc_blockTrampolineLast_stret:
  220. TrampolineEntry_stret
  221. // TrampolineEntry_stret
  222. // TrampolineEntry_stret
  223. // TrampolineEntry_stret
  224. // TrampolineEntry_stret
  225. #endif