From 9121d9f1ac21a91d2031a186a5b3c77d551acaa4 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Tue, 19 Nov 2013 18:09:34 +0100 Subject: [PATCH] All instruction pointers are now scm_t_uint32* * libguile/frames.h (SCM_FRAME_RTL_RETURN_ADDRESS) (SCM_FRAME_SET_RTL_RETURN_ADDRESS): Remove. The variants without _RTL now work fine. (struct scm_vm_frame): Change the return address to be a scm_t_uint32*. (struct scm_frame): Change IP to be scm_t_uint32*. * libguile/frames.c (scm_c_make_frame) * libguile/control.c (reify_partial_continuation, scm_c_abort) * libguile/dynstack.c (PROMPT_IP) (scm_dynstack_push_prompt, scm_dynstack_find_prompt) * libguile/dynstack.h: * libguile/vm-engine.c (SYNC_IP, RETURN_ONE_VALUE) (call, return-values, prompt): Adapt. --- libguile/control.c | 6 ++++-- libguile/dynstack.c | 6 +++--- libguile/dynstack.h | 4 ++-- libguile/frames.c | 2 +- libguile/frames.h | 14 +++----------- libguile/vm-engine.c | 10 +++++----- libguile/vm.c | 2 +- libguile/vm.h | 6 +++--- 8 files changed, 22 insertions(+), 28 deletions(-) diff --git a/libguile/control.c b/libguile/control.c index 3e5c0d855..4b51edfbe 100644 --- a/libguile/control.c +++ b/libguile/control.c @@ -79,7 +79,9 @@ make_partial_continuation (SCM vm_cont) static SCM reify_partial_continuation (SCM vm, - SCM *saved_fp, SCM *saved_sp, scm_t_uint8 *saved_ip, + SCM *saved_fp, + SCM *saved_sp, + scm_t_uint32 *saved_ip, scm_i_jmp_buf *saved_registers, scm_t_dynstack *dynstack, scm_i_jmp_buf *current_registers) @@ -128,7 +130,7 @@ scm_c_abort (SCM vm, SCM tag, size_t n, SCM *argv, scm_t_bits *prompt; scm_t_dynstack_prompt_flags flags; SCM *fp, *sp; - scm_t_uint8 *ip; + scm_t_uint32 *ip; scm_i_jmp_buf *registers; size_t i; diff --git a/libguile/dynstack.c b/libguile/dynstack.c index 5f19a2bc2..2d8895e08 100644 --- a/libguile/dynstack.c +++ b/libguile/dynstack.c @@ -38,7 +38,7 @@ #define PROMPT_KEY(top) (SCM_PACK ((top)[0])) #define PROMPT_FP(top) ((SCM *) ((top)[1])) #define PROMPT_SP(top) ((SCM *) ((top)[2])) -#define PROMPT_IP(top) ((scm_t_uint8 *) ((top)[3])) +#define PROMPT_IP(top) ((scm_t_uint32 *) ((top)[3])) #define PROMPT_JMPBUF(top) ((scm_i_jmp_buf *) ((top)[4])) #define WINDER_WORDS 2 @@ -186,7 +186,7 @@ void scm_dynstack_push_prompt (scm_t_dynstack *dynstack, scm_t_dynstack_prompt_flags flags, SCM key, - SCM *fp, SCM *sp, scm_t_uint8 *ip, + SCM *fp, SCM *sp, scm_t_uint32 *ip, scm_i_jmp_buf *registers) { scm_t_bits *words; @@ -442,7 +442,7 @@ scm_dynstack_unwind_fork (scm_t_dynstack *dynstack, scm_t_dynstack *branch) scm_t_bits* scm_dynstack_find_prompt (scm_t_dynstack *dynstack, SCM key, scm_t_dynstack_prompt_flags *flags, - SCM **fp, SCM **sp, scm_t_uint8 **ip, + SCM **fp, SCM **sp, scm_t_uint32 **ip, scm_i_jmp_buf **registers) { scm_t_bits *walk; diff --git a/libguile/dynstack.h b/libguile/dynstack.h index 08e36a2b9..fe5bb5483 100644 --- a/libguile/dynstack.h +++ b/libguile/dynstack.h @@ -155,7 +155,7 @@ SCM_INTERNAL void scm_dynstack_push_fluid (scm_t_dynstack *, SCM_INTERNAL void scm_dynstack_push_prompt (scm_t_dynstack *, scm_t_dynstack_prompt_flags, SCM key, - SCM *fp, SCM *sp, scm_t_uint8 *ip, + SCM *fp, SCM *sp, scm_t_uint32 *ip, scm_i_jmp_buf *registers); SCM_INTERNAL void scm_dynstack_push_dynwind (scm_t_dynstack *, SCM enter, SCM leave); @@ -191,7 +191,7 @@ SCM_INTERNAL void scm_dynstack_unwind_fluid (scm_t_dynstack *dynstack, SCM_INTERNAL scm_t_bits* scm_dynstack_find_prompt (scm_t_dynstack *, SCM, scm_t_dynstack_prompt_flags *, - SCM **, SCM **, scm_t_uint8 **, + SCM **, SCM **, scm_t_uint32 **, scm_i_jmp_buf **); SCM_INTERNAL void scm_dynstack_wind_prompt (scm_t_dynstack *, scm_t_bits *, diff --git a/libguile/frames.c b/libguile/frames.c index 8ca628ae4..a96b1334f 100644 --- a/libguile/frames.c +++ b/libguile/frames.c @@ -37,7 +37,7 @@ verify (offsetof (struct scm_vm_frame, dynamic_link) == 0); SCM scm_c_make_frame (SCM stack_holder, SCM *fp, SCM *sp, - scm_t_uint8 *ip, scm_t_ptrdiff offset) + scm_t_uint32 *ip, scm_t_ptrdiff offset) { struct scm_frame *p = scm_gc_malloc (sizeof (struct scm_frame), "vmframe"); diff --git a/libguile/frames.h b/libguile/frames.h index bc5216568..d425b9439 100644 --- a/libguile/frames.h +++ b/libguile/frames.h @@ -85,7 +85,7 @@ struct scm_vm_frame { SCM *dynamic_link; - scm_t_uint8 *return_address; + scm_t_uint32 *return_address; SCM locals[1]; /* Variable-length */ }; @@ -132,14 +132,6 @@ struct scm_vm_frame #define SCM_FRAME_PROGRAM(fp) (SCM_FRAME_LOCAL (fp, 0)) - -/* FIXME: Replace SCM_FRAME_RETURN_ADDRESS with these. */ -#define SCM_FRAME_RTL_RETURN_ADDRESS(fp) \ - ((scm_t_uint32 *) SCM_FRAME_RETURN_ADDRESS (fp)) -#define SCM_FRAME_SET_RTL_RETURN_ADDRESS(fp, ip) \ - SCM_FRAME_SET_RETURN_ADDRESS (fp, (scm_t_uint8 *) (ip)) - - /* * Heap frames */ @@ -149,7 +141,7 @@ struct scm_frame SCM stack_holder; SCM *fp; SCM *sp; - scm_t_uint8 *ip; + scm_t_uint32 *ip; scm_t_ptrdiff offset; }; @@ -163,7 +155,7 @@ struct scm_frame #define SCM_VALIDATE_VM_FRAME(p,x) SCM_MAKE_VALIDATE (p, x, VM_FRAME_P) SCM_API SCM scm_c_make_frame (SCM stack_holder, SCM *fp, SCM *sp, - scm_t_uint8 *ip, scm_t_ptrdiff offset); + scm_t_uint32 *ip, scm_t_ptrdiff offset); SCM_API SCM scm_frame_p (SCM obj); SCM_API SCM scm_frame_procedure (SCM frame); SCM_API SCM scm_frame_arguments (SCM frame); diff --git a/libguile/vm-engine.c b/libguile/vm-engine.c index 7fe78933c..3d689f7b1 100644 --- a/libguile/vm-engine.c +++ b/libguile/vm-engine.c @@ -130,7 +130,7 @@ exception. */ #define SYNC_IP() \ - vp->ip = (scm_t_uint8 *) (ip) + vp->ip = (ip) #define SYNC_REGISTER() \ SYNC_IP() @@ -230,7 +230,7 @@ SCM val = ret; \ SCM *old_fp = fp; \ VM_HANDLE_INTERRUPTS; \ - ip = SCM_FRAME_RTL_RETURN_ADDRESS (fp); \ + ip = SCM_FRAME_RETURN_ADDRESS (fp); \ fp = vp->fp = SCM_FRAME_DYNAMIC_LINK (fp); \ /* Clear frame. */ \ old_fp[-1] = SCM_BOOL_F; \ @@ -577,7 +577,7 @@ RTL_VM_NAME (SCM vm, SCM program, SCM *argv, size_t nargs_) fp = vp->fp = old_fp + proc; SCM_FRAME_SET_DYNAMIC_LINK (fp, old_fp); - SCM_FRAME_SET_RTL_RETURN_ADDRESS (fp, ip + 2); + SCM_FRAME_SET_RETURN_ADDRESS (fp, ip + 2); RESET_FRAME (nlocals); @@ -712,7 +712,7 @@ RTL_VM_NAME (SCM vm, SCM program, SCM *argv, size_t nargs_) SCM *old_fp = fp; VM_HANDLE_INTERRUPTS; - ip = SCM_FRAME_RTL_RETURN_ADDRESS (fp); + ip = SCM_FRAME_RETURN_ADDRESS (fp); fp = vp->fp = SCM_FRAME_DYNAMIC_LINK (fp); /* Clear stack frame. */ @@ -2012,7 +2012,7 @@ RTL_VM_NAME (SCM vm, SCM program, SCM *argv, size_t nargs_) LOCAL_REF (tag), fp, LOCAL_ADDRESS (proc_slot), - (scm_t_uint8 *)(ip + offset), + ip + offset, ®isters); NEXT (3); } diff --git a/libguile/vm.c b/libguile/vm.c index b083d061f..e2e460645 100644 --- a/libguile/vm.c +++ b/libguile/vm.c @@ -103,7 +103,7 @@ scm_i_vm_cont_print (SCM x, SCM port, scm_print_state *pstate) call to vm_run; but that's currently not implemented. */ SCM -scm_i_vm_capture_stack (SCM *stack_base, SCM *fp, SCM *sp, scm_t_uint8 *ra, +scm_i_vm_capture_stack (SCM *stack_base, SCM *fp, SCM *sp, scm_t_uint32 *ra, scm_t_dynstack *dynstack, scm_t_uint32 flags) { struct scm_vm_cont *p; diff --git a/libguile/vm.h b/libguile/vm.h index 7012eef25..c678e421b 100644 --- a/libguile/vm.h +++ b/libguile/vm.h @@ -41,7 +41,7 @@ typedef SCM (*scm_t_vm_engine) (SCM vm, SCM program, SCM *argv, int nargs); #define SCM_VM_NUM_ENGINES 2 struct scm_vm { - scm_t_uint8 *ip; /* instruction pointer */ + scm_t_uint32 *ip; /* instruction pointer */ SCM *sp; /* stack pointer */ SCM *fp; /* frame pointer */ size_t stack_size; /* stack size */ @@ -88,7 +88,7 @@ SCM_API void scm_c_set_default_vm_engine_x (int engine); struct scm_vm_cont { SCM *sp; SCM *fp; - scm_t_uint8 *ra; + scm_t_uint32 *ra; scm_t_ptrdiff stack_size; SCM *stack_base; scm_t_ptrdiff reloc; @@ -110,7 +110,7 @@ SCM_INTERNAL void scm_i_vm_print (SCM x, SCM port, SCM_INTERNAL SCM scm_i_call_with_current_continuation (SCM proc); SCM_INTERNAL SCM scm_i_capture_current_stack (void); SCM_INTERNAL SCM scm_i_vm_capture_stack (SCM *stack_base, SCM *fp, SCM *sp, - scm_t_uint8 *ra, + scm_t_uint32 *ra, scm_t_dynstack *dynstack, scm_t_uint32 flags); SCM_INTERNAL void scm_i_vm_cont_print (SCM x, SCM port, -- 2.20.1