aboutsummaryrefslogtreecommitdiff
path: root/src/jit
diff options
context:
space:
mode:
authorMike Pall <mike>2024-01-22 19:06:36 +0100
committerMike Pall <mike>2024-01-22 19:06:36 +0100
commit4b90f6c4d7420139c135435e1580acb52ea18436 (patch)
tree1c3543b6baa4f8b30a33e8a624b60edc6feb0206 /src/jit
parentc525bcb9024510cad9e170e12b6209aedb330f83 (diff)
downloadluajit-4b90f6c4d7420139c135435e1580acb52ea18436.tar.gz
luajit-4b90f6c4d7420139c135435e1580acb52ea18436.tar.bz2
luajit-4b90f6c4d7420139c135435e1580acb52ea18436.zip
Add cross-32/64 bit and deterministic bytecode generation.
Contributed by Peter Cawley. #993 #1008
Diffstat (limited to 'src/jit')
-rw-r--r--src/jit/bcsave.lua31
1 files changed, 21 insertions, 10 deletions
diff --git a/src/jit/bcsave.lua b/src/jit/bcsave.lua
index 390d297c..131bf39b 100644
--- a/src/jit/bcsave.lua
+++ b/src/jit/bcsave.lua
@@ -29,6 +29,9 @@ Save LuaJIT bytecode: luajit -b[options] input output
29 -l Only list bytecode. 29 -l Only list bytecode.
30 -s Strip debug info (default). 30 -s Strip debug info (default).
31 -g Keep debug info. 31 -g Keep debug info.
32 -W Generate 32 bit (non-GC64) bytecode.
33 -X Generate 64 bit (GC64) bytecode.
34 -d Generate bytecode in deterministic manner.
32 -n name Set module name (default: auto-detect from input name). 35 -n name Set module name (default: auto-detect from input name).
33 -t type Set output file type (default: auto-detect from output name). 36 -t type Set output file type (default: auto-detect from output name).
34 -a arch Override architecture for object files (default: native). 37 -a arch Override architecture for object files (default: native).
@@ -51,8 +54,9 @@ local function check(ok, ...)
51end 54end
52 55
53local function readfile(ctx, input) 56local function readfile(ctx, input)
54 if type(input) == "function" then return input end 57 if ctx.string then
55 if ctx.filename then 58 return check(loadstring(input, nil, ctx.mode))
59 elseif ctx.filename then
56 local data 60 local data
57 if input == "-" then 61 if input == "-" then
58 data = io.stdin:read("*a") 62 data = io.stdin:read("*a")
@@ -61,10 +65,10 @@ local function readfile(ctx, input)
61 data = assert(fp:read("*a")) 65 data = assert(fp:read("*a"))
62 assert(fp:close()) 66 assert(fp:close())
63 end 67 end
64 return check(load(data, ctx.filename)) 68 return check(load(data, ctx.filename, ctx.mode))
65 else 69 else
66 if input == "-" then input = nil end 70 if input == "-" then input = nil end
67 return check(loadfile(input)) 71 return check(loadfile(input, ctx.mode))
68 end 72 end
69end 73end
70 74
@@ -624,7 +628,7 @@ end
624 628
625local function bcsave(ctx, input, output) 629local function bcsave(ctx, input, output)
626 local f = readfile(ctx, input) 630 local f = readfile(ctx, input)
627 local s = string.dump(f, ctx.strip) 631 local s = string.dump(f, ctx.mode)
628 local t = ctx.type 632 local t = ctx.type
629 if not t then 633 if not t then
630 t = detecttype(output) 634 t = detecttype(output)
@@ -647,9 +651,11 @@ local function docmd(...)
647 local n = 1 651 local n = 1
648 local list = false 652 local list = false
649 local ctx = { 653 local ctx = {
650 strip = true, arch = jit.arch, os = jit.os:lower(), 654 mode = "bt", arch = jit.arch, os = jit.os:lower(),
651 type = false, modname = false, 655 type = false, modname = false, string = false,
652 } 656 }
657 local strip = "s"
658 local gc64 = ""
653 while n <= #arg do 659 while n <= #arg do
654 local a = arg[n] 660 local a = arg[n]
655 if type(a) == "string" and a:sub(1, 1) == "-" and a ~= "-" then 661 if type(a) == "string" and a:sub(1, 1) == "-" and a ~= "-" then
@@ -660,14 +666,18 @@ local function docmd(...)
660 if opt == "l" then 666 if opt == "l" then
661 list = true 667 list = true
662 elseif opt == "s" then 668 elseif opt == "s" then
663 ctx.strip = true 669 strip = "s"
664 elseif opt == "g" then 670 elseif opt == "g" then
665 ctx.strip = false 671 strip = ""
672 elseif opt == "W" or opt == "X" then
673 gc64 = opt
674 elseif opt == "d" then
675 ctx.mode = ctx.mode .. opt
666 else 676 else
667 if arg[n] == nil or m ~= #a then usage() end 677 if arg[n] == nil or m ~= #a then usage() end
668 if opt == "e" then 678 if opt == "e" then
669 if n ~= 1 then usage() end 679 if n ~= 1 then usage() end
670 arg[1] = check(loadstring(arg[1])) 680 ctx.string = true
671 elseif opt == "n" then 681 elseif opt == "n" then
672 ctx.modname = checkmodname(tremove(arg, n)) 682 ctx.modname = checkmodname(tremove(arg, n))
673 elseif opt == "t" then 683 elseif opt == "t" then
@@ -687,6 +697,7 @@ local function docmd(...)
687 n = n + 1 697 n = n + 1
688 end 698 end
689 end 699 end
700 ctx.mode = ctx.mode .. strip .. gc64
690 if list then 701 if list then
691 if #arg == 0 or #arg > 2 then usage() end 702 if #arg == 0 or #arg > 2 then usage() end
692 bclist(ctx, arg[1], arg[2] or "-") 703 bclist(ctx, arg[1], arg[2] or "-")