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