diff options
author | Takashi Kokubun <[email protected]> | 2023-02-10 21:06:02 -0800 |
---|---|---|
committer | Takashi Kokubun <[email protected]> | 2023-03-05 22:41:35 -0800 |
commit | 9e42f315741b8e1be38540ea3d115ef0fc72cd51 (patch) | |
tree | 3b3d457c4aa337412b59b3472de1af51f967e3b3 /mjit.c | |
parent | 20e55be47ccf1ba89d6ca061f45625f1bd8e8578 (diff) |
Do not compile C calls when C tracing is enabled
Diffstat (limited to 'mjit.c')
-rw-r--r-- | mjit.c | 19 |
1 files changed, 11 insertions, 8 deletions
@@ -300,6 +300,9 @@ mjit_compile(FILE *f, const rb_iseq_t *iseq, const char *funcname, int id) // JIT buffer uint8_t *rb_mjit_mem_block = NULL; +// `rb_ec_ractor_hooks(ec)->events` is moved to this variable during compilation. +rb_event_flag_t rb_mjit_global_events = 0; + // Basically mjit_opts.stats, but this becomes false during MJIT compilation. static bool mjit_stats_p = false; @@ -316,17 +319,17 @@ rb_mjit_collect_vm_usage_insn(int insn) #endif // YJIT_STATS -#define WITH_MJIT_DISABLED(stmt) do { \ +#define WITH_MJIT_ISOLATED(stmt) do { \ rb_hook_list_t *global_hooks = rb_ec_ractor_hooks(GET_EC()); \ - rb_event_flag_t original_events = global_hooks->events; \ - bool original_call_p = mjit_call_p; \ + rb_mjit_global_events = global_hooks->events; \ global_hooks->events = 0; \ + bool original_call_p = mjit_call_p; \ mjit_stats_p = false; \ mjit_call_p = false; \ stmt; \ mjit_call_p = (mjit_cancel_p ? false : original_call_p); \ mjit_stats_p = mjit_opts.stats; \ - global_hooks->events = original_events; \ + global_hooks->events = rb_mjit_global_events; \ } while (0); void @@ -341,7 +344,7 @@ mjit_cme_invalidate(void *data) { if (!mjit_enabled || !mjit_call_p || !rb_mMJITHooks) return; rb_callable_method_entry_t *cme = (rb_callable_method_entry_t *)data; - WITH_MJIT_DISABLED({ + WITH_MJIT_ISOLATED({ VALUE cme_klass = rb_funcall(rb_mMJITC, rb_intern("rb_callable_method_entry_struct"), 0); VALUE cme_ptr = rb_funcall(cme_klass, rb_intern("new"), 1, SIZET2NUM((size_t)cme)); rb_funcall(rb_mMJITHooks, rb_intern("on_cme_invalidate"), 1, cme_ptr); @@ -368,7 +371,7 @@ void rb_mjit_tracing_invalidate_all(rb_event_flag_t new_iseq_events) { if (!mjit_call_p) return; - WITH_MJIT_DISABLED({ + WITH_MJIT_ISOLATED({ rb_funcall(rb_mMJITHooks, rb_intern("on_tracing_invalidate_all"), 1, UINT2NUM(new_iseq_events)); }); } @@ -386,7 +389,7 @@ rb_mjit_compile(const rb_iseq_t *iseq) RB_VM_LOCK_ENTER(); rb_vm_barrier(); - WITH_MJIT_DISABLED({ + WITH_MJIT_ISOLATED({ VALUE iseq_ptr = rb_funcall(rb_cMJITIseqPtr, rb_intern("new"), 1, SIZET2NUM((size_t)iseq)); VALUE cfp_ptr = rb_funcall(rb_cMJITCfpPtr, rb_intern("new"), 1, SIZET2NUM((size_t)GET_EC()->cfp)); rb_funcall(rb_MJITCompiler, rb_intern("compile"), 2, iseq_ptr, cfp_ptr); @@ -406,7 +409,7 @@ rb_mjit_branch_stub_hit(VALUE branch_stub, int sp_offset, int target0_p) rb_control_frame_t *cfp = GET_EC()->cfp; cfp->sp += sp_offset; // preserve stack values, also using the actual sp_offset to make jit.peek_at_stack work - WITH_MJIT_DISABLED({ + WITH_MJIT_ISOLATED({ VALUE cfp_ptr = rb_funcall(rb_cMJITCfpPtr, rb_intern("new"), 1, SIZET2NUM((size_t)cfp)); result = rb_funcall(rb_MJITCompiler, rb_intern("branch_stub_hit"), 3, branch_stub, cfp_ptr, RBOOL(target0_p)); }); |