diff --git a/libguile/intrinsics.h b/libguile/intrinsics.h index 30e85c5fc..397dffed6 100644 --- a/libguile/intrinsics.h +++ b/libguile/intrinsics.h @@ -160,10 +160,6 @@ typedef uint32_t* scm_t_vcode_intrinsic; M(scm_from_thread, current_module, "current-module", CURRENT_MODULE) \ M(thread_u8_scm_sp_vra_mra, push_prompt, "push-prompt", PUSH_PROMPT) \ M(thread_scm, unpack_values_object, "unpack-values-object", UNPACK_VALUES_OBJECT) \ - M(thread, invoke_apply_hook, "invoke-apply-hook", INVOKE_APPLY_HOOK) \ - M(thread, invoke_return_hook, "invoke-return-hook", INVOKE_RETURN_HOOK) \ - M(thread, invoke_next_hook, "invoke-next-hook", INVOKE_NEXT_HOOK) \ - M(thread, invoke_abort_hook, "invoke-abort-hook", INVOKE_ABORT_HOOK) \ M(scm_from_ptr, atomic_ref_scm, "atomic-ref-scm", ATOMIC_REF_SCM) \ M(ptr_scm, atomic_set_scm, "atomic-set-scm", ATOMIC_SET_SCM) \ M(scm_from_ptr_scm, atomic_swap_scm, "atomic-swap-scm", ATOMIC_SWAP_SCM) \ diff --git a/libguile/jit.c b/libguile/jit.c index ca466bbbd..59c01877b 100644 --- a/libguile/jit.c +++ b/libguile/jit.c @@ -171,7 +171,6 @@ struct scm_jit_state { uint8_t *op_attrs; jit_node_t **labels; int32_t frame_size; - uint8_t hooks_enabled; uint32_t register_state; jit_gpr_t sp_cache_gpr; jit_fpr_t sp_cache_fpr; @@ -226,7 +225,6 @@ DEFINE_THREAD_VP_OFFSET (sp); DEFINE_THREAD_VP_OFFSET (ip); DEFINE_THREAD_VP_OFFSET (sp_min_since_gc); DEFINE_THREAD_VP_OFFSET (stack_limit); -DEFINE_THREAD_VP_OFFSET (trace_level); /* The current scm_thread*. Preserved across callouts. */ static const jit_gpr_t THREAD = JIT_V0; @@ -1138,20 +1136,6 @@ emit_mov (scm_jit_state *j, uint32_t dst, uint32_t src, jit_gpr_t t) clear_register_state (j, SP_CACHE_FPR); } -static void -emit_run_hook (scm_jit_state *j, jit_gpr_t t, scm_t_thread_intrinsic f) -{ - jit_node_t *k; - uint32_t saved_state = save_reloadable_register_state (j); - jit_ldxi_i (T0, THREAD, thread_offset_trace_level); - record_gpr_clobber (j, T0); - k = jit_beqi (T0, 0); - emit_store_current_ip (j, T0); - emit_call_r (j, f, THREAD); - restore_reloadable_register_state (j, saved_state); - jit_patch (k); -} - static jit_node_t* emit_branch_if_frame_locals_count_less_than (scm_jit_state *j, jit_gpr_t t, uint32_t nlocals) @@ -1480,8 +1464,6 @@ compile_tail_call_label (scm_jit_state *j, const uint32_t *vcode) static void compile_instrument_entry (scm_jit_state *j, void *data) { - if (j->hooks_enabled) - emit_run_hook (j, T0, scm_vm_intrinsics.invoke_apply_hook); } static void @@ -1572,8 +1554,6 @@ compile_return_values (scm_jit_state *j) { jit_gpr_t old_fp = T0, ra = T1; jit_node_t *interp; - if (j->hooks_enabled) - emit_run_hook (j, T0, scm_vm_intrinsics.invoke_return_hook); emit_pop_fp (j, old_fp); @@ -1710,9 +1690,6 @@ compile_abort (scm_jit_state *j) emit_call_r_r (j, scm_vm_intrinsics.abort_to_prompt, THREAD, T0); jit_retval (T1_PRESERVED); - if (j->hooks_enabled) - emit_run_hook (j, T0, scm_vm_intrinsics.invoke_abort_hook); - interp = jit_beqi (T1_PRESERVED, 0); emit_reload_sp (j); emit_reload_fp (j); @@ -3040,9 +3017,6 @@ compile_return_from_interrupt (scm_jit_state *j) jit_gpr_t old_fp = T0, ra = T1; jit_node_t *interp; - if (j->hooks_enabled) - emit_run_hook (j, T0, scm_vm_intrinsics.invoke_return_hook); - emit_pop_fp (j, old_fp); emit_load_mra (j, ra, old_fp); @@ -4712,7 +4686,6 @@ compute_mcode (scm_thread *thread, uint32_t *entry_ip, ASSERT (j->labels); j->frame_size = -1; - j->hooks_enabled = 0; /* ? */ INFO ("vcode: start=%p,+%zu entry=+%zu\n", j->start, j->end - j->start, j->entry - j->start); diff --git a/libguile/vm-engine.c b/libguile/vm-engine.c index 2d9be38ab..7ce306caa 100644 --- a/libguile/vm-engine.c +++ b/libguile/vm-engine.c @@ -110,23 +110,23 @@ #endif #if VM_USE_HOOKS -#define RUN_HOOK(h) \ - do { \ - if (SCM_UNLIKELY (VP->trace_level)) \ - { \ - SYNC_IP (); \ - CALL_INTRINSIC (invoke_##h##_hook, (thread)); \ - CACHE_SP (); \ - } \ +#define RUN_HOOK(H, h) \ + do { \ + if (SCM_UNLIKELY (VP->hooks_enabled[SCM_VM_##H##_HOOK])) \ + { \ + SYNC_IP (); \ + invoke_##h##_hook (thread); \ + CACHE_SP (); \ + } \ } while (0) #else -#define RUN_HOOK(h) +#define RUN_HOOK(H, h) #endif -#define APPLY_HOOK() RUN_HOOK (apply) -#define RETURN_HOOK() RUN_HOOK (return) -#define NEXT_HOOK() RUN_HOOK (next) -#define ABORT_HOOK() RUN_HOOK (abort) +#define APPLY_HOOK() RUN_HOOK (APPLY, apply) +#define RETURN_HOOK() RUN_HOOK (RETURN, return) +#define NEXT_HOOK() RUN_HOOK (NEXT, next) +#define ABORT_HOOK() RUN_HOOK (ABORT, abort) diff --git a/libguile/vm.c b/libguile/vm.c index c59c91b8f..a7355e4a5 100644 --- a/libguile/vm.c +++ b/libguile/vm.c @@ -198,11 +198,6 @@ scm_i_capture_current_stack (void) 0); } -static void invoke_apply_hook (scm_thread *thread); -static void invoke_return_hook (scm_thread *thread); -static void invoke_next_hook (scm_thread *thread); -static void invoke_abort_hook (scm_thread *thread); - /* Return the first integer greater than or equal to LEN such that LEN % ALIGN == 0. Return LEN if ALIGN is zero. */ #define ROUND_UP(len, align) \ @@ -260,26 +255,19 @@ invoke_hook (scm_thread *thread, int hook_num) vp->trace_level = saved_trace_level; } -static void -invoke_apply_hook (scm_thread *thread) -{ - return invoke_hook (thread, SCM_VM_APPLY_HOOK); -} -static void -invoke_return_hook (scm_thread *thread) -{ - return invoke_hook (thread, SCM_VM_RETURN_HOOK); -} -static void -invoke_next_hook (scm_thread *thread) -{ - return invoke_hook (thread, SCM_VM_NEXT_HOOK); -} -static void -invoke_abort_hook (scm_thread *thread) -{ - return invoke_hook (thread, SCM_VM_ABORT_HOOK); -} +#define DEFINE_INVOKE_HOOK(H, h) \ + static void \ + invoke_##h##_hook (scm_thread *thread) SCM_NOINLINE; \ + static void \ + invoke_##h##_hook (scm_thread *thread) \ + { \ + return invoke_hook (thread, SCM_VM_##H##_HOOK); \ + } + +DEFINE_INVOKE_HOOK(APPLY, apply) +DEFINE_INVOKE_HOOK(RETURN, return) +DEFINE_INVOKE_HOOK(NEXT, next) +DEFINE_INVOKE_HOOK(ABORT, abort) /* @@ -1820,10 +1808,6 @@ scm_bootstrap_vm (void) scm_vm_intrinsics.abort_to_prompt = abort_to_prompt; scm_vm_intrinsics.get_callee_vcode = get_callee_vcode; scm_vm_intrinsics.unpack_values_object = unpack_values_object; - scm_vm_intrinsics.invoke_apply_hook = invoke_apply_hook; - scm_vm_intrinsics.invoke_return_hook = invoke_return_hook; - scm_vm_intrinsics.invoke_next_hook = invoke_next_hook; - scm_vm_intrinsics.invoke_abort_hook = invoke_abort_hook; scm_vm_intrinsics.foreign_call = foreign_call; sym_keyword_argument_error = scm_from_latin1_symbol ("keyword-argument-error");