diff options
author | Andy Wingo <wingo@pobox.com> | 2018-08-20 08:48:00 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2018-08-20 08:56:35 +0200 |
commit | dca1e9d7bd36cad32e2165918194b522ed30e67d (patch) | |
tree | 1d0cb4964bb568fdd4d8266838216c7768ee789e /libguile/threads.c | |
parent | 698bff8748492c10d9935d7837776c323dc4f383 (diff) | |
download | guile-dca1e9d7bd36cad32e2165918194b522ed30e67d.tar.gz |
Manual JIT interface via %jit-compile
* libguile/init.c (scm_i_init_guile): Call scm_init_jit ().
* libguile/jit.c (enter_mcode, exit_mcode): New static members; code
pointers for the JIT trampoline.
(emit_exit): New helper. The Lightning tramp/frame mechanism that we
use needs to exit via a jmp instead of a return. Adapt callers of
jit_ret.
(emit_entry_trampoline): Use the "frame" mechanism to enter the JIT.
(compile1): Add missing "break" after case statements. Oops!
(compile): Add prolog and "tramp" to compiled functions.
(initialize_jit): New local routine to init the JIT on demand.
(compute_mcode): New helper, to compile a function.
(scm_sys_jit_compile): New function, exported to Scheme as
%jit-compile.
(scm_jit_compute_mcode): Return the existing mcode if the function is
at the start.
(scm_jit_enter_mcode): Call the enter_mcode trampoline.
* libguile/jit.h (struct scm_jit_state): Declare, so we can make
pointers to it.
* libguile/threads.h (struct scm_thread): Add jit_state member.
* libguile/threads.c (on_thread_exit): Free the jit state.
Diffstat (limited to 'libguile/threads.c')
-rw-r--r-- | libguile/threads.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/libguile/threads.c b/libguile/threads.c index 0e438782e..707ef8d2a 100644 --- a/libguile/threads.c +++ b/libguile/threads.c @@ -53,6 +53,7 @@ #include "hashtab.h" #include "init.h" #include "iselect.h" +#include "jit.h" #include "list.h" #include "modules.h" #include "numbers.h" @@ -513,6 +514,8 @@ on_thread_exit (void *v) t->dynstack.top = NULL; t->dynstack.limit = NULL; scm_i_vm_free_stack (&t->vm); + scm_jit_state_free (t->jit_state); + t->jit_state = NULL; #ifdef SCM_HAVE_THREAD_STORAGE_CLASS scm_i_current_thread = NULL; |