aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/dis_arm.lua5
-rw-r--r--lib/dis_x64.lua1
-rw-r--r--lib/dis_x86.lua12
-rw-r--r--lib/dump.lua31
4 files changed, 28 insertions, 21 deletions
diff --git a/lib/dis_arm.lua b/lib/dis_arm.lua
index d007f86c..e4e98afc 100644
--- a/lib/dis_arm.lua
+++ b/lib/dis_arm.lua
@@ -529,10 +529,15 @@ local function disass_(code, addr, out)
529 create_(code, addr, out):disass() 529 create_(code, addr, out):disass()
530end 530end
531 531
532-- Return register name for RID.
533local function regname_(r)
534 return map_gpr[r]
535end
532 536
533-- Public module functions. 537-- Public module functions.
534module(...) 538module(...)
535 539
536create = create_ 540create = create_
537disass = disass_ 541disass = disass_
542regname = regname_
538 543
diff --git a/lib/dis_x64.lua b/lib/dis_x64.lua
index d69113b7..6ba49143 100644
--- a/lib/dis_x64.lua
+++ b/lib/dis_x64.lua
@@ -16,4 +16,5 @@ local dis_x86 = require(_PACKAGE.."dis_x86")
16 16
17create = dis_x86.create64 17create = dis_x86.create64
18disass = dis_x86.disass64 18disass = dis_x86.disass64
19regname = dis_x86.regname64
19 20
diff --git a/lib/dis_x86.lua b/lib/dis_x86.lua
index eb447eb0..f489a861 100644
--- a/lib/dis_x86.lua
+++ b/lib/dis_x86.lua
@@ -813,6 +813,16 @@ local function disass64_(code, addr, out)
813 create64_(code, addr, out):disass() 813 create64_(code, addr, out):disass()
814end 814end
815 815
816-- Return register name for RID.
817local function regname_(r)
818 if r < 8 then return map_regs.D[r+1] end
819 return map_regs.X[r-7]
820end
821
822local function regname64_(r)
823 if r < 16 then return map_regs.Q[r+1] end
824 return map_regs.X[r-15]
825end
816 826
817-- Public module functions. 827-- Public module functions.
818module(...) 828module(...)
@@ -821,4 +831,6 @@ create = create_
821create64 = create64_ 831create64 = create64_
822disass = disass_ 832disass = disass_
823disass64 = disass64_ 833disass64 = disass64_
834regname = regname_
835regname64 = regname64_
824 836
diff --git a/lib/dump.lua b/lib/dump.lua
index a6b61f53..b049828f 100644
--- a/lib/dump.lua
+++ b/lib/dump.lua
@@ -69,7 +69,7 @@ local type, tostring = type, tostring
69local stdout, stderr = io.stdout, io.stderr 69local stdout, stderr = io.stdout, io.stderr
70 70
71-- Load other modules on-demand. 71-- Load other modules on-demand.
72local bcline, discreate 72local bcline, disass
73 73
74-- Active flag, output file handle and dump mode. 74-- Active flag, output file handle and dump mode.
75local active, out, dumpmode 75local active, out, dumpmode
@@ -87,7 +87,11 @@ local function fillsymtab(nexit)
87 for i=0,#ircall do t[ircalladdr(i)] = ircall[i] end 87 for i=0,#ircall do t[ircalladdr(i)] = ircall[i] end
88 end 88 end
89 if nexit > nexitsym then 89 if nexit > nexitsym then
90 for i=nexitsym,nexit-1 do t[traceexitstub(i)] = tostring(i) end 90 for i=nexitsym,nexit-1 do
91 local addr = traceexitstub(i)
92 if addr == nil then nexit = 1000000; break end
93 t[addr] = tostring(i)
94 end
91 nexitsym = nexit 95 nexitsym = nexit
92 end 96 end
93 return t 97 return t
@@ -103,11 +107,9 @@ local function dump_mcode(tr)
103 if not info then return end 107 if not info then return end
104 local mcode, addr, loop = tracemc(tr) 108 local mcode, addr, loop = tracemc(tr)
105 if not mcode then return end 109 if not mcode then return end
106 if not discreate then 110 if not disass then disass = require("jit.dis_"..jit.arch) end
107 discreate = require("jit.dis_"..jit.arch).create
108 end
109 out:write("---- TRACE ", tr, " mcode ", #mcode, "\n") 111 out:write("---- TRACE ", tr, " mcode ", #mcode, "\n")
110 local ctx = discreate(mcode, addr, dumpwrite) 112 local ctx = disass.create(mcode, addr, dumpwrite)
111 ctx.hexdump = 0 113 ctx.hexdump = 0
112 ctx.symtab = fillsymtab(info.nexit) 114 ctx.symtab = fillsymtab(info.nexit)
113 if loop ~= 0 then 115 if loop ~= 0 then
@@ -346,25 +348,12 @@ local function dump_snap(tr)
346 end 348 end
347end 349end
348 350
349-- NYI: should really get the register map from the disassembler.
350local reg_map = ({
351 x86 = {
352 [0] = "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
353 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
354 },
355 x64 = {
356 [0] = "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
357 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
358 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
359 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
360 }
361})[jit.arch]
362
363-- Return a register name or stack slot for a rid/sp location. 351-- Return a register name or stack slot for a rid/sp location.
364local function ridsp_name(ridsp) 352local function ridsp_name(ridsp)
353 if not disass then disass = require("jit.dis_"..jit.arch) end
365 local rid = band(ridsp, 0xff) 354 local rid = band(ridsp, 0xff)
366 if ridsp > 255 then return format("[%x]", shr(ridsp, 8)*4) end 355 if ridsp > 255 then return format("[%x]", shr(ridsp, 8)*4) end
367 if rid < 128 then return reg_map[rid] end 356 if rid < 128 then return disass.regname(rid) end
368 return "" 357 return ""
369end 358end
370 359