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
  ** Instruction dispatch handling.
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_DISPATCH_H
@@ -107,6 +107,7 @@ typedef struct GG_State {
107
107
  #define J2G(J) (&J2GG(J)->g)
108
108
  #define G2J(gl) (&G2GG(gl)->J)
109
109
  #define L2J(L) (&L2GG(L)->J)
110
+ #define GG_G2J (GG_OFS(J) - GG_OFS(g))
110
111
  #define GG_G2DISP (GG_OFS(dispatch) - GG_OFS(g))
111
112
  #define GG_DISP2G (GG_OFS(g) - GG_OFS(dispatch))
112
113
  #define GG_DISP2J (GG_OFS(J) - GG_OFS(dispatch))
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  ** ARM instruction emitter.
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
  /* -- Constant encoding --------------------------------------------------- */
@@ -207,7 +207,7 @@ static void emit_loadi(ASMState *as, Reg r, int32_t i)
207
207
 
208
208
  #define emit_loada(as, r, addr) emit_loadi(as, (r), i32ptr((addr)))
209
209
 
210
- static Reg ra_allock(ASMState *as, int32_t k, RegSet allow);
210
+ static Reg ra_allock(ASMState *as, intptr_t k, RegSet allow);
211
211
 
212
212
  /* Get/set from constant pointer. */
213
213
  static void emit_lsptr(ASMState *as, ARMIns ai, Reg r, void *p)
@@ -219,8 +219,9 @@ static void emit_lsptr(ASMState *as, ARMIns ai, Reg r, void *p)
219
219
 
220
220
  #if !LJ_SOFTFP
221
221
  /* Load a number constant into an FPR. */
222
- static void emit_loadn(ASMState *as, Reg r, cTValue *tv)
222
+ static void emit_loadk64(ASMState *as, Reg r, IRIns *ir)
223
223
  {
224
+ cTValue *tv = ir_knum(ir);
224
225
  int32_t i;
225
226
  if ((as->flags & JIT_F_VFPV3) && !tv->u32.lo) {
226
227
  uint32_t hi = tv->u32.hi;
@@ -273,7 +274,7 @@ static void emit_call(ASMState *as, void *target)
273
274
  ptrdiff_t delta = ((char *)target - (char *)p) - 8;
274
275
  if ((((delta>>2) + 0x00800000) >> 24) == 0) {
275
276
  if ((delta & 1))
276
- *p = ARMI_BLX | ((uint32_t)(delta>>2) & 0x00ffffffu) | ((delta&2) << 27);
277
+ *p = ARMI_BLX | ((uint32_t)(delta>>2) & 0x00ffffffu) | ((delta&2) << 23);
277
278
  else
278
279
  *p = ARMI_BL | ((uint32_t)(delta>>2) & 0x00ffffffu);
279
280
  } else { /* Target out of range: need indirect call. But don't use R0-R3. */
@@ -0,0 +1,419 @@
1
+ /*
2
+ ** ARM64 instruction emitter.
3
+ ** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
4
+ **
5
+ ** Contributed by Djordje Kovacevic and Stefan Pejic from RT-RK.com.
6
+ ** Sponsored by Cisco Systems, Inc.
7
+ */
8
+
9
+ /* -- Constant encoding --------------------------------------------------- */
10
+
11
+ static uint64_t get_k64val(IRIns *ir)
12
+ {
13
+ if (ir->o == IR_KINT64) {
14
+ return ir_kint64(ir)->u64;
15
+ } else if (ir->o == IR_KGC) {
16
+ return (uint64_t)ir_kgc(ir);
17
+ } else if (ir->o == IR_KPTR || ir->o == IR_KKPTR) {
18
+ return (uint64_t)ir_kptr(ir);
19
+ } else {
20
+ lua_assert(ir->o == IR_KINT || ir->o == IR_KNULL);
21
+ return ir->i; /* Sign-extended. */
22
+ }
23
+ }
24
+
25
+ /* Encode constant in K12 format for data processing instructions. */
26
+ static uint32_t emit_isk12(int64_t n)
27
+ {
28
+ uint64_t k = (n < 0) ? -n : n;
29
+ uint32_t m = (n < 0) ? 0x40000000 : 0;
30
+ if (k < 0x1000) {
31
+ return A64I_K12|m|A64F_U12(k);
32
+ } else if ((k & 0xfff000) == k) {
33
+ return A64I_K12|m|0x400000|A64F_U12(k>>12);
34
+ }
35
+ return 0;
36
+ }
37
+
38
+ #define emit_clz64(n) __builtin_clzll(n)
39
+ #define emit_ctz64(n) __builtin_ctzll(n)
40
+
41
+ /* Encode constant in K13 format for logical data processing instructions. */
42
+ static uint32_t emit_isk13(uint64_t n, int is64)
43
+ {
44
+ int inv = 0, w = 128, lz, tz;
45
+ if (n & 1) { n = ~n; w = 64; inv = 1; } /* Avoid wrap-around of ones. */
46
+ if (!n) return 0; /* Neither all-zero nor all-ones are allowed. */
47
+ do { /* Find the repeat width. */
48
+ if (is64 && (uint32_t)(n^(n>>32))) break;
49
+ n = (uint32_t)n;
50
+ if (!n) return 0; /* Ditto when passing n=0xffffffff and is64=0. */
51
+ w = 32; if ((n^(n>>16)) & 0xffff) break;
52
+ n = n & 0xffff; w = 16; if ((n^(n>>8)) & 0xff) break;
53
+ n = n & 0xff; w = 8; if ((n^(n>>4)) & 0xf) break;
54
+ n = n & 0xf; w = 4; if ((n^(n>>2)) & 0x3) break;
55
+ n = n & 0x3; w = 2;
56
+ } while (0);
57
+ lz = emit_clz64(n);
58
+ tz = emit_ctz64(n);
59
+ if ((int64_t)(n << lz) >> (lz+tz) != -1ll) return 0; /* Non-contiguous? */
60
+ if (inv)
61
+ return A64I_K13 | (((lz-w) & 127) << 16) | (((lz+tz-w-1) & 63) << 10);
62
+ else
63
+ return A64I_K13 | ((w-tz) << 16) | (((63-lz-tz-w-w) & 63) << 10);
64
+ }
65
+
66
+ static uint32_t emit_isfpk64(uint64_t n)
67
+ {
68
+ uint64_t etop9 = ((n >> 54) & 0x1ff);
69
+ if ((n << 16) == 0 && (etop9 == 0x100 || etop9 == 0x0ff)) {
70
+ return (uint32_t)(((n >> 48) & 0x7f) | ((n >> 56) & 0x80));
71
+ }
72
+ return ~0u;
73
+ }
74
+
75
+ /* -- Emit basic instructions --------------------------------------------- */
76
+
77
+ static void emit_dnma(ASMState *as, A64Ins ai, Reg rd, Reg rn, Reg rm, Reg ra)
78
+ {
79
+ *--as->mcp = ai | A64F_D(rd) | A64F_N(rn) | A64F_M(rm) | A64F_A(ra);
80
+ }
81
+
82
+ static void emit_dnm(ASMState *as, A64Ins ai, Reg rd, Reg rn, Reg rm)
83
+ {
84
+ *--as->mcp = ai | A64F_D(rd) | A64F_N(rn) | A64F_M(rm);
85
+ }
86
+
87
+ static void emit_dm(ASMState *as, A64Ins ai, Reg rd, Reg rm)
88
+ {
89
+ *--as->mcp = ai | A64F_D(rd) | A64F_M(rm);
90
+ }
91
+
92
+ static void emit_dn(ASMState *as, A64Ins ai, Reg rd, Reg rn)
93
+ {
94
+ *--as->mcp = ai | A64F_D(rd) | A64F_N(rn);
95
+ }
96
+
97
+ static void emit_nm(ASMState *as, A64Ins ai, Reg rn, Reg rm)
98
+ {
99
+ *--as->mcp = ai | A64F_N(rn) | A64F_M(rm);
100
+ }
101
+
102
+ static void emit_d(ASMState *as, A64Ins ai, Reg rd)
103
+ {
104
+ *--as->mcp = ai | A64F_D(rd);
105
+ }
106
+
107
+ static void emit_n(ASMState *as, A64Ins ai, Reg rn)
108
+ {
109
+ *--as->mcp = ai | A64F_N(rn);
110
+ }
111
+
112
+ static int emit_checkofs(A64Ins ai, int64_t ofs)
113
+ {
114
+ int scale = (ai >> 30) & 3;
115
+ if (ofs < 0 || (ofs & ((1<<scale)-1))) {
116
+ return (ofs >= -256 && ofs <= 255) ? -1 : 0;
117
+ } else {
118
+ return (ofs < (4096<<scale)) ? 1 : 0;
119
+ }
120
+ }
121
+
122
+ static void emit_lso(ASMState *as, A64Ins ai, Reg rd, Reg rn, int64_t ofs)
123
+ {
124
+ int ot = emit_checkofs(ai, ofs), sc = (ai >> 30) & 3;
125
+ lua_assert(ot);
126
+ /* Combine LDR/STR pairs to LDP/STP. */
127
+ if ((sc == 2 || sc == 3) &&
128
+ (!(ai & 0x400000) || rd != rn) &&
129
+ as->mcp != as->mcloop) {
130
+ uint32_t prev = *as->mcp & ~A64F_D(31);
131
+ int ofsm = ofs - (1<<sc), ofsp = ofs + (1<<sc);
132
+ A64Ins aip;
133
+ if (prev == (ai | A64F_N(rn) | A64F_U12(ofsm>>sc)) ||
134
+ prev == ((ai^A64I_LS_U) | A64F_N(rn) | A64F_S9(ofsm&0x1ff))) {
135
+ aip = (A64F_A(rd) | A64F_D(*as->mcp & 31));
136
+ } else if (prev == (ai | A64F_N(rn) | A64F_U12(ofsp>>sc)) ||
137
+ prev == ((ai^A64I_LS_U) | A64F_N(rn) | A64F_S9(ofsp&0x1ff))) {
138
+ aip = (A64F_D(rd) | A64F_A(*as->mcp & 31));
139
+ ofsm = ofs;
140
+ } else {
141
+ goto nopair;
142
+ }
143
+ if (ofsm >= (int)((unsigned int)-64<<sc) && ofsm <= (63<<sc)) {
144
+ *as->mcp = aip | A64F_N(rn) | ((ofsm >> sc) << 15) |
145
+ (ai ^ ((ai == A64I_LDRx || ai == A64I_STRx) ? 0x50000000 : 0x90000000));
146
+ return;
147
+ }
148
+ }
149
+ nopair:
150
+ if (ot == 1)
151
+ *--as->mcp = ai | A64F_D(rd) | A64F_N(rn) | A64F_U12(ofs >> sc);
152
+ else
153
+ *--as->mcp = (ai^A64I_LS_U) | A64F_D(rd) | A64F_N(rn) | A64F_S9(ofs & 0x1ff);
154
+ }
155
+
156
+ /* -- Emit loads/stores --------------------------------------------------- */
157
+
158
+ /* Prefer rematerialization of BASE/L from global_State over spills. */
159
+ #define emit_canremat(ref) ((ref) <= ASMREF_L)
160
+
161
+ /* Try to find an N-step delta relative to other consts with N < lim. */
162
+ static int emit_kdelta(ASMState *as, Reg rd, uint64_t k, int lim)
163
+ {
164
+ RegSet work = ~as->freeset & RSET_GPR;
165
+ if (lim <= 1) return 0; /* Can't beat that. */
166
+ while (work) {
167
+ Reg r = rset_picktop(work);
168
+ IRRef ref = regcost_ref(as->cost[r]);
169
+ lua_assert(r != rd);
170
+ if (ref < REF_TRUE) {
171
+ uint64_t kx = ra_iskref(ref) ? (uint64_t)ra_krefk(as, ref) :
172
+ get_k64val(IR(ref));
173
+ int64_t delta = (int64_t)(k - kx);
174
+ if (delta == 0) {
175
+ emit_dm(as, A64I_MOVx, rd, r);
176
+ return 1;
177
+ } else {
178
+ uint32_t k12 = emit_isk12(delta < 0 ? -delta : delta);
179
+ if (k12) {
180
+ emit_dn(as, (delta < 0 ? A64I_SUBx : A64I_ADDx)^k12, rd, r);
181
+ return 1;
182
+ }
183
+ /* Do other ops or multi-step deltas pay off? Probably not.
184
+ ** E.g. XOR rarely helps with pointer consts.
185
+ */
186
+ }
187
+ }
188
+ rset_clear(work, r);
189
+ }
190
+ return 0; /* Failed. */
191
+ }
192
+
193
+ static void emit_loadk(ASMState *as, Reg rd, uint64_t u64, int is64)
194
+ {
195
+ uint32_t k13 = emit_isk13(u64, is64);
196
+ if (k13) { /* Can the constant be represented as a bitmask immediate? */
197
+ emit_dn(as, (is64|A64I_ORRw)^k13, rd, RID_ZERO);
198
+ } else {
199
+ int i, zeros = 0, ones = 0, neg;
200
+ if (!is64) u64 = (int64_t)(int32_t)u64; /* Sign-extend. */
201
+ /* Count homogeneous 16 bit fragments. */
202
+ for (i = 0; i < 4; i++) {
203
+ uint64_t frag = (u64 >> i*16) & 0xffff;
204
+ zeros += (frag == 0);
205
+ ones += (frag == 0xffff);
206
+ }
207
+ neg = ones > zeros; /* Use MOVN if it pays off. */
208
+ if (!emit_kdelta(as, rd, u64, 4 - (neg ? ones : zeros))) {
209
+ int shift = 0, lshift = 0;
210
+ uint64_t n64 = neg ? ~u64 : u64;
211
+ if (n64 != 0) {
212
+ /* Find first/last fragment to be filled. */
213
+ shift = (63-emit_clz64(n64)) & ~15;
214
+ lshift = emit_ctz64(n64) & ~15;
215
+ }
216
+ /* MOVK requires the original value (u64). */
217
+ while (shift > lshift) {
218
+ uint32_t u16 = (u64 >> shift) & 0xffff;
219
+ /* Skip fragments that are correctly filled by MOVN/MOVZ. */
220
+ if (u16 != (neg ? 0xffff : 0))
221
+ emit_d(as, is64 | A64I_MOVKw | A64F_U16(u16) | A64F_LSL16(shift), rd);
222
+ shift -= 16;
223
+ }
224
+ /* But MOVN needs an inverted value (n64). */
225
+ emit_d(as, (neg ? A64I_MOVNx : A64I_MOVZx) |
226
+ A64F_U16((n64 >> lshift) & 0xffff) | A64F_LSL16(lshift), rd);
227
+ }
228
+ }
229
+ }
230
+
231
+ /* Load a 32 bit constant into a GPR. */
232
+ #define emit_loadi(as, rd, i) emit_loadk(as, rd, i, 0)
233
+
234
+ /* Load a 64 bit constant into a GPR. */
235
+ #define emit_loadu64(as, rd, i) emit_loadk(as, rd, i, A64I_X)
236
+
237
+ #define emit_loada(as, r, addr) emit_loadu64(as, (r), (uintptr_t)(addr))
238
+
239
+ #define glofs(as, k) \
240
+ ((intptr_t)((uintptr_t)(k) - (uintptr_t)&J2GG(as->J)->g))
241
+ #define mcpofs(as, k) \
242
+ ((intptr_t)((uintptr_t)(k) - (uintptr_t)(as->mcp - 1)))
243
+ #define checkmcpofs(as, k) \
244
+ ((((mcpofs(as, k)>>2) + 0x00040000) >> 19) == 0)
245
+
246
+ static Reg ra_allock(ASMState *as, intptr_t k, RegSet allow);
247
+
248
+ /* Get/set from constant pointer. */
249
+ static void emit_lsptr(ASMState *as, A64Ins ai, Reg r, void *p)
250
+ {
251
+ /* First, check if ip + offset is in range. */
252
+ if ((ai & 0x00400000) && checkmcpofs(as, p)) {
253
+ emit_d(as, A64I_LDRLx | A64F_S19(mcpofs(as, p)>>2), r);
254
+ } else {
255
+ Reg base = RID_GL; /* Next, try GL + offset. */
256
+ int64_t ofs = glofs(as, p);
257
+ if (!emit_checkofs(ai, ofs)) { /* Else split up into base reg + offset. */
258
+ int64_t i64 = i64ptr(p);
259
+ base = ra_allock(as, (i64 & ~0x7fffull), rset_exclude(RSET_GPR, r));
260
+ ofs = i64 & 0x7fffull;
261
+ }
262
+ emit_lso(as, ai, r, base, ofs);
263
+ }
264
+ }
265
+
266
+ /* Load 64 bit IR constant into register. */
267
+ static void emit_loadk64(ASMState *as, Reg r, IRIns *ir)
268
+ {
269
+ const uint64_t *k = &ir_k64(ir)->u64;
270
+ int64_t ofs;
271
+ if (r >= RID_MAX_GPR) {
272
+ uint32_t fpk = emit_isfpk64(*k);
273
+ if (fpk != ~0u) {
274
+ emit_d(as, A64I_FMOV_DI | A64F_FP8(fpk), (r & 31));
275
+ return;
276
+ }
277
+ }
278
+ ofs = glofs(as, k);
279
+ if (emit_checkofs(A64I_LDRx, ofs)) {
280
+ emit_lso(as, r >= RID_MAX_GPR ? A64I_LDRd : A64I_LDRx,
281
+ (r & 31), RID_GL, ofs);
282
+ } else {
283
+ if (r >= RID_MAX_GPR) {
284
+ emit_dn(as, A64I_FMOV_D_R, (r & 31), RID_TMP);
285
+ r = RID_TMP;
286
+ }
287
+ if (checkmcpofs(as, k))
288
+ emit_d(as, A64I_LDRLx | A64F_S19(mcpofs(as, k)>>2), r);
289
+ else
290
+ emit_loadu64(as, r, *k);
291
+ }
292
+ }
293
+
294
+ /* Get/set global_State fields. */
295
+ #define emit_getgl(as, r, field) \
296
+ emit_lsptr(as, A64I_LDRx, (r), (void *)&J2G(as->J)->field)
297
+ #define emit_setgl(as, r, field) \
298
+ emit_lsptr(as, A64I_STRx, (r), (void *)&J2G(as->J)->field)
299
+
300
+ /* Trace number is determined from pc of exit instruction. */
301
+ #define emit_setvmstate(as, i) UNUSED(i)
302
+
303
+ /* -- Emit control-flow instructions -------------------------------------- */
304
+
305
+ /* Label for internal jumps. */
306
+ typedef MCode *MCLabel;
307
+
308
+ /* Return label pointing to current PC. */
309
+ #define emit_label(as) ((as)->mcp)
310
+
311
+ static void emit_cond_branch(ASMState *as, A64CC cond, MCode *target)
312
+ {
313
+ MCode *p = --as->mcp;
314
+ ptrdiff_t delta = target - p;
315
+ lua_assert(((delta + 0x40000) >> 19) == 0);
316
+ *p = A64I_BCC | A64F_S19(delta) | cond;
317
+ }
318
+
319
+ static void emit_branch(ASMState *as, A64Ins ai, MCode *target)
320
+ {
321
+ MCode *p = --as->mcp;
322
+ ptrdiff_t delta = target - p;
323
+ lua_assert(((delta + 0x02000000) >> 26) == 0);
324
+ *p = ai | ((uint32_t)delta & 0x03ffffffu);
325
+ }
326
+
327
+ static void emit_tnb(ASMState *as, A64Ins ai, Reg r, uint32_t bit, MCode *target)
328
+ {
329
+ MCode *p = --as->mcp;
330
+ ptrdiff_t delta = target - p;
331
+ lua_assert(bit < 63 && ((delta + 0x2000) >> 14) == 0);
332
+ if (bit > 31) ai |= A64I_X;
333
+ *p = ai | A64F_BIT(bit & 31) | A64F_S14((uint32_t)delta & 0x3fffu) | r;
334
+ }
335
+
336
+ static void emit_cnb(ASMState *as, A64Ins ai, Reg r, MCode *target)
337
+ {
338
+ MCode *p = --as->mcp;
339
+ ptrdiff_t delta = target - p;
340
+ lua_assert(((delta + 0x40000) >> 19) == 0);
341
+ *p = ai | A64F_S19(delta) | r;
342
+ }
343
+
344
+ #define emit_jmp(as, target) emit_branch(as, A64I_B, (target))
345
+
346
+ static void emit_call(ASMState *as, void *target)
347
+ {
348
+ MCode *p = --as->mcp;
349
+ ptrdiff_t delta = (char *)target - (char *)p;
350
+ if ((((delta>>2) + 0x02000000) >> 26) == 0) {
351
+ *p = A64I_BL | ((uint32_t)(delta>>2) & 0x03ffffffu);
352
+ } else { /* Target out of range: need indirect call. But don't use R0-R7. */
353
+ Reg r = ra_allock(as, i64ptr(target),
354
+ RSET_RANGE(RID_X8, RID_MAX_GPR)-RSET_FIXED);
355
+ *p = A64I_BLR | A64F_N(r);
356
+ }
357
+ }
358
+
359
+ /* -- Emit generic operations --------------------------------------------- */
360
+
361
+ /* Generic move between two regs. */
362
+ static void emit_movrr(ASMState *as, IRIns *ir, Reg dst, Reg src)
363
+ {
364
+ if (dst >= RID_MAX_GPR) {
365
+ emit_dn(as, irt_isnum(ir->t) ? A64I_FMOV_D : A64I_FMOV_S,
366
+ (dst & 31), (src & 31));
367
+ return;
368
+ }
369
+ if (as->mcp != as->mcloop) { /* Swap early registers for loads/stores. */
370
+ MCode ins = *as->mcp, swp = (src^dst);
371
+ if ((ins & 0xbf800000) == 0xb9000000) {
372
+ if (!((ins ^ (dst << 5)) & 0x000003e0))
373
+ *as->mcp = ins ^ (swp << 5); /* Swap N in load/store. */
374
+ if (!(ins & 0x00400000) && !((ins ^ dst) & 0x0000001f))
375
+ *as->mcp = ins ^ swp; /* Swap D in store. */
376
+ }
377
+ }
378
+ emit_dm(as, A64I_MOVx, dst, src);
379
+ }
380
+
381
+ /* Generic load of register with base and (small) offset address. */
382
+ static void emit_loadofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs)
383
+ {
384
+ if (r >= RID_MAX_GPR)
385
+ emit_lso(as, irt_isnum(ir->t) ? A64I_LDRd : A64I_LDRs, (r & 31), base, ofs);
386
+ else
387
+ emit_lso(as, irt_is64(ir->t) ? A64I_LDRx : A64I_LDRw, r, base, ofs);
388
+ }
389
+
390
+ /* Generic store of register with base and (small) offset address. */
391
+ static void emit_storeofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs)
392
+ {
393
+ if (r >= RID_MAX_GPR)
394
+ emit_lso(as, irt_isnum(ir->t) ? A64I_STRd : A64I_STRs, (r & 31), base, ofs);
395
+ else
396
+ emit_lso(as, irt_is64(ir->t) ? A64I_STRx : A64I_STRw, r, base, ofs);
397
+ }
398
+
399
+ /* Emit an arithmetic operation with a constant operand. */
400
+ static void emit_opk(ASMState *as, A64Ins ai, Reg dest, Reg src,
401
+ int32_t i, RegSet allow)
402
+ {
403
+ uint32_t k = emit_isk12(i);
404
+ if (k)
405
+ emit_dn(as, ai^k, dest, src);
406
+ else
407
+ emit_dnm(as, ai, dest, src, ra_allock(as, i, allow));
408
+ }
409
+
410
+ /* Add offset to pointer. */
411
+ static void emit_addptr(ASMState *as, Reg r, int32_t ofs)
412
+ {
413
+ if (ofs)
414
+ emit_opk(as, ofs < 0 ? A64I_SUBx : A64I_ADDx, r, r,
415
+ ofs < 0 ? -ofs : ofs, rset_exclude(RSET_GPR, r));
416
+ }
417
+
418
+ #define emit_spsub(as, ofs) emit_addptr(as, RID_SP, -(ofs))
419
+