immunio 1.2.1 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (291) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +13 -5
  3. data/ext/immunio/Rakefile +14 -6
  4. data/lib/immunio/context.rb +2 -0
  5. data/lib/immunio/plugins/action_view.rb +7 -668
  6. data/lib/immunio/plugins/action_view/action_view.rb +22 -0
  7. data/lib/immunio/plugins/action_view/active_support_hash.rb +29 -0
  8. data/lib/immunio/plugins/action_view/cache_store.rb +24 -0
  9. data/lib/immunio/plugins/action_view/erubi.rb +38 -0
  10. data/lib/immunio/plugins/action_view/erubis.rb +39 -0
  11. data/lib/immunio/plugins/action_view/fragment_caching.rb +29 -0
  12. data/lib/immunio/plugins/action_view/haml.rb +46 -0
  13. data/lib/immunio/plugins/action_view/slim.rb +42 -0
  14. data/lib/immunio/plugins/action_view/template.rb +431 -0
  15. data/lib/immunio/plugins/action_view/template_rendering.rb +45 -0
  16. data/lib/immunio/plugins/http_tracker.rb +2 -0
  17. data/lib/immunio/plugins/io.rb +34 -0
  18. data/lib/immunio/version.rb +1 -1
  19. data/lua-hooks/Makefile +36 -9
  20. data/lua-hooks/ext/luajit/COPYRIGHT +1 -1
  21. data/lua-hooks/ext/luajit/Makefile +22 -15
  22. data/lua-hooks/ext/luajit/README +2 -2
  23. data/lua-hooks/ext/luajit/doc/bluequad-print.css +1 -1
  24. data/lua-hooks/ext/luajit/doc/bluequad.css +1 -1
  25. data/lua-hooks/ext/luajit/doc/changes.html +69 -3
  26. data/lua-hooks/ext/luajit/doc/contact.html +10 -3
  27. data/lua-hooks/ext/luajit/doc/ext_c_api.html +2 -2
  28. data/lua-hooks/ext/luajit/doc/ext_ffi.html +2 -2
  29. data/lua-hooks/ext/luajit/doc/ext_ffi_api.html +2 -2
  30. data/lua-hooks/ext/luajit/doc/ext_ffi_semantics.html +3 -4
  31. data/lua-hooks/ext/luajit/doc/ext_ffi_tutorial.html +2 -2
  32. data/lua-hooks/ext/luajit/doc/ext_jit.html +3 -3
  33. data/lua-hooks/ext/luajit/doc/ext_profiler.html +2 -2
  34. data/lua-hooks/ext/luajit/doc/extensions.html +47 -20
  35. data/lua-hooks/ext/luajit/doc/faq.html +2 -2
  36. data/lua-hooks/ext/luajit/doc/install.html +74 -45
  37. data/lua-hooks/ext/luajit/doc/luajit.html +5 -5
  38. data/lua-hooks/ext/luajit/doc/running.html +3 -3
  39. data/lua-hooks/ext/luajit/doc/status.html +13 -8
  40. data/lua-hooks/ext/luajit/dynasm/dasm_arm.h +1 -1
  41. data/lua-hooks/ext/luajit/dynasm/dasm_arm.lua +1 -1
  42. data/lua-hooks/ext/luajit/dynasm/dasm_arm64.h +1 -1
  43. data/lua-hooks/ext/luajit/dynasm/dasm_arm64.lua +1 -1
  44. data/lua-hooks/ext/luajit/dynasm/dasm_mips.h +8 -5
  45. data/lua-hooks/ext/luajit/dynasm/dasm_mips.lua +66 -11
  46. data/lua-hooks/ext/luajit/dynasm/dasm_mips64.lua +12 -0
  47. data/lua-hooks/ext/luajit/dynasm/dasm_ppc.h +1 -1
  48. data/lua-hooks/ext/luajit/dynasm/dasm_ppc.lua +1 -1
  49. data/lua-hooks/ext/luajit/dynasm/dasm_proto.h +1 -1
  50. data/lua-hooks/ext/luajit/dynasm/dasm_x64.lua +1 -1
  51. data/lua-hooks/ext/luajit/dynasm/dasm_x86.h +1 -1
  52. data/lua-hooks/ext/luajit/dynasm/dasm_x86.lua +5 -1
  53. data/lua-hooks/ext/luajit/dynasm/dynasm.lua +2 -2
  54. data/lua-hooks/ext/luajit/etc/luajit.1 +1 -1
  55. data/lua-hooks/ext/luajit/etc/luajit.pc +1 -1
  56. data/lua-hooks/ext/luajit/src/Makefile +15 -11
  57. data/lua-hooks/ext/luajit/src/Makefile.dep +16 -16
  58. data/lua-hooks/ext/luajit/src/host/buildvm.c +2 -2
  59. data/lua-hooks/ext/luajit/src/host/buildvm.h +1 -1
  60. data/lua-hooks/ext/luajit/src/host/buildvm_asm.c +9 -4
  61. data/lua-hooks/ext/luajit/src/host/buildvm_fold.c +2 -2
  62. data/lua-hooks/ext/luajit/src/host/buildvm_lib.c +1 -1
  63. data/lua-hooks/ext/luajit/src/host/buildvm_libbc.h +14 -3
  64. data/lua-hooks/ext/luajit/src/host/buildvm_peobj.c +27 -3
  65. data/lua-hooks/ext/luajit/src/host/genlibbc.lua +1 -1
  66. data/lua-hooks/ext/luajit/src/host/genminilua.lua +6 -5
  67. data/lua-hooks/ext/luajit/src/host/minilua.c +1 -1
  68. data/lua-hooks/ext/luajit/src/jit/bc.lua +1 -1
  69. data/lua-hooks/ext/luajit/src/jit/bcsave.lua +8 -8
  70. data/lua-hooks/ext/luajit/src/jit/dis_arm.lua +2 -2
  71. data/lua-hooks/ext/luajit/src/jit/dis_arm64.lua +1216 -0
  72. data/lua-hooks/ext/luajit/src/jit/dis_arm64be.lua +12 -0
  73. data/lua-hooks/ext/luajit/src/jit/dis_mips.lua +35 -20
  74. data/lua-hooks/ext/luajit/src/jit/dis_mips64.lua +17 -0
  75. data/lua-hooks/ext/luajit/src/jit/dis_mips64el.lua +17 -0
  76. data/lua-hooks/ext/luajit/src/jit/dis_mipsel.lua +1 -1
  77. data/lua-hooks/ext/luajit/src/jit/dis_ppc.lua +2 -2
  78. data/lua-hooks/ext/luajit/src/jit/dis_x64.lua +1 -1
  79. data/lua-hooks/ext/luajit/src/jit/dis_x86.lua +7 -4
  80. data/lua-hooks/ext/luajit/src/jit/dump.lua +17 -12
  81. data/lua-hooks/ext/luajit/src/jit/p.lua +3 -2
  82. data/lua-hooks/ext/luajit/src/jit/v.lua +2 -2
  83. data/lua-hooks/ext/luajit/src/jit/zone.lua +1 -1
  84. data/lua-hooks/ext/luajit/src/lauxlib.h +14 -20
  85. data/lua-hooks/ext/luajit/src/lib_aux.c +38 -27
  86. data/lua-hooks/ext/luajit/src/lib_base.c +12 -5
  87. data/lua-hooks/ext/luajit/src/lib_bit.c +1 -1
  88. data/lua-hooks/ext/luajit/src/lib_debug.c +5 -5
  89. data/lua-hooks/ext/luajit/src/lib_ffi.c +2 -2
  90. data/lua-hooks/ext/luajit/src/lib_init.c +16 -16
  91. data/lua-hooks/ext/luajit/src/lib_io.c +6 -7
  92. data/lua-hooks/ext/luajit/src/lib_jit.c +14 -4
  93. data/lua-hooks/ext/luajit/src/lib_math.c +1 -5
  94. data/lua-hooks/ext/luajit/src/lib_os.c +1 -1
  95. data/lua-hooks/ext/luajit/src/lib_package.c +14 -23
  96. data/lua-hooks/ext/luajit/src/lib_string.c +1 -5
  97. data/lua-hooks/ext/luajit/src/lib_table.c +21 -1
  98. data/lua-hooks/ext/luajit/src/lj.supp +3 -3
  99. data/lua-hooks/ext/luajit/src/lj_alloc.c +174 -83
  100. data/lua-hooks/ext/luajit/src/lj_api.c +97 -18
  101. data/lua-hooks/ext/luajit/src/lj_arch.h +54 -22
  102. data/lua-hooks/ext/luajit/src/lj_asm.c +172 -53
  103. data/lua-hooks/ext/luajit/src/lj_asm.h +1 -1
  104. data/lua-hooks/ext/luajit/src/lj_asm_arm.h +19 -16
  105. data/lua-hooks/ext/luajit/src/lj_asm_arm64.h +2022 -0
  106. data/lua-hooks/ext/luajit/src/lj_asm_mips.h +564 -158
  107. data/lua-hooks/ext/luajit/src/lj_asm_ppc.h +19 -18
  108. data/lua-hooks/ext/luajit/src/lj_asm_x86.h +578 -92
  109. data/lua-hooks/ext/luajit/src/lj_bc.c +1 -1
  110. data/lua-hooks/ext/luajit/src/lj_bc.h +1 -1
  111. data/lua-hooks/ext/luajit/src/lj_bcdump.h +1 -1
  112. data/lua-hooks/ext/luajit/src/lj_bcread.c +1 -1
  113. data/lua-hooks/ext/luajit/src/lj_bcwrite.c +1 -1
  114. data/lua-hooks/ext/luajit/src/lj_buf.c +1 -1
  115. data/lua-hooks/ext/luajit/src/lj_buf.h +1 -1
  116. data/lua-hooks/ext/luajit/src/lj_carith.c +1 -1
  117. data/lua-hooks/ext/luajit/src/lj_carith.h +1 -1
  118. data/lua-hooks/ext/luajit/src/lj_ccall.c +172 -7
  119. data/lua-hooks/ext/luajit/src/lj_ccall.h +21 -5
  120. data/lua-hooks/ext/luajit/src/lj_ccallback.c +71 -17
  121. data/lua-hooks/ext/luajit/src/lj_ccallback.h +1 -1
  122. data/lua-hooks/ext/luajit/src/lj_cconv.c +4 -2
  123. data/lua-hooks/ext/luajit/src/lj_cconv.h +1 -1
  124. data/lua-hooks/ext/luajit/src/lj_cdata.c +7 -5
  125. data/lua-hooks/ext/luajit/src/lj_cdata.h +1 -1
  126. data/lua-hooks/ext/luajit/src/lj_clib.c +5 -5
  127. data/lua-hooks/ext/luajit/src/lj_clib.h +1 -1
  128. data/lua-hooks/ext/luajit/src/lj_cparse.c +11 -6
  129. data/lua-hooks/ext/luajit/src/lj_cparse.h +1 -1
  130. data/lua-hooks/ext/luajit/src/lj_crecord.c +70 -14
  131. data/lua-hooks/ext/luajit/src/lj_crecord.h +1 -1
  132. data/lua-hooks/ext/luajit/src/lj_ctype.c +1 -1
  133. data/lua-hooks/ext/luajit/src/lj_ctype.h +8 -8
  134. data/lua-hooks/ext/luajit/src/lj_debug.c +1 -1
  135. data/lua-hooks/ext/luajit/src/lj_debug.h +1 -1
  136. data/lua-hooks/ext/luajit/src/lj_def.h +6 -9
  137. data/lua-hooks/ext/luajit/src/lj_dispatch.c +3 -3
  138. data/lua-hooks/ext/luajit/src/lj_dispatch.h +2 -1
  139. data/lua-hooks/ext/luajit/src/lj_emit_arm.h +5 -4
  140. data/lua-hooks/ext/luajit/src/lj_emit_arm64.h +419 -0
  141. data/lua-hooks/ext/luajit/src/lj_emit_mips.h +100 -20
  142. data/lua-hooks/ext/luajit/src/lj_emit_ppc.h +4 -4
  143. data/lua-hooks/ext/luajit/src/lj_emit_x86.h +116 -25
  144. data/lua-hooks/ext/luajit/src/lj_err.c +34 -13
  145. data/lua-hooks/ext/luajit/src/lj_err.h +1 -1
  146. data/lua-hooks/ext/luajit/src/lj_errmsg.h +1 -1
  147. data/lua-hooks/ext/luajit/src/lj_ff.h +1 -1
  148. data/lua-hooks/ext/luajit/src/lj_ffrecord.c +58 -49
  149. data/lua-hooks/ext/luajit/src/lj_ffrecord.h +1 -1
  150. data/lua-hooks/ext/luajit/src/lj_frame.h +33 -6
  151. data/lua-hooks/ext/luajit/src/lj_func.c +4 -2
  152. data/lua-hooks/ext/luajit/src/lj_func.h +1 -1
  153. data/lua-hooks/ext/luajit/src/lj_gc.c +16 -7
  154. data/lua-hooks/ext/luajit/src/lj_gc.h +1 -1
  155. data/lua-hooks/ext/luajit/src/lj_gdbjit.c +31 -1
  156. data/lua-hooks/ext/luajit/src/lj_gdbjit.h +1 -1
  157. data/lua-hooks/ext/luajit/src/lj_ir.c +69 -96
  158. data/lua-hooks/ext/luajit/src/lj_ir.h +29 -18
  159. data/lua-hooks/ext/luajit/src/lj_ircall.h +24 -30
  160. data/lua-hooks/ext/luajit/src/lj_iropt.h +9 -9
  161. data/lua-hooks/ext/luajit/src/lj_jit.h +67 -9
  162. data/lua-hooks/ext/luajit/src/lj_lex.c +1 -1
  163. data/lua-hooks/ext/luajit/src/lj_lex.h +1 -1
  164. data/lua-hooks/ext/luajit/src/lj_lib.c +1 -1
  165. data/lua-hooks/ext/luajit/src/lj_lib.h +1 -1
  166. data/lua-hooks/ext/luajit/src/lj_load.c +1 -1
  167. data/lua-hooks/ext/luajit/src/lj_mcode.c +11 -10
  168. data/lua-hooks/ext/luajit/src/lj_mcode.h +1 -1
  169. data/lua-hooks/ext/luajit/src/lj_meta.c +1 -1
  170. data/lua-hooks/ext/luajit/src/lj_meta.h +1 -1
  171. data/lua-hooks/ext/luajit/src/lj_obj.c +1 -1
  172. data/lua-hooks/ext/luajit/src/lj_obj.h +7 -3
  173. data/lua-hooks/ext/luajit/src/lj_opt_dce.c +1 -1
  174. data/lua-hooks/ext/luajit/src/lj_opt_fold.c +84 -17
  175. data/lua-hooks/ext/luajit/src/lj_opt_loop.c +1 -1
  176. data/lua-hooks/ext/luajit/src/lj_opt_mem.c +3 -3
  177. data/lua-hooks/ext/luajit/src/lj_opt_narrow.c +24 -22
  178. data/lua-hooks/ext/luajit/src/lj_opt_sink.c +11 -6
  179. data/lua-hooks/ext/luajit/src/lj_opt_split.c +11 -2
  180. data/lua-hooks/ext/luajit/src/lj_parse.c +9 -7
  181. data/lua-hooks/ext/luajit/src/lj_parse.h +1 -1
  182. data/lua-hooks/ext/luajit/src/lj_profile.c +1 -1
  183. data/lua-hooks/ext/luajit/src/lj_profile.h +1 -1
  184. data/lua-hooks/ext/luajit/src/lj_record.c +201 -117
  185. data/lua-hooks/ext/luajit/src/lj_record.h +1 -1
  186. data/lua-hooks/ext/luajit/src/lj_snap.c +72 -26
  187. data/lua-hooks/ext/luajit/src/lj_snap.h +1 -1
  188. data/lua-hooks/ext/luajit/src/lj_state.c +6 -6
  189. data/lua-hooks/ext/luajit/src/lj_state.h +2 -2
  190. data/lua-hooks/ext/luajit/src/lj_str.c +1 -1
  191. data/lua-hooks/ext/luajit/src/lj_str.h +1 -1
  192. data/lua-hooks/ext/luajit/src/lj_strfmt.c +7 -3
  193. data/lua-hooks/ext/luajit/src/lj_strfmt.h +1 -1
  194. data/lua-hooks/ext/luajit/src/lj_strfmt_num.c +4 -3
  195. data/lua-hooks/ext/luajit/src/lj_strscan.c +1 -1
  196. data/lua-hooks/ext/luajit/src/lj_strscan.h +1 -1
  197. data/lua-hooks/ext/luajit/src/lj_tab.c +1 -2
  198. data/lua-hooks/ext/luajit/src/lj_tab.h +1 -1
  199. data/lua-hooks/ext/luajit/src/lj_target.h +3 -3
  200. data/lua-hooks/ext/luajit/src/lj_target_arm.h +1 -1
  201. data/lua-hooks/ext/luajit/src/lj_target_arm64.h +239 -7
  202. data/lua-hooks/ext/luajit/src/lj_target_mips.h +111 -22
  203. data/lua-hooks/ext/luajit/src/lj_target_ppc.h +1 -1
  204. data/lua-hooks/ext/luajit/src/lj_target_x86.h +21 -4
  205. data/lua-hooks/ext/luajit/src/lj_trace.c +63 -18
  206. data/lua-hooks/ext/luajit/src/lj_trace.h +2 -1
  207. data/lua-hooks/ext/luajit/src/lj_traceerr.h +1 -1
  208. data/lua-hooks/ext/luajit/src/lj_udata.c +1 -1
  209. data/lua-hooks/ext/luajit/src/lj_udata.h +1 -1
  210. data/lua-hooks/ext/luajit/src/lj_vm.h +5 -1
  211. data/lua-hooks/ext/luajit/src/lj_vmevent.c +1 -1
  212. data/lua-hooks/ext/luajit/src/lj_vmevent.h +1 -1
  213. data/lua-hooks/ext/luajit/src/lj_vmmath.c +1 -1
  214. data/lua-hooks/ext/luajit/src/ljamalg.c +1 -1
  215. data/lua-hooks/ext/luajit/src/lua.h +9 -1
  216. data/lua-hooks/ext/luajit/src/luaconf.h +3 -7
  217. data/lua-hooks/ext/luajit/src/luajit.c +69 -54
  218. data/lua-hooks/ext/luajit/src/luajit.h +4 -4
  219. data/lua-hooks/ext/luajit/src/lualib.h +1 -1
  220. data/lua-hooks/ext/luajit/src/msvcbuild.bat +12 -4
  221. data/lua-hooks/ext/luajit/src/vm_arm.dasc +1 -1
  222. data/lua-hooks/ext/luajit/src/vm_arm64.dasc +255 -32
  223. data/lua-hooks/ext/luajit/src/vm_mips.dasc +26 -23
  224. data/lua-hooks/ext/luajit/src/vm_mips64.dasc +5062 -0
  225. data/lua-hooks/ext/luajit/src/vm_ppc.dasc +1 -1
  226. data/lua-hooks/ext/luajit/src/vm_x64.dasc +24 -25
  227. data/lua-hooks/ext/luajit/src/vm_x86.dasc +77 -4
  228. data/lua-hooks/libluahooks.darwin.a +0 -0
  229. data/lua-hooks/libluahooks.linux.a +0 -0
  230. data/lua-hooks/options.mk +1 -1
  231. metadata +37 -77
  232. data/lua-hooks/ext/all.c +0 -69
  233. data/lua-hooks/ext/libinjection/COPYING +0 -37
  234. data/lua-hooks/ext/libinjection/libinjection.h +0 -65
  235. data/lua-hooks/ext/libinjection/libinjection_html5.c +0 -847
  236. data/lua-hooks/ext/libinjection/libinjection_html5.h +0 -54
  237. data/lua-hooks/ext/libinjection/libinjection_sqli.c +0 -2301
  238. data/lua-hooks/ext/libinjection/libinjection_sqli.h +0 -295
  239. data/lua-hooks/ext/libinjection/libinjection_sqli_data.h +0 -9349
  240. data/lua-hooks/ext/libinjection/libinjection_xss.c +0 -531
  241. data/lua-hooks/ext/libinjection/libinjection_xss.h +0 -21
  242. data/lua-hooks/ext/libinjection/lualib.c +0 -145
  243. data/lua-hooks/ext/libinjection/module.mk +0 -5
  244. data/lua-hooks/ext/lpeg/HISTORY +0 -96
  245. data/lua-hooks/ext/lpeg/lpcap.c +0 -537
  246. data/lua-hooks/ext/lpeg/lpcap.h +0 -56
  247. data/lua-hooks/ext/lpeg/lpcode.c +0 -1014
  248. data/lua-hooks/ext/lpeg/lpcode.h +0 -40
  249. data/lua-hooks/ext/lpeg/lpeg-128.gif +0 -0
  250. data/lua-hooks/ext/lpeg/lpeg.html +0 -1445
  251. data/lua-hooks/ext/lpeg/lpprint.c +0 -244
  252. data/lua-hooks/ext/lpeg/lpprint.h +0 -36
  253. data/lua-hooks/ext/lpeg/lptree.c +0 -1303
  254. data/lua-hooks/ext/lpeg/lptree.h +0 -82
  255. data/lua-hooks/ext/lpeg/lptypes.h +0 -149
  256. data/lua-hooks/ext/lpeg/lpvm.c +0 -364
  257. data/lua-hooks/ext/lpeg/lpvm.h +0 -58
  258. data/lua-hooks/ext/lpeg/makefile +0 -55
  259. data/lua-hooks/ext/lpeg/module.mk +0 -6
  260. data/lua-hooks/ext/lpeg/re.html +0 -498
  261. data/lua-hooks/ext/lua-cmsgpack/.gitignore +0 -13
  262. data/lua-hooks/ext/lua-cmsgpack/CMakeLists.txt +0 -45
  263. data/lua-hooks/ext/lua-cmsgpack/README.md +0 -115
  264. data/lua-hooks/ext/lua-cmsgpack/lua_cmsgpack.c +0 -970
  265. data/lua-hooks/ext/lua-cmsgpack/module.mk +0 -2
  266. data/lua-hooks/ext/lua-cmsgpack/test.lua +0 -570
  267. data/lua-hooks/ext/lua-snapshot/LICENSE +0 -7
  268. data/lua-hooks/ext/lua-snapshot/Makefile +0 -12
  269. data/lua-hooks/ext/lua-snapshot/README.md +0 -18
  270. data/lua-hooks/ext/lua-snapshot/dump.lua +0 -15
  271. data/lua-hooks/ext/lua-snapshot/module.mk +0 -2
  272. data/lua-hooks/ext/lua-snapshot/snapshot.c +0 -462
  273. data/lua-hooks/ext/luautf8/README.md +0 -152
  274. data/lua-hooks/ext/luautf8/lutf8lib.c +0 -1274
  275. data/lua-hooks/ext/luautf8/module.mk +0 -2
  276. data/lua-hooks/ext/luautf8/unidata.h +0 -3064
  277. data/lua-hooks/ext/module.mk +0 -15
  278. data/lua-hooks/ext/modules.h +0 -17
  279. data/lua-hooks/ext/perf/luacpu.c +0 -114
  280. data/lua-hooks/ext/perf/lualoadavg.c +0 -40
  281. data/lua-hooks/ext/perf/luameminfo.c +0 -38
  282. data/lua-hooks/ext/perf/luaoslib.c +0 -203
  283. data/lua-hooks/ext/perf/module.mk +0 -5
  284. data/lua-hooks/ext/sha1/luasha1.c +0 -74
  285. data/lua-hooks/ext/sha1/module.mk +0 -5
  286. data/lua-hooks/ext/sha1/sha1.c +0 -145
  287. data/lua-hooks/ext/sha2/luasha256.c +0 -77
  288. data/lua-hooks/ext/sha2/module.mk +0 -5
  289. data/lua-hooks/ext/sha2/sha256.c +0 -196
  290. data/lua-hooks/ext/sysutils/lua_utils.c +0 -56
  291. data/lua-hooks/ext/sysutils/module.mk +0 -2
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  ** Target architecture selection.
3
- ** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
3
+ ** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
4
4
  */
