summaryrefslogtreecommitdiff
path: root/mjit.c
diff options
context:
space:
mode:
authorTakashi Kokubun <[email protected]>2023-02-10 21:06:02 -0800
committerTakashi Kokubun <[email protected]>2023-03-05 22:41:35 -0800
commit9e42f315741b8e1be38540ea3d115ef0fc72cd51 (patch)
tree3b3d457c4aa337412b59b3472de1af51f967e3b3 /mjit.c
parent20e55be47ccf1ba89d6ca061f45625f1bd8e8578 (diff)
Do not compile C calls when C tracing is enabled
Diffstat (limited to 'mjit.c')
-rw-r--r--mjit.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/mjit.c b/mjit.c
index fcb0e4f7bb..c3d04a9d39 100644
--- a/mjit.c
+++ b/mjit.c
@@ -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));
});