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,138 @@
1
+ /*
2
+ ** Instruction dispatch handling.
3
+ ** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
4
+ */
5
+
6
+ #ifndef _LJ_DISPATCH_H
7
+ #define _LJ_DISPATCH_H
8
+
9
+ #include "lj_obj.h"
10
+ #include "lj_bc.h"
11
+ #if LJ_HASJIT
12
+ #include "lj_jit.h"
13
+ #endif
14
+
15
+ #if LJ_TARGET_MIPS
16
+ /* Need our own global offset table for the dreaded MIPS calling conventions. */
17
+ #if LJ_HASJIT
18
+ #define JITGOTDEF(_) _(lj_trace_exit) _(lj_trace_hot)
19
+ #else
20
+ #define JITGOTDEF(_)
21
+ #endif
22
+ #if LJ_HASFFI
23
+ #define FFIGOTDEF(_) \
24
+ _(lj_meta_equal_cd) _(lj_ccallback_enter) _(lj_ccallback_leave)
25
+ #else
26
+ #define FFIGOTDEF(_)
27
+ #endif
28
+ #define GOTDEF(_) \
29
+ _(floor) _(ceil) _(trunc) _(log) _(log10) _(exp) _(sin) _(cos) _(tan) \
30
+ _(asin) _(acos) _(atan) _(sinh) _(cosh) _(tanh) _(frexp) _(modf) _(atan2) \
31
+ _(pow) _(fmod) _(ldexp) \
32
+ _(lj_dispatch_call) _(lj_dispatch_ins) _(lj_dispatch_stitch) \
33
+ _(lj_dispatch_profile) _(lj_err_throw) \
34
+ _(lj_ffh_coroutine_wrap_err) _(lj_func_closeuv) _(lj_func_newL_gc) \
35
+ _(lj_gc_barrieruv) _(lj_gc_step) _(lj_gc_step_fixtop) _(lj_meta_arith) \
36
+ _(lj_meta_call) _(lj_meta_cat) _(lj_meta_comp) _(lj_meta_equal) \
37
+ _(lj_meta_for) _(lj_meta_istype) _(lj_meta_len) _(lj_meta_tget) \
38
+ _(lj_meta_tset) _(lj_state_growstack) _(lj_strfmt_num) \
39
+ _(lj_str_new) _(lj_tab_dup) _(lj_tab_get) _(lj_tab_getinth) _(lj_tab_len) \
40
+ _(lj_tab_new) _(lj_tab_newkey) _(lj_tab_next) _(lj_tab_reasize) \
41
+ _(lj_tab_setinth) _(lj_buf_putstr_reverse) _(lj_buf_putstr_lower) \
42
+ _(lj_buf_putstr_upper) _(lj_buf_tostr) JITGOTDEF(_) FFIGOTDEF(_)
43
+
44
+ enum {
45
+ #define GOTENUM(name) LJ_GOT_##name,
46
+ GOTDEF(GOTENUM)
47
+ #undef GOTENUM
48
+ LJ_GOT__MAX
49
+ };
50
+ #endif
51
+
52
+ /* Type of hot counter. Must match the code in the assembler VM. */
53
+ /* 16 bits are sufficient. Only 0.0015% overhead with maximum slot penalty. */
54
+ typedef uint16_t HotCount;
55
+
56
+ /* Number of hot counter hash table entries (must be a power of two). */
57
+ #define HOTCOUNT_SIZE 64
58
+ #define HOTCOUNT_PCMASK ((HOTCOUNT_SIZE-1)*sizeof(HotCount))
59
+
60
+ /* Hotcount decrements. */
61
+ #define HOTCOUNT_LOOP 2
62
+ #define HOTCOUNT_CALL 1
63
+
64
+ /* This solves a circular dependency problem -- bump as needed. Sigh. */
65
+ #define GG_NUM_ASMFF 57
66
+
67
+ #define GG_LEN_DDISP (BC__MAX + GG_NUM_ASMFF)
68
+ #define GG_LEN_SDISP BC_FUNCF
69
+ #define GG_LEN_DISP (GG_LEN_DDISP + GG_LEN_SDISP)
70
+
71
+ /* Global state, main thread and extra fields are allocated together. */
72
+ typedef struct GG_State {
73
+ lua_State L; /* Main thread. */
74
+ global_State g; /* Global state. */
75
+ #if LJ_TARGET_MIPS
76
+ ASMFunction got[LJ_GOT__MAX]; /* Global offset table. */
77
+ #endif
78
+ #if LJ_HASJIT
79
+ jit_State J; /* JIT state. */
80
+ HotCount hotcount[HOTCOUNT_SIZE]; /* Hot counters. */
81
+ #endif
82
+ ASMFunction dispatch[GG_LEN_DISP]; /* Instruction dispatch tables. */
83
+ BCIns bcff[GG_NUM_ASMFF]; /* Bytecode for ASM fast functions. */
84
+ } GG_State;
85
+
86
+ #define GG_OFS(field) ((int)offsetof(GG_State, field))
87
+ #define G2GG(gl) ((GG_State *)((char *)(gl) - GG_OFS(g)))
88
+ #define J2GG(j) ((GG_State *)((char *)(j) - GG_OFS(J)))
89
+ #define L2GG(L) (G2GG(G(L)))
90
+ #define J2G(J) (&J2GG(J)->g)
91
+ #define G2J(gl) (&G2GG(gl)->J)
92
+ #define L2J(L) (&L2GG(L)->J)
93
+ #define GG_G2DISP (GG_OFS(dispatch) - GG_OFS(g))
94
+ #define GG_DISP2G (GG_OFS(g) - GG_OFS(dispatch))
95
+ #define GG_DISP2J (GG_OFS(J) - GG_OFS(dispatch))
96
+ #define GG_DISP2HOT (GG_OFS(hotcount) - GG_OFS(dispatch))
97
+ #define GG_DISP2STATIC (GG_LEN_DDISP*(int)sizeof(ASMFunction))
98
+
99
+ #define hotcount_get(gg, pc) \
100
+ (gg)->hotcount[(u32ptr(pc)>>2) & (HOTCOUNT_SIZE-1)]
101
+ #define hotcount_set(gg, pc, val) \
102
+ (hotcount_get((gg), (pc)) = (HotCount)(val))
103
+
104
+ /* Dispatch table management. */
105
+ LJ_FUNC void lj_dispatch_init(GG_State *GG);
106
+ #if LJ_HASJIT
107
+ LJ_FUNC void lj_dispatch_init_hotcount(global_State *g);
108
+ #endif
109
+ LJ_FUNC void lj_dispatch_update(global_State *g);
110
+
111
+ /* Instruction dispatch callback for hooks or when recording. */
112
+ LJ_FUNCA void LJ_FASTCALL lj_dispatch_ins(lua_State *L, const BCIns *pc);
113
+ LJ_FUNCA ASMFunction LJ_FASTCALL lj_dispatch_call(lua_State *L, const BCIns*pc);
114
+ #if LJ_HASJIT
115
+ LJ_FUNCA void LJ_FASTCALL lj_dispatch_stitch(jit_State *J, const BCIns *pc);
116
+ #endif
117
+ #if LJ_HASPROFILE
118
+ LJ_FUNCA void LJ_FASTCALL lj_dispatch_profile(lua_State *L, const BCIns *pc);
119
+ #endif
120
+
121
+ #if LJ_HASFFI && !defined(_BUILDVM_H)
122
+ /* Save/restore errno and GetLastError() around hooks, exits and recording. */
123
+ #include <errno.h>
124
+ #if LJ_TARGET_WINDOWS
125
+ #define WIN32_LEAN_AND_MEAN
126
+ #include <windows.h>
127
+ #define ERRNO_SAVE int olderr = errno; DWORD oldwerr = GetLastError();
128
+ #define ERRNO_RESTORE errno = olderr; SetLastError(oldwerr);
129
+ #else
130
+ #define ERRNO_SAVE int olderr = errno;
131
+ #define ERRNO_RESTORE errno = olderr;
132
+ #endif
133
+ #else
134
+ #define ERRNO_SAVE
135
+ #define ERRNO_RESTORE
136
+ #endif
137
+
138
+ #endif
@@ -0,0 +1,356 @@
1
+ /*
2
+ ** ARM instruction emitter.
3
+ ** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
4
+ */
5
+
6
+ /* -- Constant encoding --------------------------------------------------- */
7
+
8
+ static uint8_t emit_invai[16] = {
9
+ /* AND */ (ARMI_AND^ARMI_BIC) >> 21,
10
+ /* EOR */ 0,
11
+ /* SUB */ (ARMI_SUB^ARMI_ADD) >> 21,
12
+ /* RSB */ 0,
13
+ /* ADD */ (ARMI_ADD^ARMI_SUB) >> 21,
14
+ /* ADC */ (ARMI_ADC^ARMI_SBC) >> 21,
15
+ /* SBC */ (ARMI_SBC^ARMI_ADC) >> 21,
16
+ /* RSC */ 0,
17
+ /* TST */ 0,
18
+ /* TEQ */ 0,
19
+ /* CMP */ (ARMI_CMP^ARMI_CMN) >> 21,
20
+ /* CMN */ (ARMI_CMN^ARMI_CMP) >> 21,
21
+ /* ORR */ 0,
22
+ /* MOV */ (ARMI_MOV^ARMI_MVN) >> 21,
23
+ /* BIC */ (ARMI_BIC^ARMI_AND) >> 21,
24
+ /* MVN */ (ARMI_MVN^ARMI_MOV) >> 21
25
+ };
26
+
27
+ /* Encode constant in K12 format for data processing instructions. */
28
+ static uint32_t emit_isk12(ARMIns ai, int32_t n)
29
+ {
30
+ uint32_t invai, i, m = (uint32_t)n;
31
+ /* K12: unsigned 8 bit value, rotated in steps of two bits. */
32
+ for (i = 0; i < 4096; i += 256, m = lj_rol(m, 2))
33
+ if (m <= 255) return ARMI_K12|m|i;
34
+ /* Otherwise try negation/complement with the inverse instruction. */
35
+ invai = emit_invai[((ai >> 21) & 15)];
36
+ if (!invai) return 0; /* Failed. No inverse instruction. */
37
+ m = ~(uint32_t)n;
38
+ if (invai == ((ARMI_SUB^ARMI_ADD) >> 21) ||
39
+ invai == (ARMI_CMP^ARMI_CMN) >> 21) m++;
40
+ for (i = 0; i < 4096; i += 256, m = lj_rol(m, 2))
41
+ if (m <= 255) return ARMI_K12|(invai<<21)|m|i;
42
+ return 0; /* Failed. */
43
+ }
44
+
45
+ /* -- Emit basic instructions --------------------------------------------- */
46
+
47
+ static void emit_dnm(ASMState *as, ARMIns ai, Reg rd, Reg rn, Reg rm)
48
+ {
49
+ *--as->mcp = ai | ARMF_D(rd) | ARMF_N(rn) | ARMF_M(rm);
50
+ }
51
+
52
+ static void emit_dm(ASMState *as, ARMIns ai, Reg rd, Reg rm)
53
+ {
54
+ *--as->mcp = ai | ARMF_D(rd) | ARMF_M(rm);
55
+ }
56
+
57
+ static void emit_dn(ASMState *as, ARMIns ai, Reg rd, Reg rn)
58
+ {
59
+ *--as->mcp = ai | ARMF_D(rd) | ARMF_N(rn);
60
+ }
61
+
62
+ static void emit_nm(ASMState *as, ARMIns ai, Reg rn, Reg rm)
63
+ {
64
+ *--as->mcp = ai | ARMF_N(rn) | ARMF_M(rm);
65
+ }
66
+
67
+ static void emit_d(ASMState *as, ARMIns ai, Reg rd)
68
+ {
69
+ *--as->mcp = ai | ARMF_D(rd);
70
+ }
71
+
72
+ static void emit_n(ASMState *as, ARMIns ai, Reg rn)
73
+ {
74
+ *--as->mcp = ai | ARMF_N(rn);
75
+ }
76
+
77
+ static void emit_m(ASMState *as, ARMIns ai, Reg rm)
78
+ {
79
+ *--as->mcp = ai | ARMF_M(rm);
80
+ }
81
+
82
+ static void emit_lsox(ASMState *as, ARMIns ai, Reg rd, Reg rn, int32_t ofs)
83
+ {
84
+ lua_assert(ofs >= -255 && ofs <= 255);
85
+ if (ofs < 0) ofs = -ofs; else ai |= ARMI_LS_U;
86
+ *--as->mcp = ai | ARMI_LS_P | ARMI_LSX_I | ARMF_D(rd) | ARMF_N(rn) |
87
+ ((ofs & 0xf0) << 4) | (ofs & 0x0f);
88
+ }
89
+
90
+ static void emit_lso(ASMState *as, ARMIns ai, Reg rd, Reg rn, int32_t ofs)
91
+ {
92
+ lua_assert(ofs >= -4095 && ofs <= 4095);
93
+ /* Combine LDR/STR pairs to LDRD/STRD. */
94
+ if (*as->mcp == (ai|ARMI_LS_P|ARMI_LS_U|ARMF_D(rd^1)|ARMF_N(rn)|(ofs^4)) &&
95
+ (ai & ~(ARMI_LDR^ARMI_STR)) == ARMI_STR && rd != rn &&
96
+ (uint32_t)ofs <= 252 && !(ofs & 3) && !((rd ^ (ofs >>2)) & 1) &&
97
+ as->mcp != as->mcloop) {
98
+ as->mcp++;
99
+ emit_lsox(as, ai == ARMI_LDR ? ARMI_LDRD : ARMI_STRD, rd&~1, rn, ofs&~4);
100
+ return;
101
+ }
102
+ if (ofs < 0) ofs = -ofs; else ai |= ARMI_LS_U;
103
+ *--as->mcp = ai | ARMI_LS_P | ARMF_D(rd) | ARMF_N(rn) | ofs;
104
+ }
105
+
106
+ #if !LJ_SOFTFP
107
+ static void emit_vlso(ASMState *as, ARMIns ai, Reg rd, Reg rn, int32_t ofs)
108
+ {
109
+ lua_assert(ofs >= -1020 && ofs <= 1020 && (ofs&3) == 0);
110
+ if (ofs < 0) ofs = -ofs; else ai |= ARMI_LS_U;
111
+ *--as->mcp = ai | ARMI_LS_P | ARMF_D(rd & 15) | ARMF_N(rn) | (ofs >> 2);
112
+ }
113
+ #endif
114
+
115
+ /* -- Emit loads/stores --------------------------------------------------- */
116
+
117
+ /* Prefer spills of BASE/L. */
118
+ #define emit_canremat(ref) ((ref) < ASMREF_L)
119
+
120
+ /* Try to find a one step delta relative to another constant. */
121
+ static int emit_kdelta1(ASMState *as, Reg d, int32_t i)
122
+ {
123
+ RegSet work = ~as->freeset & RSET_GPR;
124
+ while (work) {
125
+ Reg r = rset_picktop(work);
126
+ IRRef ref = regcost_ref(as->cost[r]);
127
+ lua_assert(r != d);
128
+ if (emit_canremat(ref)) {
129
+ int32_t delta = i - (ra_iskref(ref) ? ra_krefk(as, ref) : IR(ref)->i);
130
+ uint32_t k = emit_isk12(ARMI_ADD, delta);
131
+ if (k) {
132
+ if (k == ARMI_K12)
133
+ emit_dm(as, ARMI_MOV, d, r);
134
+ else
135
+ emit_dn(as, ARMI_ADD^k, d, r);
136
+ return 1;
137
+ }
138
+ }
139
+ rset_clear(work, r);
140
+ }
141
+ return 0; /* Failed. */
142
+ }
143
+
144
+ /* Try to find a two step delta relative to another constant. */
145
+ static int emit_kdelta2(ASMState *as, Reg d, int32_t i)
146
+ {
147
+ RegSet work = ~as->freeset & RSET_GPR;
148
+ while (work) {
149
+ Reg r = rset_picktop(work);
150
+ IRRef ref = regcost_ref(as->cost[r]);
151
+ lua_assert(r != d);
152
+ if (emit_canremat(ref)) {
153
+ int32_t other = ra_iskref(ref) ? ra_krefk(as, ref) : IR(ref)->i;
154
+ if (other) {
155
+ int32_t delta = i - other;
156
+ uint32_t sh, inv = 0, k2, k;
157
+ if (delta < 0) { delta = -delta; inv = ARMI_ADD^ARMI_SUB; }
158
+ sh = lj_ffs(delta) & ~1;
159
+ k2 = emit_isk12(0, delta & (255 << sh));
160
+ k = emit_isk12(0, delta & ~(255 << sh));
161
+ if (k) {
162
+ emit_dn(as, ARMI_ADD^k2^inv, d, d);
163
+ emit_dn(as, ARMI_ADD^k^inv, d, r);
164
+ return 1;
165
+ }
166
+ }
167
+ }
168
+ rset_clear(work, r);
169
+ }
170
+ return 0; /* Failed. */
171
+ }
172
+
173
+ /* Load a 32 bit constant into a GPR. */
174
+ static void emit_loadi(ASMState *as, Reg r, int32_t i)
175
+ {
176
+ uint32_t k = emit_isk12(ARMI_MOV, i);
177
+ lua_assert(rset_test(as->freeset, r) || r == RID_TMP);
178
+ if (k) {
179
+ /* Standard K12 constant. */
180
+ emit_d(as, ARMI_MOV^k, r);
181
+ } else if ((as->flags & JIT_F_ARMV6T2) && (uint32_t)i < 0x00010000u) {
182
+ /* 16 bit loword constant for ARMv6T2. */
183
+ emit_d(as, ARMI_MOVW|(i & 0x0fff)|((i & 0xf000)<<4), r);
184
+ } else if (emit_kdelta1(as, r, i)) {
185
+ /* One step delta relative to another constant. */
186
+ } else if ((as->flags & JIT_F_ARMV6T2)) {
187
+ /* 32 bit hiword/loword constant for ARMv6T2. */
188
+ emit_d(as, ARMI_MOVT|((i>>16) & 0x0fff)|(((i>>16) & 0xf000)<<4), r);
189
+ emit_d(as, ARMI_MOVW|(i & 0x0fff)|((i & 0xf000)<<4), r);
190
+ } else if (emit_kdelta2(as, r, i)) {
191
+ /* Two step delta relative to another constant. */
192
+ } else {
193
+ /* Otherwise construct the constant with up to 4 instructions. */
194
+ /* NYI: use mvn+bic, use pc-relative loads. */
195
+ for (;;) {
196
+ uint32_t sh = lj_ffs(i) & ~1;
197
+ int32_t m = i & (255 << sh);
198
+ i &= ~(255 << sh);
199
+ if (i == 0) {
200
+ emit_d(as, ARMI_MOV ^ emit_isk12(0, m), r);
201
+ break;
202
+ }
203
+ emit_dn(as, ARMI_ORR ^ emit_isk12(0, m), r, r);
204
+ }
205
+ }
206
+ }
207
+
208
+ #define emit_loada(as, r, addr) emit_loadi(as, (r), i32ptr((addr)))
209
+
210
+ static Reg ra_allock(ASMState *as, int32_t k, RegSet allow);
211
+
212
+ /* Get/set from constant pointer. */
213
+ static void emit_lsptr(ASMState *as, ARMIns ai, Reg r, void *p)
214
+ {
215
+ int32_t i = i32ptr(p);
216
+ emit_lso(as, ai, r, ra_allock(as, (i & ~4095), rset_exclude(RSET_GPR, r)),
217
+ (i & 4095));
218
+ }
219
+
220
+ #if !LJ_SOFTFP
221
+ /* Load a number constant into an FPR. */
222
+ static void emit_loadn(ASMState *as, Reg r, cTValue *tv)
223
+ {
224
+ int32_t i;
225
+ if ((as->flags & JIT_F_VFPV3) && !tv->u32.lo) {
226
+ uint32_t hi = tv->u32.hi;
227
+ uint32_t b = ((hi >> 22) & 0x1ff);
228
+ if (!(hi & 0xffff) && (b == 0x100 || b == 0x0ff)) {
229
+ *--as->mcp = ARMI_VMOVI_D | ARMF_D(r & 15) |
230
+ ((tv->u32.hi >> 12) & 0x00080000) |
231
+ ((tv->u32.hi >> 4) & 0x00070000) |
232
+ ((tv->u32.hi >> 16) & 0x0000000f);
233
+ return;
234
+ }
235
+ }
236
+ i = i32ptr(tv);
237
+ emit_vlso(as, ARMI_VLDR_D, r,
238
+ ra_allock(as, (i & ~1020), RSET_GPR), (i & 1020));
239
+ }
240
+ #endif
241
+
242
+ /* Get/set global_State fields. */
243
+ #define emit_getgl(as, r, field) \
244
+ emit_lsptr(as, ARMI_LDR, (r), (void *)&J2G(as->J)->field)
245
+ #define emit_setgl(as, r, field) \
246
+ emit_lsptr(as, ARMI_STR, (r), (void *)&J2G(as->J)->field)
247
+
248
+ /* Trace number is determined from pc of exit instruction. */
249
+ #define emit_setvmstate(as, i) UNUSED(i)
250
+
251
+ /* -- Emit control-flow instructions -------------------------------------- */
252
+
253
+ /* Label for internal jumps. */
254
+ typedef MCode *MCLabel;
255
+
256
+ /* Return label pointing to current PC. */
257
+ #define emit_label(as) ((as)->mcp)
258
+
259
+ static void emit_branch(ASMState *as, ARMIns ai, MCode *target)
260
+ {
261
+ MCode *p = as->mcp;
262
+ ptrdiff_t delta = (target - p) - 1;
263
+ lua_assert(((delta + 0x00800000) >> 24) == 0);
264
+ *--p = ai | ((uint32_t)delta & 0x00ffffffu);
265
+ as->mcp = p;
266
+ }
267
+
268
+ #define emit_jmp(as, target) emit_branch(as, ARMI_B, (target))
269
+
270
+ static void emit_call(ASMState *as, void *target)
271
+ {
272
+ MCode *p = --as->mcp;
273
+ ptrdiff_t delta = ((char *)target - (char *)p) - 8;
274
+ if ((((delta>>2) + 0x00800000) >> 24) == 0) {
275
+ if ((delta & 1))
276
+ *p = ARMI_BLX | ((uint32_t)(delta>>2) & 0x00ffffffu) | ((delta&2) << 27);
277
+ else
278
+ *p = ARMI_BL | ((uint32_t)(delta>>2) & 0x00ffffffu);
279
+ } else { /* Target out of range: need indirect call. But don't use R0-R3. */
280
+ Reg r = ra_allock(as, i32ptr(target), RSET_RANGE(RID_R4, RID_R12+1));
281
+ *p = ARMI_BLXr | ARMF_M(r);
282
+ }
283
+ }
284
+
285
+ /* -- Emit generic operations --------------------------------------------- */
286
+
287
+ /* Generic move between two regs. */
288
+ static void emit_movrr(ASMState *as, IRIns *ir, Reg dst, Reg src)
289
+ {
290
+ #if LJ_SOFTFP
291
+ lua_assert(!irt_isnum(ir->t)); UNUSED(ir);
292
+ #else
293
+ if (dst >= RID_MAX_GPR) {
294
+ emit_dm(as, irt_isnum(ir->t) ? ARMI_VMOV_D : ARMI_VMOV_S,
295
+ (dst & 15), (src & 15));
296
+ return;
297
+ }
298
+ #endif
299
+ if (as->mcp != as->mcloop) { /* Swap early registers for loads/stores. */
300
+ MCode ins = *as->mcp, swp = (src^dst);
301
+ if ((ins & 0x0c000000) == 0x04000000 && (ins & 0x02000010) != 0x02000010) {
302
+ if (!((ins ^ (dst << 16)) & 0x000f0000))
303
+ *as->mcp = ins ^ (swp << 16); /* Swap N in load/store. */
304
+ if (!(ins & 0x00100000) && !((ins ^ (dst << 12)) & 0x0000f000))
305
+ *as->mcp = ins ^ (swp << 12); /* Swap D in store. */
306
+ }
307
+ }
308
+ emit_dm(as, ARMI_MOV, dst, src);
309
+ }
310
+
311
+ /* Generic load of register with base and (small) offset address. */
312
+ static void emit_loadofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs)
313
+ {
314
+ #if LJ_SOFTFP
315
+ lua_assert(!irt_isnum(ir->t)); UNUSED(ir);
316
+ #else
317
+ if (r >= RID_MAX_GPR)
318
+ emit_vlso(as, irt_isnum(ir->t) ? ARMI_VLDR_D : ARMI_VLDR_S, r, base, ofs);
319
+ else
320
+ #endif
321
+ emit_lso(as, ARMI_LDR, r, base, ofs);
322
+ }
323
+
324
+ /* Generic store of register with base and (small) offset address. */
325
+ static void emit_storeofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs)
326
+ {
327
+ #if LJ_SOFTFP
328
+ lua_assert(!irt_isnum(ir->t)); UNUSED(ir);
329
+ #else
330
+ if (r >= RID_MAX_GPR)
331
+ emit_vlso(as, irt_isnum(ir->t) ? ARMI_VSTR_D : ARMI_VSTR_S, r, base, ofs);
332
+ else
333
+ #endif
334
+ emit_lso(as, ARMI_STR, r, base, ofs);
335
+ }
336
+
337
+ /* Emit an arithmetic/logic operation with a constant operand. */
338
+ static void emit_opk(ASMState *as, ARMIns ai, Reg dest, Reg src,
339
+ int32_t i, RegSet allow)
340
+ {
341
+ uint32_t k = emit_isk12(ai, i);
342
+ if (k)
343
+ emit_dn(as, ai^k, dest, src);
344
+ else
345
+ emit_dnm(as, ai, dest, src, ra_allock(as, i, allow));
346
+ }
347
+
348
+ /* Add offset to pointer. */
349
+ static void emit_addptr(ASMState *as, Reg r, int32_t ofs)
350
+ {
351
+ if (ofs)
352
+ emit_opk(as, ARMI_ADD, r, r, ofs, rset_exclude(RSET_GPR, r));
353
+ }
354
+
355
+ #define emit_spsub(as, ofs) emit_addptr(as, RID_SP, -(ofs))
356
+