diff options
author | Takashi Kokubun <[email protected]> | 2020-03-12 22:21:31 -0700 |
---|---|---|
committer | Takashi Kokubun <[email protected]> | 2020-03-12 22:21:32 -0700 |
commit | 8562bfd1501a69aa736ba4f699a77940b2cdd9b1 (patch) | |
tree | 2846ba5722ce184e20bdcbbb4f986ff76ddd68f6 | |
parent | a90117c8c90134994bac3146d282a6f73dd17416 (diff) |
Move code to mark jit_unit's cc_entries to mjit.c
-rw-r--r-- | iseq.c | 12 | ||||
-rw-r--r-- | mjit.c | 18 | ||||
-rw-r--r-- | mjit.h | 2 |
3 files changed, 17 insertions, 15 deletions
@@ -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 } @@ -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. @@ -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. |