]> git.unchartedbackwaters.co.uk Git - francis/libjit.git/commitdiff
fix on-demand compilation for interpreter
authorAleksey Demakov <ademakov@gmail.com>
Fri, 21 Dec 2007 06:42:45 +0000 (06:42 +0000)
committerAleksey Demakov <ademakov@gmail.com>
Fri, 21 Dec 2007 06:42:45 +0000 (06:42 +0000)
ChangeLog
jit/jit-context.c
jit/jit-function.c
jit/jit-internal.h
jit/jit-interp.c

index 3d58cbe308b7518869c74ae8bfce602dd180d17b..866e0306c03deb0aacce9ec231701aa9a37bdf27 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2007-12-21  Aleksey Demakov  <ademakov@gmail.com>
+
+       * 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  <ademakov@gmail.com>
 
        * include/jit/jit-plus.h: add jit_context::build_start() and
index 8e0f0f29dea1f602d047617483c1e9301f7228a2..057a4a415f452b34bcf6e3790da501e497750343 100644 (file)
@@ -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;
+       }
 }
 
 /*@
index 5fb2d9c2b56b39fca7a87b2e13edb3deec555434..3e2b6323922f098184d8c878430a0a3e923ae4aa 100644 (file)
 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 */
index bfc266312a68f56c15eae92fd7af73dd94731b02..16d725e12877c06da1439dd7da80f88c080196df 100644 (file)
@@ -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
 };
 
 /*
index f8c80be6807129fdeeb95e85db6e956283bf9c58..f53a05f9f0cf58447df70af900f415205fcdcddb 100644 (file)
@@ -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 */