5
5
 
6
6
  #ifndef _LJ_ARCH_H
@@ -25,6 +25,10 @@
25
25
  #define LUAJIT_ARCH_ppc 5
26
26
  #define LUAJIT_ARCH_MIPS 6
27
27
  #define LUAJIT_ARCH_mips 6
28
+ #define LUAJIT_ARCH_MIPS32 6
29
+ #define LUAJIT_ARCH_mips32 6
30
+ #define LUAJIT_ARCH_MIPS64 7
31
+ #define LUAJIT_ARCH_mips64 7
28
32
 
29
33
  /* Target OS. */
30
34
  #define LUAJIT_OS_OTHER 0
@@ -47,8 +51,10 @@
47
51
  #define LUAJIT_TARGET LUAJIT_ARCH_ARM64
48
52
  #elif defined(__ppc__) || defined(__ppc) || defined(__PPC__) || defined(__PPC) || defined(__powerpc__) || defined(__powerpc) || defined(__POWERPC__) || defined(__POWERPC) || defined(_M_PPC)
49
53
  #define LUAJIT_TARGET LUAJIT_ARCH_PPC
54
+ #elif defined(__mips64__) || defined(__mips64) || defined(__MIPS64__) || defined(__MIPS64)
55
+ #define LUAJIT_TARGET LUAJIT_ARCH_MIPS64
50
56
  #elif defined(__mips__) || defined(__mips) || defined(__MIPS__) || defined(__MIPS)
