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 | ||
