Skip to content

Commit 856db87

Browse files
st0012k0kubunXrXr
authored
ZJIT: Add patchpoint for TracePoint (ruby#14420)
ZJIT: Add patchpoint for TracePoint activation Co-authored-by: Takashi Kokubun <[email protected]> Co-authored-by: Alan Wu <[email protected]>
1 parent aff3e5a commit 856db87

File tree

6 files changed

+1028
-926
lines changed

6 files changed

+1028
-926
lines changed

test/ruby/test_zjit.rb

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2256,6 +2256,52 @@ def foo = 1
22562256
}
22572257
end
22582258

2259+
def test_line_tracepoint_on_c_method
2260+
assert_compiles '"[[:line, true]]"', %q{
2261+
events = []
2262+
events.instance_variable_set(
2263+
:@tp,
2264+
TracePoint.new(:line) { |tp| events << [tp.event, tp.lineno] if tp.path == __FILE__ }
2265+
)
2266+
def events.to_str
2267+
@tp.enable; ''
2268+
end
2269+
2270+
# Stay in generated code while enabling tracing
2271+
def events.compiled(obj)
2272+
String(obj)
2273+
@tp.disable; __LINE__
2274+
end
2275+
2276+
line = events.compiled(events)
2277+
events[0][-1] = (events[0][-1] == line)
2278+
2279+
events.to_s # can't dump events as it's a singleton object AND it has a TracePoint instance variable, which also can't be dumped
2280+
}
2281+
end
2282+
2283+
def test_targeted_line_tracepoint_in_c_method_call
2284+
assert_compiles '"[true]"', %q{
2285+
events = []
2286+
events.instance_variable_set(:@tp, TracePoint.new(:line) { |tp| events << tp.lineno })
2287+
def events.to_str
2288+
@tp.enable(target: method(:compiled))
2289+
''
2290+
end
2291+
2292+
# Stay in generated code while enabling tracing
2293+
def events.compiled(obj)
2294+
String(obj)
2295+
__LINE__
2296+
end
2297+
2298+
line = events.compiled(events)
2299+
events[0] = (events[0] == line)
2300+
2301+
events.to_s # can't dump events as it's a singleton object AND it has a TracePoint instance variable, which also can't be dumped
2302+
}
2303+
end
2304+
22592305
def test_opt_case_dispatch
22602306
assert_compiles '[true, false]', %q{
22612307
def test(x)

zjit/bindgen/src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,7 @@ fn main() {
330330
.allowlist_type("vm_check_match_type")
331331
.allowlist_type("vm_opt_newarray_send_type")
332332
.allowlist_type("rb_iseq_type")
333+
.allowlist_type("rb_event_flag_t")
333334

334335
// From zjit.c
335336
.allowlist_function("rb_object_shape_count")

zjit/src/codegen.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use std::slice;
99

1010
use crate::asm::Label;
1111
use crate::backend::current::{Reg, ALLOC_REGS};
12-
use crate::invariants::{track_bop_assumption, track_cme_assumption, track_single_ractor_assumption, track_stable_constant_names_assumption};
12+
use crate::invariants::{track_bop_assumption, track_cme_assumption, track_single_ractor_assumption, track_stable_constant_names_assumption, track_no_trace_point_assumption};
1313
use crate::gc::{append_gc_offsets, get_or_create_iseq_payload, get_or_create_iseq_payload_ptr, IseqPayload, IseqStatus};
1414
use crate::state::ZJITState;
1515
use crate::stats::{exit_counter_for_compile_error, incr_counter, incr_counter_by, CompileError};
@@ -593,6 +593,10 @@ fn gen_patch_point(jit: &mut JITState, asm: &mut Assembler, invariant: &Invarian
593593
let side_exit_ptr = cb.resolve_label(label);
594594
track_stable_constant_names_assumption(idlist, code_ptr, side_exit_ptr, payload_ptr);
595595
}
596+
Invariant::NoTracePoint => {
597+
let side_exit_ptr = cb.resolve_label(label);
598+
track_no_trace_point_assumption(code_ptr, side_exit_ptr, payload_ptr);
599+
}
596600
Invariant::SingleRactorMode => {
597601
let side_exit_ptr = cb.resolve_label(label);
598602
track_single_ractor_assumption(code_ptr, side_exit_ptr, payload_ptr);

zjit/src/cruby_bindings.inc.rs

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)