wingo pushed a commit to branch wip-whippet in repository guile. commit 8726b8789b05cb22cb96349f4a903017094ab0f3 Author: Andy Wingo <wi...@pobox.com> AuthorDate: Mon Jun 30 09:47:24 2025 +0200
Replace alloca hack in vm.c:invoke_hook with alignas * libguile/vm.c (invoke_hook): Stack-allocate the "struct scm_vm_frame" by specifying an alignment on the type. --- libguile/vm.c | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/libguile/vm.c b/libguile/vm.c index 376b63937..70781c935 100644 --- a/libguile/vm.c +++ b/libguile/vm.c @@ -265,17 +265,10 @@ set_vm_trace_level (scm_thread *thread, int level) return old_level; } -/* 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) \ - ((align) ? (((len) - 1UL) | ((align) - 1UL)) + 1UL : (len)) - static void invoke_hook (scm_thread *thread, SCM hook) { struct scm_vm *vp = &thread->vm; - struct scm_vm_frame *frame; - SCM scm_frame; int saved_trace_level; uint8_t saved_compare_result; @@ -293,16 +286,17 @@ invoke_hook (scm_thread *thread, SCM hook) while the stack frame represented by the frame object is visible, so it seems reasonable to limit the lifetime of frame objects. */ - /* Arrange for FRAME to be 8-byte aligned, like any other cell. */ - frame = alloca (sizeof (*frame) + 8); - frame = (struct scm_vm_frame *) ROUND_UP ((uintptr_t) frame, 8UL); - frame->tag_and_flags = scm_tc7_frame | (SCM_VM_FRAME_KIND_VM << 8); - frame->frame.stack_holder = vp; - frame->frame.fp_offset = vp->stack_top - vp->fp; - frame->frame.sp_offset = vp->stack_top - vp->sp; - frame->frame.ip = vp->ip; + SCM_ALIGNED (8) struct scm_vm_frame frame = { + .tag_and_flags = scm_tc7_frame | (SCM_VM_FRAME_KIND_VM << 8), + .frame = { + .stack_holder = vp, + .fp_offset = vp->stack_top - vp->fp, + .sp_offset = vp->stack_top - vp->sp, + .ip = vp->ip + } + }; - scm_frame = SCM_PACK_POINTER (frame); + SCM scm_frame = SCM_PACK_POINTER (&frame); for (; scm_is_pair (hook); hook = scm_cdr (hook)) scm_call_1 (scm_car (hook), scm_frame);