Sergey,
thanks for the patch! Please see my comments below.
Now information about the abort of the trace is saved in the `abort_reason` field of the corresponding structure. The `jit.parse.finish()` returns now the second table containing aborted traces. Each table key is a trace number containing an array of potentially traces with this number, which was aborted. Needed for tarantool/tarantool#9924 --- .../unit-jit-parse-abort.test.lua | 38 +++++++++++++++++++ test/tarantool-tests/utils/jit/parse.lua | 22 ++++++++--- 2 files changed, 55 insertions(+), 5 deletions(-) create mode 100644 test/tarantool-tests/unit-jit-parse-abort.test.lua diff --git a/test/tarantool-tests/unit-jit-parse-abort.test.lua b/test/tarantool-tests/unit-jit-parse-abort.test.lua new file mode 100644 index 00000000..91af5a56 --- /dev/null +++ b/test/tarantool-tests/unit-jit-parse-abort.test.lua @@ -0,0 +1,38 @@ +local tap = require('tap') +local test = tap.test('unit-jit-parse'):skipcond({
Usually a name passed to `tap.test` matches to test file name,
but here it is not matched.
+ ['Test requires JIT enabled'] = not jit.status(), + ['Disabled on *BSD due to #4819'] = jit.os == 'BSD', +}) + +local jparse = require('utils').jit.parse + +-- XXX: Avoid other traces compilation due to hotcount collisions +-- for predictable results. +jit.off() +jit.flush() + +test:plan(1) + +jit.on() +-- We only need the abort reason in the test. +jparse.start('t')
I would add a comment with explanation what does 't' flag mean.
Feel free to ignore.
+ +-- XXX: A trace always has at least 3 IR constants: for `nil`, +-- `false`, and `true`. Always fails to record with the set +-- `maxirconst` limit. +jit.opt.start('hotloop=1', 'maxirconst=1') + +for _ = 1, 3 do end + +local _, aborted_traces = jparse.finish() + +jit.off() + +assert(aborted_traces and aborted_traces[1], 'aborted trace is persisted') + +-- We tried to compile only one trace. +local reason = aborted_traces[1][1].abort_reason + +test:like(reason, 'trace too long', 'abort reason is correct') + +test:done(true) diff --git a/test/tarantool-tests/utils/jit/parse.lua b/test/tarantool-tests/utils/jit/parse.lua index bcef5b35..0ce7f7c8 100644 --- a/test/tarantool-tests/utils/jit/parse.lua +++ b/test/tarantool-tests/utils/jit/parse.lua @@ -22,6 +22,7 @@ local function trace_new(n) parent = nil, parent_exitno = nil, is_stitched = false, + abort_reason = nil, start_loc = nil, bc = {}, ir = {}, @@ -87,9 +88,17 @@ local header_handlers = { ctx.parsing_trace = nil ctx.parsing = nil end, - abort = function(ctx, trace_num) + abort = function(ctx, trace_num, line) local traces = ctx.traces assert(ctx.parsing_trace == trace_num) + + local aborted_traces = ctx.aborted_traces + if not aborted_traces[trace_num] then + aborted_traces[trace_num] = {} + end + traces[trace_num].abort_reason = line:match('-- (.+)$') + table.insert(aborted_traces[trace_num], traces[trace_num]) + ctx.parsing_trace = nil ctx.parsing = nil traces[trace_num] = nil @@ -137,11 +146,14 @@ end local JDUMP_FILE local function parse_jit_dump() - local ctx = {traces = {}} + local ctx = { + aborted_traces = {}, + traces = {}, + } for line in io.lines(JDUMP_FILE) do parse_line(ctx, line) end - return ctx.traces + return ctx.traces, ctx.aborted_traces end -- Start `jit.dump()` utility with the given flags, saving the @@ -167,10 +179,10 @@ M.finish = function() -- Enable traces compilation for `jit.dump` back. jit.on(jdump.on, true) jit.on(jdump.off, true) - local traces = parse_jit_dump() + local traces, aborted_traces = parse_jit_dump() os.remove(JDUMP_FILE) JDUMP_FILE = nil - return traces + return traces, aborted_traces end -- Turn off compilation for the module to avoid side effects.