51
- #define LUAJIT_TARGET LUAJIT_ARCH_MIPS
57
+ #define LUAJIT_TARGET LUAJIT_ARCH_MIPS32
52
58
  #else
53
59
  #error "No support for this architecture (yet)"
54
60
  #endif
@@ -68,7 +74,10 @@
68
74
  defined(__NetBSD__) || defined(__OpenBSD__) || \
69
75
  defined(__DragonFly__)) && !defined(__ORBIS__)
70
76
  #define LUAJIT_OS LUAJIT_OS_BSD
71
- #elif (defined(__sun__) && defined(__svr4__)) || defined(__CYGWIN__)
77
+ #elif (defined(__sun__) && defined(__svr4__)) || defined(__HAIKU__)
78
+ #define LUAJIT_OS LUAJIT_OS_POSIX
79
+ #elif defined(__CYGWIN__)
80
+ #define LJ_TARGET_CYGWIN 1
72
81
  #define LUAJIT_OS LUAJIT_OS_POSIX
73
82
  #else
74
83
  #define LUAJIT_OS LUAJIT_OS_OTHER
@@ -137,7 +146,7 @@
137
146
  #define LJ_ARCH_NAME "x86"
138
147
  #define LJ_ARCH_BITS 32
139
148
  #define LJ_ARCH_ENDIAN LUAJIT_LE
