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,345 @@
1
+ /*
2
+ ** LuaJIT VM builder: Assembler source code emitter.
3
+ ** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
4
+ */
5
+
6
+ #include "buildvm.h"
7
+ #include "lj_bc.h"
8
+
9
+ /* ------------------------------------------------------------------------ */
10
+
11
+ #if LJ_TARGET_X86ORX64
12
+ /* Emit bytes piecewise as assembler text. */
13
+ static void emit_asm_bytes(BuildCtx *ctx, uint8_t *p, int n)
14
+ {
15
+ int i;
16
+ for (i = 0; i < n; i++) {
17
+ if ((i & 15) == 0)
18
+ fprintf(ctx->fp, "\t.byte %d", p[i]);
19
+ else
20
+ fprintf(ctx->fp, ",%d", p[i]);
21
+ if ((i & 15) == 15) putc('\n', ctx->fp);
22
+ }
23
+ if ((n & 15) != 0) putc('\n', ctx->fp);
24
+ }
25
+
26
+ /* Emit relocation */
27
+ static void emit_asm_reloc(BuildCtx *ctx, int type, const char *sym)
28
+ {
29
+ switch (ctx->mode) {
30
+ case BUILD_elfasm:
31
+ if (type)
32
+ fprintf(ctx->fp, "\t.long %s-.-4\n", sym);
33
+ else
34
+ fprintf(ctx->fp, "\t.long %s\n", sym);
35
+ break;
36
+ case BUILD_coffasm:
37
+ fprintf(ctx->fp, "\t.def %s; .scl 3; .type 32; .endef\n", sym);
38
+ if (type)
39
+ fprintf(ctx->fp, "\t.long %s-.-4\n", sym);
40
+ else
41
+ fprintf(ctx->fp, "\t.long %s\n", sym);
42
+ break;
43
+ default: /* BUILD_machasm for relative relocations handled below. */
44
+ fprintf(ctx->fp, "\t.long %s\n", sym);
45
+ break;
46
+ }
47
+ }
48
+
49
+ static const char *const jccnames[] = {
50
+ "jo", "jno", "jb", "jnb", "jz", "jnz", "jbe", "ja",
51
+ "js", "jns", "jpe", "jpo", "jl", "jge", "jle", "jg"
52
+ };
53
+
54
+ /* Emit x86/x64 text relocations. */
55
+ static void emit_asm_reloc_text(BuildCtx *ctx, uint8_t *cp, int n,
56
+ const char *sym)
57
+ {
58
+ const char *opname = NULL;
59
+ if (--n < 0) goto err;
60
+ if (cp[n] == 0xe8) {
61
+ opname = "call";
62
+ } else if (cp[n] == 0xe9) {
63
+ opname = "jmp";
64
+ } else if (cp[n] >= 0x80 && cp[n] <= 0x8f && n > 0 && cp[n-1] == 0x0f) {
65
+ opname = jccnames[cp[n]-0x80];
66
+ n--;
67
+ } else {
68
+ err:
69
+ fprintf(stderr, "Error: unsupported opcode for %s symbol relocation.\n",
70
+ sym);
71
+ exit(1);
72
+ }
73
+ emit_asm_bytes(ctx, cp, n);
74
+ if (strncmp(sym+(*sym == '_'), LABEL_PREFIX, sizeof(LABEL_PREFIX)-1)) {
75
+ /* Various fixups for external symbols outside of our binary. */
76
+ if (ctx->mode == BUILD_elfasm) {
77
+ if (LJ_32)
78
+ fprintf(ctx->fp, "#if __PIC__\n\t%s lj_wrap_%s\n#else\n", opname, sym);
79
+ fprintf(ctx->fp, "\t%s %s@PLT\n", opname, sym);
80
+ if (LJ_32)
81
+ fprintf(ctx->fp, "#endif\n");
82
+ return;
83
+ } else if (LJ_32 && ctx->mode == BUILD_machasm) {
84
+ fprintf(ctx->fp, "\t%s L%s$stub\n", opname, sym);
85
+ return;
86
+ }
87
+ }
88
+ fprintf(ctx->fp, "\t%s %s\n", opname, sym);
89
+ }
90
+ #else
91
+ /* Emit words piecewise as assembler text. */
92
+ static void emit_asm_words(BuildCtx *ctx, uint8_t *p, int n)
93
+ {
94
+ int i;
95
+ for (i = 0; i < n; i += 4) {
96
+ if ((i & 15) == 0)
97
+ fprintf(ctx->fp, "\t.long 0x%08x", *(uint32_t *)(p+i));
98
+ else
99
+ fprintf(ctx->fp, ",0x%08x", *(uint32_t *)(p+i));
100
+ if ((i & 15) == 12) putc('\n', ctx->fp);
101
+ }
102
+ if ((n & 15) != 0) putc('\n', ctx->fp);
103
+ }
104
+
105
+ /* Emit relocation as part of an instruction. */
106
+ static void emit_asm_wordreloc(BuildCtx *ctx, uint8_t *p, int n,
107
+ const char *sym)
108
+ {
109
+ uint32_t ins;
110
+ emit_asm_words(ctx, p, n-4);
111
+ ins = *(uint32_t *)(p+n-4);
112
+ #if LJ_TARGET_ARM
113
+ if ((ins & 0xff000000u) == 0xfa000000u) {
114
+ fprintf(ctx->fp, "\tblx %s\n", sym);
115
+ } else if ((ins & 0x0e000000u) == 0x0a000000u) {
116
+ fprintf(ctx->fp, "\t%s%.2s %s\n", (ins & 0x01000000u) ? "bl" : "b",
117
+ &"eqnecsccmiplvsvchilsgeltgtle"[2*(ins >> 28)], sym);
118
+ } else {
119
+ fprintf(stderr,
120
+ "Error: unsupported opcode %08x for %s symbol relocation.\n",
121
+ ins, sym);
122
+ exit(1);
123
+ }
124
+ #elif LJ_TARGET_ARM64
125
+ if ((ins >> 26) == 0x25u) {
126
+ fprintf(ctx->fp, "\tbl %s\n", sym);
127
+ } else {
128
+ fprintf(stderr,
129
+ "Error: unsupported opcode %08x for %s symbol relocation.\n",
130
+ ins, sym);
131
+ exit(1);
132
+ }
133
+ #elif LJ_TARGET_PPC
134
+ #if LJ_TARGET_PS3
135
+ #define TOCPREFIX "."
136
+ #else
137
+ #define TOCPREFIX ""
138
+ #endif
139
+ if ((ins >> 26) == 16) {
140
+ fprintf(ctx->fp, "\t%s %d, %d, " TOCPREFIX "%s\n",
141
+ (ins & 1) ? "bcl" : "bc", (ins >> 21) & 31, (ins >> 16) & 31, sym);
142
+ } else if ((ins >> 26) == 18) {
143
+ #if LJ_ARCH_PPC64
144
+ const char *suffix = strchr(sym, '@');
145
+ if (suffix && suffix[1] == 'h') {
146
+ fprintf(ctx->fp, "\taddis 11, 2, %s\n", sym);
147
+ } else if (suffix && suffix[1] == 'l') {
148
+ fprintf(ctx->fp, "\tld 12, %s\n", sym);
149
+ } else
150
+ #endif
151
+ fprintf(ctx->fp, "\t%s " TOCPREFIX "%s\n", (ins & 1) ? "bl" : "b", sym);
152
+ } else {
153
+ fprintf(stderr,
154
+ "Error: unsupported opcode %08x for %s symbol relocation.\n",
155
+ ins, sym);
156
+ exit(1);
157
+ }
158
+ #elif LJ_TARGET_MIPS
159
+ fprintf(stderr,
160
+ "Error: unsupported opcode %08x for %s symbol relocation.\n",
161
+ ins, sym);
162
+ exit(1);
163
+ #else
164
+ #error "missing relocation support for this architecture"
165
+ #endif
166
+ }
167
+ #endif
168
+
169
+ #if LJ_TARGET_ARM
170
+ #define ELFASM_PX "%%"
171
+ #else
172
+ #define ELFASM_PX "@"
173
+ #endif
174
+
175
+ /* Emit an assembler label. */
176
+ static void emit_asm_label(BuildCtx *ctx, const char *name, int size, int isfunc)
177
+ {
178
+ switch (ctx->mode) {
179
+ case BUILD_elfasm:
180
+ #if LJ_TARGET_PS3
181
+ if (!strncmp(name, "lj_vm_", 6) &&
182
+ strcmp(name, ctx->beginsym) &&
183
+ !strstr(name, "hook")) {
184
+ fprintf(ctx->fp,
185
+ "\n\t.globl %s\n"
186
+ "\t.section \".opd\",\"aw\"\n"
187
+ "%s:\n"
188
+ "\t.long .%s,.TOC.@tocbase32\n"
189
+ "\t.size %s,8\n"
190
+ "\t.previous\n"
191
+ "\t.globl .%s\n"
192
+ "\t.hidden .%s\n"
193
+ "\t.type .%s, " ELFASM_PX "function\n"
194
+ "\t.size .%s, %d\n"
195
+ ".%s:\n",
196
+ name, name, name, name, name, name, name, name, size, name);
197
+ break;
198
+ }
199
+ #endif
200
+ fprintf(ctx->fp,
201
+ "\n\t.globl %s\n"
202
+ "\t.hidden %s\n"
203
+ "\t.type %s, " ELFASM_PX "%s\n"
204
+ "\t.size %s, %d\n"
205
+ "%s:\n",
206
+ name, name, name, isfunc ? "function" : "object", name, size, name);
207
+ break;
208
+ case BUILD_coffasm:
209
+ fprintf(ctx->fp, "\n\t.globl %s\n", name);
210
+ if (isfunc)
211
+ fprintf(ctx->fp, "\t.def %s; .scl 3; .type 32; .endef\n", name);
212
+ fprintf(ctx->fp, "%s:\n", name);
213
+ break;
214
+ case BUILD_machasm:
215
+ fprintf(ctx->fp,
216
+ "\n\t.private_extern %s\n"
217
+ "%s:\n", name, name);
218
+ break;
219
+ default:
220
+ break;
221
+ }
222
+ }
223
+
224
+ /* Emit alignment. */
225
+ static void emit_asm_align(BuildCtx *ctx, int bits)
226
+ {
227
+ switch (ctx->mode) {
228
+ case BUILD_elfasm:
229
+ case BUILD_coffasm:
230
+ fprintf(ctx->fp, "\t.p2align %d\n", bits);
231
+ break;
232
+ case BUILD_machasm:
233
+ fprintf(ctx->fp, "\t.align %d\n", bits);
234
+ break;
235
+ default:
236
+ break;
237
+ }
238
+ }
239
+
240
+ /* ------------------------------------------------------------------------ */
241
+
242
+ /* Emit assembler source code. */
243
+ void emit_asm(BuildCtx *ctx)
244
+ {
245
+ int i, rel;
246
+
247
+ fprintf(ctx->fp, "\t.file \"buildvm_%s.dasc\"\n", ctx->dasm_arch);
248
+ #if LJ_ARCH_PPC64
249
+ fprintf(ctx->fp, "\t.abiversion 2\n");
250
+ #endif
251
+ fprintf(ctx->fp, "\t.text\n");
252
+ emit_asm_align(ctx, 4);
253
+
254
+ #if LJ_TARGET_PS3
255
+ emit_asm_label(ctx, ctx->beginsym, ctx->codesz, 0);
256
+ #else
257
+ emit_asm_label(ctx, ctx->beginsym, 0, 0);
258
+ #endif
259
+ if (ctx->mode != BUILD_machasm)
260
+ fprintf(ctx->fp, ".Lbegin:\n");
261
+
262
+ #if LJ_TARGET_ARM && defined(__GNUC__) && !LJ_NO_UNWIND
263
+ /* This should really be moved into buildvm_arm.dasc. */
264
+ fprintf(ctx->fp,
265
+ ".fnstart\n"
266
+ ".save {r4, r5, r6, r7, r8, r9, r10, r11, lr}\n"
267
+ ".pad #28\n");
268
+ #endif
269
+ #if LJ_TARGET_MIPS
270
+ fprintf(ctx->fp, ".set nomips16\n.abicalls\n.set noreorder\n.set nomacro\n");
271
+ #endif
272
+
273
+ for (i = rel = 0; i < ctx->nsym; i++) {
274
+ int32_t ofs = ctx->sym[i].ofs;
275
+ int32_t next = ctx->sym[i+1].ofs;
276
+ #if LJ_TARGET_ARM && defined(__GNUC__) && !LJ_NO_UNWIND && LJ_HASFFI
277
+ if (!strcmp(ctx->sym[i].name, "lj_vm_ffi_call"))
278
+ fprintf(ctx->fp,
279
+ ".globl lj_err_unwind_arm\n"
280
+ ".personality lj_err_unwind_arm\n"
281
+ ".fnend\n"
282
+ ".fnstart\n"
283
+ ".save {r4, r5, r11, lr}\n"
284
+ ".setfp r11, sp\n");
285
+ #endif
286
+ emit_asm_label(ctx, ctx->sym[i].name, next - ofs, 1);
287
+ while (rel < ctx->nreloc && ctx->reloc[rel].ofs <= next) {
288
+ BuildReloc *r = &ctx->reloc[rel];
289
+ int n = r->ofs - ofs;
290
+ #if LJ_TARGET_X86ORX64
291
+ if (r->type != 0 &&
292
+ (ctx->mode == BUILD_elfasm || ctx->mode == BUILD_machasm)) {
293
+ emit_asm_reloc_text(ctx, ctx->code+ofs, n, ctx->relocsym[r->sym]);
294
+ } else {
295
+ emit_asm_bytes(ctx, ctx->code+ofs, n);
296
+ emit_asm_reloc(ctx, r->type, ctx->relocsym[r->sym]);
297
+ }
298
+ ofs += n+4;
299
+ #else
300
+ emit_asm_wordreloc(ctx, ctx->code+ofs, n, ctx->relocsym[r->sym]);
301
+ ofs += n;
302
+ #endif
303
+ rel++;
304
+ }
305
+ #if LJ_TARGET_X86ORX64
306
+ emit_asm_bytes(ctx, ctx->code+ofs, next-ofs);
307
+ #else
308
+ emit_asm_words(ctx, ctx->code+ofs, next-ofs);
309
+ #endif
310
+ }
311
+
312
+ #if LJ_TARGET_ARM && defined(__GNUC__) && !LJ_NO_UNWIND
313
+ fprintf(ctx->fp,
314
+ #if !LJ_HASFFI
315
+ ".globl lj_err_unwind_arm\n"
316
+ ".personality lj_err_unwind_arm\n"
317
+ #endif
318
+ ".fnend\n");
319
+ #endif
320
+
321
+ fprintf(ctx->fp, "\n");
322
+ switch (ctx->mode) {
323
+ case BUILD_elfasm:
324
+ #if !(LJ_TARGET_PS3 || LJ_TARGET_PSVITA)
325
+ fprintf(ctx->fp, "\t.section .note.GNU-stack,\"\"," ELFASM_PX "progbits\n");
326
+ #endif
327
+ #if LJ_TARGET_PPC && !LJ_TARGET_PS3
328
+ /* Hard-float ABI. */
329
+ fprintf(ctx->fp, "\t.gnu_attribute 4, 1\n");
330
+ #endif
331
+ /* fallthrough */
332
+ case BUILD_coffasm:
333
+ fprintf(ctx->fp, "\t.ident \"%s\"\n", ctx->dasm_ident);
334
+ break;
335
+ case BUILD_machasm:
336
+ fprintf(ctx->fp,
337
+ "\t.cstring\n"
338
+ "\t.ascii \"%s\\0\"\n", ctx->dasm_ident);
339
+ break;
340
+ default:
341
+ break;
342
+ }
343
+ fprintf(ctx->fp, "\n");
344
+ }
345
+
@@ -0,0 +1,229 @@
1
+ /*
2
+ ** LuaJIT VM builder: IR folding hash table generator.
3
+ ** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
4
+ */
5
+
6
+ #include "buildvm.h"
7
+ #include "lj_obj.h"
8
+ #include "lj_ir.h"
9
+
10
+ /* Context for the folding hash table generator. */
11
+ static int lineno;
12
+ static int funcidx;
13
+ static uint32_t foldkeys[BUILD_MAX_FOLD];
14
+ static uint32_t nkeys;
15
+
16
+ /* Try to fill the hash table with keys using the hash parameters. */
17
+ static int tryhash(uint32_t *htab, uint32_t sz, uint32_t r, int dorol)
18
+ {
19
+ uint32_t i;
20
+ if (dorol && ((r & 31) == 0 || (r>>5) == 0))
21
+ return 0; /* Avoid zero rotates. */
22
+ memset(htab, 0xff, (sz+1)*sizeof(uint32_t));
23
+ for (i = 0; i < nkeys; i++) {
24
+ uint32_t key = foldkeys[i];
25
+ uint32_t k = key & 0xffffff;
26
+ uint32_t h = (dorol ? lj_rol(lj_rol(k, r>>5) - k, r&31) :
27
+ (((k << (r>>5)) - k) << (r&31))) % sz;
28
+ if (htab[h] != 0xffffffff) { /* Collision on primary slot. */
29
+ if (htab[h+1] != 0xffffffff) { /* Collision on secondary slot. */
30
+ /* Try to move the colliding key, if possible. */
31
+ if (h < sz-1 && htab[h+2] == 0xffffffff) {
32
+ uint32_t k2 = htab[h+1] & 0xffffff;
33
+ uint32_t h2 = (dorol ? lj_rol(lj_rol(k2, r>>5) - k2, r&31) :
34
+ (((k2 << (r>>5)) - k2) << (r&31))) % sz;
35
+ if (h2 != h+1) return 0; /* Cannot resolve collision. */
36
+ htab[h+2] = htab[h+1]; /* Move colliding key to secondary slot. */
37
+ } else {
38
+ return 0; /* Collision. */
39
+ }
40
+ }
41
+ htab[h+1] = key;
42
+ } else {
43
+ htab[h] = key;
44
+ }
45
+ }
46
+ return 1; /* Success, all keys could be stored. */
47
+ }
48
+
49
+ /* Print the generated hash table. */
50
+ static void printhash(BuildCtx *ctx, uint32_t *htab, uint32_t sz)
51
+ {
52
+ uint32_t i;
53
+ fprintf(ctx->fp, "static const uint32_t fold_hash[%d] = {\n0x%08x",
54
+ sz+1, htab[0]);
55
+ for (i = 1; i < sz+1; i++)
56
+ fprintf(ctx->fp, ",\n0x%08x", htab[i]);
57
+ fprintf(ctx->fp, "\n};\n\n");
58
+ }
59
+
60
+ /* Exhaustive search for the shortest semi-perfect hash table. */
61
+ static void makehash(BuildCtx *ctx)
62
+ {
63
+ uint32_t htab[BUILD_MAX_FOLD*2+1];
64
+ uint32_t sz, r;
65
+ /* Search for the smallest hash table with an odd size. */
66
+ for (sz = (nkeys|1); sz < BUILD_MAX_FOLD*2; sz += 2) {
67
+ /* First try all shift hash combinations. */
68
+ for (r = 0; r < 32*32; r++) {
69
+ if (tryhash(htab, sz, r, 0)) {
70
+ printhash(ctx, htab, sz);
71
+ fprintf(ctx->fp,
72
+ "#define fold_hashkey(k)\t(((((k)<<%u)-(k))<<%u)%%%u)\n\n",
73
+ r>>5, r&31, sz);
74
+ return;
75
+ }
76
+ }
77
+ /* Then try all rotate hash combinations. */
78
+ for (r = 0; r < 32*32; r++) {
79
+ if (tryhash(htab, sz, r, 1)) {
80
+ printhash(ctx, htab, sz);
81
+ fprintf(ctx->fp,
82
+ "#define fold_hashkey(k)\t(lj_rol(lj_rol((k),%u)-(k),%u)%%%u)\n\n",
83
+ r>>5, r&31, sz);
84
+ return;
85
+ }
86
+ }
87
+ }
88
+ fprintf(stderr, "Error: search for perfect hash failed\n");
89
+ exit(1);
90
+ }
91
+
92
+ /* Parse one token of a fold rule. */
93
+ static uint32_t nexttoken(char **pp, int allowlit, int allowany)
94
+ {
95
+ char *p = *pp;
96
+ if (p) {
97
+ uint32_t i;
98
+ char *q = strchr(p, ' ');
99
+ if (q) *q++ = '\0';
100
+ *pp = q;
101
+ if (allowlit && !strncmp(p, "IRFPM_", 6)) {
102
+ for (i = 0; irfpm_names[i]; i++)
103
+ if (!strcmp(irfpm_names[i], p+6))
104
+ return i;
105
+ } else if (allowlit && !strncmp(p, "IRFL_", 5)) {
106
+ for (i = 0; irfield_names[i]; i++)
107
+ if (!strcmp(irfield_names[i], p+5))
108
+ return i;
109
+ } else if (allowlit && !strncmp(p, "IRCALL_", 7)) {
110
+ for (i = 0; ircall_names[i]; i++)
111
+ if (!strcmp(ircall_names[i], p+7))
112
+ return i;
113
+ } else if (allowlit && !strncmp(p, "IRCONV_", 7)) {
114
+ for (i = 0; irt_names[i]; i++) {
115
+ const char *r = strchr(p+7, '_');
116
+ if (r && !strncmp(irt_names[i], p+7, r-(p+7))) {
117
+ uint32_t j;
118
+ for (j = 0; irt_names[j]; j++)
119
+ if (!strcmp(irt_names[j], r+1))
120
+ return (i << 5) + j;
121
+ }
122
+ }
123
+ } else if (allowlit && *p >= '0' && *p <= '9') {
124
+ for (i = 0; *p >= '0' && *p <= '9'; p++)
125
+ i = i*10 + (*p - '0');
126
+ if (*p == '\0')
127
+ return i;
128
+ } else if (allowany && !strcmp("any", p)) {
129
+ return allowany;
130
+ } else {
131
+ for (i = 0; ir_names[i]; i++)
132
+ if (!strcmp(ir_names[i], p))
133
+ return i;
134
+ }
135
+ fprintf(stderr, "Error: bad fold definition token \"%s\" at line %d\n", p, lineno);
136
+ exit(1);
137
+ }
138
+ return 0;
139
+ }
140
+
141
+ /* Parse a fold rule. */
142
+ static void foldrule(char *p)
143
+ {
144
+ uint32_t op = nexttoken(&p, 0, 0);
145
+ uint32_t left = nexttoken(&p, 0, 0x7f);
146
+ uint32_t right = nexttoken(&p, 1, 0x3ff);
147
+ uint32_t key = (funcidx << 24) | (op << 17) | (left << 10) | right;
148
+ uint32_t i;
149
+ if (nkeys >= BUILD_MAX_FOLD) {
150
+ fprintf(stderr, "Error: too many fold rules, increase BUILD_MAX_FOLD.\n");
151
+ exit(1);
152
+ }
153
+ /* Simple insertion sort to detect duplicates. */
154
+ for (i = nkeys; i > 0; i--) {
155
+ if ((foldkeys[i-1]&0xffffff) < (key & 0xffffff))
156
+ break;
157
+ if ((foldkeys[i-1]&0xffffff) == (key & 0xffffff)) {
158
+ fprintf(stderr, "Error: duplicate fold definition at line %d\n", lineno);
159
+ exit(1);
160
+ }
161
+ foldkeys[i] = foldkeys[i-1];
162
+ }
163
+ foldkeys[i] = key;
164
+ nkeys++;
165
+ }
166
+
167
+ /* Emit C source code for IR folding hash table. */
168
+ void emit_fold(BuildCtx *ctx)
169
+ {
170
+ char buf[256]; /* We don't care about analyzing lines longer than that. */
171
+ const char *fname = ctx->args[0];
172
+ FILE *fp;
173
+
174
+ if (fname == NULL) {
175
+ fprintf(stderr, "Error: missing input filename\n");
176
+ exit(1);
177
+ }
178
+
179
+ if (fname[0] == '-' && fname[1] == '\0') {
180
+ fp = stdin;
181
+ } else {
182
+ fp = fopen(fname, "r");
183
+ if (!fp) {
184
+ fprintf(stderr, "Error: cannot open input file '%s': %s\n",
185
+ fname, strerror(errno));
186
+ exit(1);
187
+ }
188
+ }
189
+
190
+ fprintf(ctx->fp, "/* This is a generated file. DO NOT EDIT! */\n\n");
191
+ fprintf(ctx->fp, "static const FoldFunc fold_func[] = {\n");
192
+
193
+ lineno = 0;
194
+ funcidx = 0;
195
+ nkeys = 0;
196
+ while (fgets(buf, sizeof(buf), fp) != NULL) {
197
+ lineno++;
198
+ /* The prefix must be at the start of a line, otherwise it's ignored. */
199
+ if (!strncmp(buf, FOLDDEF_PREFIX, sizeof(FOLDDEF_PREFIX)-1)) {
200
+ char *p = buf+sizeof(FOLDDEF_PREFIX)-1;
201
+ char *q = strchr(p, ')');
202
+ if (p[0] == '(' && q) {
203
+ p++;
204
+ *q = '\0';
205
+ foldrule(p);
206
+ } else if ((p[0] == 'F' || p[0] == 'X') && p[1] == '(' && q) {
207
+ p += 2;
208
+ *q = '\0';
209
+ if (funcidx)
210
+ fprintf(ctx->fp, ",\n");
211
+ if (p[-2] == 'X')
212
+ fprintf(ctx->fp, " %s", p);
213
+ else
214
+ fprintf(ctx->fp, " fold_%s", p);
215
+ funcidx++;
216
+ } else {
217
+ buf[strlen(buf)-1] = '\0';
218
+ fprintf(stderr, "Error: unknown fold definition tag %s%s at line %d\n",
219
+ FOLDDEF_PREFIX, p, lineno);
220
+ exit(1);
221
+ }
222
+ }
223
+ }
224
+ fclose(fp);
225
+ fprintf(ctx->fp, "\n};\n\n");
226
+
227
+ makehash(ctx);
228
+ }
229
+