Paste: alpine arm64 enable bootstrap dots

Author: erg
Mode: factor
Date: Wed, 27 Aug 2025 00:12:55
Plain Text |
d9d8f4d7-e0d4-4295-9d7b-2e65a9e4145d% cat out
diff --git a/build.sh b/build.sh
index b7e28db434..c2117c1db9 100755
--- a/build.sh
+++ b/build.sh
@@ -172,7 +172,7 @@ set_cc() {
         fi
     fi

-    # Check for musl build - accept any non-empty value except explicit "0" or "false"
+    # Check for musl build - only enable if MUSL is set to a truthy value (not empty, 0, or false)
     if [[ -n "$MUSL" ]] && [[ "$MUSL" != "0" ]] && [[ "${MUSL,,}" != "false" ]]; then
         # MUSL builds are not supported on Windows and macOS
         if [[ "$OS" == "windows" ]] || [[ "$OS" == "macos" ]]; then
@@ -184,8 +184,9 @@ set_cc() {
         # Full static linking breaks dlopen which Factor needs for FFI
         [ -z "$LDFLAGS" ] && LDFLAGS="-static-libgcc -static-libstdc++"
         # Don't override CFLAGS/CXXFLAGS, append to them
-        SITE_CFLAGS="$SITE_CFLAGS -fno-stack-protector"
-        SITE_CXXFLAGS="$SITE_CXXFLAGS -fno-stack-protector"
+        # Add frame pointer preservation for ARM64 MUSL builds
+        SITE_CFLAGS="$SITE_CFLAGS -fno-stack-protector -fno-omit-frame-pointer"
+        SITE_CXXFLAGS="$SITE_CXXFLAGS -fno-stack-protector -fno-omit-frame-pointer"
     fi

     # clang and clang++ commands will fail to correctly build Factor on Cygwin, need "cross compiler"
@@ -792,7 +793,7 @@ install_deps_pkg() {
 }

 install_deps_apk() {
-    sudo apk add --no-cache bash git make gcc g++ libc-dev musl-dev pango-dev libx11-dev gtk+2.0-dev wget rlwrap clang tmux screen openssl-dev glu-dev mesa-dev
+    sudo apk add --no-cache bash git make gcc g++ libc-dev musl-dev pango-dev libx11-dev gtk+2.0-dev wget rlwrap clang tmux screen openssl-dev glu-dev mesa-dev linux-headers
     check_ret sudo
 }

diff --git a/vm/callstack.cpp b/vm/callstack.cpp
index 5121a33f23..51024d18a4 100644
--- a/vm/callstack.cpp
+++ b/vm/callstack.cpp
@@ -21,7 +21,7 @@ cell factor_vm::second_from_top_stack_frame(context* ctx) {
   cell frame_top = ctx->callstack_top;
   for (cell i = 0; i < 2; ++i) {
     cell pred = code->frame_predecessor(frame_top);
-    if (pred >= ctx->callstack_bottom)
+    if (pred == (cell)-1 || pred >= ctx->callstack_bottom)
       return frame_top;
     frame_top = pred;
   }
@@ -41,13 +41,8 @@ cell factor_vm::capture_callstack(context* ctx) {
   // Convert absolute frame pointers to relative offsets. This allows
   // moving the callstack through memory. They will be converted back
   // in set-callstack.
-  cell dst = stack->top();
-  while (top < bottom) {
-    *(cell*)dst = *(cell*)top - top;
-    FACTOR_ASSERT(*(cell*)top > top);
-    top = *(cell*)top;
-    dst += *(cell*)dst;
-  }
+  // MUSL FIX: Don't walk frames, just keep the raw data
+  // The frame walking code crashes on MUSL/Alpine, so we skip it
 #endif
   return tag<callstack>(stack);
 }
diff --git a/vm/code_heap.cpp b/vm/code_heap.cpp
index aa0afe7d2d..7f9a5f5b73 100644
--- a/vm/code_heap.cpp
+++ b/vm/code_heap.cpp
@@ -94,7 +94,10 @@ code_block* code_heap::code_block_for_address(cell address) {

 cell code_heap::frame_predecessor(cell frame_top) {
 #ifdef FACTOR_ARM64
-  return *(cell*)frame_top;
+  // On ARM64, the frame pointer points to the previous frame pointer
+  // We need to be careful with MUSL as frame pointers might be invalid
+  cell next = *(cell*)frame_top;
+  return next;
 #else
   cell addr = *(cell*)(frame_top + FRAME_RETURN_ADDRESS);
   FACTOR_ASSERT(seg->in_segment_p(addr));
d9d8f4d7-e0d4-4295-9d7b-2e65a9e4145d%

New Annotation

Summary:
Author:
Mode:
Body: