From 432af2f304ece980315eac5cf645e3729be9f027 Mon Sep 17 00:00:00 2001 From: daanx Date: Thu, 9 Jan 2025 18:35:03 -0800 Subject: [PATCH 1/9] use directly CMAKE_INSTALL_BIN/LIBDIR to avoid patch in vcpkg --- CMakeLists.txt | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5ca281e1..b5a0742d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -385,7 +385,7 @@ if(CMAKE_C_COMPILER_ID MATCHES "AppleClang|Clang|GNU" AND NOT MI_CLANG_CL) endif() if(CMAKE_C_COMPILER_ID MATCHES "AppleClang|Clang") list(APPEND mi_cflags -Wno-static-in-inline) - endif() + endif() endif() if(CMAKE_C_COMPILER_ID MATCHES "Intel") @@ -422,7 +422,7 @@ if (MSVC AND MSVC_VERSION GREATER_EQUAL 1914) list(APPEND mi_cflags /Zc:__cplusplus) if(MI_OPT_ARCH AND NOT MI_CLANG_CL) if(MI_ARCH STREQUAL "arm64") - set(MI_OPT_ARCH_FLAGS "/arch:armv8.1") # fast atomics + set(MI_OPT_ARCH_FLAGS "/arch:armv8.1") # fast atomics endif() endif() endif() @@ -479,8 +479,7 @@ endif() # ----------------------------------------------------------------------------- # dynamic/shared library and symlinks always go to /usr/local/lib equivalent -set(mi_install_libdir "${CMAKE_INSTALL_LIBDIR}") -set(mi_install_bindir "${CMAKE_INSTALL_BINDIR}") +# we use ${CMAKE_INSTALL_BINDIR} and ${CMAKE_INSTALL_LIBDIR}. # static libraries and object files, includes, and cmake config files # are either installed at top level, or use versioned directories for side-by-side installation (default) @@ -572,10 +571,10 @@ if(MI_BUILD_SHARED) add_custom_command(TARGET mimalloc POST_BUILD COMMAND "${CMAKE_COMMAND}" -E copy "${CMAKE_CURRENT_SOURCE_DIR}/bin/mimalloc-redirect${MIMALLOC_REDIRECT_SUFFIX}.dll" $ COMMENT "Copy mimalloc-redirect${MIMALLOC_REDIRECT_SUFFIX}.dll to output directory") - install(FILES "$/mimalloc-redirect${MIMALLOC_REDIRECT_SUFFIX}.dll" DESTINATION ${mi_install_bindir}) + install(FILES "$/mimalloc-redirect${MIMALLOC_REDIRECT_SUFFIX}.dll" DESTINATION ${CMAKE_INSTALL_BINDIR}) endif() - install(TARGETS mimalloc EXPORT mimalloc ARCHIVE DESTINATION ${mi_install_libdir} RUNTIME DESTINATION ${mi_install_bindir} LIBRARY DESTINATION ${mi_install_libdir}) + install(TARGETS mimalloc EXPORT mimalloc ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) install(EXPORT mimalloc DESTINATION ${mi_install_cmakedir}) endif() From 600ca88e8725a2765d5ec46e2b2a76221deeabf0 Mon Sep 17 00:00:00 2001 From: Daan Leijen Date: Thu, 9 Jan 2025 19:31:05 -0800 Subject: [PATCH 2/9] fix library name for pkg config files (and to avoid extra patches in vcpkg) --- CMakeLists.txt | 33 +++++++++++++++++++-------------- mimalloc.pc.in | 8 ++++---- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b5a0742d..cf4bdfde 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -580,7 +580,15 @@ endif() # static library if (MI_BUILD_STATIC) + if(WIN32) + # When building both static and shared libraries on Windows, a static library should use a + # different output name to avoid the conflict with the import library of a shared one. + string(REPLACE "mimalloc" "mimalloc-static" mi_static_libname ${mi_basename}) + else() + set(mi_static_libname "${mi_basename}") + endif() add_library(mimalloc-static STATIC ${mi_sources}) + set_target_properties(mimalloc-static PROPERTIES OUTPUT_NAME ${mi_static_libname}) set_property(TARGET mimalloc-static PROPERTY POSITION_INDEPENDENT_CODE ON) target_compile_definitions(mimalloc-static PRIVATE ${mi_defines} MI_STATIC_LIB) target_compile_options(mimalloc-static PRIVATE ${mi_cflags} ${mi_cflags_static}) @@ -589,15 +597,6 @@ if (MI_BUILD_STATIC) $ $ ) - if(WIN32) - # When building both static and shared libraries on Windows, a static library should use a - # different output name to avoid the conflict with the import library of a shared one. - string(REPLACE "mimalloc" "mimalloc-static" mi_output_name ${mi_basename}) - set_target_properties(mimalloc-static PROPERTIES OUTPUT_NAME ${mi_output_name}) - else() - set_target_properties(mimalloc-static PROPERTIES OUTPUT_NAME ${mi_basename}) - endif() - install(TARGETS mimalloc-static EXPORT mimalloc DESTINATION ${mi_install_objdir} LIBRARY) install(EXPORT mimalloc DESTINATION ${mi_install_cmakedir}) endif() @@ -640,18 +639,24 @@ if (MI_BUILD_OBJECT) endif() # pkg-config file support -set(pc_libraries "") +set(mi_pc_libraries "") foreach(item IN LISTS mi_libraries) if(item MATCHES " *[-].*") - set(pc_libraries "${pc_libraries} ${item}") + set(mi_pc_libraries "${mi_pc_libraries} ${item}") else() - set(pc_libraries "${pc_libraries} -l${item}") + set(mi_pc_libraries "${mi_pc_libraries} -l${item}") endif() endforeach() +if(MI_BUILD_STATIC) # prefer static linking with pkg-config + set(mi_pc_libname "${mi_static_libname}") +else() + set(mi_pc_libname "${mi_basename}") +endif() + include("cmake/JoinPaths.cmake") -join_paths(includedir_for_pc_file "\${prefix}" "${CMAKE_INSTALL_INCLUDEDIR}") -join_paths(libdir_for_pc_file "\${prefix}" "${CMAKE_INSTALL_LIBDIR}") +join_paths(mi_pc_includedir "\${prefix}" "${CMAKE_INSTALL_INCLUDEDIR}") +join_paths(mi_pc_libdir "\${prefix}" "${CMAKE_INSTALL_LIBDIR}") configure_file(mimalloc.pc.in mimalloc.pc @ONLY) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/mimalloc.pc" diff --git a/mimalloc.pc.in b/mimalloc.pc.in index 36da2038..7c9e8a37 100644 --- a/mimalloc.pc.in +++ b/mimalloc.pc.in @@ -1,11 +1,11 @@ prefix=@CMAKE_INSTALL_PREFIX@ -libdir=@libdir_for_pc_file@ -includedir=@includedir_for_pc_file@ +libdir=@mi_pc_libdir@ +includedir=@mi_pc_includedir@ Name: @PROJECT_NAME@ Description: A compact general purpose allocator with excellent performance Version: @PACKAGE_VERSION@ URL: https://github.com/microsoft/mimalloc/ -Libs: -L${libdir} -lmimalloc -Libs.private: @pc_libraries@ +Libs: -L${libdir} -l@mi_pc_libname@ +Libs.private: @mi_pc_libraries@ Cflags: -I${includedir} From 4fcf56af2e3455a5d82c4e87fa9aa3058a252d8c Mon Sep 17 00:00:00 2001 From: daanx Date: Thu, 9 Jan 2025 20:57:08 -0800 Subject: [PATCH 3/9] use consistent naming on Windows vs other platforms. Use mimalloc.dll.lib for the dll import library to avoid a clash with the static mimalloc.lib library --- CMakeLists.txt | 62 ++++++++++++------------ ide/vs2022/mimalloc-lib.vcxproj | 16 +++--- ide/vs2022/mimalloc-override-dll.vcxproj | 8 +++ mimalloc.pc.in | 2 +- src/prim/windows/prim.c | 2 +- test/CMakeLists.txt | 8 +-- test/main-override.cpp | 16 +++--- 7 files changed, 61 insertions(+), 53 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cf4bdfde..b9ada3ed 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -493,19 +493,19 @@ else() set(mi_install_cmakedir "${CMAKE_INSTALL_LIBDIR}/cmake/mimalloc-${mi_version}") # for cmake package info endif() -set(mi_basename "mimalloc") +set(mi_libname "mimalloc") if(MI_SECURE) - set(mi_basename "${mi_basename}-secure") + set(mi_libname "${mi_libname}-secure") endif() if(MI_TRACK_VALGRIND) - set(mi_basename "${mi_basename}-valgrind") + set(mi_libname "${mi_libname}-valgrind") endif() if(MI_TRACK_ASAN) - set(mi_basename "${mi_basename}-asan") + set(mi_libname "${mi_libname}-asan") endif() string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LC) if(NOT(CMAKE_BUILD_TYPE_LC MATCHES "^(release|relwithdebinfo|minsizerel|none)$")) - set(mi_basename "${mi_basename}-${CMAKE_BUILD_TYPE_LC}") #append build type (e.g. -debug) if not a release version + set(mi_libname "${mi_libname}-${CMAKE_BUILD_TYPE_LC}") #append build type (e.g. -debug) if not a release version endif() if(MI_BUILD_SHARED) @@ -522,7 +522,7 @@ if(MI_BUILD_TESTS) endif() message(STATUS "") -message(STATUS "Library base name: ${mi_basename}") +message(STATUS "Library name : ${mi_libname}") message(STATUS "Version : ${mi_version}.${mi_version_patch}") message(STATUS "Build type : ${CMAKE_BUILD_TYPE_LC}") if(MI_USE_CXX) @@ -543,7 +543,7 @@ message(STATUS "") # shared library if(MI_BUILD_SHARED) add_library(mimalloc SHARED ${mi_sources}) - set_target_properties(mimalloc PROPERTIES VERSION ${mi_version} SOVERSION ${mi_version_major} OUTPUT_NAME ${mi_basename} ) + set_target_properties(mimalloc PROPERTIES VERSION ${mi_version} SOVERSION ${mi_version_major} OUTPUT_NAME ${mi_libname} ) target_compile_definitions(mimalloc PRIVATE ${mi_defines} MI_SHARED_LIB MI_SHARED_LIB_EXPORT) target_compile_options(mimalloc PRIVATE ${mi_cflags} ${mi_cflags_dynamic}) target_link_libraries(mimalloc PRIVATE ${mi_libraries}) @@ -551,6 +551,15 @@ if(MI_BUILD_SHARED) $ $ ) + install(TARGETS mimalloc EXPORT mimalloc ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(EXPORT mimalloc DESTINATION ${mi_install_cmakedir}) + + if(WIN32) + # On windows, the import library name for the dll would clash with the static mimalloc.lib + # so we postfix the dll import library with `.dll.lib`. + set_property(TARGET mimalloc PROPERTY ARCHIVE_OUTPUT_NAME "${mi_libname}.dll" ) + install(FILES "$/${mi_libname}.dll.lib" DESTINATION ${CMAKE_INSTALL_LIBDIR}) + endif() if(WIN32 AND MI_WIN_REDIRECT) # On windows, link and copy the mimalloc redirection dll too. if(CMAKE_GENERATOR_PLATFORM STREQUAL "arm64ec") @@ -558,8 +567,8 @@ if(MI_BUILD_SHARED) elseif(MI_ARCH STREQUAL "x64") set(MIMALLOC_REDIRECT_SUFFIX "") if(CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64") - message(STATUS "Note: x64 code emulated on Windows for arm64 should use an arm64ec build of 'mimalloc-override.dll'") - message(STATUS " with 'mimalloc-redirect-arm64ec.dll'. See the 'bin\\readme.md' for more information.") + message(STATUS "Note: x64 code emulated on Windows for arm64 should use an arm64ec build of 'mimalloc.dll'") + message(STATUS " together with 'mimalloc-redirect-arm64ec.dll'. See the 'bin\\readme.md' for more information.") endif() elseif(MI_ARCH STREQUAL "x86") set(MIMALLOC_REDIRECT_SUFFIX "32") @@ -567,28 +576,19 @@ if(MI_BUILD_SHARED) set(MIMALLOC_REDIRECT_SUFFIX "-${MI_ARCH}") # -arm64 etc. endif() - target_link_libraries(mimalloc PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/bin/mimalloc-redirect${MIMALLOC_REDIRECT_SUFFIX}.lib) + target_link_libraries(mimalloc PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/bin/mimalloc-redirect${MIMALLOC_REDIRECT_SUFFIX}.lib) # the DLL import library add_custom_command(TARGET mimalloc POST_BUILD COMMAND "${CMAKE_COMMAND}" -E copy "${CMAKE_CURRENT_SOURCE_DIR}/bin/mimalloc-redirect${MIMALLOC_REDIRECT_SUFFIX}.dll" $ COMMENT "Copy mimalloc-redirect${MIMALLOC_REDIRECT_SUFFIX}.dll to output directory") install(FILES "$/mimalloc-redirect${MIMALLOC_REDIRECT_SUFFIX}.dll" DESTINATION ${CMAKE_INSTALL_BINDIR}) endif() - - install(TARGETS mimalloc EXPORT mimalloc ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) - install(EXPORT mimalloc DESTINATION ${mi_install_cmakedir}) endif() + # static library if (MI_BUILD_STATIC) - if(WIN32) - # When building both static and shared libraries on Windows, a static library should use a - # different output name to avoid the conflict with the import library of a shared one. - string(REPLACE "mimalloc" "mimalloc-static" mi_static_libname ${mi_basename}) - else() - set(mi_static_libname "${mi_basename}") - endif() add_library(mimalloc-static STATIC ${mi_sources}) - set_target_properties(mimalloc-static PROPERTIES OUTPUT_NAME ${mi_static_libname}) + set_property(TARGET mimalloc-static PROPERTY OUTPUT_NAME ${mi_libname}) set_property(TARGET mimalloc-static PROPERTY POSITION_INDEPENDENT_CODE ON) target_compile_definitions(mimalloc-static PRIVATE ${mi_defines} MI_STATIC_LIB) target_compile_options(mimalloc-static PRIVATE ${mi_cflags} ${mi_cflags_static}) @@ -621,12 +621,15 @@ if (MI_BUILD_OBJECT) ) # Copy the generated object file (`static.o`) to the output directory (as `mimalloc.o`) - if(NOT WIN32) + if(WIN32) + set(mimalloc-obj-static "${CMAKE_CURRENT_BINARY_DIR}/mimalloc-obj.dir/$/static${CMAKE_C_OUTPUT_EXTENSION}") + else() set(mimalloc-obj-static "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/mimalloc-obj.dir/src/static.c${CMAKE_C_OUTPUT_EXTENSION}") - set(mimalloc-obj-out "${CMAKE_CURRENT_BINARY_DIR}/${mi_basename}${CMAKE_C_OUTPUT_EXTENSION}") - add_custom_command(OUTPUT ${mimalloc-obj-out} DEPENDS mimalloc-obj COMMAND "${CMAKE_COMMAND}" -E copy "${mimalloc-obj-static}" "${mimalloc-obj-out}") - add_custom_target(mimalloc-obj-target ALL DEPENDS ${mimalloc-obj-out}) endif() + set(mimalloc-obj-out "${CMAKE_CURRENT_BINARY_DIR}/${mi_libname}${CMAKE_C_OUTPUT_EXTENSION}") + add_custom_command(OUTPUT ${mimalloc-obj-out} DEPENDS mimalloc-obj COMMAND "${CMAKE_COMMAND}" -E copy "${mimalloc-obj-static}" "${mimalloc-obj-out}") + add_custom_target(mimalloc-obj-target ALL DEPENDS ${mimalloc-obj-out}) + # the following seems to lead to cmake warnings/errors on some systems, disable for now :-( # install(TARGETS mimalloc-obj EXPORT mimalloc DESTINATION ${mi_install_objdir}) @@ -635,9 +638,10 @@ if (MI_BUILD_OBJECT) # but that fails cmake versions less than 3.10 so we leave it as is for now install(FILES ${mimalloc-obj-static} DESTINATION ${mi_install_objdir} - RENAME ${mi_basename}${CMAKE_C_OUTPUT_EXTENSION} ) + RENAME ${mi_libname}${CMAKE_C_OUTPUT_EXTENSION} ) endif() + # pkg-config file support set(mi_pc_libraries "") foreach(item IN LISTS mi_libraries) @@ -648,12 +652,6 @@ foreach(item IN LISTS mi_libraries) endif() endforeach() -if(MI_BUILD_STATIC) # prefer static linking with pkg-config - set(mi_pc_libname "${mi_static_libname}") -else() - set(mi_pc_libname "${mi_basename}") -endif() - include("cmake/JoinPaths.cmake") join_paths(mi_pc_includedir "\${prefix}" "${CMAKE_INSTALL_INCLUDEDIR}") join_paths(mi_pc_libdir "\${prefix}" "${CMAKE_INSTALL_LIBDIR}") diff --git a/ide/vs2022/mimalloc-lib.vcxproj b/ide/vs2022/mimalloc-lib.vcxproj index 9e5371af..3359e6c0 100644 --- a/ide/vs2022/mimalloc-lib.vcxproj +++ b/ide/vs2022/mimalloc-lib.vcxproj @@ -120,49 +120,49 @@ $(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\ $(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\ .lib - mimalloc-static + mimalloc $(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\ $(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\ .lib - mimalloc-static + mimalloc $(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\ $(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\ .lib - mimalloc-static + mimalloc $(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\ $(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\ .lib - mimalloc-static + mimalloc $(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\ $(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\ .lib - mimalloc-static + mimalloc $(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\ $(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\ .lib - mimalloc-static + mimalloc $(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\ $(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\ .lib - mimalloc-static + mimalloc $(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\ $(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\ .lib - mimalloc-static + mimalloc diff --git a/ide/vs2022/mimalloc-override-dll.vcxproj b/ide/vs2022/mimalloc-override-dll.vcxproj index 728c4f59..f613f6df 100644 --- a/ide/vs2022/mimalloc-override-dll.vcxproj +++ b/ide/vs2022/mimalloc-override-dll.vcxproj @@ -180,6 +180,7 @@ Default false + $(OutDir)$(TargetName).dll.lib COPY /Y "$(ProjectDir)..\..\bin\mimalloc-redirect32.dll" "$(OutputPath)" @@ -208,6 +209,7 @@ Default false + $(OutDir)$(TargetName).dll.lib COPY /Y "$(ProjectDir)..\..\bin\mimalloc-redirect.dll" "$(OutputPath)" @@ -236,6 +238,7 @@ Default false + $(OutDir)$(TargetName).dll.lib COPY /Y "$(ProjectDir)..\..\bin\mimalloc-redirect-arm64.dll" "$(OutputPath)" @@ -264,6 +267,7 @@ Default false + $(OutDir)$(TargetName).dll.lib COPY /Y "$(ProjectDir)..\..\bin\mimalloc-redirect-arm64ec.dll" "$(OutputPath)" @@ -296,6 +300,7 @@ Default false + $(OutDir)$(TargetName).dll.lib COPY /Y "$(ProjectDir)..\..\bin\mimalloc-redirect32.dll" "$(OutputPath)" @@ -328,6 +333,7 @@ Default false + $(OutDir)$(TargetName).dll.lib COPY /Y "$(ProjectDir)..\..\bin\mimalloc-redirect.dll" "$(OutputPath)" @@ -361,6 +367,7 @@ Default false + $(OutDir)$(TargetName).dll.lib COPY /Y "$(ProjectDir)..\..\bin\mimalloc-redirect-arm64.dll" "$(OutputPath)" @@ -394,6 +401,7 @@ Default false + $(OutDir)$(TargetName).dll.lib COPY /Y "$(ProjectDir)..\..\bin\mimalloc-redirect-arm64ec.dll" "$(OutputPath)" diff --git a/mimalloc.pc.in b/mimalloc.pc.in index 7c9e8a37..80922256 100644 --- a/mimalloc.pc.in +++ b/mimalloc.pc.in @@ -6,6 +6,6 @@ Name: @PROJECT_NAME@ Description: A compact general purpose allocator with excellent performance Version: @PACKAGE_VERSION@ URL: https://github.com/microsoft/mimalloc/ -Libs: -L${libdir} -l@mi_pc_libname@ +Libs: -L${libdir} -l@mi_libname@ Libs.private: @mi_pc_libraries@ Cflags: -I${includedir} diff --git a/src/prim/windows/prim.c b/src/prim/windows/prim.c index 9686fe07..b25b8f2d 100644 --- a/src/prim/windows/prim.c +++ b/src/prim/windows/prim.c @@ -127,7 +127,7 @@ void _mi_prim_mem_init( mi_os_mem_config_t* config ) ULONGLONG memInKiB = 0; if (GetPhysicallyInstalledSystemMemory(&memInKiB)) { if (memInKiB > 0 && memInKiB < (SIZE_MAX / MI_KiB)) { - config->physical_memory = memInKiB * MI_KiB; + config->physical_memory = (size_t)memInKiB * MI_KiB; } } // get the VirtualAlloc2 function diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 398637c8..744fe616 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.18) project(mimalloc-test C CXX) set(CMAKE_C_STANDARD 11) @@ -16,7 +16,7 @@ if (NOT CMAKE_BUILD_TYPE) endif() # Import mimalloc (if installed) -find_package(mimalloc 1.7 REQUIRED NO_SYSTEM_ENVIRONMENT_PATH) +find_package(mimalloc 1.9 CONFIG REQUIRED) message(STATUS "Found mimalloc installed at: ${MIMALLOC_LIBRARY_DIR} (${MIMALLOC_VERSION_DIR})") # overriding with a dynamic library @@ -29,9 +29,9 @@ target_link_libraries(dynamic-override-cxx PUBLIC mimalloc) # overriding with a static object file works reliable as the symbols in the # object file have priority over those in library files -add_executable(static-override-obj main-override.c ${MIMALLOC_OBJECT_DIR}/mimalloc.o) +add_executable(static-override-obj main-override.c ${MIMALLOC_OBJECT_DIR}/mimalloc${CMAKE_C_OUTPUT_EXTENSION}) target_include_directories(static-override-obj PUBLIC ${MIMALLOC_INCLUDE_DIR}) -target_link_libraries(static-override-obj PUBLIC pthread) +target_link_libraries(static-override-obj PUBLIC mimalloc-static) # overriding with a static library works too if using the `mimalloc-override.h` diff --git a/test/main-override.cpp b/test/main-override.cpp index 1160c55d..db594acc 100644 --- a/test/main-override.cpp +++ b/test/main-override.cpp @@ -37,9 +37,9 @@ static void test_thread_local(); // issue #944 static void test_mixed1(); // issue #942 static void test_stl_allocators(); -#if _WIN32 +#if x_WIN32 #include "main-override-dep.h" -static void test_dep(); // issue #981: test overriding in another DLL +static void test_dep(); // issue #981: test overriding in another DLL #else static void test_dep() { }; #endif @@ -50,7 +50,7 @@ int main() { test_mixed1(); test_dep(); - + //test_std_string(); //test_thread_local(); // heap_thread_free_huge(); @@ -59,7 +59,7 @@ int main() { heap_no_delete(); heap_late_free(); padding_shrink(); - + tsan_numa_test(); */ /* @@ -112,8 +112,10 @@ static void various_tests() { t->~Test(); delete[] tbuf; + #if _WIN32 const char* ptr = ::_Getdays(); // test _base overrid free((void*)ptr); + #endif } class Static { @@ -143,7 +145,7 @@ static bool test_stl_allocator1() { struct some_struct { int i; int j; double z; }; -#if _WIN32 +#if x_WIN32 static void test_dep() { TestAllocInDll t; @@ -236,7 +238,7 @@ static void test_mixed0() { std::cout << "Running on " << threads.size() << " threads took " << duration << std::endl; } -#endif +#endif void asd() { void* p = malloc(128); @@ -401,7 +403,7 @@ static void test_mt_shutdown() // issue #372 static void fail_aslr() { - size_t sz = (4ULL << 40); // 4TiB + size_t sz = (size_t)(4ULL << 40); // 4TiB void* p = malloc(sz); printf("pointer p: %p: area up to %p\n", p, (uint8_t*)p + sz); *(int*)0x5FFFFFFF000 = 0; // should segfault From 0be6db0e28809e4aa641cf811f6022e2f3813bb1 Mon Sep 17 00:00:00 2001 From: daanx Date: Thu, 9 Jan 2025 21:06:38 -0800 Subject: [PATCH 4/9] comments --- test/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 744fe616..5905613c 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -19,7 +19,9 @@ endif() find_package(mimalloc 1.9 CONFIG REQUIRED) message(STATUS "Found mimalloc installed at: ${MIMALLOC_LIBRARY_DIR} (${MIMALLOC_VERSION_DIR})") -# overriding with a dynamic library + +# link with a dynamic shared library +# use `LD_PRELOAD` to actually override malloc/free at runtime with mimalloc add_executable(dynamic-override main-override.c) target_link_libraries(dynamic-override PUBLIC mimalloc) From 3f91c9f937d9a7b26c130393925e7364a26c7880 Mon Sep 17 00:00:00 2001 From: Daan Date: Thu, 9 Jan 2025 23:10:12 -0800 Subject: [PATCH 5/9] move docker files --- .gitignore | 3 +++ CMakeLists.txt | 13 +++++++++++++ .../docker}/alpine-arm32v7/Dockerfile | 0 {docker => contrib/docker}/alpine/Dockerfile | 0 {docker => contrib/docker}/manylinux-x64/Dockerfile | 0 {docker => contrib/docker}/readme.md | 0 6 files changed, 16 insertions(+) rename {docker => contrib/docker}/alpine-arm32v7/Dockerfile (100%) rename {docker => contrib/docker}/alpine/Dockerfile (100%) rename {docker => contrib/docker}/manylinux-x64/Dockerfile (100%) rename {docker => contrib/docker}/readme.md (100%) diff --git a/.gitignore b/.gitignore index b2439f94..bcedbc3f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +build ide/vs20??/*.db ide/vs20??/*.opendb ide/vs20??/*.user @@ -8,3 +9,5 @@ docs/ *.zip *.tar *.gz +.vscode +.DS_STore diff --git a/CMakeLists.txt b/CMakeLists.txt index b9ada3ed..8eb15a39 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,6 +35,10 @@ option(MI_INSTALL_TOPLEVEL "Install directly into $CMAKE_INSTALL_PREFIX instead option(MI_NO_THP "Disable transparent huge pages support on Linux/Android for the mimalloc process only" OFF) option(MI_EXTRA_CPPDEFS "Extra pre-processor definitions (use as `-DMI_EXTRA_CPPDEFS=\"opt1=val1;opt2=val2\"`)" "") +# negated options for vcpkg features +option(MI_NO_USE_CXX "Use plain C compilation (has priority over MI_USE_CXX)" OFF) +option(MI_NO_OPT_ARCH "Do not use architecture specific optimizations (like '-march=armv8.1-a' for example) (has priority over MI_OPT_ARCH)" OFF) + # deprecated options option(MI_WIN_USE_FLS "Use Fiber local storage on Windows to detect thread termination (deprecated)" OFF) option(MI_CHECK_FULL "Use full internal invariant checking in DEBUG mode (deprecated, use MI_DEBUG_FULL instead)" OFF) @@ -121,6 +125,15 @@ if(CMAKE_C_COMPILER_ID MATCHES "Intel") list(APPEND mi_cflags -Wall) endif() +# negative overrides (mainly to support vcpkg features) +if(MI_NO_USE_CXX) + set(MI_USE_CXX "OFF") +endif() +if(MI_NO_OPT_ARCH) + set(MI_OPT_ARCH "OFF") +endif() + + if(CMAKE_C_COMPILER_ID MATCHES "MSVC|Intel") set(MI_USE_CXX "ON") endif() diff --git a/docker/alpine-arm32v7/Dockerfile b/contrib/docker/alpine-arm32v7/Dockerfile similarity index 100% rename from docker/alpine-arm32v7/Dockerfile rename to contrib/docker/alpine-arm32v7/Dockerfile diff --git a/docker/alpine/Dockerfile b/contrib/docker/alpine/Dockerfile similarity index 100% rename from docker/alpine/Dockerfile rename to contrib/docker/alpine/Dockerfile diff --git a/docker/manylinux-x64/Dockerfile b/contrib/docker/manylinux-x64/Dockerfile similarity index 100% rename from docker/manylinux-x64/Dockerfile rename to contrib/docker/manylinux-x64/Dockerfile diff --git a/docker/readme.md b/contrib/docker/readme.md similarity index 100% rename from docker/readme.md rename to contrib/docker/readme.md From 4e5a6d213672755c6e52951ddbdec3fbd73f45c2 Mon Sep 17 00:00:00 2001 From: Daan Date: Thu, 9 Jan 2025 23:29:57 -0800 Subject: [PATCH 6/9] initial sources for vcpkg support --- contrib/vcpkg/portfile.cmake | 63 +++++++++++++++++++++++++ contrib/vcpkg/readme.md | 36 ++++++++++++++ contrib/vcpkg/usage | 21 +++++++++ contrib/vcpkg/vcpkg-cmake-wrapper.cmake | 20 ++++++++ contrib/vcpkg/vcpkg.json | 36 ++++++++++++++ 5 files changed, 176 insertions(+) create mode 100644 contrib/vcpkg/portfile.cmake create mode 100644 contrib/vcpkg/readme.md create mode 100644 contrib/vcpkg/usage create mode 100644 contrib/vcpkg/vcpkg-cmake-wrapper.cmake create mode 100644 contrib/vcpkg/vcpkg.json diff --git a/contrib/vcpkg/portfile.cmake b/contrib/vcpkg/portfile.cmake new file mode 100644 index 00000000..47bf30cb --- /dev/null +++ b/contrib/vcpkg/portfile.cmake @@ -0,0 +1,63 @@ +vcpkg_from_github( + OUT_SOURCE_PATH SOURCE_PATH + REPO microsoft/mimalloc + HEAD_REF master + + # The "REF" can be a commit hash, branch name (dev2), or a version (v2.2.1). + # REF "v${VERSION}" + REF 3f91c9f937d9a7b26c130393925e7364a26c7880 + + # The sha512 is the hash of the tar.gz bundle. + # (To get the sha512, run `./vcpkg install mimalloc --overlay-ports=` and copy the sha from the error message.) + SHA512 bb29283e95786c064ce6fa5a36488dafa85f7e979afe3d8fc1361997c978d13557ed27904dda9b8d29c576ad32d7dff5c674dc60c7a5891224e3f1f56bbae73c +) + +vcpkg_check_features(OUT_FEATURE_OPTIONS FEATURE_OPTIONS + FEATURES + c MI_NO_USE_CXX + guarded MI_GUARDED + secure MI_SECURE + override MI_OVERRIDE + xmalloc MI_XMALLOC + asm MI_SEE_ASM +) +string(COMPARE EQUAL "${VCPKG_LIBRARY_LINKAGE}" "static" MI_BUILD_STATIC) +string(COMPARE EQUAL "${VCPKG_LIBRARY_LINKAGE}" "dynamic" MI_BUILD_SHARED) + +vcpkg_cmake_configure( + SOURCE_PATH "${SOURCE_PATH}" + OPTIONS_RELEASE + -DMI_OPT_ARCH=ON + OPTIONS + -DMI_USE_CXX=ON + -DMI_BUILD_TESTS=OFF + -DMI_BUILD_OBJECT=ON + ${FEATURE_OPTIONS} + -DMI_BUILD_STATIC=${MI_BUILD_STATIC} + -DMI_BUILD_SHARED=${MI_BUILD_SHARED} + -DMI_INSTALL_TOPLEVEL=ON +) + +vcpkg_cmake_install() +vcpkg_copy_pdbs() + +file(COPY + "${CMAKE_CURRENT_LIST_DIR}/vcpkg-cmake-wrapper.cmake" + "${CMAKE_CURRENT_LIST_DIR}/usage" + DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}" +) +vcpkg_cmake_config_fixup(CONFIG_PATH lib/cmake/mimalloc) + +if(VCPKG_LIBRARY_LINKAGE STREQUAL "dynamic") + # todo: why is this needed? + vcpkg_replace_string( + "${CURRENT_PACKAGES_DIR}/include/mimalloc.h" + "!defined(MI_SHARED_LIB)" + "0 // !defined(MI_SHARED_LIB)" + ) +endif() +file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include") +file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/share") + +vcpkg_fixup_pkgconfig() +vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/LICENSE") diff --git a/contrib/vcpkg/readme.md b/contrib/vcpkg/readme.md new file mode 100644 index 00000000..d1b366a5 --- /dev/null +++ b/contrib/vcpkg/readme.md @@ -0,0 +1,36 @@ +# Vcpkg support + +This directory is meant to provide the sources for the official [vcpkg port] +of mimalloc, but can also be used to override the official port with +your own variant. + +For example, you can edit the [`portfile.cmake`](portfile.cmake) +to check out a specific commit, version, or branch of mimalloc, or set further options. +You can install such custom port as: +```sh +$ vcpkg install mimalloc --overlay-ports=./contrib/vcpkg +``` + +This will also show the correct sha512 hash if you use a custom version. +See the vcpkg [documentation](https://learn.microsoft.com/en-us/vcpkg/produce/update-package-version) for more information. + + +# Using mimalloc from vcpkg + +When using [cmake with vcpkg](https://learn.microsoft.com/en-us/vcpkg/get_started/get-started?pivots=shell-powershell), +you can use mimalloc from the `CMakeLists.txt` as: + +```cmake +find_package(mimalloc CONFIG REQUIRED) +target_link_libraries(main PRIVATE mimalloc) +``` + + +# Acknowledgements + +The original port for vckpg was contributed by various people, including: @vicroms, @myd7349, @PhoubeHui, @LilyWangL, +@JonLiu1993, @RT2Code, Remy Tassoux, @wangao, @BillyONeal, @jiayuehua, @dg0yt, @gerar-ryan-immersaview, @nickdademo, +and @jimwang118 -- Thank you so much! + + +[vcpkg port]: https://github.com/microsoft/vcpkg/tree/master/ports/mimalloc diff --git a/contrib/vcpkg/usage b/contrib/vcpkg/usage new file mode 100644 index 00000000..08f79c97 --- /dev/null +++ b/contrib/vcpkg/usage @@ -0,0 +1,21 @@ +Use the following CMake targets to import mimalloc: + + find_package(mimalloc CONFIG REQUIRED) + target_link_libraries(main PRIVATE mimalloc) + +And use mimalloc in your sources as: + + #include + #include + int main(int argc, char** argv) { + int* p = mi_malloc_tp(int); + *p = mi_version(); + printf("mimalloc version: %d\n", *p); + mi_free(p); + return 0; + } + +When dynamically overriding on Windows, ensure `mimalloc.dll` is linked +through some call to the mimalloc API, e.g. `mi_version()`, and that +the `mimalloc-redirect.dll` is in the same directory. +See https://github.com/microsoft/mimalloc/blob/dev/bin/readme.md for detailed information. diff --git a/contrib/vcpkg/vcpkg-cmake-wrapper.cmake b/contrib/vcpkg/vcpkg-cmake-wrapper.cmake new file mode 100644 index 00000000..1b355722 --- /dev/null +++ b/contrib/vcpkg/vcpkg-cmake-wrapper.cmake @@ -0,0 +1,20 @@ +_find_package(${ARGS}) + +if(CMAKE_CURRENT_LIST_DIR STREQUAL "${MIMALLOC_CMAKE_DIR}/${MIMALLOC_VERSION_DIR}") + set(MIMALLOC_INCLUDE_DIR "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include") + # As in vcpkg.cmake + if(NOT DEFINED CMAKE_BUILD_TYPE OR CMAKE_BUILD_TYPE MATCHES "^[Dd][Ee][Bb][Uu][Gg]$") + set(MIMALLOC_LIBRARY_DIR "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug/lib") + else() + set(MIMALLOC_LIBRARY_DIR "${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib") + endif() + set(MIMALLOC_OBJECT_DIR "${MIMALLOC_LIBRARY_DIR}") + set(MIMALLOC_TARGET_DIR "${MIMALLOC_LIBRARY_DIR}") +endif() + +# vcpkg always configures either a static or dynamic library. +# ensure to always expose the mimalloc target as either the static or dynamic build. +if(TARGET mimalloc-static AND NOT TARGET mimalloc) + add_library(mimalloc INTERFACE IMPORTED) + set_target_properties(mimalloc PROPERTIES INTERFACE_LINK_LIBRARIES mimalloc-static) +endif() diff --git a/contrib/vcpkg/vcpkg.json b/contrib/vcpkg/vcpkg.json new file mode 100644 index 00000000..69a72edf --- /dev/null +++ b/contrib/vcpkg/vcpkg.json @@ -0,0 +1,36 @@ +{ + "name": "mimalloc", + "version": "1.9.2", + "port-version": 2, + "description": "Compact general purpose allocator with excellent performance", + "homepage": "https://github.com/microsoft/mimalloc", + "license": "MIT", + "supports": "!uwp", + "dependencies": [ + { + "name": "vcpkg-cmake", + "host": true + }, + { + "name": "vcpkg-cmake-config", + "host": true + } + ], + "features": { + "c": { + "description": "Use C11 compilation (this can still override new/delete)" + }, + "override": { + "description": "Override the standard malloc/free interface" + }, + "secure": { + "description": "Use full security mitigations (like guard pages and randomization)" + }, + "xmalloc": { + "description": "If out-of-memory, call abort() instead of returning NULL" + }, + "asm": { + "description": "Generate assembly files" + } + } +} \ No newline at end of file From be05b232e8a51e076aae6d8f4a5c3049ce51cb01 Mon Sep 17 00:00:00 2001 From: Daan Date: Fri, 10 Jan 2025 08:44:31 -0800 Subject: [PATCH 7/9] fix obj path on windows --- CMakeLists.txt | 2 +- contrib/vcpkg/readme.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8eb15a39..68065741 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -634,7 +634,7 @@ if (MI_BUILD_OBJECT) ) # Copy the generated object file (`static.o`) to the output directory (as `mimalloc.o`) - if(WIN32) + if(CMAKE_GENERATOR MATCHES "^Visual Studio.*$") set(mimalloc-obj-static "${CMAKE_CURRENT_BINARY_DIR}/mimalloc-obj.dir/$/static${CMAKE_C_OUTPUT_EXTENSION}") else() set(mimalloc-obj-static "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/mimalloc-obj.dir/src/static.c${CMAKE_C_OUTPUT_EXTENSION}") diff --git a/contrib/vcpkg/readme.md b/contrib/vcpkg/readme.md index d1b366a5..a001cdb0 100644 --- a/contrib/vcpkg/readme.md +++ b/contrib/vcpkg/readme.md @@ -28,7 +28,7 @@ target_link_libraries(main PRIVATE mimalloc) # Acknowledgements -The original port for vckpg was contributed by various people, including: @vicroms, @myd7349, @PhoubeHui, @LilyWangL, +The original port for vckpg was contributed by many people, including: @vicroms, @myd7349, @PhoubeHui, @LilyWangL, @JonLiu1993, @RT2Code, Remy Tassoux, @wangao, @BillyONeal, @jiayuehua, @dg0yt, @gerar-ryan-immersaview, @nickdademo, and @jimwang118 -- Thank you so much! From 11e64c5c42271c316a83b979924a61f7ce535a9f Mon Sep 17 00:00:00 2001 From: daanx Date: Fri, 10 Jan 2025 09:19:08 -0800 Subject: [PATCH 8/9] update vcpkg instructions --- contrib/vcpkg/portfile.cmake | 12 ++++++------ contrib/vcpkg/readme.md | 8 ++++++-- contrib/vcpkg/usage | 5 ++--- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/contrib/vcpkg/portfile.cmake b/contrib/vcpkg/portfile.cmake index 47bf30cb..058ce985 100644 --- a/contrib/vcpkg/portfile.cmake +++ b/contrib/vcpkg/portfile.cmake @@ -2,14 +2,14 @@ vcpkg_from_github( OUT_SOURCE_PATH SOURCE_PATH REPO microsoft/mimalloc HEAD_REF master - + # The "REF" can be a commit hash, branch name (dev2), or a version (v2.2.1). # REF "v${VERSION}" - REF 3f91c9f937d9a7b26c130393925e7364a26c7880 + REF be05b232e8a51e076aae6d8f4a5c3049ce51cb01 - # The sha512 is the hash of the tar.gz bundle. - # (To get the sha512, run `./vcpkg install mimalloc --overlay-ports=` and copy the sha from the error message.) - SHA512 bb29283e95786c064ce6fa5a36488dafa85f7e979afe3d8fc1361997c978d13557ed27904dda9b8d29c576ad32d7dff5c674dc60c7a5891224e3f1f56bbae73c + # The sha512 is the hash of the tar.gz bundle. + # (To get the sha512, run `vcpkg install mimalloc[override] --overlay-ports=` and copy the sha from the error message.) + SHA512 24f640db050d6263e557fe9d024e6c0435762118605c0d04801efbcb32e96382b0b995000715fc0c2dcd67c67825a100a6690ecf0ef097b0a3ae107a82d74f7d ) vcpkg_check_features(OUT_FEATURE_OPTIONS FEATURE_OPTIONS @@ -19,7 +19,7 @@ vcpkg_check_features(OUT_FEATURE_OPTIONS FEATURE_OPTIONS secure MI_SECURE override MI_OVERRIDE xmalloc MI_XMALLOC - asm MI_SEE_ASM + asm MI_SEE_ASM ) string(COMPARE EQUAL "${VCPKG_LIBRARY_LINKAGE}" "static" MI_BUILD_STATIC) string(COMPARE EQUAL "${VCPKG_LIBRARY_LINKAGE}" "dynamic" MI_BUILD_SHARED) diff --git a/contrib/vcpkg/readme.md b/contrib/vcpkg/readme.md index a001cdb0..b1f6047c 100644 --- a/contrib/vcpkg/readme.md +++ b/contrib/vcpkg/readme.md @@ -7,12 +7,14 @@ your own variant. For example, you can edit the [`portfile.cmake`](portfile.cmake) to check out a specific commit, version, or branch of mimalloc, or set further options. You can install such custom port as: + ```sh -$ vcpkg install mimalloc --overlay-ports=./contrib/vcpkg +$ vcpkg install mimalloc[override] --recurse --overlay-ports=./contrib/vcpkg ``` This will also show the correct sha512 hash if you use a custom version. -See the vcpkg [documentation](https://learn.microsoft.com/en-us/vcpkg/produce/update-package-version) for more information. +Another way is to refer to the overlay from the [vcpkg-configuration.json](https://learn.microsoft.com/en-us/vcpkg/reference/vcpkg-configuration-json) file. +See also the vcpkg [documentation](https://learn.microsoft.com/en-us/vcpkg/produce/update-package-version) for more information. # Using mimalloc from vcpkg @@ -25,6 +27,8 @@ find_package(mimalloc CONFIG REQUIRED) target_link_libraries(main PRIVATE mimalloc) ``` +See [`test/CMakeLists.txt](../../test/CMakeLists.txt) for more examples. + # Acknowledgements diff --git a/contrib/vcpkg/usage b/contrib/vcpkg/usage index 08f79c97..7ce649a7 100644 --- a/contrib/vcpkg/usage +++ b/contrib/vcpkg/usage @@ -15,7 +15,6 @@ And use mimalloc in your sources as: return 0; } -When dynamically overriding on Windows, ensure `mimalloc.dll` is linked -through some call to the mimalloc API, e.g. `mi_version()`, and that -the `mimalloc-redirect.dll` is in the same directory. +When dynamically overriding on Windows, ensure `mimalloc.dll` is linked through some call to +mimalloc (e.g. `mi_version()`), and that the `mimalloc-redirect.dll` is in the same directory. See https://github.com/microsoft/mimalloc/blob/dev/bin/readme.md for detailed information. From f4c3a9069ad486abe7bc6b39336750d6648874a9 Mon Sep 17 00:00:00 2001 From: daanx Date: Fri, 10 Jan 2025 09:41:13 -0800 Subject: [PATCH 9/9] update minject -- possible fix for #986 --- bin/minject-arm64.exe | Bin 20992 -> 20992 bytes bin/minject.exe | Bin 22016 -> 22016 bytes bin/minject32.exe | Bin 18944 -> 18944 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/bin/minject-arm64.exe b/bin/minject-arm64.exe index 637c95d91576043ff83cf2f0ceb5a5555c544764..cf1ef0cab3f4b7354e5361b3bfdf02b6d9c6f382 100644 GIT binary patch delta 4120 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 yisQ^gI5G+Rs+y6IdoO=xU-PJCVv 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 DJK#E$ diff --git a/bin/minject32.exe b/bin/minject32.exe index 6dcb8da9ccb189f0e31daf31b06aa9449c840f9d..47cdf41bee7e9e5c5ede99edb97afe59ee328d31 100644 GIT binary patch delta 5762 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 Uz2QkMSI51`9pD;YpEr;B2LO2}sQ>@~ delta 5626 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 Dans$Y