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 )