140
- #if LJ_TARGET_WINDOWS || __CYGWIN__
149
+ #if LJ_TARGET_WINDOWS || LJ_TARGET_CYGWIN
141
150
  #define LJ_ABI_WIN 1
142
151
  #else
143
152
  #define LJ_ABI_WIN 0
@@ -155,7 +164,7 @@
155
164
  #define LJ_ARCH_NAME "x64"
156
165
  #define LJ_ARCH_BITS 64
157
166
  #define LJ_ARCH_ENDIAN LUAJIT_LE
158
- #if LJ_TARGET_WINDOWS || __CYGWIN__
167
+ #if LJ_TARGET_WINDOWS || LJ_TARGET_CYGWIN
159
168
  #define LJ_ABI_WIN 1
160
169
  #else
161
170
  #define LJ_ABI_WIN 0
@@ -206,9 +215,14 @@
206
215
 
207
216
  #elif LUAJIT_TARGET == LUAJIT_ARCH_ARM64
208
217
 
209
- #define LJ_ARCH_NAME "arm64"
210
218
  #define LJ_ARCH_BITS 64
219
+ #if defined(__AARCH64EB__)
220
+ #define LJ_ARCH_NAME "arm64be"
221
+ #define LJ_ARCH_ENDIAN LUAJIT_BE
222
+ #else
223
+ #define LJ_ARCH_NAME "arm64"
211
224
  #define LJ_ARCH_ENDIAN LUAJIT_LE
225
+ #endif
212
226
  #define LJ_TARGET_ARM64 1
213
227
  #define LJ_TARGET_EHRETREG 0
214
228
  #define LJ_TARGET_JUMPRANGE 27 /* +-2^27 = +-128MB */
@@ -217,7 +231,6 @@
217
231
  #define LJ_TARGET_UNIFYROT 2 /* Want only IR_BROR. */
218
232
  #define LJ_TARGET_GC64 1
219
233
  #define LJ_ARCH_NUMMODE LJ_NUMMODE_DUAL
220
- #define LJ_ARCH_NOJIT 1 /* NYI */
221
234
 
222
235
  #define LJ_ARCH_VERSION 80
223
236
 
@@ -286,13 +299,21 @@
286
299
  #define LJ_ARCH_XENON 1
287
300
  #endif
288
301
 
289
- #elif LUAJIT_TARGET == LUAJIT_ARCH_MIPS
302
+ #elif LUAJIT_TARGET == LUAJIT_ARCH_MIPS32 || LUAJIT_TARGET == LUAJIT_ARCH_MIPS64
290
303
 
291
304
  #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL)
305
+ #if LUAJIT_TARGET == LUAJIT_ARCH_MIPS32
292
306
  #define LJ_ARCH_NAME "mipsel"
307
+ #else
308
+ #define LJ_ARCH_NAME "mips64el"
309
+ #endif
293
310
  #define LJ_ARCH_ENDIAN LUAJIT_LE
