mjit.c: use NOT_COMPILED_JIT_ISEQ_FUNC for unloaded
units, renaming it from NOT_COMPILABLE_JIT_ISEQ_FUNC. NOT_READY_JIT_ISEQ_FUNC is for ones being compiled, so mjit_get_iseq_func treats it specially and it shouldn't be used for the purpose. I renamed it instead of adding a new one because I'm not sure about the impact for the performance by increasing the switch branches in mjit_exec. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64076 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
0d753d4f29
commit
e09bf11f6e
16
mjit.c
16
mjit.c
@ -540,13 +540,13 @@ clean_so_file(struct rb_mjit_unit *unit)
|
|||||||
2) The unit is not called often and unloaded by `unload_units()`.
|
2) The unit is not called often and unloaded by `unload_units()`.
|
||||||
|
|
||||||
`jit_func` state for 1 can be ignored because ISeq GC means it'll never be used.
|
`jit_func` state for 1 can be ignored because ISeq GC means it'll never be used.
|
||||||
For the situation 2, this sets the ISeq's JIT state to NOT_READY_JIT_ISEQ_FUNC
|
For the situation 2, this sets the ISeq's JIT state to NOT_COMPILED_JIT_ISEQ_FUNC
|
||||||
to prevent the situation that the same methods are continously compiled. */
|
to prevent the situation that the same methods are continously compiled. */
|
||||||
static void
|
static void
|
||||||
free_unit(struct rb_mjit_unit *unit)
|
free_unit(struct rb_mjit_unit *unit)
|
||||||
{
|
{
|
||||||
if (unit->iseq) /* ISeq is not GCed */
|
if (unit->iseq) /* ISeq is not GCed */
|
||||||
unit->iseq->body->jit_func = (mjit_func_t)NOT_READY_JIT_ISEQ_FUNC;
|
unit->iseq->body->jit_func = (mjit_func_t)NOT_COMPILED_JIT_ISEQ_FUNC;
|
||||||
if (unit->handle) /* handle is NULL if it's in queue */
|
if (unit->handle) /* handle is NULL if it's in queue */
|
||||||
dlclose(unit->handle);
|
dlclose(unit->handle);
|
||||||
clean_so_file(unit);
|
clean_so_file(unit);
|
||||||
@ -907,7 +907,7 @@ remove_file(const char *filename)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Compile ISeq in UNIT and return function pointer of JIT-ed code.
|
/* Compile ISeq in UNIT and return function pointer of JIT-ed code.
|
||||||
It may return NOT_COMPILABLE_JIT_ISEQ_FUNC if something went wrong. */
|
It may return NOT_COMPILED_JIT_ISEQ_FUNC if something went wrong. */
|
||||||
static mjit_func_t
|
static mjit_func_t
|
||||||
convert_unit_to_func(struct rb_mjit_unit *unit)
|
convert_unit_to_func(struct rb_mjit_unit *unit)
|
||||||
{
|
{
|
||||||
@ -954,7 +954,7 @@ convert_unit_to_func(struct rb_mjit_unit *unit)
|
|||||||
int e = errno;
|
int e = errno;
|
||||||
if (fd >= 0) (void)close(fd);
|
if (fd >= 0) (void)close(fd);
|
||||||
verbose(1, "Failed to fopen '%s', giving up JIT for it (%s)", c_file, strerror(e));
|
verbose(1, "Failed to fopen '%s', giving up JIT for it (%s)", c_file, strerror(e));
|
||||||
return (mjit_func_t)NOT_COMPILABLE_JIT_ISEQ_FUNC;
|
return (mjit_func_t)NOT_COMPILED_JIT_ISEQ_FUNC;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __clang__
|
#ifdef __clang__
|
||||||
@ -1017,7 +1017,7 @@ convert_unit_to_func(struct rb_mjit_unit *unit)
|
|||||||
if (!mjit_opts.save_temps)
|
if (!mjit_opts.save_temps)
|
||||||
remove_file(c_file);
|
remove_file(c_file);
|
||||||
print_jit_result("failure", unit, 0, c_file);
|
print_jit_result("failure", unit, 0, c_file);
|
||||||
return (mjit_func_t)NOT_COMPILABLE_JIT_ISEQ_FUNC;
|
return (mjit_func_t)NOT_COMPILED_JIT_ISEQ_FUNC;
|
||||||
}
|
}
|
||||||
|
|
||||||
start_time = real_ms_time();
|
start_time = real_ms_time();
|
||||||
@ -1036,7 +1036,7 @@ convert_unit_to_func(struct rb_mjit_unit *unit)
|
|||||||
remove_file(c_file);
|
remove_file(c_file);
|
||||||
if (!success) {
|
if (!success) {
|
||||||
verbose(2, "Failed to generate so: %s", so_file);
|
verbose(2, "Failed to generate so: %s", so_file);
|
||||||
return (mjit_func_t)NOT_COMPILABLE_JIT_ISEQ_FUNC;
|
return (mjit_func_t)NOT_COMPILED_JIT_ISEQ_FUNC;
|
||||||
}
|
}
|
||||||
|
|
||||||
func = load_func_from_so(so_file, funcname, unit);
|
func = load_func_from_so(so_file, funcname, unit);
|
||||||
@ -1309,7 +1309,7 @@ mjit_add_iseq_to_process(const rb_iseq_t *iseq)
|
|||||||
#define MJIT_WAIT_TIMEOUT_SECONDS 60
|
#define MJIT_WAIT_TIMEOUT_SECONDS 60
|
||||||
|
|
||||||
/* Wait for JIT compilation finish for --jit-wait. This should only return a function pointer
|
/* Wait for JIT compilation finish for --jit-wait. This should only return a function pointer
|
||||||
or NOT_COMPILABLE_JIT_ISEQ_FUNC. */
|
or NOT_COMPILED_JIT_ISEQ_FUNC. */
|
||||||
mjit_func_t
|
mjit_func_t
|
||||||
mjit_get_iseq_func(struct rb_iseq_constant_body *body)
|
mjit_get_iseq_func(struct rb_iseq_constant_body *body)
|
||||||
{
|
{
|
||||||
@ -1321,7 +1321,7 @@ mjit_get_iseq_func(struct rb_iseq_constant_body *body)
|
|||||||
tries++;
|
tries++;
|
||||||
if (tries / 1000 > MJIT_WAIT_TIMEOUT_SECONDS || pch_status == PCH_FAILED) {
|
if (tries / 1000 > MJIT_WAIT_TIMEOUT_SECONDS || pch_status == PCH_FAILED) {
|
||||||
CRITICAL_SECTION_START(3, "in mjit_get_iseq_func to set jit_func");
|
CRITICAL_SECTION_START(3, "in mjit_get_iseq_func to set jit_func");
|
||||||
body->jit_func = (mjit_func_t)NOT_COMPILABLE_JIT_ISEQ_FUNC; /* JIT worker seems dead. Give up. */
|
body->jit_func = (mjit_func_t)NOT_COMPILED_JIT_ISEQ_FUNC; /* JIT worker seems dead. Give up. */
|
||||||
CRITICAL_SECTION_FINISH(3, "in mjit_get_iseq_func to set jit_func");
|
CRITICAL_SECTION_FINISH(3, "in mjit_get_iseq_func to set jit_func");
|
||||||
if (mjit_opts.warnings || mjit_opts.verbose)
|
if (mjit_opts.warnings || mjit_opts.verbose)
|
||||||
fprintf(stderr, "MJIT warning: timed out to wait for JIT finish\n");
|
fprintf(stderr, "MJIT warning: timed out to wait for JIT finish\n");
|
||||||
|
7
mjit.h
7
mjit.h
@ -19,8 +19,9 @@ enum rb_mjit_iseq_func {
|
|||||||
/* ISEQ is already queued for the machine code generation but the
|
/* ISEQ is already queued for the machine code generation but the
|
||||||
code is not ready yet for the execution */
|
code is not ready yet for the execution */
|
||||||
NOT_READY_JIT_ISEQ_FUNC = 1,
|
NOT_READY_JIT_ISEQ_FUNC = 1,
|
||||||
/* ISEQ included not compilable insn or some assertion failed */
|
/* ISEQ included not compilable insn, some internal assertion failed
|
||||||
NOT_COMPILABLE_JIT_ISEQ_FUNC = 2,
|
or the unit is unloaded */
|
||||||
|
NOT_COMPILED_JIT_ISEQ_FUNC = 2,
|
||||||
/* End mark */
|
/* End mark */
|
||||||
LAST_JIT_ISEQ_FUNC = 3
|
LAST_JIT_ISEQ_FUNC = 3
|
||||||
};
|
};
|
||||||
@ -116,7 +117,7 @@ mjit_exec(rb_execution_context_t *ec)
|
|||||||
}
|
}
|
||||||
return Qundef;
|
return Qundef;
|
||||||
case NOT_READY_JIT_ISEQ_FUNC:
|
case NOT_READY_JIT_ISEQ_FUNC:
|
||||||
case NOT_COMPILABLE_JIT_ISEQ_FUNC:
|
case NOT_COMPILED_JIT_ISEQ_FUNC:
|
||||||
return Qundef;
|
return Qundef;
|
||||||
default: /* to avoid warning with LAST_JIT_ISEQ_FUNC */
|
default: /* to avoid warning with LAST_JIT_ISEQ_FUNC */
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user