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);
 

Reply via email to