immunio 1.2.1 → 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
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