immunio 0.15.4 → 0.16.0

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 (454) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +0 -27
  3. data/ext/immunio/Rakefile +9 -0
  4. data/lib/immunio/plugins/active_record.rb +1 -1
  5. data/lib/immunio/plugins/active_record_relation.rb +1 -1
  6. data/lib/immunio/plugins/environment_reporter.rb +20 -0
  7. data/lib/immunio/rufus_lua_ext/ref.rb +1 -3
  8. data/lib/immunio/version.rb +1 -1
  9. data/lib/immunio/vm.rb +1 -2
  10. data/lua-hooks/Makefile +97 -0
  11. data/lua-hooks/ext/all.c +41 -52
  12. data/lua-hooks/ext/all.o +0 -0
  13. data/lua-hooks/ext/libinjection/libinjection_html5.o +0 -0
  14. data/lua-hooks/ext/libinjection/libinjection_sqli.o +0 -0
  15. data/lua-hooks/ext/libinjection/libinjection_xss.o +0 -0
  16. data/lua-hooks/ext/libinjection/lualib.c +2 -2
  17. data/lua-hooks/ext/lpeg/lpcap.c +2 -2
  18. data/lua-hooks/ext/lpeg/lpcap.o +0 -0
  19. data/lua-hooks/ext/lpeg/lpcode.c +2 -2
  20. data/lua-hooks/ext/lpeg/lpcode.h +1 -1
  21. data/lua-hooks/ext/lpeg/lpcode.o +0 -0
  22. data/lua-hooks/ext/lpeg/lpprint.o +0 -0
  23. data/lua-hooks/ext/lpeg/lptree.c +2 -2
  24. data/lua-hooks/ext/lpeg/lptypes.h +1 -1
  25. data/lua-hooks/ext/lpeg/lpvm.c +2 -2
  26. data/lua-hooks/ext/lpeg/lpvm.o +0 -0
  27. data/lua-hooks/ext/lua-cmsgpack/lua_cmsgpack.c +16 -3
  28. data/lua-hooks/ext/lua-snapshot/snapshot.c +14 -7
  29. data/lua-hooks/ext/luajit/COPYRIGHT +56 -0
  30. data/lua-hooks/ext/luajit/Makefile +159 -0
  31. data/lua-hooks/ext/luajit/README +16 -0
  32. data/lua-hooks/ext/luajit/doc/bluequad-print.css +166 -0
  33. data/lua-hooks/ext/luajit/doc/bluequad.css +325 -0
  34. data/lua-hooks/ext/luajit/doc/changes.html +804 -0
  35. data/lua-hooks/ext/luajit/doc/contact.html +104 -0
  36. data/lua-hooks/ext/luajit/doc/ext_c_api.html +189 -0
  37. data/lua-hooks/ext/luajit/doc/ext_ffi.html +332 -0
  38. data/lua-hooks/ext/luajit/doc/ext_ffi_api.html +570 -0
  39. data/lua-hooks/ext/luajit/doc/ext_ffi_semantics.html +1261 -0
  40. data/lua-hooks/ext/luajit/doc/ext_ffi_tutorial.html +603 -0
  41. data/lua-hooks/ext/luajit/doc/ext_jit.html +201 -0
  42. data/lua-hooks/ext/luajit/doc/ext_profiler.html +365 -0
  43. data/lua-hooks/ext/luajit/doc/extensions.html +448 -0
  44. data/lua-hooks/ext/luajit/doc/faq.html +186 -0
  45. data/lua-hooks/ext/luajit/doc/img/contact.png +0 -0
  46. data/lua-hooks/ext/luajit/doc/install.html +659 -0
  47. data/lua-hooks/ext/luajit/doc/luajit.html +236 -0
  48. data/lua-hooks/ext/luajit/doc/running.html +309 -0
  49. data/lua-hooks/ext/luajit/doc/status.html +118 -0
  50. data/lua-hooks/ext/luajit/dynasm/dasm_arm.h +456 -0
  51. data/lua-hooks/ext/luajit/dynasm/dasm_arm.lua +1125 -0
  52. data/lua-hooks/ext/luajit/dynasm/dasm_arm64.h +518 -0
  53. data/lua-hooks/ext/luajit/dynasm/dasm_arm64.lua +1166 -0
  54. data/lua-hooks/ext/luajit/dynasm/dasm_mips.h +416 -0
  55. data/lua-hooks/ext/luajit/dynasm/dasm_mips.lua +953 -0
  56. data/lua-hooks/ext/luajit/dynasm/dasm_ppc.h +419 -0
  57. data/lua-hooks/ext/luajit/dynasm/dasm_ppc.lua +1919 -0
  58. data/lua-hooks/ext/luajit/dynasm/dasm_proto.h +83 -0
  59. data/lua-hooks/ext/luajit/dynasm/dasm_x64.lua +12 -0
  60. data/lua-hooks/ext/luajit/dynasm/dasm_x86.h +471 -0
  61. data/lua-hooks/ext/luajit/dynasm/dasm_x86.lua +1945 -0
  62. data/lua-hooks/ext/luajit/dynasm/dynasm.lua +1094 -0
  63. data/lua-hooks/ext/luajit/etc/luajit.1 +88 -0
  64. data/lua-hooks/ext/luajit/etc/luajit.pc +25 -0
  65. data/lua-hooks/ext/luajit/src/Makefile +697 -0
  66. data/lua-hooks/ext/luajit/src/Makefile.dep +244 -0
  67. data/lua-hooks/ext/luajit/src/host/README +4 -0
  68. data/lua-hooks/ext/luajit/src/host/buildvm +0 -0
  69. data/lua-hooks/ext/luajit/src/host/buildvm.c +518 -0
  70. data/lua-hooks/ext/luajit/src/host/buildvm.h +105 -0
  71. data/lua-hooks/ext/luajit/src/host/buildvm.o +0 -0
  72. data/lua-hooks/ext/luajit/src/host/buildvm_arch.h +7449 -0
  73. data/lua-hooks/ext/luajit/src/host/buildvm_asm.c +345 -0
  74. data/lua-hooks/ext/luajit/src/host/buildvm_asm.o +0 -0
  75. data/lua-hooks/ext/luajit/src/host/buildvm_fold.c +229 -0
  76. data/lua-hooks/ext/luajit/src/host/buildvm_fold.o +0 -0
  77. data/lua-hooks/ext/luajit/src/host/buildvm_lib.c +457 -0
  78. data/lua-hooks/ext/luajit/src/host/buildvm_lib.o +0 -0
  79. data/lua-hooks/ext/luajit/src/host/buildvm_libbc.h +45 -0
  80. data/lua-hooks/ext/luajit/src/host/buildvm_peobj.c +368 -0
  81. data/lua-hooks/ext/luajit/src/host/buildvm_peobj.o +0 -0
  82. data/lua-hooks/ext/luajit/src/host/genlibbc.lua +197 -0
  83. data/lua-hooks/ext/luajit/src/host/genminilua.lua +428 -0
  84. data/lua-hooks/ext/luajit/src/host/minilua +0 -0
  85. data/lua-hooks/ext/luajit/src/host/minilua.c +7770 -0
  86. data/lua-hooks/ext/luajit/src/host/minilua.o +0 -0
  87. data/lua-hooks/ext/luajit/src/jit/bc.lua +190 -0
  88. data/lua-hooks/ext/luajit/src/jit/bcsave.lua +661 -0
  89. data/lua-hooks/ext/luajit/src/jit/dis_arm.lua +689 -0
  90. data/lua-hooks/ext/luajit/src/jit/dis_mips.lua +428 -0
  91. data/lua-hooks/ext/luajit/src/jit/dis_mipsel.lua +17 -0
  92. data/lua-hooks/ext/luajit/src/jit/dis_ppc.lua +591 -0
  93. data/lua-hooks/ext/luajit/src/jit/dis_x64.lua +17 -0
  94. data/lua-hooks/ext/luajit/src/jit/dis_x86.lua +838 -0
  95. data/lua-hooks/ext/luajit/src/jit/dump.lua +706 -0
  96. data/lua-hooks/ext/luajit/src/jit/p.lua +310 -0
  97. data/lua-hooks/ext/luajit/src/jit/v.lua +170 -0
  98. data/lua-hooks/ext/luajit/src/jit/vmdef.lua +362 -0
  99. data/lua-hooks/ext/luajit/src/jit/zone.lua +45 -0
  100. data/lua-hooks/ext/{lua → luajit/src}/lauxlib.h +10 -17
  101. data/lua-hooks/ext/luajit/src/lib_aux.c +356 -0
  102. data/lua-hooks/ext/luajit/src/lib_aux.o +0 -0
  103. data/lua-hooks/ext/luajit/src/lib_aux_dyn.o +0 -0
  104. data/lua-hooks/ext/luajit/src/lib_base.c +664 -0
  105. data/lua-hooks/ext/luajit/src/lib_base.o +0 -0
  106. data/lua-hooks/ext/luajit/src/lib_base_dyn.o +0 -0
  107. data/lua-hooks/ext/luajit/src/lib_bit.c +180 -0
  108. data/lua-hooks/ext/luajit/src/lib_bit.o +0 -0
  109. data/lua-hooks/ext/luajit/src/lib_bit_dyn.o +0 -0
  110. data/lua-hooks/ext/luajit/src/lib_debug.c +405 -0
  111. data/lua-hooks/ext/luajit/src/lib_debug.o +0 -0
  112. data/lua-hooks/ext/luajit/src/lib_debug_dyn.o +0 -0
  113. data/lua-hooks/ext/luajit/src/lib_ffi.c +872 -0
  114. data/lua-hooks/ext/luajit/src/lib_ffi.o +0 -0
  115. data/lua-hooks/ext/luajit/src/lib_ffi_dyn.o +0 -0
  116. data/lua-hooks/ext/luajit/src/lib_init.c +55 -0
  117. data/lua-hooks/ext/luajit/src/lib_init.o +0 -0
  118. data/lua-hooks/ext/luajit/src/lib_init_dyn.o +0 -0
  119. data/lua-hooks/ext/luajit/src/lib_io.c +541 -0
  120. data/lua-hooks/ext/luajit/src/lib_io.o +0 -0
  121. data/lua-hooks/ext/luajit/src/lib_io_dyn.o +0 -0
  122. data/lua-hooks/ext/luajit/src/lib_jit.c +767 -0
  123. data/lua-hooks/ext/luajit/src/lib_jit.o +0 -0
  124. data/lua-hooks/ext/luajit/src/lib_jit_dyn.o +0 -0
  125. data/lua-hooks/ext/luajit/src/lib_math.c +230 -0
  126. data/lua-hooks/ext/luajit/src/lib_math.o +0 -0
  127. data/lua-hooks/ext/luajit/src/lib_math_dyn.o +0 -0
  128. data/lua-hooks/ext/luajit/src/lib_os.c +292 -0
  129. data/lua-hooks/ext/luajit/src/lib_os.o +0 -0
  130. data/lua-hooks/ext/luajit/src/lib_os_dyn.o +0 -0
  131. data/lua-hooks/ext/luajit/src/lib_package.c +610 -0
  132. data/lua-hooks/ext/luajit/src/lib_package.o +0 -0
  133. data/lua-hooks/ext/luajit/src/lib_package_dyn.o +0 -0
  134. data/lua-hooks/ext/luajit/src/lib_string.c +752 -0
  135. data/lua-hooks/ext/luajit/src/lib_string.o +0 -0
  136. data/lua-hooks/ext/luajit/src/lib_string_dyn.o +0 -0
  137. data/lua-hooks/ext/luajit/src/lib_table.c +307 -0
  138. data/lua-hooks/ext/luajit/src/lib_table.o +0 -0
  139. data/lua-hooks/ext/luajit/src/lib_table_dyn.o +0 -0
  140. data/lua-hooks/ext/luajit/src/libluajit.a +0 -0
  141. data/lua-hooks/ext/luajit/src/libluajit.so +0 -0
  142. data/lua-hooks/ext/luajit/src/lj.supp +26 -0
  143. data/lua-hooks/ext/luajit/src/lj_alloc.c +1398 -0
  144. data/lua-hooks/ext/luajit/src/lj_alloc.h +17 -0
  145. data/lua-hooks/ext/luajit/src/lj_alloc.o +0 -0
  146. data/lua-hooks/ext/luajit/src/lj_alloc_dyn.o +0 -0
  147. data/lua-hooks/ext/luajit/src/lj_api.c +1210 -0
  148. data/lua-hooks/ext/luajit/src/lj_api.o +0 -0
  149. data/lua-hooks/ext/luajit/src/lj_api_dyn.o +0 -0
  150. data/lua-hooks/ext/luajit/src/lj_arch.h +509 -0
  151. data/lua-hooks/ext/luajit/src/lj_asm.c +2278 -0
  152. data/lua-hooks/ext/luajit/src/lj_asm.h +17 -0
  153. data/lua-hooks/ext/luajit/src/lj_asm.o +0 -0
  154. data/lua-hooks/ext/luajit/src/lj_asm_arm.h +2217 -0
  155. data/lua-hooks/ext/luajit/src/lj_asm_dyn.o +0 -0
  156. data/lua-hooks/ext/luajit/src/lj_asm_mips.h +1833 -0
  157. data/lua-hooks/ext/luajit/src/lj_asm_ppc.h +2015 -0
  158. data/lua-hooks/ext/luajit/src/lj_asm_x86.h +2634 -0
  159. data/lua-hooks/ext/luajit/src/lj_bc.c +14 -0
  160. data/lua-hooks/ext/luajit/src/lj_bc.h +265 -0
  161. data/lua-hooks/ext/luajit/src/lj_bc.o +0 -0
  162. data/lua-hooks/ext/luajit/src/lj_bc_dyn.o +0 -0
  163. data/lua-hooks/ext/luajit/src/lj_bcdef.h +220 -0
  164. data/lua-hooks/ext/luajit/src/lj_bcdump.h +68 -0
  165. data/lua-hooks/ext/luajit/src/lj_bcread.c +457 -0
  166. data/lua-hooks/ext/luajit/src/lj_bcread.o +0 -0
  167. data/lua-hooks/ext/luajit/src/lj_bcread_dyn.o +0 -0
  168. data/lua-hooks/ext/luajit/src/lj_bcwrite.c +361 -0
  169. data/lua-hooks/ext/luajit/src/lj_bcwrite.o +0 -0
  170. data/lua-hooks/ext/luajit/src/lj_bcwrite_dyn.o +0 -0
  171. data/lua-hooks/ext/luajit/src/lj_buf.c +234 -0
  172. data/lua-hooks/ext/luajit/src/lj_buf.h +105 -0
  173. data/lua-hooks/ext/luajit/src/lj_buf.o +0 -0
  174. data/lua-hooks/ext/luajit/src/lj_buf_dyn.o +0 -0
  175. data/lua-hooks/ext/luajit/src/lj_carith.c +429 -0
  176. data/lua-hooks/ext/luajit/src/lj_carith.h +37 -0
  177. data/lua-hooks/ext/luajit/src/lj_carith.o +0 -0
  178. data/lua-hooks/ext/luajit/src/lj_carith_dyn.o +0 -0
  179. data/lua-hooks/ext/luajit/src/lj_ccall.c +984 -0
  180. data/lua-hooks/ext/luajit/src/lj_ccall.h +178 -0
  181. data/lua-hooks/ext/luajit/src/lj_ccall.o +0 -0
  182. data/lua-hooks/ext/luajit/src/lj_ccall_dyn.o +0 -0
  183. data/lua-hooks/ext/luajit/src/lj_ccallback.c +712 -0
  184. data/lua-hooks/ext/luajit/src/lj_ccallback.h +25 -0
  185. data/lua-hooks/ext/luajit/src/lj_ccallback.o +0 -0
  186. data/lua-hooks/ext/luajit/src/lj_ccallback_dyn.o +0 -0
  187. data/lua-hooks/ext/luajit/src/lj_cconv.c +752 -0
  188. data/lua-hooks/ext/luajit/src/lj_cconv.h +70 -0
  189. data/lua-hooks/ext/luajit/src/lj_cconv.o +0 -0
  190. data/lua-hooks/ext/luajit/src/lj_cconv_dyn.o +0 -0
  191. data/lua-hooks/ext/luajit/src/lj_cdata.c +288 -0
  192. data/lua-hooks/ext/luajit/src/lj_cdata.h +76 -0
  193. data/lua-hooks/ext/luajit/src/lj_cdata.o +0 -0
  194. data/lua-hooks/ext/luajit/src/lj_cdata_dyn.o +0 -0
  195. data/lua-hooks/ext/luajit/src/lj_char.c +43 -0
  196. data/lua-hooks/ext/luajit/src/lj_char.h +42 -0
  197. data/lua-hooks/ext/luajit/src/lj_char.o +0 -0
  198. data/lua-hooks/ext/luajit/src/lj_char_dyn.o +0 -0
  199. data/lua-hooks/ext/luajit/src/lj_clib.c +418 -0
  200. data/lua-hooks/ext/luajit/src/lj_clib.h +29 -0
  201. data/lua-hooks/ext/luajit/src/lj_clib.o +0 -0
  202. data/lua-hooks/ext/luajit/src/lj_clib_dyn.o +0 -0
  203. data/lua-hooks/ext/luajit/src/lj_cparse.c +1862 -0
  204. data/lua-hooks/ext/luajit/src/lj_cparse.h +65 -0
  205. data/lua-hooks/ext/luajit/src/lj_cparse.o +0 -0
  206. data/lua-hooks/ext/luajit/src/lj_cparse_dyn.o +0 -0
  207. data/lua-hooks/ext/luajit/src/lj_crecord.c +1834 -0
  208. data/lua-hooks/ext/luajit/src/lj_crecord.h +38 -0
  209. data/lua-hooks/ext/luajit/src/lj_crecord.o +0 -0
  210. data/lua-hooks/ext/luajit/src/lj_crecord_dyn.o +0 -0
  211. data/lua-hooks/ext/luajit/src/lj_ctype.c +635 -0
  212. data/lua-hooks/ext/luajit/src/lj_ctype.h +461 -0
  213. data/lua-hooks/ext/luajit/src/lj_ctype.o +0 -0
  214. data/lua-hooks/ext/luajit/src/lj_ctype_dyn.o +0 -0
  215. data/lua-hooks/ext/luajit/src/lj_debug.c +699 -0
  216. data/lua-hooks/ext/luajit/src/lj_debug.h +65 -0
  217. data/lua-hooks/ext/luajit/src/lj_debug.o +0 -0
  218. data/lua-hooks/ext/luajit/src/lj_debug_dyn.o +0 -0
  219. data/lua-hooks/ext/luajit/src/lj_def.h +365 -0
  220. data/lua-hooks/ext/luajit/src/lj_dispatch.c +557 -0
  221. data/lua-hooks/ext/luajit/src/lj_dispatch.h +138 -0
  222. data/lua-hooks/ext/luajit/src/lj_dispatch.o +0 -0
  223. data/lua-hooks/ext/luajit/src/lj_dispatch_dyn.o +0 -0
  224. data/lua-hooks/ext/luajit/src/lj_emit_arm.h +356 -0
  225. data/lua-hooks/ext/luajit/src/lj_emit_mips.h +211 -0
  226. data/lua-hooks/ext/luajit/src/lj_emit_ppc.h +238 -0
  227. data/lua-hooks/ext/luajit/src/lj_emit_x86.h +462 -0
  228. data/lua-hooks/ext/luajit/src/lj_err.c +794 -0
  229. data/lua-hooks/ext/luajit/src/lj_err.h +41 -0
  230. data/lua-hooks/ext/luajit/src/lj_err.o +0 -0
  231. data/lua-hooks/ext/luajit/src/lj_err_dyn.o +0 -0
  232. data/lua-hooks/ext/luajit/src/lj_errmsg.h +190 -0
  233. data/lua-hooks/ext/luajit/src/lj_ff.h +18 -0
  234. data/lua-hooks/ext/luajit/src/lj_ffdef.h +209 -0
  235. data/lua-hooks/ext/luajit/src/lj_ffrecord.c +1247 -0
  236. data/lua-hooks/ext/luajit/src/lj_ffrecord.h +24 -0
  237. data/lua-hooks/ext/luajit/src/lj_ffrecord.o +0 -0
  238. data/lua-hooks/ext/luajit/src/lj_ffrecord_dyn.o +0 -0
  239. data/lua-hooks/ext/luajit/src/lj_folddef.h +1138 -0
  240. data/lua-hooks/ext/luajit/src/lj_frame.h +259 -0
  241. data/lua-hooks/ext/luajit/src/lj_func.c +185 -0
  242. data/lua-hooks/ext/luajit/src/lj_func.h +24 -0
  243. data/lua-hooks/ext/luajit/src/lj_func.o +0 -0
  244. data/lua-hooks/ext/luajit/src/lj_func_dyn.o +0 -0
  245. data/lua-hooks/ext/luajit/src/lj_gc.c +845 -0
  246. data/lua-hooks/ext/luajit/src/lj_gc.h +134 -0
  247. data/lua-hooks/ext/luajit/src/lj_gc.o +0 -0
  248. data/lua-hooks/ext/luajit/src/lj_gc_dyn.o +0 -0
  249. data/lua-hooks/ext/luajit/src/lj_gdbjit.c +787 -0
  250. data/lua-hooks/ext/luajit/src/lj_gdbjit.h +22 -0
  251. data/lua-hooks/ext/luajit/src/lj_gdbjit.o +0 -0
  252. data/lua-hooks/ext/luajit/src/lj_gdbjit_dyn.o +0 -0
  253. data/lua-hooks/ext/luajit/src/lj_ir.c +505 -0
  254. data/lua-hooks/ext/luajit/src/lj_ir.h +577 -0
  255. data/lua-hooks/ext/luajit/src/lj_ir.o +0 -0
  256. data/lua-hooks/ext/luajit/src/lj_ir_dyn.o +0 -0
  257. data/lua-hooks/ext/luajit/src/lj_ircall.h +321 -0
  258. data/lua-hooks/ext/luajit/src/lj_iropt.h +161 -0
  259. data/lua-hooks/ext/luajit/src/lj_jit.h +440 -0
  260. data/lua-hooks/ext/luajit/src/lj_lex.c +482 -0
  261. data/lua-hooks/ext/luajit/src/lj_lex.h +86 -0
  262. data/lua-hooks/ext/luajit/src/lj_lex.o +0 -0
  263. data/lua-hooks/ext/luajit/src/lj_lex_dyn.o +0 -0
  264. data/lua-hooks/ext/luajit/src/lj_lib.c +303 -0
  265. data/lua-hooks/ext/luajit/src/lj_lib.h +115 -0
  266. data/lua-hooks/ext/luajit/src/lj_lib.o +0 -0
  267. data/lua-hooks/ext/luajit/src/lj_lib_dyn.o +0 -0
  268. data/lua-hooks/ext/luajit/src/lj_libdef.h +414 -0
  269. data/lua-hooks/ext/luajit/src/lj_load.c +168 -0
  270. data/lua-hooks/ext/luajit/src/lj_load.o +0 -0
  271. data/lua-hooks/ext/luajit/src/lj_load_dyn.o +0 -0
  272. data/lua-hooks/ext/luajit/src/lj_mcode.c +386 -0
  273. data/lua-hooks/ext/luajit/src/lj_mcode.h +30 -0
  274. data/lua-hooks/ext/luajit/src/lj_mcode.o +0 -0
  275. data/lua-hooks/ext/luajit/src/lj_mcode_dyn.o +0 -0
  276. data/lua-hooks/ext/luajit/src/lj_meta.c +477 -0
  277. data/lua-hooks/ext/luajit/src/lj_meta.h +38 -0
  278. data/lua-hooks/ext/luajit/src/lj_meta.o +0 -0
  279. data/lua-hooks/ext/luajit/src/lj_meta_dyn.o +0 -0
  280. data/lua-hooks/ext/luajit/src/lj_obj.c +50 -0
  281. data/lua-hooks/ext/luajit/src/lj_obj.h +976 -0
  282. data/lua-hooks/ext/luajit/src/lj_obj.o +0 -0
  283. data/lua-hooks/ext/luajit/src/lj_obj_dyn.o +0 -0
  284. data/lua-hooks/ext/luajit/src/lj_opt_dce.c +78 -0
  285. data/lua-hooks/ext/luajit/src/lj_opt_dce.o +0 -0
  286. data/lua-hooks/ext/luajit/src/lj_opt_dce_dyn.o +0 -0
  287. data/lua-hooks/ext/luajit/src/lj_opt_fold.c +2488 -0
  288. data/lua-hooks/ext/luajit/src/lj_opt_fold.o +0 -0
  289. data/lua-hooks/ext/luajit/src/lj_opt_fold_dyn.o +0 -0
  290. data/lua-hooks/ext/luajit/src/lj_opt_loop.c +449 -0
  291. data/lua-hooks/ext/luajit/src/lj_opt_loop.o +0 -0
  292. data/lua-hooks/ext/luajit/src/lj_opt_loop_dyn.o +0 -0
  293. data/lua-hooks/ext/luajit/src/lj_opt_mem.c +935 -0
  294. data/lua-hooks/ext/luajit/src/lj_opt_mem.o +0 -0
  295. data/lua-hooks/ext/luajit/src/lj_opt_mem_dyn.o +0 -0
  296. data/lua-hooks/ext/luajit/src/lj_opt_narrow.c +652 -0
  297. data/lua-hooks/ext/luajit/src/lj_opt_narrow.o +0 -0
  298. data/lua-hooks/ext/luajit/src/lj_opt_narrow_dyn.o +0 -0
  299. data/lua-hooks/ext/luajit/src/lj_opt_sink.c +245 -0
  300. data/lua-hooks/ext/luajit/src/lj_opt_sink.o +0 -0
  301. data/lua-hooks/ext/luajit/src/lj_opt_sink_dyn.o +0 -0
  302. data/lua-hooks/ext/luajit/src/lj_opt_split.c +856 -0
  303. data/lua-hooks/ext/luajit/src/lj_opt_split.o +0 -0
  304. data/lua-hooks/ext/luajit/src/lj_opt_split_dyn.o +0 -0
  305. data/lua-hooks/ext/luajit/src/lj_parse.c +2725 -0
  306. data/lua-hooks/ext/luajit/src/lj_parse.h +18 -0
  307. data/lua-hooks/ext/luajit/src/lj_parse.o +0 -0
  308. data/lua-hooks/ext/luajit/src/lj_parse_dyn.o +0 -0
  309. data/lua-hooks/ext/luajit/src/lj_profile.c +368 -0
  310. data/lua-hooks/ext/luajit/src/lj_profile.h +21 -0
  311. data/lua-hooks/ext/luajit/src/lj_profile.o +0 -0
  312. data/lua-hooks/ext/luajit/src/lj_profile_dyn.o +0 -0
  313. data/lua-hooks/ext/luajit/src/lj_recdef.h +270 -0
  314. data/lua-hooks/ext/luajit/src/lj_record.c +2554 -0
  315. data/lua-hooks/ext/luajit/src/lj_record.h +45 -0
  316. data/lua-hooks/ext/luajit/src/lj_record.o +0 -0
  317. data/lua-hooks/ext/luajit/src/lj_record_dyn.o +0 -0
  318. data/lua-hooks/ext/luajit/src/lj_snap.c +870 -0
  319. data/lua-hooks/ext/luajit/src/lj_snap.h +34 -0
  320. data/lua-hooks/ext/luajit/src/lj_snap.o +0 -0
  321. data/lua-hooks/ext/luajit/src/lj_snap_dyn.o +0 -0
  322. data/lua-hooks/ext/luajit/src/lj_state.c +300 -0
  323. data/lua-hooks/ext/luajit/src/lj_state.h +35 -0
  324. data/lua-hooks/ext/luajit/src/lj_state.o +0 -0
  325. data/lua-hooks/ext/luajit/src/lj_state_dyn.o +0 -0
  326. data/lua-hooks/ext/luajit/src/lj_str.c +197 -0
  327. data/lua-hooks/ext/luajit/src/lj_str.h +27 -0
  328. data/lua-hooks/ext/luajit/src/lj_str.o +0 -0
  329. data/lua-hooks/ext/luajit/src/lj_str_dyn.o +0 -0
  330. data/lua-hooks/ext/luajit/src/lj_strfmt.c +554 -0
  331. data/lua-hooks/ext/luajit/src/lj_strfmt.h +125 -0
  332. data/lua-hooks/ext/luajit/src/lj_strfmt.o +0 -0
  333. data/lua-hooks/ext/luajit/src/lj_strfmt_dyn.o +0 -0
  334. data/lua-hooks/ext/luajit/src/lj_strscan.c +547 -0
  335. data/lua-hooks/ext/luajit/src/lj_strscan.h +39 -0
  336. data/lua-hooks/ext/luajit/src/lj_strscan.o +0 -0
  337. data/lua-hooks/ext/luajit/src/lj_strscan_dyn.o +0 -0
  338. data/lua-hooks/ext/luajit/src/lj_tab.c +666 -0
  339. data/lua-hooks/ext/luajit/src/lj_tab.h +73 -0
  340. data/lua-hooks/ext/luajit/src/lj_tab.o +0 -0
  341. data/lua-hooks/ext/luajit/src/lj_tab_dyn.o +0 -0
  342. data/lua-hooks/ext/luajit/src/lj_target.h +164 -0
  343. data/lua-hooks/ext/luajit/src/lj_target_arm.h +270 -0
  344. data/lua-hooks/ext/luajit/src/lj_target_arm64.h +97 -0
  345. data/lua-hooks/ext/luajit/src/lj_target_mips.h +260 -0
  346. data/lua-hooks/ext/luajit/src/lj_target_ppc.h +280 -0
  347. data/lua-hooks/ext/luajit/src/lj_target_x86.h +345 -0
  348. data/lua-hooks/ext/luajit/src/lj_trace.c +859 -0
  349. data/lua-hooks/ext/luajit/src/lj_trace.h +54 -0
  350. data/lua-hooks/ext/luajit/src/lj_trace.o +0 -0
  351. data/lua-hooks/ext/luajit/src/lj_trace_dyn.o +0 -0
  352. data/lua-hooks/ext/luajit/src/lj_traceerr.h +63 -0
  353. data/lua-hooks/ext/luajit/src/lj_udata.c +34 -0
  354. data/lua-hooks/ext/luajit/src/lj_udata.h +14 -0
  355. data/lua-hooks/ext/luajit/src/lj_udata.o +0 -0
  356. data/lua-hooks/ext/luajit/src/lj_udata_dyn.o +0 -0
  357. data/lua-hooks/ext/luajit/src/lj_vm.S +2730 -0
  358. data/lua-hooks/ext/luajit/src/lj_vm.h +114 -0
  359. data/lua-hooks/ext/luajit/src/lj_vm.o +0 -0
  360. data/lua-hooks/ext/luajit/src/lj_vm_dyn.o +0 -0
  361. data/lua-hooks/ext/luajit/src/lj_vmevent.c +58 -0
  362. data/lua-hooks/ext/luajit/src/lj_vmevent.h +59 -0
  363. data/lua-hooks/ext/luajit/src/lj_vmevent.o +0 -0
  364. data/lua-hooks/ext/luajit/src/lj_vmevent_dyn.o +0 -0
  365. data/lua-hooks/ext/luajit/src/lj_vmmath.c +152 -0
  366. data/lua-hooks/ext/luajit/src/lj_vmmath.o +0 -0
  367. data/lua-hooks/ext/luajit/src/lj_vmmath_dyn.o +0 -0
  368. data/lua-hooks/ext/luajit/src/ljamalg.c +96 -0
  369. data/lua-hooks/ext/{lua → luajit/src}/lua.h +12 -7
  370. data/lua-hooks/ext/luajit/src/lua.hpp +9 -0
  371. data/lua-hooks/ext/luajit/src/luaconf.h +156 -0
  372. data/lua-hooks/ext/luajit/src/luajit +0 -0
  373. data/lua-hooks/ext/luajit/src/luajit.c +570 -0
  374. data/lua-hooks/ext/luajit/src/luajit.h +79 -0
  375. data/lua-hooks/ext/luajit/src/luajit.o +0 -0
  376. data/lua-hooks/ext/luajit/src/lualib.h +43 -0
  377. data/lua-hooks/ext/luajit/src/msvcbuild.bat +114 -0
  378. data/lua-hooks/ext/luajit/src/ps4build.bat +103 -0
  379. data/lua-hooks/ext/luajit/src/psvitabuild.bat +93 -0
  380. data/lua-hooks/ext/luajit/src/vm_arm.dasc +4585 -0
  381. data/lua-hooks/ext/luajit/src/vm_arm64.dasc +3764 -0
  382. data/lua-hooks/ext/luajit/src/vm_mips.dasc +4355 -0
  383. data/lua-hooks/ext/luajit/src/vm_ppc.dasc +5252 -0
  384. data/lua-hooks/ext/luajit/src/vm_x64.dasc +4902 -0
  385. data/lua-hooks/ext/luajit/src/vm_x86.dasc +5710 -0
  386. data/lua-hooks/ext/luajit/src/xb1build.bat +101 -0
  387. data/lua-hooks/ext/luajit/src/xedkbuild.bat +92 -0
  388. data/lua-hooks/ext/luautf8/lutf8lib.c +3 -3
  389. data/lua-hooks/lib/boot.lua +37 -2
  390. metadata +372 -69
  391. data/lua-hooks/ext/bitop/README +0 -22
  392. data/lua-hooks/ext/bitop/bit.c +0 -189
  393. data/lua-hooks/ext/extconf.rb +0 -38
  394. data/lua-hooks/ext/lua/COPYRIGHT +0 -34
  395. data/lua-hooks/ext/lua/lapi.c +0 -1087
  396. data/lua-hooks/ext/lua/lapi.h +0 -16
  397. data/lua-hooks/ext/lua/lauxlib.c +0 -652
  398. data/lua-hooks/ext/lua/lbaselib.c +0 -659
  399. data/lua-hooks/ext/lua/lcode.c +0 -831
  400. data/lua-hooks/ext/lua/lcode.h +0 -76
  401. data/lua-hooks/ext/lua/ldblib.c +0 -398
  402. data/lua-hooks/ext/lua/ldebug.c +0 -638
  403. data/lua-hooks/ext/lua/ldebug.h +0 -33
  404. data/lua-hooks/ext/lua/ldo.c +0 -519
  405. data/lua-hooks/ext/lua/ldo.h +0 -57
  406. data/lua-hooks/ext/lua/ldump.c +0 -164
  407. data/lua-hooks/ext/lua/lfunc.c +0 -174
  408. data/lua-hooks/ext/lua/lfunc.h +0 -34
  409. data/lua-hooks/ext/lua/lgc.c +0 -710
  410. data/lua-hooks/ext/lua/lgc.h +0 -110
  411. data/lua-hooks/ext/lua/linit.c +0 -38
  412. data/lua-hooks/ext/lua/liolib.c +0 -556
  413. data/lua-hooks/ext/lua/llex.c +0 -463
  414. data/lua-hooks/ext/lua/llex.h +0 -81
  415. data/lua-hooks/ext/lua/llimits.h +0 -128
  416. data/lua-hooks/ext/lua/lmathlib.c +0 -263
  417. data/lua-hooks/ext/lua/lmem.c +0 -86
  418. data/lua-hooks/ext/lua/lmem.h +0 -49
  419. data/lua-hooks/ext/lua/loadlib.c +0 -705
  420. data/lua-hooks/ext/lua/loadlib_rel.c +0 -760
  421. data/lua-hooks/ext/lua/lobject.c +0 -214
  422. data/lua-hooks/ext/lua/lobject.h +0 -381
  423. data/lua-hooks/ext/lua/lopcodes.c +0 -102
  424. data/lua-hooks/ext/lua/lopcodes.h +0 -268
  425. data/lua-hooks/ext/lua/loslib.c +0 -243
  426. data/lua-hooks/ext/lua/lparser.c +0 -1339
  427. data/lua-hooks/ext/lua/lparser.h +0 -82
  428. data/lua-hooks/ext/lua/lstate.c +0 -214
  429. data/lua-hooks/ext/lua/lstate.h +0 -169
  430. data/lua-hooks/ext/lua/lstring.c +0 -111
  431. data/lua-hooks/ext/lua/lstring.h +0 -31
  432. data/lua-hooks/ext/lua/lstrlib.c +0 -871
  433. data/lua-hooks/ext/lua/ltable.c +0 -588
  434. data/lua-hooks/ext/lua/ltable.h +0 -40
  435. data/lua-hooks/ext/lua/ltablib.c +0 -287
  436. data/lua-hooks/ext/lua/ltm.c +0 -75
  437. data/lua-hooks/ext/lua/ltm.h +0 -54
  438. data/lua-hooks/ext/lua/lua.c +0 -392
  439. data/lua-hooks/ext/lua/lua.def +0 -131
  440. data/lua-hooks/ext/lua/lua.rc +0 -28
  441. data/lua-hooks/ext/lua/lua_dll.rc +0 -26
  442. data/lua-hooks/ext/lua/luac.c +0 -200
  443. data/lua-hooks/ext/lua/luac.rc +0 -1
  444. data/lua-hooks/ext/lua/luaconf.h +0 -763
  445. data/lua-hooks/ext/lua/luaconf.h.in +0 -724
  446. data/lua-hooks/ext/lua/luaconf.h.orig +0 -763
  447. data/lua-hooks/ext/lua/lualib.h +0 -53
  448. data/lua-hooks/ext/lua/lundump.c +0 -227
  449. data/lua-hooks/ext/lua/lundump.h +0 -36
  450. data/lua-hooks/ext/lua/lvm.c +0 -767
  451. data/lua-hooks/ext/lua/lvm.h +0 -36
  452. data/lua-hooks/ext/lua/lzio.c +0 -82
  453. data/lua-hooks/ext/lua/lzio.h +0 -67
  454. data/lua-hooks/ext/lua/print.c +0 -227
