From: Aleksey Demakov Date: Fri, 21 Dec 2007 06:42:45 +0000 (+0000) Subject: fix on-demand compilation for interpreter X-Git-Tag: before.move.to.git~125 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=f0f25c357905f302f6da840b0a09a82c16ec0955;p=francis%2Flibjit.git fix on-demand compilation for interpreter --- diff --git a/ChangeLog b/ChangeLog index 3d58cbe..866e030 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2007-12-21 Aleksey Demakov + + * jit/jit-internal.h, jit/jit-context.c, jit/jit-function.c: + * jit/jit-interp.c: use on-demand driver for interpreter but skip + indirector/redirector stuff for it. + 2007-12-20 Aleksey Demakov * include/jit/jit-plus.h: add jit_context::build_start() and diff --git a/jit/jit-context.c b/jit/jit-context.c index 8e0f0f2..057a4a4 100644 --- a/jit/jit-context.c +++ b/jit/jit-context.c @@ -88,7 +88,7 @@ jit_context_t jit_context_create(void) jit_mutex_create(&(context->cache_lock)); context->functions = 0; context->last_function = 0; - context->on_demand_driver = 0; + context->on_demand_driver = _jit_function_compile_on_demand; return context; } @@ -204,7 +204,14 @@ void jit_context_build_end(jit_context_t context) @*/ void jit_context_set_on_demand_driver(jit_context_t context, jit_on_demand_driver_func driver) { - context->on_demand_driver = driver; + if (driver) + { + context->on_demand_driver = driver; + } + else + { + context->on_demand_driver = _jit_function_compile_on_demand; + } } /*@ diff --git a/jit/jit-function.c b/jit/jit-function.c index 5fb2d9c..3e2b632 100644 --- a/jit/jit-function.c +++ b/jit/jit-function.c @@ -49,10 +49,7 @@ jit_function_t jit_function_create(jit_context_t context, jit_type_t signature) { jit_function_t func; -#if defined(jit_redirector_size) - jit_on_demand_driver_func on_demand_driver; -#endif -#if defined(jit_redirector_size) || defined(jit_indirector_size) +#if !defined(JIT_BACKEND_INTERP) && (defined(jit_redirector_size) || defined(jit_indirector_size)) jit_cache_t cache; #endif @@ -63,7 +60,7 @@ jit_function_t jit_function_create(jit_context_t context, jit_type_t signature) return 0; } -#if defined(jit_redirector_size) || defined(jit_indirector_size) +#if !defined(JIT_BACKEND_INTERP) && (defined(jit_redirector_size) || defined(jit_indirector_size)) /* TODO: if the function is destroyed the redirector and indirector memory is leaked */ @@ -101,27 +98,22 @@ jit_function_t jit_function_create(jit_context_t context, jit_type_t signature) # endif jit_mutex_unlock(&(context->cache_lock)); -#endif +#endif /* !defined(JIT_BACKEND_INTERP) && (defined(jit_redirector_size) || defined(jit_indirector_size)) */ /* Initialize the function block */ func->context = context; func->signature = jit_type_copy(signature); -#if defined(jit_redirector_size) +#if !defined(JIT_BACKEND_INTERP) && defined(jit_redirector_size) /* If we aren't using interpretation, then point the function's initial entry point at the redirector, which in turn will invoke the on-demand compiler */ - on_demand_driver = context->on_demand_driver; - if(!on_demand_driver) - { - on_demand_driver = _jit_function_compile_on_demand; - } func->entry_point = _jit_create_redirector - (func->redirector, (void *) on_demand_driver, + (func->redirector, (void *) context->on_demand_driver, func, jit_type_get_abi(signature)); jit_flush_exec(func->redirector, jit_redirector_size); #endif -# if defined(jit_indirector_size) +# if !defined(JIT_BACKEND_INTERP) && defined(jit_indirector_size) _jit_create_indirector(func->indirector, (void**) &(func->entry_point)); jit_flush_exec(func->indirector, jit_indirector_size); # endif @@ -839,7 +831,7 @@ compile(jit_function_t func, void **entry_point) } #endif -#if !defined(jit_redirector_size) || !defined(jit_indirector_size) +#if !defined(JIT_BACKEND_INTERP) && (!defined(jit_redirector_size) || !defined(jit_indirector_size)) /* If the function is recompilable, then we need an extra entry point to properly redirect previous references to the function */ if(func->is_recompilable && !func->indirector) @@ -1455,9 +1447,6 @@ int jit_function_apply_vararg (jit_function_t func, jit_type_t signature, void **args, void *return_area) { struct jit_backtrace call_trace; -#if defined(jit_redirector_size) - jit_on_demand_driver_func on_demand_driver; -#endif void *entry; jit_jmp_buf jbuf; @@ -1492,16 +1481,7 @@ int jit_function_apply_vararg } else { -#if defined(jit_redirector_size) - on_demand_driver = func->context->on_demand_driver; - if(!on_demand_driver) - { - on_demand_driver = _jit_function_compile_on_demand; - } - entry = (*on_demand_driver)(func); -#else - entry = _jit_function_compile_on_demand(func); -#endif + entry = (*func->context->on_demand_driver)(func); } /* Get the default signature if necessary */ diff --git a/jit/jit-internal.h b/jit/jit-internal.h index bfc2663..16d725e 100644 --- a/jit/jit-internal.h +++ b/jit/jit-internal.h @@ -398,17 +398,19 @@ struct _jit_function /* The function to call to perform on-demand compilation */ jit_on_demand_func on_demand; -#ifdef jit_redirector_size +#ifndef JIT_BACKEND_INTERP +# ifdef jit_redirector_size /* Buffer that contains the redirector for this function. Redirectors are used to support on-demand compilation */ unsigned char *redirector; -#endif +# endif /* Buffer that contains the indirector for this function. The indirector jumps to the address that is currently stored in the entry_point field. Indirectors are used to support recompilation and on-demand compilation. */ unsigned char *indirector; +#endif }; /* diff --git a/jit/jit-interp.c b/jit/jit-interp.c index f8c80be..f53a05f 100644 --- a/jit/jit-interp.c +++ b/jit/jit-interp.c @@ -3308,7 +3308,7 @@ restart_tail: _jit_backtrace_push(&call_trace, pc); if(!entry) { - entry = _jit_function_compile_on_demand(call_func); + entry = (*call_func->context->on_demand_driver)(call_func); } _jit_run_function((jit_function_interp_t)entry, stacktop, @@ -3324,7 +3324,7 @@ restart_tail: entry = call_func->entry_point; if(!entry) { - entry = _jit_function_compile_on_demand(call_func); + entry = (*call_func->context->on_demand_driver)(call_func); } VM_PERFORM_TAIL((jit_function_interp_t)entry); } @@ -3360,7 +3360,7 @@ restart_tail: _jit_backtrace_push(&call_trace, pc); if(!entry) { - entry = _jit_function_compile_on_demand(call_func); + entry = (*call_func->context->on_demand_driver)(call_func); } _jit_run_function((jit_function_interp_t)entry, stacktop, @@ -3380,7 +3380,7 @@ restart_tail: entry = call_func->entry_point; if(!entry) { - entry = _jit_function_compile_on_demand(call_func); + entry = (*call_func->context->on_demand_driver)(call_func); } VM_PERFORM_TAIL((jit_function_interp_t)entry); } @@ -5009,8 +5009,7 @@ int jit_function_apply_vararg } else { - entry = (jit_function_interp_t) - _jit_function_compile_on_demand(func); + entry = (jit_function_interp_t)(*func->context->on_demand_driver)(func); } /* Populate the low-level argument buffer */