diff --git a/lib/dump.lua b/lib/dump.lua index a00862d0..b0a334e6 100644 --- a/lib/dump.lua +++ b/lib/dump.lua @@ -59,8 +59,8 @@ local jutil = require("jit.util") local vmdef = require("jit.vmdef") local funcinfo, funcbc = jutil.funcinfo, jutil.funcbc local traceinfo, traceir, tracek = jutil.traceinfo, jutil.traceir, jutil.tracek -local tracemc, traceexitstub = jutil.tracemc, jutil.traceexitstub -local tracesnap = jutil.tracesnap +local tracemc, tracesnap = jutil.tracemc, jutil.tracesnap +local traceexitstub, ircalladdr = jutil.traceexitstub, jutil.ircalladdr local bit = require("bit") local band, shl, shr = bit.band, bit.lshift, bit.rshift local sub, gsub, format = string.sub, string.gsub, string.format @@ -82,6 +82,10 @@ local nexitsym = 0 -- Fill symbol table with trace exit addresses. local function fillsymtab(nexit) local t = symtab + if nexitsym == 0 then + local ircall = vmdef.ircall + for i=0,#ircall do t[ircalladdr(i)] = ircall[i] end + end if nexit > nexitsym then for i=nexitsym,nexit-1 do t[traceexitstub(i)] = tostring(i) end nexitsym = nexit diff --git a/src/lib_jit.c b/src/lib_jit.c index bfceab62..57b50749 100644 --- a/src/lib_jit.c +++ b/src/lib_jit.c @@ -370,7 +370,18 @@ LJLIB_CF(jit_util_traceexitstub) ExitNo exitno = (ExitNo)lj_lib_checkint(L, 1); jit_State *J = L2J(L); if (exitno < EXITSTUBS_PER_GROUP*LJ_MAX_EXITSTUBGR) { - setnumV(L->top-1, cast_num((intptr_t)exitstub_addr(J, exitno))); + setnumV(L->top-1, cast_num((uintptr_t)exitstub_addr(J, exitno))); + return 1; + } + return 0; +} + +/* local addr = jit.util.ircalladdr(idx) */ +LJLIB_CF(jit_util_ircalladdr) +{ + uint32_t idx = (uint32_t)lj_lib_checkint(L, 1); + if (idx < IRCALL__MAX) { + setnumV(L->top-1, cast_num((uintptr_t)(void *)lj_ir_callinfo[idx].func)); return 1; } return 0; @@ -389,6 +400,7 @@ static int trace_nojit(lua_State *L) #define lj_cf_jit_util_tracesnap trace_nojit #define lj_cf_jit_util_tracemc trace_nojit #define lj_cf_jit_util_traceexitstub trace_nojit +#define lj_cf_jit_util_ircalladdr trace_nojit #endif