objc-blocktramps-arm.s 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  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 one page 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. // Align trampolines to 8 bytes
  33. .align 3
  34. .macro TrampolineEntry
  35. mov r12, pc
  36. b L__objc_blockTrampolineImpl_func
  37. .align 3
  38. .endmacro
  39. .macro TrampolineEntryX16
  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. TrampolineEntry
  55. TrampolineEntry
  56. .endmacro
  57. .macro TrampolineEntryX256
  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. TrampolineEntryX16
  73. TrampolineEntryX16
  74. .endmacro
  75. __objc_blockTrampolineStart:
  76. // 2048-2 trampolines to fill 16K page
  77. TrampolineEntryX256
  78. TrampolineEntryX256
  79. TrampolineEntryX256
  80. TrampolineEntryX256
  81. TrampolineEntryX256
  82. TrampolineEntryX256
  83. TrampolineEntryX256
  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. TrampolineEntryX16
  99. TrampolineEntry
  100. TrampolineEntry
  101. TrampolineEntry
  102. TrampolineEntry
  103. TrampolineEntry
  104. TrampolineEntry
  105. TrampolineEntry
  106. TrampolineEntry
  107. TrampolineEntry
  108. TrampolineEntry
  109. TrampolineEntry
  110. TrampolineEntry
  111. TrampolineEntry
  112. __objc_blockTrampolineLast:
  113. TrampolineEntry
  114. // TrampolineEntry
  115. // TrampolineEntry
  116. .text
  117. .globl __objc_blockTrampolineImpl_stret
  118. .globl __objc_blockTrampolineStart_stret
  119. .globl __objc_blockTrampolineLast_stret
  120. // Trampoline machinery assumes the trampolines are Thumb function pointers
  121. #if !__thumb2__
  122. # error sorry
  123. #endif
  124. .thumb
  125. // Exported symbols are not marked as functions.
  126. // The trampoline construction code assumes that the Thumb bit is not set.
  127. .thumb_func L__objc_blockTrampolineImpl_stret_func
  128. .align PAGE_MAX_SHIFT
  129. __objc_blockTrampolineImpl_stret:
  130. L__objc_blockTrampolineImpl_stret_func:
  131. /*
  132. r1 == self
  133. r12 == pc of trampoline's first instruction + PC bias
  134. lr == original return address
  135. */
  136. mov r2, r1 // _cmd = self
  137. // Trampoline's data is one page before the trampoline text.
  138. // Also correct PC bias of 4 bytes.
  139. sub r12, # 3*PAGE_MAX_SIZE
  140. ldr r1, [r12, #-4] // self = block object
  141. ldr pc, [r1, #12] // tail call block->invoke
  142. // not reached
  143. // Align trampolines to 8 bytes
  144. .align 3
  145. .macro TrampolineEntry_stret
  146. mov r12, pc
  147. b L__objc_blockTrampolineImpl_stret_func
  148. .align 3
  149. .endmacro
  150. .macro TrampolineEntryX16_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. TrampolineEntry_stret
  165. TrampolineEntry_stret
  166. TrampolineEntry_stret
  167. .endmacro
  168. .macro TrampolineEntryX256_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. TrampolineEntryX16_stret
  183. TrampolineEntryX16_stret
  184. TrampolineEntryX16_stret
  185. .endmacro
  186. __objc_blockTrampolineStart_stret:
  187. // 2048-2 trampolines to fill 16K page
  188. TrampolineEntryX256_stret
  189. TrampolineEntryX256_stret
  190. TrampolineEntryX256_stret
  191. TrampolineEntryX256_stret
  192. TrampolineEntryX256_stret
  193. TrampolineEntryX256_stret
  194. TrampolineEntryX256_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. TrampolineEntryX16_stret
  209. TrampolineEntryX16_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. TrampolineEntry_stret
  220. TrampolineEntry_stret
  221. TrampolineEntry_stret
  222. TrampolineEntry_stret
  223. __objc_blockTrampolineLast_stret:
  224. TrampolineEntry_stret
  225. // TrampolineEntry_stret
  226. // TrampolineEntry_stret
  227. #endif