ruby-changes:60378
From: Takashi <ko1@a...>
Date: Fri, 13 Mar 2020 14:25:01 +0900 (JST)
Subject: [ruby-changes:60378] 8562bfd150 (master): Move code to mark jit_unit's cc_entries to mjit.c
https://git.ruby-lang.org/ruby.git/commit/?id=8562bfd150 From 8562bfd1501a69aa736ba4f699a77940b2cdd9b1 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun <takashikkbn@g...> Date: Thu, 12 Mar 2020 22:21:31 -0700 Subject: Move code to mark jit_unit's cc_entries to mjit.c diff --git a/iseq.c b/iseq.c index d32a092..e1c18e7 100644 --- a/iseq.c +++ b/iseq.c @@ -359,17 +359,7 @@ rb_iseq_mark(const rb_iseq_t *iseq) https://github.com/ruby/ruby/blob/trunk/iseq.c#L359 } #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 514d04f..02a74a6 100644 --- a/mjit.c +++ b/mjit.c @@ -980,6 +980,7 @@ mjit_finish(bool close_handle_p) https://github.com/ruby/ruby/blob/trunk/mjit.c#L980 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) https://github.com/ruby/ruby/blob/trunk/mjit.c#L1015 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 9a6af2f..dac0bcf 100644 --- a/mjit.h +++ b/mjit.h @@ -93,7 +93,7 @@ extern struct mjit_cont *mjit_cont_new(rb_execution_context_t *ec); https://github.com/ruby/ruby/blob/trunk/mjit.h#L93 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. -- cgit v0.10.2 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/