294
311
  #else
312
+ #if LUAJIT_TARGET == LUAJIT_ARCH_MIPS32
295
313
  #define LJ_ARCH_NAME "mips"
314
+ #else
315
+ #define LJ_ARCH_NAME "mips64"
316
+ #endif
296
317
  #define LJ_ARCH_ENDIAN LUAJIT_BE
297
318
  #endif
298
319
 
@@ -304,11 +325,6 @@
304
325
  #endif
305
326
  #endif
306
327
 
307
- /* Temporarily disable features until the code has been merged. */
308
- #if !defined(LUAJIT_NO_UNWIND) && __GNU_COMPACT_EH__
309
- #define LUAJIT_NO_UNWIND 1
310
- #endif
311
-
312
328
  #if !defined(LJ_ABI_SOFTFP)
313
329
  #ifdef __mips_soft_float
314
330
  #define LJ_ABI_SOFTFP 1
@@ -317,7 +333,17 @@
317
333
  #endif
318
334
  #endif
319
335
 
336
+ #if LUAJIT_TARGET == LUAJIT_ARCH_MIPS32
320
337
  #define LJ_ARCH_BITS 32
338
+ #define LJ_TARGET_MIPS32 1
339
+ #else
340
+ #if LJ_ABI_SOFTFP || !LJ_ARCH_HASFPU
341
+ #define LJ_ARCH_NOJIT 1 /* NYI */
342
+ #endif
343
+ #define LJ_ARCH_BITS 64
344
+ #define LJ_TARGET_MIPS64 1
345
+ #define LJ_TARGET_GC64 1
346
+ #endif
321
347
  #define LJ_TARGET_MIPS 1
322
348
  #define LJ_TARGET_EHRETREG 4
323
349
  #define LJ_TARGET_JUMPRANGE 27 /* 2*2^27 = 256MB-aligned region */
@@ -326,7 +352,7 @@
326
352
  #define LJ_TARGET_UNIFYROT 2 /* Want only IR_BROR. */
327
353
  #define LJ_ARCH_NUMMODE LJ_NUMMODE_DUAL
328
354
 
329
- #if _MIPS_ARCH_MIPS32R2
355
+ #if _MIPS_ARCH_MIPS32R2 || _MIPS_ARCH_MIPS64R2
330
356
  #define LJ_ARCH_VERSION 20
331
357
  #else
332
358
  #define LJ_ARCH_VERSION 10
@@ -356,7 +382,7 @@
356
382
  #endif
357
383
  #elif LJ_TARGET_ARM64
358
384
  #if __clang__
359
- #if (__clang_major__ < 3) || ((__clang_major__ == 3) && __clang_minor__ < 5)
385
+ #if ((__clang_major__ < 3) || ((__clang_major__ == 3) && __clang_minor__ < 5)) && !defined(__NX_TOOLCHAIN_MAJOR__)
360
386
  #error "Need at least Clang 3.5 or newer"
361
387
  #endif
362
388
  #else
@@ -388,9 +414,6 @@
388
414
  #error "Only ARM EABI or iOS 3.0+ ABI is supported"
389
415
  #endif
390
416
  #elif LJ_TARGET_ARM64
391
- #if defined(__AARCH64EB__)
392
- #error "No support for big-endian ARM64"
393
- #endif
394
417
  #if defined(_ILP32)
395
418
  #error "No support for ILP32 model on ARM64"
396
419
  #endif
@@ -407,9 +430,13 @@
407
430
  #ifdef __NO_FPRS__
408
431
  #error "No support for PPC/e500 anymore (use LuaJIT 2.0)"
409
432
  #endif
410
- #elif LJ_TARGET_MIPS
411
- #if defined(_LP64)
412
- #error "No support for MIPS64"
433
+ #elif LJ_TARGET_MIPS32
434
+ #if !((defined(_MIPS_SIM_ABI32) && _MIPS_SIM == _MIPS_SIM_ABI32) || (defined(_ABIO32) && _MIPS_SIM == _ABIO32))
435
+ #error "Only o32 ABI supported for MIPS32"
436
+ #endif
437
+ #elif LJ_TARGET_MIPS64
438
+ #if !((defined(_MIPS_SIM_ABI64) && _MIPS_SIM == _MIPS_SIM_ABI64) || (defined(_ABI64) && _MIPS_SIM == _ABI64))
439
+ #error "Only n64 ABI supported for MIPS64"
413
440
  #endif
414
441
  #endif
415
442
  #endif
@@ -450,7 +477,7 @@
450
477
  #endif
451
478
 
452
479
  /* Disable or enable the JIT compiler. */
453
- #if defined(LUAJIT_DISABLE_JIT) || defined(LJ_ARCH_NOJIT) || defined(LJ_OS_NOJIT) || LJ_FR2 || LJ_GC64
480
+ #if defined(LUAJIT_DISABLE_JIT) || defined(LJ_ARCH_NOJIT) || defined(LJ_OS_NOJIT)
454
481
  #define LJ_HASJIT 0
455
482
  #else
456
483
  #define LJ_HASJIT 1
@@ -521,6 +548,11 @@
521
548
  #define LJ_NO_SYSTEM 1
522
549
  #endif
523
550
 
551
+ #if !defined(LUAJIT_NO_UNWIND) && __GNU_COMPACT_EH__
552
+ /* NYI: no support for compact unwind specification, yet. */
553
+ #define LUAJIT_NO_UNWIND 1
554
+ #endif
555
+
524
556
  #if defined(LUAJIT_NO_UNWIND) || defined(__symbian__) || LJ_TARGET_IOS || LJ_TARGET_PS3 || LJ_TARGET_PS4
525
557
  #define LJ_NO_UNWIND 1
526
558
  #endif
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  ** IR assembler (SSA IR -> machine code).
3
- ** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
3
+ ** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
4
4
  */
5
5
 
6
6
  #define lj_asm_c
