mirror of
https://github.com/oven-sh/bun
synced 2026-02-02 15:08:46 +00:00
Fixes illegal instruction (SIGILL) crashes on ARMv8.0 aarch64 CPUs (Cortex-A53, Raspberry Pi 4, AWS a1 instances). ## Root cause Upstream mimalloc force-enables `MI_OPT_ARCH` on arm64, which adds `-march=armv8.1-a` and emits LSE atomic instructions (`casa`, `swpa`, `ldaddl`). These are not available on ARMv8.0 CPUs. ## Fix - Pass `MI_NO_OPT_ARCH=ON` to mimalloc on aarch64 (has priority over `MI_OPT_ARCH` in mimalloc's CMake) - Update WebKit to autobuild-596e48e22e3a1090e5b802744a7938088b1ea860 which explicitly passes `-march` flags to the WebKit build ## Verification Includes QEMU-based baseline CPU verification CI steps (#26571) that catch these regressions automatically.
124 lines
3.3 KiB
CMake
124 lines
3.3 KiB
CMake
register_repository(
|
||
NAME
|
||
mimalloc
|
||
REPOSITORY
|
||
oven-sh/mimalloc
|
||
COMMIT
|
||
ffa38ab8ac914f9eb7af75c1f8ad457643dc14f2
|
||
)
|
||
|
||
set(MIMALLOC_CMAKE_ARGS
|
||
-DMI_BUILD_STATIC=ON
|
||
-DMI_BUILD_OBJECT=ON
|
||
-DMI_BUILD_SHARED=OFF
|
||
-DMI_BUILD_TESTS=OFF
|
||
-DMI_USE_CXX=ON
|
||
-DMI_SKIP_COLLECT_ON_EXIT=ON
|
||
|
||
# ```
|
||
# ❯ mimalloc_allow_large_os_pages=0 BUN_PORT=3004 mem bun http-hello.js
|
||
# Started development server: http://localhost:3004
|
||
#
|
||
# Peak memory usage: 52 MB
|
||
#
|
||
# ❯ mimalloc_allow_large_os_pages=1 BUN_PORT=3004 mem bun http-hello.js
|
||
# Started development server: http://localhost:3004
|
||
#
|
||
# Peak memory usage: 74 MB
|
||
# ```
|
||
#
|
||
# ```
|
||
# ❯ mimalloc_allow_large_os_pages=1 mem bun --eval 1
|
||
#
|
||
# Peak memory usage: 52 MB
|
||
#
|
||
# ❯ mimalloc_allow_large_os_pages=0 mem bun --eval 1
|
||
#
|
||
# Peak memory usage: 30 MB
|
||
# ```
|
||
-DMI_NO_THP=1
|
||
)
|
||
|
||
if (ABI STREQUAL "musl")
|
||
list(APPEND MIMALLOC_CMAKE_ARGS -DMI_LIBC_MUSL=ON)
|
||
endif()
|
||
|
||
if(ENABLE_ASAN)
|
||
list(APPEND MIMALLOC_CMAKE_ARGS -DMI_TRACK_ASAN=ON)
|
||
list(APPEND MIMALLOC_CMAKE_ARGS -DMI_OVERRIDE=OFF)
|
||
list(APPEND MIMALLOC_CMAKE_ARGS -DMI_OSX_ZONE=OFF)
|
||
list(APPEND MIMALLOC_CMAKE_ARGS -DMI_OSX_INTERPOSE=OFF)
|
||
list(APPEND MIMALLOC_CMAKE_ARGS -DMI_DEBUG_UBSAN=ON)
|
||
elseif(APPLE OR LINUX)
|
||
if(APPLE)
|
||
list(APPEND MIMALLOC_CMAKE_ARGS -DMI_OVERRIDE=OFF)
|
||
list(APPEND MIMALLOC_CMAKE_ARGS -DMI_OSX_ZONE=OFF)
|
||
list(APPEND MIMALLOC_CMAKE_ARGS -DMI_OSX_INTERPOSE=OFF)
|
||
else()
|
||
list(APPEND MIMALLOC_CMAKE_ARGS -DMI_OVERRIDE=ON)
|
||
list(APPEND MIMALLOC_CMAKE_ARGS -DMI_OSX_ZONE=OFF)
|
||
list(APPEND MIMALLOC_CMAKE_ARGS -DMI_OSX_INTERPOSE=OFF)
|
||
endif()
|
||
endif()
|
||
|
||
if(DEBUG)
|
||
list(APPEND MIMALLOC_CMAKE_ARGS -DMI_DEBUG_FULL=ON)
|
||
endif()
|
||
|
||
if(ENABLE_VALGRIND)
|
||
list(APPEND MIMALLOC_CMAKE_ARGS -DMI_VALGRIND=ON)
|
||
endif()
|
||
|
||
# Enable architecture-specific optimizations when not building for baseline.
|
||
# On Linux aarch64, upstream mimalloc force-enables MI_OPT_ARCH which adds
|
||
# -march=armv8.1-a (LSE atomics). This crashes on ARMv8.0 CPUs
|
||
# (Cortex-A53, Raspberry Pi 4, AWS a1 instances). Use MI_NO_OPT_ARCH
|
||
# to prevent that, but keep SIMD enabled. -moutline-atomics for runtime
|
||
# dispatch to LSE/LL-SC. macOS arm64 always has LSE (Apple Silicon) so
|
||
# MI_OPT_ARCH is safe there.
|
||
if(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|arm64|ARM64|AARCH64" AND NOT APPLE)
|
||
list(APPEND MIMALLOC_CMAKE_ARGS -DMI_NO_OPT_ARCH=ON)
|
||
list(APPEND MIMALLOC_CMAKE_ARGS -DMI_OPT_SIMD=ON)
|
||
list(APPEND MIMALLOC_CMAKE_ARGS "-DCMAKE_C_FLAGS=-moutline-atomics")
|
||
elseif(NOT ENABLE_BASELINE)
|
||
list(APPEND MIMALLOC_CMAKE_ARGS -DMI_OPT_ARCH=ON)
|
||
list(APPEND MIMALLOC_CMAKE_ARGS -DMI_OPT_SIMD=ON)
|
||
endif()
|
||
|
||
if(WIN32)
|
||
if(DEBUG)
|
||
set(MIMALLOC_LIBRARY mimalloc-debug)
|
||
else()
|
||
set(MIMALLOC_LIBRARY mimalloc)
|
||
endif()
|
||
elseif(DEBUG)
|
||
if (ENABLE_ASAN)
|
||
set(MIMALLOC_LIBRARY mimalloc-asan-debug)
|
||
else()
|
||
set(MIMALLOC_LIBRARY mimalloc-debug)
|
||
endif()
|
||
else()
|
||
set(MIMALLOC_LIBRARY mimalloc)
|
||
endif()
|
||
|
||
# Workaround for linker issue on macOS and Linux x64
|
||
# https://github.com/microsoft/mimalloc/issues/512
|
||
if(APPLE OR (LINUX AND NOT DEBUG))
|
||
set(MIMALLOC_LIBRARY CMakeFiles/mimalloc-obj.dir/src/static.c.o)
|
||
endif()
|
||
|
||
|
||
register_cmake_command(
|
||
TARGET
|
||
mimalloc
|
||
TARGETS
|
||
mimalloc-static
|
||
mimalloc-obj
|
||
ARGS
|
||
${MIMALLOC_CMAKE_ARGS}
|
||
LIBRARIES
|
||
${MIMALLOC_LIBRARY}
|
||
INCLUDES
|
||
include
|
||
)
|