summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2020-03-12 22:21:31 -0700
committerTakashi Kokubun <takashikkbn@gmail.com>2020-03-12 22:21:32 -0700
commit8562bfd1501a69aa736ba4f699a77940b2cdd9b1 (patch)
tree2846ba5722ce184e20bdcbbb4f986ff76ddd68f6
parenta90117c8c90134994bac3146d282a6f73dd17416 (diff)
Move code to mark jit_unit's cc_entries to mjit.c
-rw-r--r--iseq.c12
-rw-r--r--mjit.c18
-rw-r--r--mjit.h2
3 files changed, 17 insertions, 15 deletions
diff --git a/iseq.c b/iseq.c
index d32a0929c6..e1c18e7a8a 100644
--- a/iseq.c
+++ b/iseq.c
@@ -359,17 +359,7 @@ rb_iseq_mark(const rb_iseq_t *iseq)
}
#if USE_MJIT
- const struct rb_callcache **cc_entries;
- if (body->jit_unit && (cc_entries = mjit_iseq_cc_entries(body)) != NULL) {
- for (unsigned int i=0; i<body->ci_size; i++) {
- const struct rb_callcache *cc = cc_entries[i];
- if (cc != NULL) {
- // Pin `cc` and `cc->cme` against GC.compact as their addresses may be written in JIT-ed code.
- rb_gc_mark((VALUE)cc);
- rb_gc_mark((VALUE)vm_cc_cme(cc));
- }
- }
- }
+ mjit_mark_cc_entries(body);
#endif
}
diff --git a/mjit.c b/mjit.c
index 514d04f085..02a74a6152 100644
--- a/mjit.c
+++ b/mjit.c
@@ -980,6 +980,7 @@ mjit_finish(bool close_handle_p)
verbose(1, "Successful MJIT finish");
}
+// Called by rb_vm_mark() to mark iseq being JIT-ed and iseqs in the unit queue.
void
mjit_mark(void)
{
@@ -1014,10 +1015,21 @@ mjit_mark(void)
RUBY_MARK_LEAVE("mjit");
}
-const struct rb_callcache **
-mjit_iseq_cc_entries(const struct rb_iseq_constant_body *const body)
+// Called by rb_iseq_mark() to mark cc_entries captured for MJIT
+void
+mjit_mark_cc_entries(const struct rb_iseq_constant_body *const body)
{
- return body->jit_unit->cc_entries;
+ const struct rb_callcache **cc_entries;
+ if (body->jit_unit && (cc_entries = body->jit_unit->cc_entries) != NULL) {
+ for (unsigned int i = 0; i < body->ci_size; i++) {
+ const struct rb_callcache *cc = cc_entries[i];
+ if (cc != NULL) {
+ // Pin `cc` and `cc->cme` against GC.compact as their addresses may be written in JIT-ed code.
+ rb_gc_mark((VALUE)cc);
+ rb_gc_mark((VALUE)vm_cc_cme(cc));
+ }
+ }
+ }
}
// A hook to update valid_class_serials.
diff --git a/mjit.h b/mjit.h
index 9a6af2f4af..dac0bcfc39 100644
--- a/mjit.h
+++ b/mjit.h
@@ -93,7 +93,7 @@ extern struct mjit_cont *mjit_cont_new(rb_execution_context_t *ec);
extern void mjit_cont_free(struct mjit_cont *cont);
extern void mjit_add_class_serial(rb_serial_t class_serial);
extern void mjit_remove_class_serial(rb_serial_t class_serial);
-const struct rb_callcache ** mjit_iseq_cc_entries(const struct rb_iseq_constant_body *const body);
+extern void mjit_mark_cc_entries(const struct rb_iseq_constant_body *const body);
// A threshold used to reject long iseqs from JITting as such iseqs
// takes too much time to be compiled.