@@ -91,7 +91,7 @@ typedef struct ASMState {
91
91
  MCode *realign; /* Realign loop if not NULL. */
92
92
 
93
93
  #ifdef RID_NUM_KREF
94
- int32_t krefk[RID_NUM_KREF];
94
+ intptr_t krefk[RID_NUM_KREF];
95
95
  #endif
96
96
  IRRef1 phireg[RID_MAX]; /* PHI register references. */
97
97
  uint16_t parentmap[LJ_MAX_JSLOTS]; /* Parent instruction to RegSP map. */
@@ -144,7 +144,7 @@ static LJ_AINLINE void checkmclim(ASMState *as)
144
144
  #define ra_krefreg(ref) ((Reg)(RID_MIN_KREF + (Reg)(ref)))
145
145
  #define ra_krefk(as, ref) (as->krefk[(ref)])
146
146
 
147
- static LJ_AINLINE void ra_setkref(ASMState *as, Reg r, int32_t k)
147
+ static LJ_AINLINE void ra_setkref(ASMState *as, Reg r, intptr_t k)
148
148
  {
149
149
  IRRef ref = (IRRef)(r - RID_MIN_KREF);
150
150
  as->krefk[ref] = k;
@@ -171,6 +171,8 @@ IRFLDEF(FLOFS)
171
171
  #include "lj_emit_x86.h"
172
172
  #elif LJ_TARGET_ARM
173
173
  #include "lj_emit_arm.h"
174
+ #elif LJ_TARGET_ARM64
175
+ #include "lj_emit_arm64.h"
174
176
  #elif LJ_TARGET_PPC
175
177
  #include "lj_emit_ppc.h"
176
178
  #elif LJ_TARGET_MIPS
@@ -322,7 +324,11 @@ static Reg ra_rematk(ASMState *as, IRRef ref)
322
324
  lua_assert(!rset_test(as->freeset, r));
323
325
  ra_free(as, r);
324
326
  ra_modified(as, r);
327
+ #if LJ_64
328
+ emit_loadu64(as, r, ra_krefk(as, ref));
329
+ #else
325
330
  emit_loadi(as, r, ra_krefk(as, ref));
331
+ #endif
326
332
  return r;
327
333
  }
328
334
  ir = IR(ref);
@@ -334,7 +340,7 @@ static Reg ra_rematk(ASMState *as, IRRef ref)
334
340
  RA_DBGX((as, "remat $i $r", ir, r));
335
341
  #if !LJ_SOFTFP
336
342
  if (ir->o == IR_KNUM) {
337
- emit_loadn(as, r, ir_knum(ir));
343
+ emit_loadk64(as, r, ir);
338
344
  } else
339
345
  #endif
340
346
  if (emit_canremat(REF_BASE) && ir->o == IR_BASE) {
@@ -346,6 +352,12 @@ static Reg ra_rematk(ASMState *as, IRRef ref)
346
352
  #if LJ_64
347
353
  } else if (ir->o == IR_KINT64) {
348
354
  emit_loadu64(as, r, ir_kint64(ir)->u64);
355
+ #if LJ_GC64
356
+ } else if (ir->o == IR_KGC) {
357
+ emit_loadu64(as, r, (uintptr_t)ir_kgc(ir));
358
+ } else if (ir->o == IR_KPTR || ir->o == IR_KKPTR) {
359
+ emit_loadu64(as, r, (uintptr_t)ir_kptr(ir));
360
+ #endif
349
361
  #endif
350
362
  } else {
351
363
  lua_assert(ir->o == IR_KINT || ir->o == IR_KGC ||
@@ -518,7 +530,7 @@ static void ra_evictk(ASMState *as)
518
530
 
519
531
  #ifdef RID_NUM_KREF
520
532
  /* Allocate a register for a constant. */
521
- static Reg ra_allock(ASMState *as, int32_t k, RegSet allow)
533
+ static Reg ra_allock(ASMState *as, intptr_t k, RegSet allow)
522
534
  {
523
535
  /* First try to find a register which already holds the same constant. */
524
536
  RegSet pick, work = ~as->freeset & RSET_GPR;
@@ -527,9 +539,31 @@ static Reg ra_allock(ASMState *as, int32_t k, RegSet allow)
527
539
  IRRef ref;
528
540
  r = rset_pickbot(work);
529
541
  ref = regcost_ref(as->cost[r]);
542
+ #if LJ_64
543
+ if (ref < ASMREF_L) {
544
+ if (ra_iskref(ref)) {
545
+ if (k == ra_krefk(as, ref))
546
+ return r;
547
+ } else {
548
+ IRIns *ir = IR(ref);
549
+ if ((ir->o == IR_KINT64 && k == (int64_t)ir_kint64(ir)->u64) ||
550
+ #if LJ_GC64
551
+ (ir->o == IR_KINT && k == ir->i) ||
552
+ (ir->o == IR_KGC && k == (intptr_t)ir_kgc(ir)) ||
553
+ ((ir->o == IR_KPTR || ir->o == IR_KKPTR) &&
554
+ k == (intptr_t)ir_kptr(ir))
555
+ #else
556
+ (ir->o != IR_KINT64 && k == ir->i)
557
+ #endif
558
+ )
559
+ return r;
560
+ }
561
+ }
562
+ #else
530
563
  if (ref < ASMREF_L &&
531
564
  k == (ra_iskref(ref) ? ra_krefk(as, ref) : IR(ref)->i))
532
565
  return r;
566
+ #endif
533
567
  rset_clear(work, r);
534
568
  }
535
569
  pick = as->freeset & allow;
@@ -549,7 +583,7 @@ static Reg ra_allock(ASMState *as, int32_t k, RegSet allow)
549
583
  }
550
584
 
551
585
  /* Allocate a specific register for a constant. */
552
- static void ra_allockreg(ASMState *as, int32_t k, Reg r)
586
+ static void ra_allockreg(ASMState *as, intptr_t k, Reg r)
553
587
  {
554
588
  Reg kr = ra_allock(as, k, RID2RSET(r));
555
589
  if (kr != r) {
@@ -619,10 +653,20 @@ static Reg ra_alloc1(ASMState *as, IRRef ref, RegSet allow)
619
653
  return r;
620
654
  }
621
655
 
656
+ /* Add a register rename to the IR. */
657
+ static void ra_addrename(ASMState *as, Reg down, IRRef ref, SnapNo snapno)
658
+ {
659
+ IRRef ren;
660
+ lj_ir_set(as->J, IRT(IR_RENAME, IRT_NIL), ref, snapno);
661
+ ren = tref_ref(lj_ir_emit(as->J));
662
+ as->J->cur.ir[ren].r = (uint8_t)down;
663
+ as->J->cur.ir[ren].s = SPS_NONE;
664
+ }
665
+
622
666
  /* Rename register allocation and emit move. */
623
667
  static void ra_rename(ASMState *as, Reg down, Reg up)
624
668
  {
625
- IRRef ren, ref = regcost_ref(as->cost[up] = as->cost[down]);
669
+ IRRef ref = regcost_ref(as->cost[up] = as->cost[down]);
626
670
  IRIns *ir = IR(ref);
627
671
  ir->r = (uint8_t)up;
628
672
  as->cost[down] = 0;
@@ -635,11 +679,7 @@ static void ra_rename(ASMState *as, Reg down, Reg up)
635
679
  RA_DBGX((as, "rename $f $r $r", regcost_ref(as->cost[up]), down, up));
636
680
  emit_movrr(as, ir, down, up); /* Backwards codegen needs inverse move. */
637
681
  if (!ra_hasspill(IR(ref)->s)) { /* Add the rename to the IR. */
638
- lj_ir_set(as->J, IRT(IR_RENAME, IRT_NIL), ref, as->snapno);
639
- ren = tref_ref(lj_ir_emit(as->J));
640
- as->ir = as->T->ir; /* The IR may have been reallocated. */
641
- IR(ren)->r = (uint8_t)down;
642
- IR(ren)->s = SPS_NONE;
682
+ ra_addrename(as, down, ref, as->snapno);
643
683
  }
644
684
  }
645
685
 
@@ -689,16 +729,20 @@ static void ra_left(ASMState *as, Reg dest, IRRef lref)
689
729
  if (ra_noreg(left)) {
690
730
  if (irref_isk(lref)) {
691
731
  if (ir->o == IR_KNUM) {
692
- cTValue *tv = ir_knum(ir);
693
732
  /* FP remat needs a load except for +0. Still better than eviction. */
694
- if (tvispzero(tv) || !(as->freeset & RSET_FPR)) {
695
- emit_loadn(as, dest, tv);
733
+ if (tvispzero(ir_knum(ir)) || !(as->freeset & RSET_FPR)) {
734
+ emit_loadk64(as, dest, ir);
696
735
  return;
697
736
  }
698
737
  #if LJ_64
699
738
  } else if (ir->o == IR_KINT64) {
700
- emit_loadu64(as, dest, ir_kint64(ir)->u64);
739
+ emit_loadk64(as, dest, ir);
740
+ return;
741
+ #if LJ_GC64
742
+ } else if (ir->o == IR_KGC || ir->o == IR_KPTR || ir->o == IR_KKPTR) {
743
+ emit_loadk64(as, dest, ir);
701
744
  return;
745
+ #endif
702
746
  #endif
703
747
  } else if (ir->o != IR_KPRI) {
704
748
  lua_assert(ir->o == IR_KINT || ir->o == IR_KGC ||
@@ -941,7 +985,7 @@ static void asm_snap_prep(ASMState *as)
941
985
  } else {
942
986
  /* Process any renames above the highwater mark. */
943
987
  for (; as->snaprename < as->T->nins; as->snaprename++) {
944
- IRIns *ir = IR(as->snaprename);
988
+ IRIns *ir = &as->T->ir[as->snaprename];
945
989
  if (asm_snap_checkrename(as, ir->op1))
946
990
  ir->op2 = REF_BIAS-1; /* Kill rename. */
947
991
  }
@@ -1055,7 +1099,7 @@ static void asm_bufhdr(ASMState *as, IRIns *ir)
1055
1099
  }
1056
1100
  } else {
1057
1101
  Reg tmp = ra_scratch(as, rset_exclude(RSET_GPR, sb));
1058
- /* Passing ir isn't strictly correct, but it's an IRT_P32, too. */
1102
+ /* Passing ir isn't strictly correct, but it's an IRT_PGC, too. */
1059
1103
  emit_storeofs(as, ir, tmp, sb, offsetof(SBuf, p));
1060
1104
  emit_loadofs(as, ir, tmp, sb, offsetof(SBuf, b));
1061
1105
  }
@@ -1472,12 +1516,7 @@ static void asm_phi_fixup(ASMState *as)
1472
1516
  irt_clearmark(ir->t);
1473
1517
  /* Left PHI gained a spill slot before the loop? */
1474
1518
  if (ra_hasspill(ir->s)) {
1475
- IRRef ren;
1476
- lj_ir_set(as->J, IRT(IR_RENAME, IRT_NIL), lref, as->loopsnapno);
1477
- ren = tref_ref(lj_ir_emit(as->J));
1478
- as->ir = as->T->ir; /* The IR may have been reallocated. */
1479
- IR(ren)->r = (uint8_t)r;
1480
- IR(ren)->s = SPS_NONE;
1519
+ ra_addrename(as, r, lref, as->loopsnapno);
1481
1520
  }
1482
1521
  }
1483
1522
  rset_clear(work, r);
@@ -1552,6 +1591,8 @@ static void asm_loop(ASMState *as)
1552
1591
  #include "lj_asm_x86.h"
1553
1592
  #elif LJ_TARGET_ARM
1554
1593
  #include "lj_asm_arm.h"
1594
+ #elif LJ_TARGET_ARM64
1595
+ #include "lj_asm_arm64.h"
1555
1596
  #elif LJ_TARGET_PPC
1556
1597
  #include "lj_asm_ppc.h"
1557
1598
  #elif LJ_TARGET_MIPS
@@ -1888,7 +1929,7 @@ static BCReg asm_baseslot(ASMState *as, SnapShot *snap, int *gotframe)
1888
1929
  SnapEntry sn = map[n-1];
1889
1930
  if ((sn & SNAP_FRAME)) {
1890
1931
  *gotframe = 1;
1891
- return snap_slot(sn);
1932
+ return snap_slot(sn) - LJ_FR2;
1892
1933
  }
1893
1934
  }
1894
1935
  return 0;
@@ -1908,16 +1949,20 @@ static void asm_tail_link(ASMState *as)
1908
1949
 
1909
1950
  if (as->T->link == 0) {
1910
1951
  /* Setup fixed registers for exit to interpreter. */
1911
- const BCIns *pc = snap_pc(as->T->snapmap[snap->mapofs + snap->nent]);
1952
+ const BCIns *pc = snap_pc(&as->T->snapmap[snap->mapofs + snap->nent]);
1912
1953
  int32_t mres;
1913
1954
  if (bc_op(*pc) == BC_JLOOP) { /* NYI: find a better way to do this. */
1914
1955
  BCIns *retpc = &traceref(as->J, bc_d(*pc))->startins;
1915
1956
  if (bc_isret(bc_op(*retpc)))
1916
1957
  pc = retpc;
1917
1958
  }
1959
+ #if LJ_GC64
1960
+ emit_loadu64(as, RID_LPC, u64ptr(pc));
1961
+ #else
1918
1962
  ra_allockreg(as, i32ptr(J2GG(as->J)->dispatch), RID_DISPATCH);
1919
1963
  ra_allockreg(as, i32ptr(pc), RID_LPC);
1920
- mres = (int32_t)(snap->nslots - baseslot);
1964
+ #endif
1965
+ mres = (int32_t)(snap->nslots - baseslot - LJ_FR2);
1921
1966
  switch (bc_op(*pc)) {
1922
1967
  case BC_CALLM: case BC_CALLMT:
1923
1968
  mres -= (int32_t)(1 + LJ_FR2 + bc_a(*pc) + bc_c(*pc)); break;
@@ -1932,6 +1977,11 @@ static void asm_tail_link(ASMState *as)
1932
1977
  }
1933
1978
  emit_addptr(as, RID_BASE, 8*(int32_t)baseslot);
1934
1979
 
1980
+ if (as->J->ktrace) { /* Patch ktrace slot with the final GCtrace pointer. */
1981
+ setgcref(IR(as->J->ktrace)[LJ_GC64].gcr, obj2gco(as->J->curfinal));
1982
+ IR(as->J->ktrace)->o = IR_KGC;
1983
+ }
1984
+
1935
1985
  /* Sync the interpreter state with the on-trace state. */
1936
1986
  asm_stack_restore(as, snap);
1937
1987
 
@@ -1957,17 +2007,22 @@ static void asm_setup_regsp(ASMState *as)
1957
2007
  ra_setup(as);
1958
2008
 
1959
2009
  /* Clear reg/sp for constants. */
1960
- for (ir = IR(T->nk), lastir = IR(REF_BASE); ir < lastir; ir++)
2010
+ for (ir = IR(T->nk), lastir = IR(REF_BASE); ir < lastir; ir++) {
1961
2011
  ir->prev = REGSP_INIT;
2012
+ if (irt_is64(ir->t) && ir->o != IR_KNULL) {
2013
+ #if LJ_GC64
2014
+ ir->i = 0; /* Will become non-zero only for RIP-relative addresses. */
2015
+ #else
2016
+ /* Make life easier for backends by putting address of constant in i. */
2017
+ ir->i = (int32_t)(intptr_t)(ir+1);
2018
+ #endif
2019
+ ir++;
2020
+ }
2021
+ }
1962
2022
 
1963
2023
  /* REF_BASE is used for implicit references to the BASE register. */
1964
2024
  lastir->prev = REGSP_HINT(RID_BASE);
1965
2025
 
1966
- ir = IR(nins-1);
1967
- if (ir->o == IR_RENAME) {
1968
- do { ir--; nins--; } while (ir->o == IR_RENAME);
1969
- T->nins = nins; /* Remove any renames left over from ASM restart. */
1970
- }
1971
2026
  as->snaprename = nins;
1972
2027
  as->snapref = nins;
1973
2028
  as->snapno = T->nsnap;
@@ -2150,7 +2205,10 @@ static void asm_setup_regsp(ASMState *as)
2150
2205
  #endif
2151
2206
  #if LJ_TARGET_X86ORX64
2152
2207
  /* Non-constant shift counts need to be in RID_ECX on x86/x64. */
2153
- case IR_BSHL: case IR_BSHR: case IR_BSAR: case IR_BROL: case IR_BROR:
2208
+ case IR_BSHL: case IR_BSHR: case IR_BSAR:
2209
+ if ((as->flags & JIT_F_BMI2)) /* Except if BMI2 is available. */
2210
+ break;
2211
+ case IR_BROL: case IR_BROR:
2154
2212
  if (!irref_isk(ir->op2) && !ra_hashint(IR(ir->op2)->r)) {
2155
2213
  IR(ir->op2)->r = REGSP_HINT(RID_ECX);
2156
2214
  if (inloop)
@@ -2196,14 +2254,25 @@ void lj_asm_trace(jit_State *J, GCtrace *T)
2196
2254
  ASMState *as = &as_;
2197
2255
  MCode *origtop;
2198
2256
 
2257
+ /* Remove nops/renames left over from ASM restart due to LJ_TRERR_MCODELM. */
2258
+ {
2259
+ IRRef nins = T->nins;
2260
+ IRIns *ir = &T->ir[nins-1];
2261
+ if (ir->o == IR_NOP || ir->o == IR_RENAME) {
2262
+ do { ir--; nins--; } while (ir->o == IR_NOP || ir->o == IR_RENAME);
2263
+ T->nins = nins;
2264
+ }
2265
+ }
2266
+
2199
2267
  /* Ensure an initialized instruction beyond the last one for HIOP checks. */
2200
- J->cur.nins = lj_ir_nextins(J);
2201
- J->cur.ir[J->cur.nins].o = IR_NOP;
2268
+ /* This also allows one RENAME to be added without reallocating curfinal. */
2269
+ as->orignins = lj_ir_nextins(J);
2270
+ J->cur.ir[as->orignins].o = IR_NOP;
2202
2271
 
2203
2272
  /* Setup initial state. Copy some fields to reduce indirections. */
2204
2273
  as->J = J;
2205
2274
  as->T = T;
2206
- as->ir = T->ir;
2275
+ J->curfinal = lj_trace_alloc(J->L, T); /* This copies the IR, too. */
2207
2276
  as->flags = J->flags;
2208
2277
  as->loopref = J->loopref;
2209
2278
  as->realign = NULL;
@@ -2216,12 +2285,41 @@ void lj_asm_trace(jit_State *J, GCtrace *T)
2216
2285
  as->mclim = as->mcbot + MCLIM_REDZONE;
2217
2286
  asm_setup_target(as);
2218
2287
 
2219
- do {
2288
+ /*
2289
+ ** This is a loop, because the MCode may have to be (re-)assembled
2290
+ ** multiple times:
2291
+ **
2292
+ ** 1. as->realign is set (and the assembly aborted), if the arch-specific
2293
+ ** backend wants the MCode to be aligned differently.
2294
+ **
2295
+ ** This is currently only the case on x86/x64, where small loops get
2296
+ ** an aligned loop body plus a short branch. Not much effort is wasted,
2297
+ ** because the abort happens very quickly and only once.
2298
+ **
2299
+ ** 2. The IR is immovable, since the MCode embeds pointers to various
2300
+ ** constants inside the IR. But RENAMEs may need to be added to the IR
2301
+ ** during assembly, which might grow and reallocate the IR. We check
2302
+ ** at the end if the IR (in J->cur.ir) has actually grown, resize the
2303
+ ** copy (in J->curfinal.ir) and try again.
2304
+ **
2305
+ ** 95% of all traces have zero RENAMEs, 3% have one RENAME, 1.5% have
2306
+ ** 2 RENAMEs and only 0.5% have more than that. That's why we opt to
2307
+ ** always have one spare slot in the IR (see above), which means we
2308
+ ** have to redo the assembly for only ~2% of all traces.
2309
+ **
2310
+ ** Very, very rarely, this needs to be done repeatedly, since the
2311
+ ** location of constants inside the IR (actually, reachability from
2312
+ ** a global pointer) may affect register allocation and thus the
2313
+ ** number of RENAMEs.
2314
+ */
2315
+ for (;;) {
2220
2316
  as->mcp = as->mctop;
2221
2317
  #ifdef LUA_USE_ASSERT
2222
2318
  as->mcp_prev = as->mcp;
2223
2319
  #endif
2224
- as->curins = T->nins;
2320
+ as->ir = J->curfinal->ir; /* Use the copied IR. */
2321
+ as->curins = J->cur.nins = as->orignins;
2322
+
2225
2323
  RA_DBG_START();
2226
2324
  RA_DBGX((as, "===== STOP ====="));
2227
2325
 
@@ -2249,22 +2347,40 @@ void lj_asm_trace(jit_State *J, GCtrace *T)
2249
2347
  checkmclim(as);
2250
2348
  asm_ir(as, ir);
2251
2349
  }
2252
- } while (as->realign); /* Retry in case the MCode needs to be realigned. */
2253
2350
 
2254
- /* Emit head of trace. */
2255
- RA_DBG_REF();
2256
- checkmclim(as);
2257
- if (as->gcsteps > 0) {
2258
- as->curins = as->T->snap[0].ref;
2259
- asm_snap_prep(as); /* The GC check is a guard. */
2260
- asm_gc_check(as);
2351
+ if (as->realign && J->curfinal->nins >= T->nins)
2352
+ continue; /* Retry in case only the MCode needs to be realigned. */
2353
+
2354
+ /* Emit head of trace. */
2355
+ RA_DBG_REF();
2356
+ checkmclim(as);
2357
+ if (as->gcsteps > 0) {
2358
+ as->curins = as->T->snap[0].ref;
2359
+ asm_snap_prep(as); /* The GC check is a guard. */
2360
+ asm_gc_check(as);
2361
+ as->curins = as->stopins;
2362
+ }
2363
+ ra_evictk(as);
2364
+ if (as->parent)
2365
+ asm_head_side(as);
2366
+ else
2367
+ asm_head_root(as);
2368
+ asm_phi_fixup(as);
2369
+
2370
+ if (J->curfinal->nins >= T->nins) { /* IR didn't grow? */
2371
+ lua_assert(J->curfinal->nk == T->nk);
2372
+ memcpy(J->curfinal->ir + as->orignins, T->ir + as->orignins,
2373
+ (T->nins - as->orignins) * sizeof(IRIns)); /* Copy RENAMEs. */
2374
+ T->nins = J->curfinal->nins;
2375
+ break; /* Done. */
2376
+ }
2377
+
2378
+ /* Otherwise try again with a bigger IR. */
2379
+ lj_trace_free(J2G(J), J->curfinal);
2380
+ J->curfinal = NULL; /* In case lj_trace_alloc() OOMs. */
2381
+ J->curfinal = lj_trace_alloc(J->L, T);
2382
+ as->realign = NULL;
2261
2383
  }
2262
- ra_evictk(as);
2263
- if (as->parent)
2264
- asm_head_side(as);
2265
- else
2266
- asm_head_root(as);
2267
- asm_phi_fixup(as);
2268
2384
 
2269
2385
  RA_DBGX((as, "===== START ===="));
2270
2386
  RA_DBG_FLUSH();
@@ -2277,6 +2393,9 @@ void lj_asm_trace(jit_State *J, GCtrace *T)
2277
2393
  if (!as->loopref)
2278
2394
  asm_tail_fixup(as, T->link); /* Note: this may change as->mctop! */
2279
2395
  T->szmcode = (MSize)((char *)as->mctop - (char *)as->mcp);
2396
+ #if LJ_TARGET_MCODE_FIXUP
2397
+ asm_mcode_fixup(T->mcode, T->szmcode);
2398
+ #endif
2280
2399
  lj_mcode_sync(T->mcode, origtop);
2281
2400
  }
2282
2401