@@ -0,0 +1,449 @@
1
+ /*
2
+ ** LOOP: Loop Optimizations.
3
+ ** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
4
+ */
5
+
6
+ #define lj_opt_loop_c
7
+ #define LUA_CORE
8
+
9
+ #include "lj_obj.h"
10
+
11
+ #if LJ_HASJIT
12
+
13
+ #include "lj_err.h"
14
+ #include "lj_buf.h"
15
+ #include "lj_ir.h"
16
+ #include "lj_jit.h"
17
+ #include "lj_iropt.h"
18
+ #include "lj_trace.h"
19
+ #include "lj_snap.h"
20
+ #include "lj_vm.h"
21
+
22
+ /* Loop optimization:
23
+ **
24
+ ** Traditional Loop-Invariant Code Motion (LICM) splits the instructions
25
+ ** of a loop into invariant and variant instructions. The invariant
26
+ ** instructions are hoisted out of the loop and only the variant
27
+ ** instructions remain inside the loop body.
28
+ **
29
+ ** Unfortunately LICM is mostly useless for compiling dynamic languages.
30
+ ** The IR has many guards and most of the subsequent instructions are
31
+ ** control-dependent on them. The first non-hoistable guard would
32
+ ** effectively prevent hoisting of all subsequent instructions.
33
+ **
34
+ ** That's why we use a special form of unrolling using copy-substitution,
35
+ ** combined with redundancy elimination:
36
+ **
37
+ ** The recorded instruction stream is re-emitted to the compiler pipeline
38
+ ** with substituted operands. The substitution table is filled with the
39
+ ** refs returned by re-emitting each instruction. This can be done
40
+ ** on-the-fly, because the IR is in strict SSA form, where every ref is
41
+ ** defined before its use.
42
+ **
43
+ ** This aproach generates two code sections, separated by the LOOP
44
+ ** instruction:
45
+ **
46
+ ** 1. The recorded instructions form a kind of pre-roll for the loop. It
47
+ ** contains a mix of invariant and variant instructions and performs
48
+ ** exactly one loop iteration (but not necessarily the 1st iteration).
49
+ **
50
+ ** 2. The loop body contains only the variant instructions and performs
51
+ ** all remaining loop iterations.
52
+ **
53
+ ** On first sight that looks like a waste of space, because the variant
54
+ ** instructions are present twice. But the key insight is that the
55
+ ** pre-roll honors the control-dependencies for *both* the pre-roll itself
56
+ ** *and* the loop body!
57
+ **
58
+ ** It also means one doesn't have to explicitly model control-dependencies
59
+ ** (which, BTW, wouldn't help LICM much). And it's much easier to
60
+ ** integrate sparse snapshotting with this approach.
61
+ **
62
+ ** One of the nicest aspects of this approach is that all of the
63
+ ** optimizations of the compiler pipeline (FOLD, CSE, FWD, etc.) can be
64
+ ** reused with only minor restrictions (e.g. one should not fold
65
+ ** instructions across loop-carried dependencies).
66
+ **
67
+ ** But in general all optimizations can be applied which only need to look
68
+ ** backwards into the generated instruction stream. At any point in time
69
+ ** during the copy-substitution process this contains both a static loop
70
+ ** iteration (the pre-roll) and a dynamic one (from the to-be-copied
71
+ ** instruction up to the end of the partial loop body).
72
+ **
73
+ ** Since control-dependencies are implicitly kept, CSE also applies to all
74
+ ** kinds of guards. The major advantage is that all invariant guards can
75
+ ** be hoisted, too.
76
+ **
77
+ ** Load/store forwarding works across loop iterations, too. This is
78
+ ** important if loop-carried dependencies are kept in upvalues or tables.
79
+ ** E.g. 'self.idx = self.idx + 1' deep down in some OO-style method may
80
+ ** become a forwarded loop-recurrence after inlining.
81
+ **
82
+ ** Since the IR is in SSA form, loop-carried dependencies have to be
83
+ ** modeled with PHI instructions. The potential candidates for PHIs are
84
+ ** collected on-the-fly during copy-substitution. After eliminating the
85
+ ** redundant ones, PHI instructions are emitted *below* the loop body.
86
+ **
87
+ ** Note that this departure from traditional SSA form doesn't change the
88
+ ** semantics of the PHI instructions themselves. But it greatly simplifies
89
+ ** on-the-fly generation of the IR and the machine code.
90
+ */
91
+
92
+ /* Some local macros to save typing. Undef'd at the end. */
93
+ #define IR(ref) (&J->cur.ir[(ref)])
94
+
95
+ /* Pass IR on to next optimization in chain (FOLD). */
96
+ #define emitir(ot, a, b) (lj_ir_set(J, (ot), (a), (b)), lj_opt_fold(J))
97
+
98
+ /* Emit raw IR without passing through optimizations. */
99
+ #define emitir_raw(ot, a, b) (lj_ir_set(J, (ot), (a), (b)), lj_ir_emit(J))
100
+
101
+ /* -- PHI elimination ----------------------------------------------------- */
102
+
103
+ /* Emit or eliminate collected PHIs. */
104
+ static void loop_emit_phi(jit_State *J, IRRef1 *subst, IRRef1 *phi, IRRef nphi,
105
+ SnapNo onsnap)
106
+ {
107
+ int passx = 0;
108
+ IRRef i, j, nslots;
109
+ IRRef invar = J->chain[IR_LOOP];
110
+ /* Pass #1: mark redundant and potentially redundant PHIs. */
111
+ for (i = 0, j = 0; i < nphi; i++) {
112
+ IRRef lref = phi[i];
113
+ IRRef rref = subst[lref];
114
+ if (lref == rref || rref == REF_DROP) { /* Invariants are redundant. */
115
+ irt_clearphi(IR(lref)->t);
116
+ } else {
117
+ phi[j++] = (IRRef1)lref;
118
+ if (!(IR(rref)->op1 == lref || IR(rref)->op2 == lref)) {
119
+ /* Quick check for simple recurrences failed, need pass2. */
120
+ irt_setmark(IR(lref)->t);
121
+ passx = 1;
122
+ }
123
+ }
124
+ }
125
+ nphi = j;
126
+ /* Pass #2: traverse variant part and clear marks of non-redundant PHIs. */
127
+ if (passx) {
128
+ SnapNo s;
129
+ for (i = J->cur.nins-1; i > invar; i--) {
130
+ IRIns *ir = IR(i);
131
+ if (!irref_isk(ir->op2)) irt_clearmark(IR(ir->op2)->t);
132
+ if (!irref_isk(ir->op1)) {
133
+ irt_clearmark(IR(ir->op1)->t);
134
+ if (ir->op1 < invar &&
135
+ ir->o >= IR_CALLN && ir->o <= IR_CARG) { /* ORDER IR */
136
+ ir = IR(ir->op1);
137
+ while (ir->o == IR_CARG) {
138
+ if (!irref_isk(ir->op2)) irt_clearmark(IR(ir->op2)->t);
139
+ if (irref_isk(ir->op1)) break;
140
+ ir = IR(ir->op1);
141
+ irt_clearmark(ir->t);
142
+ }
143
+ }
144
+ }
145
+ }
146
+ for (s = J->cur.nsnap-1; s >= onsnap; s--) {
147
+ SnapShot *snap = &J->cur.snap[s];
148
+ SnapEntry *map = &J->cur.snapmap[snap->mapofs];
149
+ MSize n, nent = snap->nent;
150
+ for (n = 0; n < nent; n++) {
151
+ IRRef ref = snap_ref(map[n]);
152
+ if (!irref_isk(ref)) irt_clearmark(IR(ref)->t);
153
+ }
154
+ }
155
+ }
156
+ /* Pass #3: add PHIs for variant slots without a corresponding SLOAD. */
157
+ nslots = J->baseslot+J->maxslot;
158
+ for (i = 1; i < nslots; i++) {
159
+ IRRef ref = tref_ref(J->slot[i]);
160
+ while (!irref_isk(ref) && ref != subst[ref]) {
161
+ IRIns *ir = IR(ref);
162
+ irt_clearmark(ir->t); /* Unmark potential uses, too. */
163
+ if (irt_isphi(ir->t) || irt_ispri(ir->t))
164
+ break;
165
+ irt_setphi(ir->t);
166
+ if (nphi >= LJ_MAX_PHI)
167
+ lj_trace_err(J, LJ_TRERR_PHIOV);
168
+ phi[nphi++] = (IRRef1)ref;
169
+ ref = subst[ref];
170
+ if (ref > invar)
171
+ break;
172
+ }
173
+ }
174
+ /* Pass #4: propagate non-redundant PHIs. */
175
+ while (passx) {
176
+ passx = 0;
177
+ for (i = 0; i < nphi; i++) {
178
+ IRRef lref = phi[i];
179
+ IRIns *ir = IR(lref);
180
+ if (!irt_ismarked(ir->t)) { /* Propagate only from unmarked PHIs. */
181
+ IRIns *irr = IR(subst[lref]);
182
+ if (irt_ismarked(irr->t)) { /* Right ref points to other PHI? */
183
+ irt_clearmark(irr->t); /* Mark that PHI as non-redundant. */
184
+ passx = 1; /* Retry. */
185
+ }
186
+ }
187
+ }
188
+ }
189
+ /* Pass #5: emit PHI instructions or eliminate PHIs. */
190
+ for (i = 0; i < nphi; i++) {
191
+ IRRef lref = phi[i];
192
+ IRIns *ir = IR(lref);
193
+ if (!irt_ismarked(ir->t)) { /* Emit PHI if not marked. */
194
+ IRRef rref = subst[lref];
195
+ if (rref > invar)
196
+ irt_setphi(IR(rref)->t);
197
+ emitir_raw(IRT(IR_PHI, irt_type(ir->t)), lref, rref);
198
+ } else { /* Otherwise eliminate PHI. */
199
+ irt_clearmark(ir->t);
200
+ irt_clearphi(ir->t);
201
+ }
202
+ }
203
+ }
204
+
205
+ /* -- Loop unrolling using copy-substitution ------------------------------ */
206
+
207
+ /* Copy-substitute snapshot. */
208
+ static void loop_subst_snap(jit_State *J, SnapShot *osnap,
209
+ SnapEntry *loopmap, IRRef1 *subst)
210
+ {
211
+ SnapEntry *nmap, *omap = &J->cur.snapmap[osnap->mapofs];
212
+ SnapEntry *nextmap = &J->cur.snapmap[snap_nextofs(&J->cur, osnap)];
213
+ MSize nmapofs;
214
+ MSize on, ln, nn, onent = osnap->nent;
215
+ BCReg nslots = osnap->nslots;
216
+ SnapShot *snap = &J->cur.snap[J->cur.nsnap];
217
+ if (irt_isguard(J->guardemit)) { /* Guard inbetween? */
218
+ nmapofs = J->cur.nsnapmap;
219
+ J->cur.nsnap++; /* Add new snapshot. */
220
+ } else { /* Otherwise overwrite previous snapshot. */
221
+ snap--;
222
+ nmapofs = snap->mapofs;
223
+ }
224
+ J->guardemit.irt = 0;
225
+ /* Setup new snapshot. */
226
+ snap->mapofs = (uint16_t)nmapofs;
227
+ snap->ref = (IRRef1)J->cur.nins;
228
+ snap->nslots = nslots;
229
+ snap->topslot = osnap->topslot;
230
+ snap->count = 0;
231
+ nmap = &J->cur.snapmap[nmapofs];
232
+ /* Substitute snapshot slots. */
233
+ on = ln = nn = 0;
234
+ while (on < onent) {
235
+ SnapEntry osn = omap[on], lsn = loopmap[ln];
236
+ if (snap_slot(lsn) < snap_slot(osn)) { /* Copy slot from loop map. */
237
+ nmap[nn++] = lsn;
238
+ ln++;
239
+ } else { /* Copy substituted slot from snapshot map. */
240
+ if (snap_slot(lsn) == snap_slot(osn)) ln++; /* Shadowed loop slot. */
241
+ if (!irref_isk(snap_ref(osn)))
242
+ osn = snap_setref(osn, subst[snap_ref(osn)]);
243
+ nmap[nn++] = osn;
244
+ on++;
245
+ }
246
+ }
247
+ while (snap_slot(loopmap[ln]) < nslots) /* Copy remaining loop slots. */
248
+ nmap[nn++] = loopmap[ln++];
249
+ snap->nent = (uint8_t)nn;
250
+ omap += onent;
251
+ nmap += nn;
252
+ while (omap < nextmap) /* Copy PC + frame links. */
253
+ *nmap++ = *omap++;
254
+ J->cur.nsnapmap = (uint16_t)(nmap - J->cur.snapmap);
255
+ }
256
+
257
+ typedef struct LoopState {
258
+ jit_State *J;
259
+ IRRef1 *subst;
260
+ MSize sizesubst;
261
+ } LoopState;
262
+
263
+ /* Unroll loop. */
264
+ static void loop_unroll(LoopState *lps)
265
+ {
266
+ jit_State *J = lps->J;
267
+ IRRef1 phi[LJ_MAX_PHI];
268
+ uint32_t nphi = 0;
269
+ IRRef1 *subst;
270
+ SnapNo onsnap;
271
+ SnapShot *osnap, *loopsnap;
272
+ SnapEntry *loopmap, *psentinel;
273
+ IRRef ins, invar;
274
+
275
+ /* Allocate substitution table.
276
+ ** Only non-constant refs in [REF_BIAS,invar) are valid indexes.
277
+ */
278
+ invar = J->cur.nins;
279
+ lps->sizesubst = invar - REF_BIAS;
280
+ lps->subst = lj_mem_newvec(J->L, lps->sizesubst, IRRef1);
281
+ subst = lps->subst - REF_BIAS;
282
+ subst[REF_BASE] = REF_BASE;
283
+
284
+ /* LOOP separates the pre-roll from the loop body. */
285
+ emitir_raw(IRTG(IR_LOOP, IRT_NIL), 0, 0);
286
+
287
+ /* Grow snapshot buffer and map for copy-substituted snapshots.
288
+ ** Need up to twice the number of snapshots minus #0 and loop snapshot.
289
+ ** Need up to twice the number of entries plus fallback substitutions
290
+ ** from the loop snapshot entries for each new snapshot.
291
+ ** Caveat: both calls may reallocate J->cur.snap and J->cur.snapmap!
292
+ */
293
+ onsnap = J->cur.nsnap;
294
+ lj_snap_grow_buf(J, 2*onsnap-2);
295
+ lj_snap_grow_map(J, J->cur.nsnapmap*2+(onsnap-2)*J->cur.snap[onsnap-1].nent);
296
+
297
+ /* The loop snapshot is used for fallback substitutions. */
298
+ loopsnap = &J->cur.snap[onsnap-1];
299
+ loopmap = &J->cur.snapmap[loopsnap->mapofs];
300
+ /* The PC of snapshot #0 and the loop snapshot must match. */
301
+ psentinel = &loopmap[loopsnap->nent];
302
+ lua_assert(*psentinel == J->cur.snapmap[J->cur.snap[0].nent]);
303
+ *psentinel = SNAP(255, 0, 0); /* Replace PC with temporary sentinel. */
304
+
305
+ /* Start substitution with snapshot #1 (#0 is empty for root traces). */
306
+ osnap = &J->cur.snap[1];
307
+
308
+ /* Copy and substitute all recorded instructions and snapshots. */
309
+ for (ins = REF_FIRST; ins < invar; ins++) {
310
+ IRIns *ir;
311
+ IRRef op1, op2;
312
+
313
+ if (ins >= osnap->ref) /* Instruction belongs to next snapshot? */
314
+ loop_subst_snap(J, osnap++, loopmap, subst); /* Copy-substitute it. */
315
+
316
+ /* Substitute instruction operands. */
317
+ ir = IR(ins);
318
+ op1 = ir->op1;
319
+ if (!irref_isk(op1)) op1 = subst[op1];
320
+ op2 = ir->op2;
321
+ if (!irref_isk(op2)) op2 = subst[op2];
322
+ if (irm_kind(lj_ir_mode[ir->o]) == IRM_N &&
323
+ op1 == ir->op1 && op2 == ir->op2) { /* Regular invariant ins? */
324
+ subst[ins] = (IRRef1)ins; /* Shortcut. */
325
+ } else {
326
+ /* Re-emit substituted instruction to the FOLD/CSE/etc. pipeline. */
327
+ IRType1 t = ir->t; /* Get this first, since emitir may invalidate ir. */
328
+ IRRef ref = tref_ref(emitir(ir->ot & ~IRT_ISPHI, op1, op2));
329
+ subst[ins] = (IRRef1)ref;
330
+ if (ref != ins) {
331
+ IRIns *irr = IR(ref);
332
+ if (ref < invar) { /* Loop-carried dependency? */
333
+ /* Potential PHI? */
334
+ if (!irref_isk(ref) && !irt_isphi(irr->t) && !irt_ispri(irr->t)) {
335
+ irt_setphi(irr->t);
336
+ if (nphi >= LJ_MAX_PHI)
337
+ lj_trace_err(J, LJ_TRERR_PHIOV);
338
+ phi[nphi++] = (IRRef1)ref;
339
+ }
340
+ /* Check all loop-carried dependencies for type instability. */
341
+ if (!irt_sametype(t, irr->t)) {
342
+ if (irt_isinteger(t) && irt_isinteger(irr->t))
343
+ continue;
344
+ else if (irt_isnum(t) && irt_isinteger(irr->t)) /* Fix int->num. */
345
+ ref = tref_ref(emitir(IRTN(IR_CONV), ref, IRCONV_NUM_INT));
346
+ else if (irt_isnum(irr->t) && irt_isinteger(t)) /* Fix num->int. */
347
+ ref = tref_ref(emitir(IRTGI(IR_CONV), ref,
348
+ IRCONV_INT_NUM|IRCONV_CHECK));
349
+ else
350
+ lj_trace_err(J, LJ_TRERR_TYPEINS);
351
+ subst[ins] = (IRRef1)ref;
352
+ irr = IR(ref);
353
+ goto phiconv;
354
+ }
355
+ } else if (ref != REF_DROP && irr->o == IR_CONV &&
356
+ ref > invar && irr->op1 < invar) {
357
+ /* May need an extra PHI for a CONV. */
358
+ ref = irr->op1;
359
+ irr = IR(ref);
360
+ phiconv:
361
+ if (ref < invar && !irref_isk(ref) && !irt_isphi(irr->t)) {
362
+ irt_setphi(irr->t);
363
+ if (nphi >= LJ_MAX_PHI)
364
+ lj_trace_err(J, LJ_TRERR_PHIOV);
365
+ phi[nphi++] = (IRRef1)ref;
366
+ }
367
+ }
368
+ }
369
+ }
370
+ }
371
+ if (!irt_isguard(J->guardemit)) /* Drop redundant snapshot. */
372
+ J->cur.nsnapmap = (uint16_t)J->cur.snap[--J->cur.nsnap].mapofs;
373
+ lua_assert(J->cur.nsnapmap <= J->sizesnapmap);
374
+ *psentinel = J->cur.snapmap[J->cur.snap[0].nent]; /* Restore PC. */
375
+
376
+ loop_emit_phi(J, subst, phi, nphi, onsnap);
377
+ }
378
+
379
+ /* Undo any partial changes made by the loop optimization. */
380
+ static void loop_undo(jit_State *J, IRRef ins, SnapNo nsnap, MSize nsnapmap)
381
+ {
382
+ ptrdiff_t i;
383
+ SnapShot *snap = &J->cur.snap[nsnap-1];
384
+ SnapEntry *map = J->cur.snapmap;
385
+ map[snap->mapofs + snap->nent] = map[J->cur.snap[0].nent]; /* Restore PC. */
386
+ J->cur.nsnapmap = (uint16_t)nsnapmap;
387
+ J->cur.nsnap = nsnap;
388
+ J->guardemit.irt = 0;
389
+ lj_ir_rollback(J, ins);
390
+ for (i = 0; i < BPROP_SLOTS; i++) { /* Remove backprop. cache entries. */
391
+ BPropEntry *bp = &J->bpropcache[i];
392
+ if (bp->val >= ins)
393
+ bp->key = 0;
394
+ }
395
+ for (ins--; ins >= REF_FIRST; ins--) { /* Remove flags. */
396
+ IRIns *ir = IR(ins);
397
+ irt_clearphi(ir->t);
398
+ irt_clearmark(ir->t);
399
+ }
400
+ }
401
+
402
+ /* Protected callback for loop optimization. */
403
+ static TValue *cploop_opt(lua_State *L, lua_CFunction dummy, void *ud)
404
+ {
405
+ UNUSED(L); UNUSED(dummy);
406
+ loop_unroll((LoopState *)ud);
407
+ return NULL;
408
+ }
409
+
410
+ /* Loop optimization. */
411
+ int lj_opt_loop(jit_State *J)
412
+ {
413
+ IRRef nins = J->cur.nins;
414
+ SnapNo nsnap = J->cur.nsnap;
415
+ MSize nsnapmap = J->cur.nsnapmap;
416
+ LoopState lps;
417
+ int errcode;
418
+ lps.J = J;
419
+ lps.subst = NULL;
420
+ lps.sizesubst = 0;
421
+ errcode = lj_vm_cpcall(J->L, NULL, &lps, cploop_opt);
422
+ lj_mem_freevec(J2G(J), lps.subst, lps.sizesubst, IRRef1);
423
+ if (LJ_UNLIKELY(errcode)) {
424
+ lua_State *L = J->L;
425
+ if (errcode == LUA_ERRRUN && tvisnumber(L->top-1)) { /* Trace error? */
426
+ int32_t e = numberVint(L->top-1);
427
+ switch ((TraceError)e) {
428
+ case LJ_TRERR_TYPEINS: /* Type instability. */
429
+ case LJ_TRERR_GFAIL: /* Guard would always fail. */
430
+ /* Unrolling via recording fixes many cases, e.g. a flipped boolean. */
431
+ if (--J->instunroll < 0) /* But do not unroll forever. */
432
+ break;
433
+ L->top--; /* Remove error object. */
434
+ loop_undo(J, nins, nsnap, nsnapmap);
435
+ return 1; /* Loop optimization failed, continue recording. */
436
+ default:
437
+ break;
438
+ }
439
+ }
440
+ lj_err_throw(L, errcode); /* Propagate all other errors. */
441
+ }
442
+ return 0; /* Loop optimization is ok. */
443
+ }
444
+
445
+ #undef IR
446
+ #undef emitir
447
+ #undef emitir_raw
448
+
449
+ #endif