This refactoring is needed for implementing inlining later.
I've had this since long ago and it has conflicted sometimes. So let me
just commit this now.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67566 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
k0kubun 2019-04-15 14:38:57 +00:00
Родитель 246723a34c
Коммит e68495e5f4
1 изменённых файлов: 21 добавлений и 14 удалений

Просмотреть файл

@ -215,9 +215,8 @@ compile_cancel_handler(FILE *f, const struct rb_iseq_constant_body *body, struct
extern bool mjit_copy_cache_from_main_thread(const rb_iseq_t *iseq, struct rb_call_cache *cc_entries, union iseq_inline_storage_entry *is_entries); extern bool mjit_copy_cache_from_main_thread(const rb_iseq_t *iseq, struct rb_call_cache *cc_entries, union iseq_inline_storage_entry *is_entries);
// Compile ISeq to C code in `f`. It returns true if it succeeds to compile. static bool
bool mjit_compile_body(FILE *f, const rb_iseq_t *iseq)
mjit_compile(FILE *f, const rb_iseq_t *iseq, const char *funcname)
{ {
const struct rb_iseq_constant_body *body = iseq->body; const struct rb_iseq_constant_body *body = iseq->body;
struct compile_status status = { struct compile_status status = {
@ -235,16 +234,6 @@ mjit_compile(FILE *f, const rb_iseq_t *iseq, const char *funcname)
&& !mjit_copy_cache_from_main_thread(iseq, status.cc_entries, status.is_entries)) && !mjit_copy_cache_from_main_thread(iseq, status.cc_entries, status.is_entries))
return false; return false;
// For performance, we verify stack size only on compilation time (mjit_compile.inc.erb) without --jit-debug
if (!mjit_opts.debug) {
fprintf(f, "#undef OPT_CHECKED_RUN\n");
fprintf(f, "#define OPT_CHECKED_RUN 0\n\n");
}
#ifdef _WIN32
fprintf(f, "__declspec(dllexport)\n");
#endif
fprintf(f, "VALUE\n%s(rb_execution_context_t *ec, rb_control_frame_t *reg_cfp)\n{\n", funcname);
if (status.local_stack_p) { if (status.local_stack_p) {
fprintf(f, " VALUE stack[%d];\n", body->stack_max); fprintf(f, " VALUE stack[%d];\n", body->stack_max);
} }
@ -271,8 +260,26 @@ mjit_compile(FILE *f, const rb_iseq_t *iseq, const char *funcname)
compile_insns(f, body, 0, 0, &status); compile_insns(f, body, 0, 0, &status);
compile_cancel_handler(f, body, &status); compile_cancel_handler(f, body, &status);
fprintf(f, "\n} /* end of %s */\n", funcname);
return status.success; return status.success;
} }
// Compile ISeq to C code in `f`. It returns true if it succeeds to compile.
bool
mjit_compile(FILE *f, const rb_iseq_t *iseq, const char *funcname)
{
// For performance, we verify stack size only on compilation time (mjit_compile.inc.erb) without --jit-debug
if (!mjit_opts.debug) {
fprintf(f, "#undef OPT_CHECKED_RUN\n");
fprintf(f, "#define OPT_CHECKED_RUN 0\n\n");
}
#ifdef _WIN32
fprintf(f, "__declspec(dllexport)\n");
#endif
fprintf(f, "VALUE\n%s(rb_execution_context_t *ec, rb_control_frame_t *reg_cfp)\n{\n", funcname);
bool result = mjit_compile_body(f, iseq);
fprintf(f, "\n} // end of %s\n", funcname);
return result;
}
#endif // USE_MJIT #endif // USE_MJIT