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.
- checksums.yaml +4 -4
- data/LICENSE +0 -27
- data/ext/immunio/Rakefile +9 -0
- data/lib/immunio/plugins/active_record.rb +1 -1
- data/lib/immunio/plugins/active_record_relation.rb +1 -1
- data/lib/immunio/plugins/environment_reporter.rb +20 -0
- data/lib/immunio/rufus_lua_ext/ref.rb +1 -3
- data/lib/immunio/version.rb +1 -1
- data/lib/immunio/vm.rb +1 -2
- data/lua-hooks/Makefile +97 -0
- data/lua-hooks/ext/all.c +41 -52
- data/lua-hooks/ext/all.o +0 -0
- data/lua-hooks/ext/libinjection/libinjection_html5.o +0 -0
- data/lua-hooks/ext/libinjection/libinjection_sqli.o +0 -0
- data/lua-hooks/ext/libinjection/libinjection_xss.o +0 -0
- data/lua-hooks/ext/libinjection/lualib.c +2 -2
- data/lua-hooks/ext/lpeg/lpcap.c +2 -2
- data/lua-hooks/ext/lpeg/lpcap.o +0 -0
- data/lua-hooks/ext/lpeg/lpcode.c +2 -2
- data/lua-hooks/ext/lpeg/lpcode.h +1 -1
- data/lua-hooks/ext/lpeg/lpcode.o +0 -0
- data/lua-hooks/ext/lpeg/lpprint.o +0 -0
- data/lua-hooks/ext/lpeg/lptree.c +2 -2
- data/lua-hooks/ext/lpeg/lptypes.h +1 -1
- data/lua-hooks/ext/lpeg/lpvm.c +2 -2
- data/lua-hooks/ext/lpeg/lpvm.o +0 -0
- data/lua-hooks/ext/lua-cmsgpack/lua_cmsgpack.c +16 -3
- data/lua-hooks/ext/lua-snapshot/snapshot.c +14 -7
- data/lua-hooks/ext/luajit/COPYRIGHT +56 -0
- data/lua-hooks/ext/luajit/Makefile +159 -0
- data/lua-hooks/ext/luajit/README +16 -0
- data/lua-hooks/ext/luajit/doc/bluequad-print.css +166 -0
- data/lua-hooks/ext/luajit/doc/bluequad.css +325 -0
- data/lua-hooks/ext/luajit/doc/changes.html +804 -0
- data/lua-hooks/ext/luajit/doc/contact.html +104 -0
- data/lua-hooks/ext/luajit/doc/ext_c_api.html +189 -0
- data/lua-hooks/ext/luajit/doc/ext_ffi.html +332 -0
- data/lua-hooks/ext/luajit/doc/ext_ffi_api.html +570 -0
- data/lua-hooks/ext/luajit/doc/ext_ffi_semantics.html +1261 -0
- data/lua-hooks/ext/luajit/doc/ext_ffi_tutorial.html +603 -0
- data/lua-hooks/ext/luajit/doc/ext_jit.html +201 -0
- data/lua-hooks/ext/luajit/doc/ext_profiler.html +365 -0
- data/lua-hooks/ext/luajit/doc/extensions.html +448 -0
- data/lua-hooks/ext/luajit/doc/faq.html +186 -0
- data/lua-hooks/ext/luajit/doc/img/contact.png +0 -0
- data/lua-hooks/ext/luajit/doc/install.html +659 -0
- data/lua-hooks/ext/luajit/doc/luajit.html +236 -0
- data/lua-hooks/ext/luajit/doc/running.html +309 -0
- data/lua-hooks/ext/luajit/doc/status.html +118 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_arm.h +456 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_arm.lua +1125 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_arm64.h +518 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_arm64.lua +1166 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_mips.h +416 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_mips.lua +953 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_ppc.h +419 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_ppc.lua +1919 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_proto.h +83 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_x64.lua +12 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_x86.h +471 -0
- data/lua-hooks/ext/luajit/dynasm/dasm_x86.lua +1945 -0
- data/lua-hooks/ext/luajit/dynasm/dynasm.lua +1094 -0
- data/lua-hooks/ext/luajit/etc/luajit.1 +88 -0
- data/lua-hooks/ext/luajit/etc/luajit.pc +25 -0
- data/lua-hooks/ext/luajit/src/Makefile +697 -0
- data/lua-hooks/ext/luajit/src/Makefile.dep +244 -0
- data/lua-hooks/ext/luajit/src/host/README +4 -0
- data/lua-hooks/ext/luajit/src/host/buildvm +0 -0
- data/lua-hooks/ext/luajit/src/host/buildvm.c +518 -0
- data/lua-hooks/ext/luajit/src/host/buildvm.h +105 -0
- data/lua-hooks/ext/luajit/src/host/buildvm.o +0 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_arch.h +7449 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_asm.c +345 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_asm.o +0 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_fold.c +229 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_fold.o +0 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_lib.c +457 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_lib.o +0 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_libbc.h +45 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_peobj.c +368 -0
- data/lua-hooks/ext/luajit/src/host/buildvm_peobj.o +0 -0
- data/lua-hooks/ext/luajit/src/host/genlibbc.lua +197 -0
- data/lua-hooks/ext/luajit/src/host/genminilua.lua +428 -0
- data/lua-hooks/ext/luajit/src/host/minilua +0 -0
- data/lua-hooks/ext/luajit/src/host/minilua.c +7770 -0
- data/lua-hooks/ext/luajit/src/host/minilua.o +0 -0
- data/lua-hooks/ext/luajit/src/jit/bc.lua +190 -0
- data/lua-hooks/ext/luajit/src/jit/bcsave.lua +661 -0
- data/lua-hooks/ext/luajit/src/jit/dis_arm.lua +689 -0
- data/lua-hooks/ext/luajit/src/jit/dis_mips.lua +428 -0
- data/lua-hooks/ext/luajit/src/jit/dis_mipsel.lua +17 -0
- data/lua-hooks/ext/luajit/src/jit/dis_ppc.lua +591 -0
- data/lua-hooks/ext/luajit/src/jit/dis_x64.lua +17 -0
- data/lua-hooks/ext/luajit/src/jit/dis_x86.lua +838 -0
- data/lua-hooks/ext/luajit/src/jit/dump.lua +706 -0
- data/lua-hooks/ext/luajit/src/jit/p.lua +310 -0
- data/lua-hooks/ext/luajit/src/jit/v.lua +170 -0
- data/lua-hooks/ext/luajit/src/jit/vmdef.lua +362 -0
- data/lua-hooks/ext/luajit/src/jit/zone.lua +45 -0
- data/lua-hooks/ext/{lua → luajit/src}/lauxlib.h +10 -17
- data/lua-hooks/ext/luajit/src/lib_aux.c +356 -0
- data/lua-hooks/ext/luajit/src/lib_aux.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_aux_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_base.c +664 -0
- data/lua-hooks/ext/luajit/src/lib_base.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_base_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_bit.c +180 -0
- data/lua-hooks/ext/luajit/src/lib_bit.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_bit_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_debug.c +405 -0
- data/lua-hooks/ext/luajit/src/lib_debug.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_debug_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_ffi.c +872 -0
- data/lua-hooks/ext/luajit/src/lib_ffi.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_ffi_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_init.c +55 -0
- data/lua-hooks/ext/luajit/src/lib_init.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_init_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_io.c +541 -0
- data/lua-hooks/ext/luajit/src/lib_io.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_io_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_jit.c +767 -0
- data/lua-hooks/ext/luajit/src/lib_jit.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_jit_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_math.c +230 -0
- data/lua-hooks/ext/luajit/src/lib_math.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_math_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_os.c +292 -0
- data/lua-hooks/ext/luajit/src/lib_os.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_os_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_package.c +610 -0
- data/lua-hooks/ext/luajit/src/lib_package.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_package_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_string.c +752 -0
- data/lua-hooks/ext/luajit/src/lib_string.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_string_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_table.c +307 -0
- data/lua-hooks/ext/luajit/src/lib_table.o +0 -0
- data/lua-hooks/ext/luajit/src/lib_table_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/libluajit.a +0 -0
- data/lua-hooks/ext/luajit/src/libluajit.so +0 -0
- data/lua-hooks/ext/luajit/src/lj.supp +26 -0
- data/lua-hooks/ext/luajit/src/lj_alloc.c +1398 -0
- data/lua-hooks/ext/luajit/src/lj_alloc.h +17 -0
- data/lua-hooks/ext/luajit/src/lj_alloc.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_alloc_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_api.c +1210 -0
- data/lua-hooks/ext/luajit/src/lj_api.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_api_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_arch.h +509 -0
- data/lua-hooks/ext/luajit/src/lj_asm.c +2278 -0
- data/lua-hooks/ext/luajit/src/lj_asm.h +17 -0
- data/lua-hooks/ext/luajit/src/lj_asm.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_asm_arm.h +2217 -0
- data/lua-hooks/ext/luajit/src/lj_asm_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_asm_mips.h +1833 -0
- data/lua-hooks/ext/luajit/src/lj_asm_ppc.h +2015 -0
- data/lua-hooks/ext/luajit/src/lj_asm_x86.h +2634 -0
- data/lua-hooks/ext/luajit/src/lj_bc.c +14 -0
- data/lua-hooks/ext/luajit/src/lj_bc.h +265 -0
- data/lua-hooks/ext/luajit/src/lj_bc.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_bc_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_bcdef.h +220 -0
- data/lua-hooks/ext/luajit/src/lj_bcdump.h +68 -0
- data/lua-hooks/ext/luajit/src/lj_bcread.c +457 -0
- data/lua-hooks/ext/luajit/src/lj_bcread.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_bcread_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_bcwrite.c +361 -0
- data/lua-hooks/ext/luajit/src/lj_bcwrite.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_bcwrite_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_buf.c +234 -0
- data/lua-hooks/ext/luajit/src/lj_buf.h +105 -0
- data/lua-hooks/ext/luajit/src/lj_buf.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_buf_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_carith.c +429 -0
- data/lua-hooks/ext/luajit/src/lj_carith.h +37 -0
- data/lua-hooks/ext/luajit/src/lj_carith.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_carith_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ccall.c +984 -0
- data/lua-hooks/ext/luajit/src/lj_ccall.h +178 -0
- data/lua-hooks/ext/luajit/src/lj_ccall.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ccall_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ccallback.c +712 -0
- data/lua-hooks/ext/luajit/src/lj_ccallback.h +25 -0
- data/lua-hooks/ext/luajit/src/lj_ccallback.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ccallback_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cconv.c +752 -0
- data/lua-hooks/ext/luajit/src/lj_cconv.h +70 -0
- data/lua-hooks/ext/luajit/src/lj_cconv.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cconv_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cdata.c +288 -0
- data/lua-hooks/ext/luajit/src/lj_cdata.h +76 -0
- data/lua-hooks/ext/luajit/src/lj_cdata.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cdata_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_char.c +43 -0
- data/lua-hooks/ext/luajit/src/lj_char.h +42 -0
- data/lua-hooks/ext/luajit/src/lj_char.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_char_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_clib.c +418 -0
- data/lua-hooks/ext/luajit/src/lj_clib.h +29 -0
- data/lua-hooks/ext/luajit/src/lj_clib.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_clib_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cparse.c +1862 -0
- data/lua-hooks/ext/luajit/src/lj_cparse.h +65 -0
- data/lua-hooks/ext/luajit/src/lj_cparse.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_cparse_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_crecord.c +1834 -0
- data/lua-hooks/ext/luajit/src/lj_crecord.h +38 -0
- data/lua-hooks/ext/luajit/src/lj_crecord.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_crecord_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ctype.c +635 -0
- data/lua-hooks/ext/luajit/src/lj_ctype.h +461 -0
- data/lua-hooks/ext/luajit/src/lj_ctype.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ctype_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_debug.c +699 -0
- data/lua-hooks/ext/luajit/src/lj_debug.h +65 -0
- data/lua-hooks/ext/luajit/src/lj_debug.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_debug_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_def.h +365 -0
- data/lua-hooks/ext/luajit/src/lj_dispatch.c +557 -0
- data/lua-hooks/ext/luajit/src/lj_dispatch.h +138 -0
- data/lua-hooks/ext/luajit/src/lj_dispatch.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_dispatch_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_emit_arm.h +356 -0
- data/lua-hooks/ext/luajit/src/lj_emit_mips.h +211 -0
- data/lua-hooks/ext/luajit/src/lj_emit_ppc.h +238 -0
- data/lua-hooks/ext/luajit/src/lj_emit_x86.h +462 -0
- data/lua-hooks/ext/luajit/src/lj_err.c +794 -0
- data/lua-hooks/ext/luajit/src/lj_err.h +41 -0
- data/lua-hooks/ext/luajit/src/lj_err.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_err_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_errmsg.h +190 -0
- data/lua-hooks/ext/luajit/src/lj_ff.h +18 -0
- data/lua-hooks/ext/luajit/src/lj_ffdef.h +209 -0
- data/lua-hooks/ext/luajit/src/lj_ffrecord.c +1247 -0
- data/lua-hooks/ext/luajit/src/lj_ffrecord.h +24 -0
- data/lua-hooks/ext/luajit/src/lj_ffrecord.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ffrecord_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_folddef.h +1138 -0
- data/lua-hooks/ext/luajit/src/lj_frame.h +259 -0
- data/lua-hooks/ext/luajit/src/lj_func.c +185 -0
- data/lua-hooks/ext/luajit/src/lj_func.h +24 -0
- data/lua-hooks/ext/luajit/src/lj_func.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_func_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_gc.c +845 -0
- data/lua-hooks/ext/luajit/src/lj_gc.h +134 -0
- data/lua-hooks/ext/luajit/src/lj_gc.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_gc_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_gdbjit.c +787 -0
- data/lua-hooks/ext/luajit/src/lj_gdbjit.h +22 -0
- data/lua-hooks/ext/luajit/src/lj_gdbjit.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_gdbjit_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ir.c +505 -0
- data/lua-hooks/ext/luajit/src/lj_ir.h +577 -0
- data/lua-hooks/ext/luajit/src/lj_ir.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ir_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_ircall.h +321 -0
- data/lua-hooks/ext/luajit/src/lj_iropt.h +161 -0
- data/lua-hooks/ext/luajit/src/lj_jit.h +440 -0
- data/lua-hooks/ext/luajit/src/lj_lex.c +482 -0
- data/lua-hooks/ext/luajit/src/lj_lex.h +86 -0
- data/lua-hooks/ext/luajit/src/lj_lex.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_lex_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_lib.c +303 -0
- data/lua-hooks/ext/luajit/src/lj_lib.h +115 -0
- data/lua-hooks/ext/luajit/src/lj_lib.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_lib_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_libdef.h +414 -0
- data/lua-hooks/ext/luajit/src/lj_load.c +168 -0
- data/lua-hooks/ext/luajit/src/lj_load.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_load_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_mcode.c +386 -0
- data/lua-hooks/ext/luajit/src/lj_mcode.h +30 -0
- data/lua-hooks/ext/luajit/src/lj_mcode.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_mcode_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_meta.c +477 -0
- data/lua-hooks/ext/luajit/src/lj_meta.h +38 -0
- data/lua-hooks/ext/luajit/src/lj_meta.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_meta_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_obj.c +50 -0
- data/lua-hooks/ext/luajit/src/lj_obj.h +976 -0
- data/lua-hooks/ext/luajit/src/lj_obj.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_obj_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_dce.c +78 -0
- data/lua-hooks/ext/luajit/src/lj_opt_dce.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_dce_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_fold.c +2488 -0
- data/lua-hooks/ext/luajit/src/lj_opt_fold.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_fold_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_loop.c +449 -0
- data/lua-hooks/ext/luajit/src/lj_opt_loop.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_loop_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_mem.c +935 -0
- data/lua-hooks/ext/luajit/src/lj_opt_mem.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_mem_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_narrow.c +652 -0
- data/lua-hooks/ext/luajit/src/lj_opt_narrow.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_narrow_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_sink.c +245 -0
- data/lua-hooks/ext/luajit/src/lj_opt_sink.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_sink_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_split.c +856 -0
- data/lua-hooks/ext/luajit/src/lj_opt_split.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_opt_split_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_parse.c +2725 -0
- data/lua-hooks/ext/luajit/src/lj_parse.h +18 -0
- data/lua-hooks/ext/luajit/src/lj_parse.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_parse_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_profile.c +368 -0
- data/lua-hooks/ext/luajit/src/lj_profile.h +21 -0
- data/lua-hooks/ext/luajit/src/lj_profile.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_profile_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_recdef.h +270 -0
- data/lua-hooks/ext/luajit/src/lj_record.c +2554 -0
- data/lua-hooks/ext/luajit/src/lj_record.h +45 -0
- data/lua-hooks/ext/luajit/src/lj_record.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_record_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_snap.c +870 -0
- data/lua-hooks/ext/luajit/src/lj_snap.h +34 -0
- data/lua-hooks/ext/luajit/src/lj_snap.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_snap_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_state.c +300 -0
- data/lua-hooks/ext/luajit/src/lj_state.h +35 -0
- data/lua-hooks/ext/luajit/src/lj_state.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_state_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_str.c +197 -0
- data/lua-hooks/ext/luajit/src/lj_str.h +27 -0
- data/lua-hooks/ext/luajit/src/lj_str.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_str_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_strfmt.c +554 -0
- data/lua-hooks/ext/luajit/src/lj_strfmt.h +125 -0
- data/lua-hooks/ext/luajit/src/lj_strfmt.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_strfmt_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_strscan.c +547 -0
- data/lua-hooks/ext/luajit/src/lj_strscan.h +39 -0
- data/lua-hooks/ext/luajit/src/lj_strscan.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_strscan_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_tab.c +666 -0
- data/lua-hooks/ext/luajit/src/lj_tab.h +73 -0
- data/lua-hooks/ext/luajit/src/lj_tab.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_tab_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_target.h +164 -0
- data/lua-hooks/ext/luajit/src/lj_target_arm.h +270 -0
- data/lua-hooks/ext/luajit/src/lj_target_arm64.h +97 -0
- data/lua-hooks/ext/luajit/src/lj_target_mips.h +260 -0
- data/lua-hooks/ext/luajit/src/lj_target_ppc.h +280 -0
- data/lua-hooks/ext/luajit/src/lj_target_x86.h +345 -0
- data/lua-hooks/ext/luajit/src/lj_trace.c +859 -0
- data/lua-hooks/ext/luajit/src/lj_trace.h +54 -0
- data/lua-hooks/ext/luajit/src/lj_trace.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_trace_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_traceerr.h +63 -0
- data/lua-hooks/ext/luajit/src/lj_udata.c +34 -0
- data/lua-hooks/ext/luajit/src/lj_udata.h +14 -0
- data/lua-hooks/ext/luajit/src/lj_udata.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_udata_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vm.S +2730 -0
- data/lua-hooks/ext/luajit/src/lj_vm.h +114 -0
- data/lua-hooks/ext/luajit/src/lj_vm.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vm_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vmevent.c +58 -0
- data/lua-hooks/ext/luajit/src/lj_vmevent.h +59 -0
- data/lua-hooks/ext/luajit/src/lj_vmevent.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vmevent_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vmmath.c +152 -0
- data/lua-hooks/ext/luajit/src/lj_vmmath.o +0 -0
- data/lua-hooks/ext/luajit/src/lj_vmmath_dyn.o +0 -0
- data/lua-hooks/ext/luajit/src/ljamalg.c +96 -0
- data/lua-hooks/ext/{lua → luajit/src}/lua.h +12 -7
- data/lua-hooks/ext/luajit/src/lua.hpp +9 -0
- data/lua-hooks/ext/luajit/src/luaconf.h +156 -0
- data/lua-hooks/ext/luajit/src/luajit +0 -0
- data/lua-hooks/ext/luajit/src/luajit.c +570 -0
- data/lua-hooks/ext/luajit/src/luajit.h +79 -0
- data/lua-hooks/ext/luajit/src/luajit.o +0 -0
- data/lua-hooks/ext/luajit/src/lualib.h +43 -0
- data/lua-hooks/ext/luajit/src/msvcbuild.bat +114 -0
- data/lua-hooks/ext/luajit/src/ps4build.bat +103 -0
- data/lua-hooks/ext/luajit/src/psvitabuild.bat +93 -0
- data/lua-hooks/ext/luajit/src/vm_arm.dasc +4585 -0
- data/lua-hooks/ext/luajit/src/vm_arm64.dasc +3764 -0
- data/lua-hooks/ext/luajit/src/vm_mips.dasc +4355 -0
- data/lua-hooks/ext/luajit/src/vm_ppc.dasc +5252 -0
- data/lua-hooks/ext/luajit/src/vm_x64.dasc +4902 -0
- data/lua-hooks/ext/luajit/src/vm_x86.dasc +5710 -0
- data/lua-hooks/ext/luajit/src/xb1build.bat +101 -0
- data/lua-hooks/ext/luajit/src/xedkbuild.bat +92 -0
- data/lua-hooks/ext/luautf8/lutf8lib.c +3 -3
- data/lua-hooks/lib/boot.lua +37 -2
- metadata +372 -69
- data/lua-hooks/ext/bitop/README +0 -22
- data/lua-hooks/ext/bitop/bit.c +0 -189
- data/lua-hooks/ext/extconf.rb +0 -38
- data/lua-hooks/ext/lua/COPYRIGHT +0 -34
- data/lua-hooks/ext/lua/lapi.c +0 -1087
- data/lua-hooks/ext/lua/lapi.h +0 -16
- data/lua-hooks/ext/lua/lauxlib.c +0 -652
- data/lua-hooks/ext/lua/lbaselib.c +0 -659
- data/lua-hooks/ext/lua/lcode.c +0 -831
- data/lua-hooks/ext/lua/lcode.h +0 -76
- data/lua-hooks/ext/lua/ldblib.c +0 -398
- data/lua-hooks/ext/lua/ldebug.c +0 -638
- data/lua-hooks/ext/lua/ldebug.h +0 -33
- data/lua-hooks/ext/lua/ldo.c +0 -519
- data/lua-hooks/ext/lua/ldo.h +0 -57
- data/lua-hooks/ext/lua/ldump.c +0 -164
- data/lua-hooks/ext/lua/lfunc.c +0 -174
- data/lua-hooks/ext/lua/lfunc.h +0 -34
- data/lua-hooks/ext/lua/lgc.c +0 -710
- data/lua-hooks/ext/lua/lgc.h +0 -110
- data/lua-hooks/ext/lua/linit.c +0 -38
- data/lua-hooks/ext/lua/liolib.c +0 -556
- data/lua-hooks/ext/lua/llex.c +0 -463
- data/lua-hooks/ext/lua/llex.h +0 -81
- data/lua-hooks/ext/lua/llimits.h +0 -128
- data/lua-hooks/ext/lua/lmathlib.c +0 -263
- data/lua-hooks/ext/lua/lmem.c +0 -86
- data/lua-hooks/ext/lua/lmem.h +0 -49
- data/lua-hooks/ext/lua/loadlib.c +0 -705
- data/lua-hooks/ext/lua/loadlib_rel.c +0 -760
- data/lua-hooks/ext/lua/lobject.c +0 -214
- data/lua-hooks/ext/lua/lobject.h +0 -381
- data/lua-hooks/ext/lua/lopcodes.c +0 -102
- data/lua-hooks/ext/lua/lopcodes.h +0 -268
- data/lua-hooks/ext/lua/loslib.c +0 -243
- data/lua-hooks/ext/lua/lparser.c +0 -1339
- data/lua-hooks/ext/lua/lparser.h +0 -82
- data/lua-hooks/ext/lua/lstate.c +0 -214
- data/lua-hooks/ext/lua/lstate.h +0 -169
- data/lua-hooks/ext/lua/lstring.c +0 -111
- data/lua-hooks/ext/lua/lstring.h +0 -31
- data/lua-hooks/ext/lua/lstrlib.c +0 -871
- data/lua-hooks/ext/lua/ltable.c +0 -588
- data/lua-hooks/ext/lua/ltable.h +0 -40
- data/lua-hooks/ext/lua/ltablib.c +0 -287
- data/lua-hooks/ext/lua/ltm.c +0 -75
- data/lua-hooks/ext/lua/ltm.h +0 -54
- data/lua-hooks/ext/lua/lua.c +0 -392
- data/lua-hooks/ext/lua/lua.def +0 -131
- data/lua-hooks/ext/lua/lua.rc +0 -28
- data/lua-hooks/ext/lua/lua_dll.rc +0 -26
- data/lua-hooks/ext/lua/luac.c +0 -200
- data/lua-hooks/ext/lua/luac.rc +0 -1
- data/lua-hooks/ext/lua/luaconf.h +0 -763
- data/lua-hooks/ext/lua/luaconf.h.in +0 -724
- data/lua-hooks/ext/lua/luaconf.h.orig +0 -763
- data/lua-hooks/ext/lua/lualib.h +0 -53
- data/lua-hooks/ext/lua/lundump.c +0 -227
- data/lua-hooks/ext/lua/lundump.h +0 -36
- data/lua-hooks/ext/lua/lvm.c +0 -767
- data/lua-hooks/ext/lua/lvm.h +0 -36
- data/lua-hooks/ext/lua/lzio.c +0 -82
- data/lua-hooks/ext/lua/lzio.h +0 -67
- data/lua-hooks/ext/lua/print.c +0 -227
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/*
|
|
2
|
+
** Trace recorder (bytecode -> SSA IR).
|
|
3
|
+
** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
#ifndef _LJ_RECORD_H
|
|
7
|
+
#define _LJ_RECORD_H
|
|
8
|
+
|
|
9
|
+
#include "lj_obj.h"
|
|
10
|
+
#include "lj_jit.h"
|
|
11
|
+
|
|
12
|
+
#if LJ_HASJIT
|
|
13
|
+
/* Context for recording an indexed load/store. */
|
|
14
|
+
typedef struct RecordIndex {
|
|
15
|
+
TValue tabv; /* Runtime value of table (or indexed object). */
|
|
16
|
+
TValue keyv; /* Runtime value of key. */
|
|
17
|
+
TValue valv; /* Runtime value of stored value. */
|
|
18
|
+
TValue mobjv; /* Runtime value of metamethod object. */
|
|
19
|
+
GCtab *mtv; /* Runtime value of metatable object. */
|
|
20
|
+
cTValue *oldv; /* Runtime value of previously stored value. */
|
|
21
|
+
TRef tab; /* Table (or indexed object) reference. */
|
|
22
|
+
TRef key; /* Key reference. */
|
|
23
|
+
TRef val; /* Value reference for a store or 0 for a load. */
|
|
24
|
+
TRef mt; /* Metatable reference. */
|
|
25
|
+
TRef mobj; /* Metamethod object reference. */
|
|
26
|
+
int idxchain; /* Index indirections left or 0 for raw lookup. */
|
|
27
|
+
} RecordIndex;
|
|
28
|
+
|
|
29
|
+
LJ_FUNC int lj_record_objcmp(jit_State *J, TRef a, TRef b,
|
|
30
|
+
cTValue *av, cTValue *bv);
|
|
31
|
+
LJ_FUNC void lj_record_stop(jit_State *J, TraceLink linktype, TraceNo lnk);
|
|
32
|
+
LJ_FUNC TRef lj_record_constify(jit_State *J, cTValue *o);
|
|
33
|
+
|
|
34
|
+
LJ_FUNC void lj_record_call(jit_State *J, BCReg func, ptrdiff_t nargs);
|
|
35
|
+
LJ_FUNC void lj_record_tailcall(jit_State *J, BCReg func, ptrdiff_t nargs);
|
|
36
|
+
LJ_FUNC void lj_record_ret(jit_State *J, BCReg rbase, ptrdiff_t gotresults);
|
|
37
|
+
|
|
38
|
+
LJ_FUNC int lj_record_mm_lookup(jit_State *J, RecordIndex *ix, MMS mm);
|
|
39
|
+
LJ_FUNC TRef lj_record_idx(jit_State *J, RecordIndex *ix);
|
|
40
|
+
|
|
41
|
+
LJ_FUNC void lj_record_ins(jit_State *J);
|
|
42
|
+
LJ_FUNC void lj_record_setup(jit_State *J);
|
|
43
|
+
#endif
|
|
44
|
+
|
|
45
|
+
#endif
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,870 @@
|
|
|
1
|
+
/*
|
|
2
|
+
** Snapshot handling.
|
|
3
|
+
** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
#define lj_snap_c
|
|
7
|
+
#define LUA_CORE
|
|
8
|
+
|
|
9
|
+
#include "lj_obj.h"
|
|
10
|
+
|
|
11
|
+
#if LJ_HASJIT
|
|
12
|
+
|
|
13
|
+
#include "lj_gc.h"
|
|
14
|
+
#include "lj_tab.h"
|
|
15
|
+
#include "lj_state.h"
|
|
16
|
+
#include "lj_frame.h"
|
|
17
|
+
#include "lj_bc.h"
|
|
18
|
+
#include "lj_ir.h"
|
|
19
|
+
#include "lj_jit.h"
|
|
20
|
+
#include "lj_iropt.h"
|
|
21
|
+
#include "lj_trace.h"
|
|
22
|
+
#include "lj_snap.h"
|
|
23
|
+
#include "lj_target.h"
|
|
24
|
+
#if LJ_HASFFI
|
|
25
|
+
#include "lj_ctype.h"
|
|
26
|
+
#include "lj_cdata.h"
|
|
27
|
+
#endif
|
|
28
|
+
|
|
29
|
+
/* Some local macros to save typing. Undef'd at the end. */
|
|
30
|
+
#define IR(ref) (&J->cur.ir[(ref)])
|
|
31
|
+
|
|
32
|
+
/* Pass IR on to next optimization in chain (FOLD). */
|
|
33
|
+
#define emitir(ot, a, b) (lj_ir_set(J, (ot), (a), (b)), lj_opt_fold(J))
|
|
34
|
+
|
|
35
|
+
/* Emit raw IR without passing through optimizations. */
|
|
36
|
+
#define emitir_raw(ot, a, b) (lj_ir_set(J, (ot), (a), (b)), lj_ir_emit(J))
|
|
37
|
+
|
|
38
|
+
/* -- Snapshot buffer allocation ------------------------------------------ */
|
|
39
|
+
|
|
40
|
+
/* Grow snapshot buffer. */
|
|
41
|
+
void lj_snap_grow_buf_(jit_State *J, MSize need)
|
|
42
|
+
{
|
|
43
|
+
MSize maxsnap = (MSize)J->param[JIT_P_maxsnap];
|
|
44
|
+
if (need > maxsnap)
|
|
45
|
+
lj_trace_err(J, LJ_TRERR_SNAPOV);
|
|
46
|
+
lj_mem_growvec(J->L, J->snapbuf, J->sizesnap, maxsnap, SnapShot);
|
|
47
|
+
J->cur.snap = J->snapbuf;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/* Grow snapshot map buffer. */
|
|
51
|
+
void lj_snap_grow_map_(jit_State *J, MSize need)
|
|
52
|
+
{
|
|
53
|
+
if (need < 2*J->sizesnapmap)
|
|
54
|
+
need = 2*J->sizesnapmap;
|
|
55
|
+
else if (need < 64)
|
|
56
|
+
need = 64;
|
|
57
|
+
J->snapmapbuf = (SnapEntry *)lj_mem_realloc(J->L, J->snapmapbuf,
|
|
58
|
+
J->sizesnapmap*sizeof(SnapEntry), need*sizeof(SnapEntry));
|
|
59
|
+
J->cur.snapmap = J->snapmapbuf;
|
|
60
|
+
J->sizesnapmap = need;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/* -- Snapshot generation ------------------------------------------------- */
|
|
64
|
+
|
|
65
|
+
/* Add all modified slots to the snapshot. */
|
|
66
|
+
static MSize snapshot_slots(jit_State *J, SnapEntry *map, BCReg nslots)
|
|
67
|
+
{
|
|
68
|
+
IRRef retf = J->chain[IR_RETF]; /* Limits SLOAD restore elimination. */
|
|
69
|
+
BCReg s;
|
|
70
|
+
MSize n = 0;
|
|
71
|
+
for (s = 0; s < nslots; s++) {
|
|
72
|
+
TRef tr = J->slot[s];
|
|
73
|
+
IRRef ref = tref_ref(tr);
|
|
74
|
+
if (ref) {
|
|
75
|
+
SnapEntry sn = SNAP_TR(s, tr);
|
|
76
|
+
IRIns *ir = IR(ref);
|
|
77
|
+
if (!(sn & (SNAP_CONT|SNAP_FRAME)) &&
|
|
78
|
+
ir->o == IR_SLOAD && ir->op1 == s && ref > retf) {
|
|
79
|
+
/* No need to snapshot unmodified non-inherited slots. */
|
|
80
|
+
if (!(ir->op2 & IRSLOAD_INHERIT))
|
|
81
|
+
continue;
|
|
82
|
+
/* No need to restore readonly slots and unmodified non-parent slots. */
|
|
83
|
+
if (!(LJ_DUALNUM && (ir->op2 & IRSLOAD_CONVERT)) &&
|
|
84
|
+
(ir->op2 & (IRSLOAD_READONLY|IRSLOAD_PARENT)) != IRSLOAD_PARENT)
|
|
85
|
+
sn |= SNAP_NORESTORE;
|
|
86
|
+
}
|
|
87
|
+
if (LJ_SOFTFP && irt_isnum(ir->t))
|
|
88
|
+
sn |= SNAP_SOFTFPNUM;
|
|
89
|
+
map[n++] = sn;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return n;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/* Add frame links at the end of the snapshot. */
|
|
96
|
+
static BCReg snapshot_framelinks(jit_State *J, SnapEntry *map)
|
|
97
|
+
{
|
|
98
|
+
cTValue *frame = J->L->base - 1;
|
|
99
|
+
cTValue *lim = J->L->base - J->baseslot;
|
|
100
|
+
GCfunc *fn = frame_func(frame);
|
|
101
|
+
cTValue *ftop = isluafunc(fn) ? (frame+funcproto(fn)->framesize) : J->L->top;
|
|
102
|
+
MSize f = 0;
|
|
103
|
+
lua_assert(!LJ_FR2); /* TODO_FR2: store 64 bit PCs. */
|
|
104
|
+
map[f++] = SNAP_MKPC(J->pc); /* The current PC is always the first entry. */
|
|
105
|
+
while (frame > lim) { /* Backwards traversal of all frames above base. */
|
|
106
|
+
if (frame_islua(frame)) {
|
|
107
|
+
map[f++] = SNAP_MKPC(frame_pc(frame));
|
|
108
|
+
frame = frame_prevl(frame);
|
|
109
|
+
} else if (frame_iscont(frame)) {
|
|
110
|
+
map[f++] = SNAP_MKFTSZ(frame_ftsz(frame));
|
|
111
|
+
map[f++] = SNAP_MKPC(frame_contpc(frame));
|
|
112
|
+
frame = frame_prevd(frame);
|
|
113
|
+
} else {
|
|
114
|
+
lua_assert(!frame_isc(frame));
|
|
115
|
+
map[f++] = SNAP_MKFTSZ(frame_ftsz(frame));
|
|
116
|
+
frame = frame_prevd(frame);
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
if (frame + funcproto(frame_func(frame))->framesize > ftop)
|
|
120
|
+
ftop = frame + funcproto(frame_func(frame))->framesize;
|
|
121
|
+
}
|
|
122
|
+
lua_assert(f == (MSize)(1 + J->framedepth));
|
|
123
|
+
return (BCReg)(ftop - lim);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/* Take a snapshot of the current stack. */
|
|
127
|
+
static void snapshot_stack(jit_State *J, SnapShot *snap, MSize nsnapmap)
|
|
128
|
+
{
|
|
129
|
+
BCReg nslots = J->baseslot + J->maxslot;
|
|
130
|
+
MSize nent;
|
|
131
|
+
SnapEntry *p;
|
|
132
|
+
/* Conservative estimate. */
|
|
133
|
+
lj_snap_grow_map(J, nsnapmap + nslots + (MSize)J->framedepth+1);
|
|
134
|
+
p = &J->cur.snapmap[nsnapmap];
|
|
135
|
+
nent = snapshot_slots(J, p, nslots);
|
|
136
|
+
snap->topslot = (uint8_t)snapshot_framelinks(J, p + nent);
|
|
137
|
+
snap->mapofs = (uint16_t)nsnapmap;
|
|
138
|
+
snap->ref = (IRRef1)J->cur.nins;
|
|
139
|
+
snap->nent = (uint8_t)nent;
|
|
140
|
+
snap->nslots = (uint8_t)nslots;
|
|
141
|
+
snap->count = 0;
|
|
142
|
+
J->cur.nsnapmap = (uint16_t)(nsnapmap + nent + 1 + J->framedepth);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/* Add or merge a snapshot. */
|
|
146
|
+
void lj_snap_add(jit_State *J)
|
|
147
|
+
{
|
|
148
|
+
MSize nsnap = J->cur.nsnap;
|
|
149
|
+
MSize nsnapmap = J->cur.nsnapmap;
|
|
150
|
+
/* Merge if no ins. inbetween or if requested and no guard inbetween. */
|
|
151
|
+
if (J->mergesnap ? !irt_isguard(J->guardemit) :
|
|
152
|
+
(nsnap > 0 && J->cur.snap[nsnap-1].ref == J->cur.nins)) {
|
|
153
|
+
if (nsnap == 1) { /* But preserve snap #0 PC. */
|
|
154
|
+
emitir_raw(IRT(IR_NOP, IRT_NIL), 0, 0);
|
|
155
|
+
goto nomerge;
|
|
156
|
+
}
|
|
157
|
+
nsnapmap = J->cur.snap[--nsnap].mapofs;
|
|
158
|
+
} else {
|
|
159
|
+
nomerge:
|
|
160
|
+
lj_snap_grow_buf(J, nsnap+1);
|
|
161
|
+
J->cur.nsnap = (uint16_t)(nsnap+1);
|
|
162
|
+
}
|
|
163
|
+
J->mergesnap = 0;
|
|
164
|
+
J->guardemit.irt = 0;
|
|
165
|
+
snapshot_stack(J, &J->cur.snap[nsnap], nsnapmap);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/* -- Snapshot modification ----------------------------------------------- */
|
|
169
|
+
|
|
170
|
+
#define SNAP_USEDEF_SLOTS (LJ_MAX_JSLOTS+LJ_STACK_EXTRA)
|
|
171
|
+
|
|
172
|
+
/* Find unused slots with reaching-definitions bytecode data-flow analysis. */
|
|
173
|
+
static BCReg snap_usedef(jit_State *J, uint8_t *udf,
|
|
174
|
+
const BCIns *pc, BCReg maxslot)
|
|
175
|
+
{
|
|
176
|
+
BCReg s;
|
|
177
|
+
GCobj *o;
|
|
178
|
+
|
|
179
|
+
if (maxslot == 0) return 0;
|
|
180
|
+
#ifdef LUAJIT_USE_VALGRIND
|
|
181
|
+
/* Avoid errors for harmless reads beyond maxslot. */
|
|
182
|
+
memset(udf, 1, SNAP_USEDEF_SLOTS);
|
|
183
|
+
#else
|
|
184
|
+
memset(udf, 1, maxslot);
|
|
185
|
+
#endif
|
|
186
|
+
|
|
187
|
+
/* Treat open upvalues as used. */
|
|
188
|
+
o = gcref(J->L->openupval);
|
|
189
|
+
while (o) {
|
|
190
|
+
if (uvval(gco2uv(o)) < J->L->base) break;
|
|
191
|
+
udf[uvval(gco2uv(o)) - J->L->base] = 0;
|
|
192
|
+
o = gcref(o->gch.nextgc);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
#define USE_SLOT(s) udf[(s)] &= ~1
|
|
196
|
+
#define DEF_SLOT(s) udf[(s)] *= 3
|
|
197
|
+
|
|
198
|
+
/* Scan through following bytecode and check for uses/defs. */
|
|
199
|
+
lua_assert(pc >= proto_bc(J->pt) && pc < proto_bc(J->pt) + J->pt->sizebc);
|
|
200
|
+
for (;;) {
|
|
201
|
+
BCIns ins = *pc++;
|
|
202
|
+
BCOp op = bc_op(ins);
|
|
203
|
+
switch (bcmode_b(op)) {
|
|
204
|
+
case BCMvar: USE_SLOT(bc_b(ins)); break;
|
|
205
|
+
default: break;
|
|
206
|
+
}
|
|
207
|
+
switch (bcmode_c(op)) {
|
|
208
|
+
case BCMvar: USE_SLOT(bc_c(ins)); break;
|
|
209
|
+
case BCMrbase:
|
|
210
|
+
lua_assert(op == BC_CAT);
|
|
211
|
+
for (s = bc_b(ins); s <= bc_c(ins); s++) USE_SLOT(s);
|
|
212
|
+
for (; s < maxslot; s++) DEF_SLOT(s);
|
|
213
|
+
break;
|
|
214
|
+
case BCMjump:
|
|
215
|
+
handle_jump: {
|
|
216
|
+
BCReg minslot = bc_a(ins);
|
|
217
|
+
if (op >= BC_FORI && op <= BC_JFORL) minslot += FORL_EXT;
|
|
218
|
+
else if (op >= BC_ITERL && op <= BC_JITERL) minslot += bc_b(pc[-2])-1;
|
|
219
|
+
else if (op == BC_UCLO) { pc += bc_j(ins); break; }
|
|
220
|
+
for (s = minslot; s < maxslot; s++) DEF_SLOT(s);
|
|
221
|
+
return minslot < maxslot ? minslot : maxslot;
|
|
222
|
+
}
|
|
223
|
+
case BCMlit:
|
|
224
|
+
if (op == BC_JFORL || op == BC_JITERL || op == BC_JLOOP) {
|
|
225
|
+
goto handle_jump;
|
|
226
|
+
} else if (bc_isret(op)) {
|
|
227
|
+
BCReg top = op == BC_RETM ? maxslot : (bc_a(ins) + bc_d(ins)-1);
|
|
228
|
+
for (s = 0; s < bc_a(ins); s++) DEF_SLOT(s);
|
|
229
|
+
for (; s < top; s++) USE_SLOT(s);
|
|
230
|
+
for (; s < maxslot; s++) DEF_SLOT(s);
|
|
231
|
+
return 0;
|
|
232
|
+
}
|
|
233
|
+
break;
|
|
234
|
+
case BCMfunc: return maxslot; /* NYI: will abort, anyway. */
|
|
235
|
+
default: break;
|
|
236
|
+
}
|
|
237
|
+
switch (bcmode_a(op)) {
|
|
238
|
+
case BCMvar: USE_SLOT(bc_a(ins)); break;
|
|
239
|
+
case BCMdst:
|
|
240
|
+
if (!(op == BC_ISTC || op == BC_ISFC)) DEF_SLOT(bc_a(ins));
|
|
241
|
+
break;
|
|
242
|
+
case BCMbase:
|
|
243
|
+
if (op >= BC_CALLM && op <= BC_VARG) {
|
|
244
|
+
BCReg top = (op == BC_CALLM || op == BC_CALLMT || bc_c(ins) == 0) ?
|
|
245
|
+
maxslot : (bc_a(ins) + bc_c(ins)+LJ_FR2);
|
|
246
|
+
if (LJ_FR2) DEF_SLOT(bc_a(ins)+1);
|
|
247
|
+
s = bc_a(ins) - ((op == BC_ITERC || op == BC_ITERN) ? 3 : 0);
|
|
248
|
+
for (; s < top; s++) USE_SLOT(s);
|
|
249
|
+
for (; s < maxslot; s++) DEF_SLOT(s);
|
|
250
|
+
if (op == BC_CALLT || op == BC_CALLMT) {
|
|
251
|
+
for (s = 0; s < bc_a(ins); s++) DEF_SLOT(s);
|
|
252
|
+
return 0;
|
|
253
|
+
}
|
|
254
|
+
} else if (op == BC_KNIL) {
|
|
255
|
+
for (s = bc_a(ins); s <= bc_d(ins); s++) DEF_SLOT(s);
|
|
256
|
+
} else if (op == BC_TSETM) {
|
|
257
|
+
for (s = bc_a(ins)-1; s < maxslot; s++) USE_SLOT(s);
|
|
258
|
+
}
|
|
259
|
+
break;
|
|
260
|
+
default: break;
|
|
261
|
+
}
|
|
262
|
+
lua_assert(pc >= proto_bc(J->pt) && pc < proto_bc(J->pt) + J->pt->sizebc);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
#undef USE_SLOT
|
|
266
|
+
#undef DEF_SLOT
|
|
267
|
+
|
|
268
|
+
return 0; /* unreachable */
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/* Purge dead slots before the next snapshot. */
|
|
272
|
+
void lj_snap_purge(jit_State *J)
|
|
273
|
+
{
|
|
274
|
+
uint8_t udf[SNAP_USEDEF_SLOTS];
|
|
275
|
+
BCReg maxslot = J->maxslot;
|
|
276
|
+
BCReg s = snap_usedef(J, udf, J->pc, maxslot);
|
|
277
|
+
for (; s < maxslot; s++)
|
|
278
|
+
if (udf[s] != 0)
|
|
279
|
+
J->base[s] = 0; /* Purge dead slots. */
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/* Shrink last snapshot. */
|
|
283
|
+
void lj_snap_shrink(jit_State *J)
|
|
284
|
+
{
|
|
285
|
+
SnapShot *snap = &J->cur.snap[J->cur.nsnap-1];
|
|
286
|
+
SnapEntry *map = &J->cur.snapmap[snap->mapofs];
|
|
287
|
+
MSize n, m, nlim, nent = snap->nent;
|
|
288
|
+
uint8_t udf[SNAP_USEDEF_SLOTS];
|
|
289
|
+
BCReg maxslot = J->maxslot;
|
|
290
|
+
BCReg minslot = snap_usedef(J, udf, snap_pc(map[nent]), maxslot);
|
|
291
|
+
BCReg baseslot = J->baseslot;
|
|
292
|
+
maxslot += baseslot;
|
|
293
|
+
minslot += baseslot;
|
|
294
|
+
snap->nslots = (uint8_t)maxslot;
|
|
295
|
+
for (n = m = 0; n < nent; n++) { /* Remove unused slots from snapshot. */
|
|
296
|
+
BCReg s = snap_slot(map[n]);
|
|
297
|
+
if (s < minslot || (s < maxslot && udf[s-baseslot] == 0))
|
|
298
|
+
map[m++] = map[n]; /* Only copy used slots. */
|
|
299
|
+
}
|
|
300
|
+
snap->nent = (uint8_t)m;
|
|
301
|
+
nlim = J->cur.nsnapmap - snap->mapofs - 1;
|
|
302
|
+
while (n <= nlim) map[m++] = map[n++]; /* Move PC + frame links down. */
|
|
303
|
+
J->cur.nsnapmap = (uint16_t)(snap->mapofs + m); /* Free up space in map. */
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/* -- Snapshot access ----------------------------------------------------- */
|
|
307
|
+
|
|
308
|
+
/* Initialize a Bloom Filter with all renamed refs.
|
|
309
|
+
** There are very few renames (often none), so the filter has
|
|
310
|
+
** very few bits set. This makes it suitable for negative filtering.
|
|
311
|
+
*/
|
|
312
|
+
static BloomFilter snap_renamefilter(GCtrace *T, SnapNo lim)
|
|
313
|
+
{
|
|
314
|
+
BloomFilter rfilt = 0;
|
|
315
|
+
IRIns *ir;
|
|
316
|
+
for (ir = &T->ir[T->nins-1]; ir->o == IR_RENAME; ir--)
|
|
317
|
+
if (ir->op2 <= lim)
|
|
318
|
+
bloomset(rfilt, ir->op1);
|
|
319
|
+
return rfilt;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/* Process matching renames to find the original RegSP. */
|
|
323
|
+
static RegSP snap_renameref(GCtrace *T, SnapNo lim, IRRef ref, RegSP rs)
|
|
324
|
+
{
|
|
325
|
+
IRIns *ir;
|
|
326
|
+
for (ir = &T->ir[T->nins-1]; ir->o == IR_RENAME; ir--)
|
|
327
|
+
if (ir->op1 == ref && ir->op2 <= lim)
|
|
328
|
+
rs = ir->prev;
|
|
329
|
+
return rs;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/* Copy RegSP from parent snapshot to the parent links of the IR. */
|
|
333
|
+
IRIns *lj_snap_regspmap(GCtrace *T, SnapNo snapno, IRIns *ir)
|
|
334
|
+
{
|
|
335
|
+
SnapShot *snap = &T->snap[snapno];
|
|
336
|
+
SnapEntry *map = &T->snapmap[snap->mapofs];
|
|
337
|
+
BloomFilter rfilt = snap_renamefilter(T, snapno);
|
|
338
|
+
MSize n = 0;
|
|
339
|
+
IRRef ref = 0;
|
|
340
|
+
for ( ; ; ir++) {
|
|
341
|
+
uint32_t rs;
|
|
342
|
+
if (ir->o == IR_SLOAD) {
|
|
343
|
+
if (!(ir->op2 & IRSLOAD_PARENT)) break;
|
|
344
|
+
for ( ; ; n++) {
|
|
345
|
+
lua_assert(n < snap->nent);
|
|
346
|
+
if (snap_slot(map[n]) == ir->op1) {
|
|
347
|
+
ref = snap_ref(map[n++]);
|
|
348
|
+
break;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
} else if (LJ_SOFTFP && ir->o == IR_HIOP) {
|
|
352
|
+
ref++;
|
|
353
|
+
} else if (ir->o == IR_PVAL) {
|
|
354
|
+
ref = ir->op1 + REF_BIAS;
|
|
355
|
+
} else {
|
|
356
|
+
break;
|
|
357
|
+
}
|
|
358
|
+
rs = T->ir[ref].prev;
|
|
359
|
+
if (bloomtest(rfilt, ref))
|
|
360
|
+
rs = snap_renameref(T, snapno, ref, rs);
|
|
361
|
+
ir->prev = (uint16_t)rs;
|
|
362
|
+
lua_assert(regsp_used(rs));
|
|
363
|
+
}
|
|
364
|
+
return ir;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/* -- Snapshot replay ----------------------------------------------------- */
|
|
368
|
+
|
|
369
|
+
/* Replay constant from parent trace. */
|
|
370
|
+
static TRef snap_replay_const(jit_State *J, IRIns *ir)
|
|
371
|
+
{
|
|
372
|
+
/* Only have to deal with constants that can occur in stack slots. */
|
|
373
|
+
switch ((IROp)ir->o) {
|
|
374
|
+
case IR_KPRI: return TREF_PRI(irt_type(ir->t));
|
|
375
|
+
case IR_KINT: return lj_ir_kint(J, ir->i);
|
|
376
|
+
case IR_KGC: return lj_ir_kgc(J, ir_kgc(ir), irt_t(ir->t));
|
|
377
|
+
case IR_KNUM: return lj_ir_k64(J, IR_KNUM, ir_knum(ir));
|
|
378
|
+
case IR_KINT64: return lj_ir_k64(J, IR_KINT64, ir_kint64(ir));
|
|
379
|
+
case IR_KPTR: return lj_ir_kptr(J, ir_kptr(ir)); /* Continuation. */
|
|
380
|
+
default: lua_assert(0); return TREF_NIL; break;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
/* De-duplicate parent reference. */
|
|
385
|
+
static TRef snap_dedup(jit_State *J, SnapEntry *map, MSize nmax, IRRef ref)
|
|
386
|
+
{
|
|
387
|
+
MSize j;
|
|
388
|
+
for (j = 0; j < nmax; j++)
|
|
389
|
+
if (snap_ref(map[j]) == ref)
|
|
390
|
+
return J->slot[snap_slot(map[j])] & ~(SNAP_CONT|SNAP_FRAME);
|
|
391
|
+
return 0;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
/* Emit parent reference with de-duplication. */
|
|
395
|
+
static TRef snap_pref(jit_State *J, GCtrace *T, SnapEntry *map, MSize nmax,
|
|
396
|
+
BloomFilter seen, IRRef ref)
|
|
397
|
+
{
|
|
398
|
+
IRIns *ir = &T->ir[ref];
|
|
399
|
+
TRef tr;
|
|
400
|
+
if (irref_isk(ref))
|
|
401
|
+
tr = snap_replay_const(J, ir);
|
|
402
|
+
else if (!regsp_used(ir->prev))
|
|
403
|
+
tr = 0;
|
|
404
|
+
else if (!bloomtest(seen, ref) || (tr = snap_dedup(J, map, nmax, ref)) == 0)
|
|
405
|
+
tr = emitir(IRT(IR_PVAL, irt_type(ir->t)), ref - REF_BIAS, 0);
|
|
406
|
+
return tr;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
/* Check whether a sunk store corresponds to an allocation. Slow path. */
|
|
410
|
+
static int snap_sunk_store2(jit_State *J, IRIns *ira, IRIns *irs)
|
|
411
|
+
{
|
|
412
|
+
if (irs->o == IR_ASTORE || irs->o == IR_HSTORE ||
|
|
413
|
+
irs->o == IR_FSTORE || irs->o == IR_XSTORE) {
|
|
414
|
+
IRIns *irk = IR(irs->op1);
|
|
415
|
+
if (irk->o == IR_AREF || irk->o == IR_HREFK)
|
|
416
|
+
irk = IR(irk->op1);
|
|
417
|
+
return (IR(irk->op1) == ira);
|
|
418
|
+
}
|
|
419
|
+
return 0;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
/* Check whether a sunk store corresponds to an allocation. Fast path. */
|
|
423
|
+
static LJ_AINLINE int snap_sunk_store(jit_State *J, IRIns *ira, IRIns *irs)
|
|
424
|
+
{
|
|
425
|
+
if (irs->s != 255)
|
|
426
|
+
return (ira + irs->s == irs); /* Fast check. */
|
|
427
|
+
return snap_sunk_store2(J, ira, irs);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
/* Replay snapshot state to setup side trace. */
|
|
431
|
+
void lj_snap_replay(jit_State *J, GCtrace *T)
|
|
432
|
+
{
|
|
433
|
+
SnapShot *snap = &T->snap[J->exitno];
|
|
434
|
+
SnapEntry *map = &T->snapmap[snap->mapofs];
|
|
435
|
+
MSize n, nent = snap->nent;
|
|
436
|
+
BloomFilter seen = 0;
|
|
437
|
+
int pass23 = 0;
|
|
438
|
+
J->framedepth = 0;
|
|
439
|
+
/* Emit IR for slots inherited from parent snapshot. */
|
|
440
|
+
for (n = 0; n < nent; n++) {
|
|
441
|
+
SnapEntry sn = map[n];
|
|
442
|
+
BCReg s = snap_slot(sn);
|
|
443
|
+
IRRef ref = snap_ref(sn);
|
|
444
|
+
IRIns *ir = &T->ir[ref];
|
|
445
|
+
TRef tr;
|
|
446
|
+
/* The bloom filter avoids O(nent^2) overhead for de-duping slots. */
|
|
447
|
+
if (bloomtest(seen, ref) && (tr = snap_dedup(J, map, n, ref)) != 0)
|
|
448
|
+
goto setslot;
|
|
449
|
+
bloomset(seen, ref);
|
|
450
|
+
if (irref_isk(ref)) {
|
|
451
|
+
tr = snap_replay_const(J, ir);
|
|
452
|
+
} else if (!regsp_used(ir->prev)) {
|
|
453
|
+
pass23 = 1;
|
|
454
|
+
lua_assert(s != 0);
|
|
455
|
+
tr = s;
|
|
456
|
+
} else {
|
|
457
|
+
IRType t = irt_type(ir->t);
|
|
458
|
+
uint32_t mode = IRSLOAD_INHERIT|IRSLOAD_PARENT;
|
|
459
|
+
if (LJ_SOFTFP && (sn & SNAP_SOFTFPNUM)) t = IRT_NUM;
|
|
460
|
+
if (ir->o == IR_SLOAD) mode |= (ir->op2 & IRSLOAD_READONLY);
|
|
461
|
+
tr = emitir_raw(IRT(IR_SLOAD, t), s, mode);
|
|
462
|
+
}
|
|
463
|
+
setslot:
|
|
464
|
+
J->slot[s] = tr | (sn&(SNAP_CONT|SNAP_FRAME)); /* Same as TREF_* flags. */
|
|
465
|
+
J->framedepth += ((sn & (SNAP_CONT|SNAP_FRAME)) && s);
|
|
466
|
+
if ((sn & SNAP_FRAME))
|
|
467
|
+
J->baseslot = s+1;
|
|
468
|
+
}
|
|
469
|
+
if (pass23) {
|
|
470
|
+
IRIns *irlast = &T->ir[snap->ref];
|
|
471
|
+
pass23 = 0;
|
|
472
|
+
/* Emit dependent PVALs. */
|
|
473
|
+
for (n = 0; n < nent; n++) {
|
|
474
|
+
SnapEntry sn = map[n];
|
|
475
|
+
IRRef refp = snap_ref(sn);
|
|
476
|
+
IRIns *ir = &T->ir[refp];
|
|
477
|
+
if (regsp_reg(ir->r) == RID_SUNK) {
|
|
478
|
+
if (J->slot[snap_slot(sn)] != snap_slot(sn)) continue;
|
|
479
|
+
pass23 = 1;
|
|
480
|
+
lua_assert(ir->o == IR_TNEW || ir->o == IR_TDUP ||
|
|
481
|
+
ir->o == IR_CNEW || ir->o == IR_CNEWI);
|
|
482
|
+
if (ir->op1 >= T->nk) snap_pref(J, T, map, nent, seen, ir->op1);
|
|
483
|
+
if (ir->op2 >= T->nk) snap_pref(J, T, map, nent, seen, ir->op2);
|
|
484
|
+
if (LJ_HASFFI && ir->o == IR_CNEWI) {
|
|
485
|
+
if (LJ_32 && refp+1 < T->nins && (ir+1)->o == IR_HIOP)
|
|
486
|
+
snap_pref(J, T, map, nent, seen, (ir+1)->op2);
|
|
487
|
+
} else {
|
|
488
|
+
IRIns *irs;
|
|
489
|
+
for (irs = ir+1; irs < irlast; irs++)
|
|
490
|
+
if (irs->r == RID_SINK && snap_sunk_store(J, ir, irs)) {
|
|
491
|
+
if (snap_pref(J, T, map, nent, seen, irs->op2) == 0)
|
|
492
|
+
snap_pref(J, T, map, nent, seen, T->ir[irs->op2].op1);
|
|
493
|
+
else if ((LJ_SOFTFP || (LJ_32 && LJ_HASFFI)) &&
|
|
494
|
+
irs+1 < irlast && (irs+1)->o == IR_HIOP)
|
|
495
|
+
snap_pref(J, T, map, nent, seen, (irs+1)->op2);
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
} else if (!irref_isk(refp) && !regsp_used(ir->prev)) {
|
|
499
|
+
lua_assert(ir->o == IR_CONV && ir->op2 == IRCONV_NUM_INT);
|
|
500
|
+
J->slot[snap_slot(sn)] = snap_pref(J, T, map, nent, seen, ir->op1);
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
/* Replay sunk instructions. */
|
|
504
|
+
for (n = 0; pass23 && n < nent; n++) {
|
|
505
|
+
SnapEntry sn = map[n];
|
|
506
|
+
IRRef refp = snap_ref(sn);
|
|
507
|
+
IRIns *ir = &T->ir[refp];
|
|
508
|
+
if (regsp_reg(ir->r) == RID_SUNK) {
|
|
509
|
+
TRef op1, op2;
|
|
510
|
+
if (J->slot[snap_slot(sn)] != snap_slot(sn)) { /* De-dup allocs. */
|
|
511
|
+
J->slot[snap_slot(sn)] = J->slot[J->slot[snap_slot(sn)]];
|
|
512
|
+
continue;
|
|
513
|
+
}
|
|
514
|
+
op1 = ir->op1;
|
|
515
|
+
if (op1 >= T->nk) op1 = snap_pref(J, T, map, nent, seen, op1);
|
|
516
|
+
op2 = ir->op2;
|
|
517
|
+
if (op2 >= T->nk) op2 = snap_pref(J, T, map, nent, seen, op2);
|
|
518
|
+
if (LJ_HASFFI && ir->o == IR_CNEWI) {
|
|
519
|
+
if (LJ_32 && refp+1 < T->nins && (ir+1)->o == IR_HIOP) {
|
|
520
|
+
lj_needsplit(J); /* Emit joining HIOP. */
|
|
521
|
+
op2 = emitir_raw(IRT(IR_HIOP, IRT_I64), op2,
|
|
522
|
+
snap_pref(J, T, map, nent, seen, (ir+1)->op2));
|
|
523
|
+
}
|
|
524
|
+
J->slot[snap_slot(sn)] = emitir(ir->ot, op1, op2);
|
|
525
|
+
} else {
|
|
526
|
+
IRIns *irs;
|
|
527
|
+
TRef tr = emitir(ir->ot, op1, op2);
|
|
528
|
+
J->slot[snap_slot(sn)] = tr;
|
|
529
|
+
for (irs = ir+1; irs < irlast; irs++)
|
|
530
|
+
if (irs->r == RID_SINK && snap_sunk_store(J, ir, irs)) {
|
|
531
|
+
IRIns *irr = &T->ir[irs->op1];
|
|
532
|
+
TRef val, key = irr->op2, tmp = tr;
|
|
533
|
+
if (irr->o != IR_FREF) {
|
|
534
|
+
IRIns *irk = &T->ir[key];
|
|
535
|
+
if (irr->o == IR_HREFK)
|
|
536
|
+
key = lj_ir_kslot(J, snap_replay_const(J, &T->ir[irk->op1]),
|
|
537
|
+
irk->op2);
|
|
538
|
+
else
|
|
539
|
+
key = snap_replay_const(J, irk);
|
|
540
|
+
if (irr->o == IR_HREFK || irr->o == IR_AREF) {
|
|
541
|
+
IRIns *irf = &T->ir[irr->op1];
|
|
542
|
+
tmp = emitir(irf->ot, tmp, irf->op2);
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
tmp = emitir(irr->ot, tmp, key);
|
|
546
|
+
val = snap_pref(J, T, map, nent, seen, irs->op2);
|
|
547
|
+
if (val == 0) {
|
|
548
|
+
IRIns *irc = &T->ir[irs->op2];
|
|
549
|
+
lua_assert(irc->o == IR_CONV && irc->op2 == IRCONV_NUM_INT);
|
|
550
|
+
val = snap_pref(J, T, map, nent, seen, irc->op1);
|
|
551
|
+
val = emitir(IRTN(IR_CONV), val, IRCONV_NUM_INT);
|
|
552
|
+
} else if ((LJ_SOFTFP || (LJ_32 && LJ_HASFFI)) &&
|
|
553
|
+
irs+1 < irlast && (irs+1)->o == IR_HIOP) {
|
|
554
|
+
IRType t = IRT_I64;
|
|
555
|
+
if (LJ_SOFTFP && irt_type((irs+1)->t) == IRT_SOFTFP)
|
|
556
|
+
t = IRT_NUM;
|
|
557
|
+
lj_needsplit(J);
|
|
558
|
+
if (irref_isk(irs->op2) && irref_isk((irs+1)->op2)) {
|
|
559
|
+
uint64_t k = (uint32_t)T->ir[irs->op2].i +
|
|
560
|
+
((uint64_t)T->ir[(irs+1)->op2].i << 32);
|
|
561
|
+
val = lj_ir_k64(J, t == IRT_I64 ? IR_KINT64 : IR_KNUM,
|
|
562
|
+
lj_ir_k64_find(J, k));
|
|
563
|
+
} else {
|
|
564
|
+
val = emitir_raw(IRT(IR_HIOP, t), val,
|
|
565
|
+
snap_pref(J, T, map, nent, seen, (irs+1)->op2));
|
|
566
|
+
}
|
|
567
|
+
tmp = emitir(IRT(irs->o, t), tmp, val);
|
|
568
|
+
continue;
|
|
569
|
+
}
|
|
570
|
+
tmp = emitir(irs->ot, tmp, val);
|
|
571
|
+
} else if (LJ_HASFFI && irs->o == IR_XBAR && ir->o == IR_CNEW) {
|
|
572
|
+
emitir(IRT(IR_XBAR, IRT_NIL), 0, 0);
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
J->base = J->slot + J->baseslot;
|
|
579
|
+
J->maxslot = snap->nslots - J->baseslot;
|
|
580
|
+
lj_snap_add(J);
|
|
581
|
+
if (pass23) /* Need explicit GC step _after_ initial snapshot. */
|
|
582
|
+
emitir_raw(IRTG(IR_GCSTEP, IRT_NIL), 0, 0);
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
/* -- Snapshot restore ---------------------------------------------------- */
|
|
586
|
+
|
|
587
|
+
static void snap_unsink(jit_State *J, GCtrace *T, ExitState *ex,
|
|
588
|
+
SnapNo snapno, BloomFilter rfilt,
|
|
589
|
+
IRIns *ir, TValue *o);
|
|
590
|
+
|
|
591
|
+
/* Restore a value from the trace exit state. */
|
|
592
|
+
static void snap_restoreval(jit_State *J, GCtrace *T, ExitState *ex,
|
|
593
|
+
SnapNo snapno, BloomFilter rfilt,
|
|
594
|
+
IRRef ref, TValue *o)
|
|
595
|
+
{
|
|
596
|
+
IRIns *ir = &T->ir[ref];
|
|
597
|
+
IRType1 t = ir->t;
|
|
598
|
+
RegSP rs = ir->prev;
|
|
599
|
+
if (irref_isk(ref)) { /* Restore constant slot. */
|
|
600
|
+
lj_ir_kvalue(J->L, o, ir);
|
|
601
|
+
return;
|
|
602
|
+
}
|
|
603
|
+
if (LJ_UNLIKELY(bloomtest(rfilt, ref)))
|
|
604
|
+
rs = snap_renameref(T, snapno, ref, rs);
|
|
605
|
+
lua_assert(!LJ_GC64); /* TODO_GC64: handle 64 bit references. */
|
|
606
|
+
if (ra_hasspill(regsp_spill(rs))) { /* Restore from spill slot. */
|
|
607
|
+
int32_t *sps = &ex->spill[regsp_spill(rs)];
|
|
608
|
+
if (irt_isinteger(t)) {
|
|
609
|
+
setintV(o, *sps);
|
|
610
|
+
#if !LJ_SOFTFP
|
|
611
|
+
} else if (irt_isnum(t)) {
|
|
612
|
+
o->u64 = *(uint64_t *)sps;
|
|
613
|
+
#endif
|
|
614
|
+
} else if (LJ_64 && irt_islightud(t)) {
|
|
615
|
+
/* 64 bit lightuserdata which may escape already has the tag bits. */
|
|
616
|
+
o->u64 = *(uint64_t *)sps;
|
|
617
|
+
} else {
|
|
618
|
+
lua_assert(!irt_ispri(t)); /* PRI refs never have a spill slot. */
|
|
619
|
+
setgcV(J->L, o, (GCobj *)(uintptr_t)*(GCSize *)sps, irt_toitype(t));
|
|
620
|
+
}
|
|
621
|
+
} else { /* Restore from register. */
|
|
622
|
+
Reg r = regsp_reg(rs);
|
|
623
|
+
if (ra_noreg(r)) {
|
|
624
|
+
lua_assert(ir->o == IR_CONV && ir->op2 == IRCONV_NUM_INT);
|
|
625
|
+
snap_restoreval(J, T, ex, snapno, rfilt, ir->op1, o);
|
|
626
|
+
if (LJ_DUALNUM) setnumV(o, (lua_Number)intV(o));
|
|
627
|
+
return;
|
|
628
|
+
} else if (irt_isinteger(t)) {
|
|
629
|
+
setintV(o, (int32_t)ex->gpr[r-RID_MIN_GPR]);
|
|
630
|
+
#if !LJ_SOFTFP
|
|
631
|
+
} else if (irt_isnum(t)) {
|
|
632
|
+
setnumV(o, ex->fpr[r-RID_MIN_FPR]);
|
|
633
|
+
#endif
|
|
634
|
+
} else if (LJ_64 && irt_islightud(t)) {
|
|
635
|
+
/* 64 bit lightuserdata which may escape already has the tag bits. */
|
|
636
|
+
o->u64 = ex->gpr[r-RID_MIN_GPR];
|
|
637
|
+
} else if (irt_ispri(t)) {
|
|
638
|
+
setpriV(o, irt_toitype(t));
|
|
639
|
+
} else {
|
|
640
|
+
setgcV(J->L, o, (GCobj *)ex->gpr[r-RID_MIN_GPR], irt_toitype(t));
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
#if LJ_HASFFI
|
|
646
|
+
/* Restore raw data from the trace exit state. */
|
|
647
|
+
static void snap_restoredata(GCtrace *T, ExitState *ex,
|
|
648
|
+
SnapNo snapno, BloomFilter rfilt,
|
|
649
|
+
IRRef ref, void *dst, CTSize sz)
|
|
650
|
+
{
|
|
651
|
+
IRIns *ir = &T->ir[ref];
|
|
652
|
+
RegSP rs = ir->prev;
|
|
653
|
+
int32_t *src;
|
|
654
|
+
uint64_t tmp;
|
|
655
|
+
if (irref_isk(ref)) {
|
|
656
|
+
if (ir->o == IR_KNUM || ir->o == IR_KINT64) {
|
|
657
|
+
src = mref(ir->ptr, int32_t);
|
|
658
|
+
} else if (sz == 8) {
|
|
659
|
+
tmp = (uint64_t)(uint32_t)ir->i;
|
|
660
|
+
src = (int32_t *)&tmp;
|
|
661
|
+
} else {
|
|
662
|
+
src = &ir->i;
|
|
663
|
+
}
|
|
664
|
+
} else {
|
|
665
|
+
if (LJ_UNLIKELY(bloomtest(rfilt, ref)))
|
|
666
|
+
rs = snap_renameref(T, snapno, ref, rs);
|
|
667
|
+
if (ra_hasspill(regsp_spill(rs))) {
|
|
668
|
+
src = &ex->spill[regsp_spill(rs)];
|
|
669
|
+
if (sz == 8 && !irt_is64(ir->t)) {
|
|
670
|
+
tmp = (uint64_t)(uint32_t)*src;
|
|
671
|
+
src = (int32_t *)&tmp;
|
|
672
|
+
}
|
|
673
|
+
} else {
|
|
674
|
+
Reg r = regsp_reg(rs);
|
|
675
|
+
if (ra_noreg(r)) {
|
|
676
|
+
/* Note: this assumes CNEWI is never used for SOFTFP split numbers. */
|
|
677
|
+
lua_assert(sz == 8 && ir->o == IR_CONV && ir->op2 == IRCONV_NUM_INT);
|
|
678
|
+
snap_restoredata(T, ex, snapno, rfilt, ir->op1, dst, 4);
|
|
679
|
+
*(lua_Number *)dst = (lua_Number)*(int32_t *)dst;
|
|
680
|
+
return;
|
|
681
|
+
}
|
|
682
|
+
src = (int32_t *)&ex->gpr[r-RID_MIN_GPR];
|
|
683
|
+
#if !LJ_SOFTFP
|
|
684
|
+
if (r >= RID_MAX_GPR) {
|
|
685
|
+
src = (int32_t *)&ex->fpr[r-RID_MIN_FPR];
|
|
686
|
+
#if LJ_TARGET_PPC
|
|
687
|
+
if (sz == 4) { /* PPC FPRs are always doubles. */
|
|
688
|
+
*(float *)dst = (float)*(double *)src;
|
|
689
|
+
return;
|
|
690
|
+
}
|
|
691
|
+
#else
|
|
692
|
+
if (LJ_BE && sz == 4) src++;
|
|
693
|
+
#endif
|
|
694
|
+
}
|
|
695
|
+
#endif
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
lua_assert(sz == 1 || sz == 2 || sz == 4 || sz == 8);
|
|
699
|
+
if (sz == 4) *(int32_t *)dst = *src;
|
|
700
|
+
else if (sz == 8) *(int64_t *)dst = *(int64_t *)src;
|
|
701
|
+
else if (sz == 1) *(int8_t *)dst = (int8_t)*src;
|
|
702
|
+
else *(int16_t *)dst = (int16_t)*src;
|
|
703
|
+
}
|
|
704
|
+
#endif
|
|
705
|
+
|
|
706
|
+
/* Unsink allocation from the trace exit state. Unsink sunk stores. */
|
|
707
|
+
static void snap_unsink(jit_State *J, GCtrace *T, ExitState *ex,
|
|
708
|
+
SnapNo snapno, BloomFilter rfilt,
|
|
709
|
+
IRIns *ir, TValue *o)
|
|
710
|
+
{
|
|
711
|
+
lua_assert(ir->o == IR_TNEW || ir->o == IR_TDUP ||
|
|
712
|
+
ir->o == IR_CNEW || ir->o == IR_CNEWI);
|
|
713
|
+
#if LJ_HASFFI
|
|
714
|
+
if (ir->o == IR_CNEW || ir->o == IR_CNEWI) {
|
|
715
|
+
CTState *cts = ctype_cts(J->L);
|
|
716
|
+
CTypeID id = (CTypeID)T->ir[ir->op1].i;
|
|
717
|
+
CTSize sz = lj_ctype_size(cts, id);
|
|
718
|
+
GCcdata *cd = lj_cdata_new(cts, id, sz);
|
|
719
|
+
setcdataV(J->L, o, cd);
|
|
720
|
+
if (ir->o == IR_CNEWI) {
|
|
721
|
+
uint8_t *p = (uint8_t *)cdataptr(cd);
|
|
722
|
+
lua_assert(sz == 4 || sz == 8);
|
|
723
|
+
if (LJ_32 && sz == 8 && ir+1 < T->ir + T->nins && (ir+1)->o == IR_HIOP) {
|
|
724
|
+
snap_restoredata(T, ex, snapno, rfilt, (ir+1)->op2, LJ_LE?p+4:p, 4);
|
|
725
|
+
if (LJ_BE) p += 4;
|
|
726
|
+
sz = 4;
|
|
727
|
+
}
|
|
728
|
+
snap_restoredata(T, ex, snapno, rfilt, ir->op2, p, sz);
|
|
729
|
+
} else {
|
|
730
|
+
IRIns *irs, *irlast = &T->ir[T->snap[snapno].ref];
|
|
731
|
+
for (irs = ir+1; irs < irlast; irs++)
|
|
732
|
+
if (irs->r == RID_SINK && snap_sunk_store(J, ir, irs)) {
|
|
733
|
+
IRIns *iro = &T->ir[T->ir[irs->op1].op2];
|
|
734
|
+
uint8_t *p = (uint8_t *)cd;
|
|
735
|
+
CTSize szs;
|
|
736
|
+
lua_assert(irs->o == IR_XSTORE && T->ir[irs->op1].o == IR_ADD);
|
|
737
|
+
lua_assert(iro->o == IR_KINT || iro->o == IR_KINT64);
|
|
738
|
+
if (irt_is64(irs->t)) szs = 8;
|
|
739
|
+
else if (irt_isi8(irs->t) || irt_isu8(irs->t)) szs = 1;
|
|
740
|
+
else if (irt_isi16(irs->t) || irt_isu16(irs->t)) szs = 2;
|
|
741
|
+
else szs = 4;
|
|
742
|
+
if (LJ_64 && iro->o == IR_KINT64)
|
|
743
|
+
p += (int64_t)ir_k64(iro)->u64;
|
|
744
|
+
else
|
|
745
|
+
p += iro->i;
|
|
746
|
+
lua_assert(p >= (uint8_t *)cdataptr(cd) &&
|
|
747
|
+
p + szs <= (uint8_t *)cdataptr(cd) + sz);
|
|
748
|
+
if (LJ_32 && irs+1 < T->ir + T->nins && (irs+1)->o == IR_HIOP) {
|
|
749
|
+
lua_assert(szs == 4);
|
|
750
|
+
snap_restoredata(T, ex, snapno, rfilt, (irs+1)->op2, LJ_LE?p+4:p,4);
|
|
751
|
+
if (LJ_BE) p += 4;
|
|
752
|
+
}
|
|
753
|
+
snap_restoredata(T, ex, snapno, rfilt, irs->op2, p, szs);
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
} else
|
|
757
|
+
#endif
|
|
758
|
+
{
|
|
759
|
+
IRIns *irs, *irlast;
|
|
760
|
+
GCtab *t = ir->o == IR_TNEW ? lj_tab_new(J->L, ir->op1, ir->op2) :
|
|
761
|
+
lj_tab_dup(J->L, ir_ktab(&T->ir[ir->op1]));
|
|
762
|
+
settabV(J->L, o, t);
|
|
763
|
+
irlast = &T->ir[T->snap[snapno].ref];
|
|
764
|
+
for (irs = ir+1; irs < irlast; irs++)
|
|
765
|
+
if (irs->r == RID_SINK && snap_sunk_store(J, ir, irs)) {
|
|
766
|
+
IRIns *irk = &T->ir[irs->op1];
|
|
767
|
+
TValue tmp, *val;
|
|
768
|
+
lua_assert(irs->o == IR_ASTORE || irs->o == IR_HSTORE ||
|
|
769
|
+
irs->o == IR_FSTORE);
|
|
770
|
+
if (irk->o == IR_FREF) {
|
|
771
|
+
lua_assert(irk->op2 == IRFL_TAB_META);
|
|
772
|
+
snap_restoreval(J, T, ex, snapno, rfilt, irs->op2, &tmp);
|
|
773
|
+
/* NOBARRIER: The table is new (marked white). */
|
|
774
|
+
setgcref(t->metatable, obj2gco(tabV(&tmp)));
|
|
775
|
+
} else {
|
|
776
|
+
irk = &T->ir[irk->op2];
|
|
777
|
+
if (irk->o == IR_KSLOT) irk = &T->ir[irk->op1];
|
|
778
|
+
lj_ir_kvalue(J->L, &tmp, irk);
|
|
779
|
+
val = lj_tab_set(J->L, t, &tmp);
|
|
780
|
+
/* NOBARRIER: The table is new (marked white). */
|
|
781
|
+
snap_restoreval(J, T, ex, snapno, rfilt, irs->op2, val);
|
|
782
|
+
if (LJ_SOFTFP && irs+1 < T->ir + T->nins && (irs+1)->o == IR_HIOP) {
|
|
783
|
+
snap_restoreval(J, T, ex, snapno, rfilt, (irs+1)->op2, &tmp);
|
|
784
|
+
val->u32.hi = tmp.u32.lo;
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
/* Restore interpreter state from exit state with the help of a snapshot. */
|
|
792
|
+
const BCIns *lj_snap_restore(jit_State *J, void *exptr)
|
|
793
|
+
{
|
|
794
|
+
ExitState *ex = (ExitState *)exptr;
|
|
795
|
+
SnapNo snapno = J->exitno; /* For now, snapno == exitno. */
|
|
796
|
+
GCtrace *T = traceref(J, J->parent);
|
|
797
|
+
SnapShot *snap = &T->snap[snapno];
|
|
798
|
+
MSize n, nent = snap->nent;
|
|
799
|
+
SnapEntry *map = &T->snapmap[snap->mapofs];
|
|
800
|
+
SnapEntry *flinks = &T->snapmap[snap_nextofs(T, snap)-1];
|
|
801
|
+
ptrdiff_t ftsz0;
|
|
802
|
+
TValue *frame;
|
|
803
|
+
BloomFilter rfilt = snap_renamefilter(T, snapno);
|
|
804
|
+
const BCIns *pc = snap_pc(map[nent]);
|
|
805
|
+
lua_State *L = J->L;
|
|
806
|
+
|
|
807
|
+
/* Set interpreter PC to the next PC to get correct error messages. */
|
|
808
|
+
setcframe_pc(cframe_raw(L->cframe), pc+1);
|
|
809
|
+
|
|
810
|
+
/* Make sure the stack is big enough for the slots from the snapshot. */
|
|
811
|
+
if (LJ_UNLIKELY(L->base + snap->topslot >= tvref(L->maxstack))) {
|
|
812
|
+
L->top = curr_topL(L);
|
|
813
|
+
lj_state_growstack(L, snap->topslot - curr_proto(L)->framesize);
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
/* Fill stack slots with data from the registers and spill slots. */
|
|
817
|
+
frame = L->base-1;
|
|
818
|
+
ftsz0 = frame_ftsz(frame); /* Preserve link to previous frame in slot #0. */
|
|
819
|
+
for (n = 0; n < nent; n++) {
|
|
820
|
+
SnapEntry sn = map[n];
|
|
821
|
+
if (!(sn & SNAP_NORESTORE)) {
|
|
822
|
+
TValue *o = &frame[snap_slot(sn)];
|
|
823
|
+
IRRef ref = snap_ref(sn);
|
|
824
|
+
IRIns *ir = &T->ir[ref];
|
|
825
|
+
if (ir->r == RID_SUNK) {
|
|
826
|
+
MSize j;
|
|
827
|
+
for (j = 0; j < n; j++)
|
|
828
|
+
if (snap_ref(map[j]) == ref) { /* De-duplicate sunk allocations. */
|
|
829
|
+
copyTV(L, o, &frame[snap_slot(map[j])]);
|
|
830
|
+
goto dupslot;
|
|
831
|
+
}
|
|
832
|
+
snap_unsink(J, T, ex, snapno, rfilt, ir, o);
|
|
833
|
+
dupslot:
|
|
834
|
+
continue;
|
|
835
|
+
}
|
|
836
|
+
snap_restoreval(J, T, ex, snapno, rfilt, ref, o);
|
|
837
|
+
if (LJ_SOFTFP && (sn & SNAP_SOFTFPNUM) && tvisint(o)) {
|
|
838
|
+
TValue tmp;
|
|
839
|
+
snap_restoreval(J, T, ex, snapno, rfilt, ref+1, &tmp);
|
|
840
|
+
o->u32.hi = tmp.u32.lo;
|
|
841
|
+
} else if ((sn & (SNAP_CONT|SNAP_FRAME))) {
|
|
842
|
+
lua_assert(!LJ_FR2); /* TODO_FR2: store 64 bit PCs. */
|
|
843
|
+
/* Overwrite tag with frame link. */
|
|
844
|
+
setframe_ftsz(o, snap_slot(sn) != 0 ? (int32_t)*flinks-- : ftsz0);
|
|
845
|
+
L->base = o+1;
|
|
846
|
+
}
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
lua_assert(map + nent == flinks);
|
|
850
|
+
|
|
851
|
+
/* Compute current stack top. */
|
|
852
|
+
switch (bc_op(*pc)) {
|
|
853
|
+
default:
|
|
854
|
+
if (bc_op(*pc) < BC_FUNCF) {
|
|
855
|
+
L->top = curr_topL(L);
|
|
856
|
+
break;
|
|
857
|
+
}
|
|
858
|
+
/* fallthrough */
|
|
859
|
+
case BC_CALLM: case BC_CALLMT: case BC_RETM: case BC_TSETM:
|
|
860
|
+
L->top = frame + snap->nslots;
|
|
861
|
+
break;
|
|
862
|
+
}
|
|
863
|
+
return pc;
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
#undef IR
|
|
867
|
+
#undef emitir_raw
|
|
868
|
+
#undef emitir
|
|
869
|
+
|
|
870
|
+
#endif
|