diff options
-rw-r--r-- | lib/dis_arm.lua | 5 | ||||
-rw-r--r-- | lib/dis_x64.lua | 1 | ||||
-rw-r--r-- | lib/dis_x86.lua | 12 | ||||
-rw-r--r-- | lib/dump.lua | 31 |
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() |
530 | end | 530 | end |
531 | 531 | ||
532 | -- Return register name for RID. | ||
533 | local function regname_(r) | ||
534 | return map_gpr[r] | ||
535 | end | ||
532 | 536 | ||
533 | -- Public module functions. | 537 | -- Public module functions. |
534 | module(...) | 538 | module(...) |
535 | 539 | ||
536 | create = create_ | 540 | create = create_ |
537 | disass = disass_ | 541 | disass = disass_ |
542 | regname = 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 | ||
17 | create = dis_x86.create64 | 17 | create = dis_x86.create64 |
18 | disass = dis_x86.disass64 | 18 | disass = dis_x86.disass64 |
19 | regname = 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() |
814 | end | 814 | end |
815 | 815 | ||
816 | -- Return register name for RID. | ||
817 | local function regname_(r) | ||
818 | if r < 8 then return map_regs.D[r+1] end | ||
819 | return map_regs.X[r-7] | ||
820 | end | ||
821 | |||
822 | local function regname64_(r) | ||
823 | if r < 16 then return map_regs.Q[r+1] end | ||
824 | return map_regs.X[r-15] | ||
825 | end | ||
816 | 826 | ||
817 | -- Public module functions. | 827 | -- Public module functions. |
818 | module(...) | 828 | module(...) |
@@ -821,4 +831,6 @@ create = create_ | |||
821 | create64 = create64_ | 831 | create64 = create64_ |
822 | disass = disass_ | 832 | disass = disass_ |
823 | disass64 = disass64_ | 833 | disass64 = disass64_ |
834 | regname = regname_ | ||
835 | regname64 = 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 | |||
69 | local stdout, stderr = io.stdout, io.stderr | 69 | local stdout, stderr = io.stdout, io.stderr |
70 | 70 | ||
71 | -- Load other modules on-demand. | 71 | -- Load other modules on-demand. |
72 | local bcline, discreate | 72 | local bcline, disass |
73 | 73 | ||
74 | -- Active flag, output file handle and dump mode. | 74 | -- Active flag, output file handle and dump mode. |
75 | local active, out, dumpmode | 75 | local 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 |
347 | end | 349 | end |
348 | 350 | ||
349 | -- NYI: should really get the register map from the disassembler. | ||
350 | local 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. |
364 | local function ridsp_name(ridsp) | 352 | local 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 "" |
369 | end | 358 | end |
370 | 359 | ||