diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6e7a6aca..a9535936 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -89,6 +89,11 @@ if (NOT CMAKE_BUILD_TYPE)
endif()
endif()
+if (CMAKE_GENERATOR MATCHES "^Visual Studio.*$")
+ message(STATUS "Note: when building with Visual Studio the build type is specified when building.")
+ message(STATUS "For example: 'cmake --build . --config=Release")
+endif()
+
if("${CMAKE_BINARY_DIR}" MATCHES ".*(S|s)ecure$")
message(STATUS "Default to secure build")
set(MI_SECURE "ON")
@@ -327,11 +332,11 @@ set(MI_OPT_ARCH_FLAGS "")
set(MI_ARCH "unknown")
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(x86|i[3456]86)$" OR CMAKE_GENERATOR_PLATFORM MATCHES "^(x86|Win32)$")
set(MI_ARCH "x86")
-elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(x86_64|x64|amd64|AMD64)$" OR CMAKE_GENERATOR_PLATFORM STREQUAL "x64")
+elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(x86_64|x64|amd64|AMD64)$" OR CMAKE_GENERATOR_PLATFORM STREQUAL "x64") # must be before arm64
set(MI_ARCH "x64")
-elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64|arm64|armv8.?)$" OR CMAKE_GENERATOR_PLATFORM STREQUAL "ARM64")
+elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64|arm64|armv8.?|ARM64)$" OR CMAKE_GENERATOR_PLATFORM STREQUAL "ARM64")
set(MI_ARCH "arm64")
-elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm|armv[34567])$")
+elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm|armv[34567]|ARM)$")
set(MI_ARCH "arm32")
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(riscv|riscv32|riscv64)$")
if(CMAKE_SIZEOF_VOID_P==4)
@@ -342,7 +347,7 @@ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(riscv|riscv32|riscv64)$")
else()
set(MI_ARCH ${CMAKE_SYSTEM_PROCESSOR})
endif()
-message(STATUS "Architecture: ${MI_ARCH}")
+message(STATUS "Architecture: ${MI_ARCH}") # (${CMAKE_SYSTEM_PROCESSOR}, ${CMAKE_GENERATOR_PLATFORM}, ${CMAKE_GENERATOR})")
# Check /proc/cpuinfo for an SV39 MMU and limit the virtual address bits.
# (this will skip the aligned hinting in that case. Issue #939, #949)
@@ -547,8 +552,14 @@ if(MI_BUILD_SHARED)
)
if(WIN32 AND MI_WIN_REDIRECT)
# On windows, link and copy the mimalloc redirection dll too.
- if(MI_ARCH STREQUAL "x64")
+ if(CMAKE_GENERATOR_PLATFORM STREQUAL "arm64ec")
+ set(MIMALLOC_REDIRECT_SUFFIX "-arm64ec")
+ 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.")
+ endif()
elseif(MI_ARCH STREQUAL "x86")
set(MIMALLOC_REDIRECT_SUFFIX "32")
else()
diff --git a/bin/mimalloc-redirect-arm64.dll b/bin/mimalloc-redirect-arm64.dll
index 2b1d3e35..455f8394 100644
Binary files a/bin/mimalloc-redirect-arm64.dll and b/bin/mimalloc-redirect-arm64.dll differ
diff --git a/bin/mimalloc-redirect-arm64ec.dll b/bin/mimalloc-redirect-arm64ec.dll
new file mode 100644
index 00000000..62569b57
Binary files /dev/null and b/bin/mimalloc-redirect-arm64ec.dll differ
diff --git a/bin/mimalloc-redirect-arm64ec.lib b/bin/mimalloc-redirect-arm64ec.lib
new file mode 100644
index 00000000..eb724d74
Binary files /dev/null and b/bin/mimalloc-redirect-arm64ec.lib differ
diff --git a/bin/mimalloc-redirect.dll b/bin/mimalloc-redirect.dll
index 4702fec0..7d0ec33b 100644
Binary files a/bin/mimalloc-redirect.dll and b/bin/mimalloc-redirect.dll differ
diff --git a/bin/mimalloc-redirect.lib b/bin/mimalloc-redirect.lib
index 7d5f19ce..851455a5 100644
Binary files a/bin/mimalloc-redirect.lib and b/bin/mimalloc-redirect.lib differ
diff --git a/bin/mimalloc-redirect32.dll b/bin/mimalloc-redirect32.dll
index 17c05550..cc661036 100644
Binary files a/bin/mimalloc-redirect32.dll and b/bin/mimalloc-redirect32.dll differ
diff --git a/bin/mimalloc-redirect32.lib b/bin/mimalloc-redirect32.lib
index a7100afc..45d7297d 100644
Binary files a/bin/mimalloc-redirect32.lib and b/bin/mimalloc-redirect32.lib differ
diff --git a/bin/readme.md b/bin/readme.md
index d133eea2..d6c3775f 100644
--- a/bin/readme.md
+++ b/bin/readme.md
@@ -1,28 +1,30 @@
# Windows Override
Dynamically overriding on mimalloc on Windows
-is robust and has the particular advantage to be able to redirect all malloc/free calls that go through
-the (dynamic) C runtime allocator, including those from other DLL's or libraries.
-As it intercepts all allocation calls on a low level, it can be used reliably
+is robust and has the particular advantage to be able to redirect all malloc/free calls
+that go through the (dynamic) C runtime allocator, including those from other DLL's or
+libraries. As it intercepts all allocation calls on a low level, it can be used reliably
on large programs that include other 3rd party components.
-There are four requirements to make the overriding work robustly:
+There are four requirements to make the overriding work well:
1. Use the C-runtime library as a DLL (using the `/MD` or `/MDd` switch).
-2. Link your program explicitly with `mimalloc-override.dll` library.
- To ensure the `mimalloc-override.dll` is loaded at run-time it is easiest to insert some
- call to the mimalloc API in the `main` function, like `mi_version()`
- (or use the `/INCLUDE:mi_version` switch on the linker, or
- use `#pragma comment(linker, "/include:mi_version")` in some source file).
- See the `mimalloc-override-test` project for an example on how to use this.
+2. Link your program explicitly with the `mimalloc-override.lib` export library for
+ the `mimalloc-override.dll` -- which contains all mimalloc functionality.
+ To ensure the `mimalloc-override.dll` is actually loaded at run-time it is easiest
+ to insert some call to the mimalloc API in the `main` function, like `mi_version()`
+ (or use the `/include:mi_version` switch on the linker, or
+ use `#pragma comment(linker, "/include:mi_version")` in some source file).
+ See the `mimalloc-override-test` project for an example on how to use this.
-3. The `mimalloc-redirect.dll` (x64) (or `mimalloc-redirect32.dll` (x86), or `mimalloc-redirect-arm64.dll` (arm64)) must be put
- in the same folder as the main `mimalloc-override.dll` at runtime (as it is a dependency of that DLL).
- The redirection DLL ensures that all calls to the C runtime malloc API get redirected to
- mimalloc functions (which reside in `mimalloc-override.dll`).
+3. The `mimalloc-redirect.dll` must be put in the same folder as the main
+ `mimalloc-override.dll` at runtime (as it is a dependency of that DLL).
+ The redirection DLL ensures that all calls to the C runtime malloc API get
+ redirected to mimalloc functions (which reside in `mimalloc-override.dll`).
4. Ensure the `mimalloc-override.dll` comes as early as possible in the import
list of the final executable (so it can intercept all potential allocations).
+ You can use `minject -l ` to check this if needed.
For best performance on Windows with C++, it
is also recommended to also override the `new`/`delete` operations (by including
@@ -30,19 +32,42 @@ is also recommended to also override the `new`/`delete` operations (by including
a single(!) source file in your project).
The environment variable `MIMALLOC_DISABLE_REDIRECT=1` can be used to disable dynamic
-overriding at run-time. Use `MIMALLOC_VERBOSE=1` to check if mimalloc was successfully redirected.
+overriding at run-time. Use `MIMALLOC_VERBOSE=1` to check if mimalloc was successfully
+redirected.
-## Minject
+### Other Platforms
-We cannot always re-link an executable with `mimalloc-override.dll`, and similarly, we cannot always
-ensure the the DLL comes first in the import table of the final executable.
+You always link with `mimalloc-override.dll` but for different platforms you may
+need a specific `mimalloc-redirect.dll`:
+
+- __x64__: `mimalloc-redirect.dll`.
+- __x86__: `mimalloc-redirect32.dll`. Use for older 32-bit Windows programs.
+- __arm64__: `mimalloc-redirect-arm64.dll`. Use for native Windows arm64 programs.
+- __arm64ec__: `mimalloc-redirect-arm64ec.dll`. The [arm64ec] ABI is "emulation compatible"
+ mode on Windows arm64. Unfortunately we cannot run x64 code emulated on Windows arm64 with
+ the x64 mimalloc override directly (since the C runtime always uses `arm64ec`). Instead:
+ 1. Build the program as normal for x64 and link as normal with the x64
+ `mimalloc-override.lib` export library.
+ 2. Now separately build `mimalloc-override.dll` in `arm64ec` mode and _overwrite_ your
+ previous (x64) `mimalloc-override.dll` -- the loader can handle the mix of arm64ec
+ and x64 code. Now use `mimalloc-redirect-arm64ec.dll` to match your new
+ arm64ec `mimalloc-override.dll`. The main program stays as is and can be fully x64
+ or contain more arm64ec modules. At runtime, the arm64ec `mimalloc-override.dll` will
+ run with native arm64 instructions while the rest of the program runs emulated x64.
+
+[arm64ec]: https://learn.microsoft.com/en-us/windows/arm/arm64ec
+
+
+### Minject
+
+We cannot always re-link an executable with `mimalloc-override.dll`, and similarly, we
+cannot always ensure that the DLL comes first in the import table of the final executable.
In many cases though we can patch existing executables without any recompilation
-if they are linked with the dynamic C runtime (`ucrtbase.dll`) -- just put the `mimalloc-override.dll`
-into the import table (and put `mimalloc-redirect.dll` in the same folder)
-Such patching can be done for example with [CFF Explorer](https://ntcore.com/?page_id=388).
+if they are linked with the dynamic C runtime (`ucrtbase.dll`) -- just put the
+`mimalloc-override.dll` into the import table (and put `mimalloc-redirect.dll` in the same
+directory) Such patching can be done for example with [CFF Explorer](https://ntcore.com/?page_id=388).
The `minject` program can also do this from the command line
-(or `minject32` for 32-bit PE files, or `minject-arm64` on arm64 Windows).
Use `minject --help` for options:
```
@@ -72,3 +97,6 @@ examples:
> minject --list myprogram.exe
> minject --force --inplace myprogram.exe
```
+
+For x86 32-bit binaries, use `minject32`, and for arm64 binaries use `minject-arm64`.
+
diff --git a/ide/vs2022/mimalloc-override-test.vcxproj b/ide/vs2022/mimalloc-override-test.vcxproj
index ff5d53d0..97803b9c 100644
--- a/ide/vs2022/mimalloc-override-test.vcxproj
+++ b/ide/vs2022/mimalloc-override-test.vcxproj
@@ -5,6 +5,10 @@
Debug
ARM64
+
+ Debug
+ ARM64EC
+
Debug
Win32
@@ -13,6 +17,10 @@
Release
ARM64
+
+ Release
+ ARM64EC
+
Release
Win32
@@ -55,6 +63,11 @@
true
v143
+
+ Application
+ true
+ v143
+
Application
false
@@ -67,6 +80,12 @@
v143
true
+
+ Application
+ false
+ v143
+ true
+
@@ -84,12 +103,18 @@
+
+
+
+
+
+
$(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
@@ -107,6 +132,10 @@
$(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
$(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+
$(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
$(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
@@ -115,6 +144,10 @@
$(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
$(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+
Level3
@@ -185,6 +218,30 @@
+
+
+ Level3
+ Disabled
+ true
+ true
+ ..\..\include
+ MultiThreadedDebugDLL
+ Sync
+ Default
+ false
+
+
+ Console
+
+
+ kernel32.lib;%(AdditionalDependencies)
+
+
+
+
+
+
+
Level3
@@ -258,6 +315,31 @@
+
+
+ Level3
+ MaxSpeed
+ true
+ true
+ true
+ true
+ ..\..\include
+ _MBCS;%(PreprocessorDefinitions);NDEBUG
+ MultiThreadedDLL
+
+
+ true
+ true
+ Console
+
+
+ kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
+
+
+
+
+
+
diff --git a/ide/vs2022/mimalloc-override.vcxproj b/ide/vs2022/mimalloc-override.vcxproj
index 426c7be4..90f4d1d3 100644
--- a/ide/vs2022/mimalloc-override.vcxproj
+++ b/ide/vs2022/mimalloc-override.vcxproj
@@ -5,6 +5,10 @@
Debug
ARM64
+
+ Debug
+ ARM64EC
+
Debug
Win32
@@ -13,6 +17,10 @@
Release
ARM64
+
+ Release
+ ARM64EC
+
Release
Win32
@@ -54,6 +62,11 @@
true
v143
+
+ DynamicLibrary
+ true
+ v143
+
DynamicLibrary
false
@@ -64,6 +77,11 @@
false
v143
+
+ DynamicLibrary
+ false
+ v143
+
@@ -81,12 +99,18 @@
+
+
+
+
+
+
$(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\
@@ -112,6 +136,12 @@
.dll
mimalloc-override
+
+ $(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\
+ $(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+ .dll
+ mimalloc-override
+
$(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\
$(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
@@ -124,6 +154,12 @@
.dll
mimalloc-override
+
+ $(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\
+ $(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+ .dll
+ mimalloc-override
+
Level3
@@ -208,6 +244,34 @@
copy mimalloc-redirect-arm64.dll to the output directory
+
+
+ Level3
+ Disabled
+ true
+ true
+ ../../include
+ MI_DEBUG=4;MI_SHARED_LIB;MI_SHARED_LIB_EXPORT;MI_MALLOC_OVERRIDE;%(PreprocessorDefinitions);
+ MultiThreadedDebugDLL
+ false
+ CompileAsCpp
+
+
+ $(ProjectDir)\..\..\bin\mimalloc-redirect-arm64ec.lib;%(AdditionalDependencies)
+
+
+
+
+ Default
+ false
+
+
+ COPY /Y "$(ProjectDir)..\..\bin\mimalloc-redirect-arm64ec.dll" "$(OutputPath)"
+
+
+ copy mimalloc-redirect-arm64ec.dll to the output directory
+
+
Level3
@@ -305,6 +369,39 @@
copy mimalloc-redirect-arm64.dll to the output directory
+
+
+ Level3
+ MaxSpeed
+ true
+ true
+ true
+ ../../include
+ MI_SHARED_LIB;MI_SHARED_LIB_EXPORT;MI_MALLOC_OVERRIDE;%(PreprocessorDefinitions);NDEBUG
+ AssemblyAndSourceCode
+ $(IntDir)
+ false
+ MultiThreadedDLL
+ CompileAsCpp
+ false
+ CPUExtensionRequirementsARMv81
+
+
+ true
+ true
+ $(ProjectDir)\..\..\bin\mimalloc-redirect-arm64ec.lib;%(AdditionalDependencies)
+
+
+ Default
+ false
+
+
+ COPY /Y "$(ProjectDir)..\..\bin\mimalloc-redirect-arm64ec.dll" "$(OutputPath)"
+
+
+ copy mimalloc-redirect-arm64ec.dll to the output directory
+
+
@@ -324,16 +421,20 @@
false
false
false
+ false
false
false
+ false
true
true
true
true
+ true
true
true
+ true
@@ -345,8 +446,10 @@
true
true
true
+ true
true
true
+ true
@@ -358,8 +461,10 @@
true
true
true
+ true
true
true
+ true
@@ -368,8 +473,10 @@
true
true
true
+ true
true
true
+ true
diff --git a/ide/vs2022/mimalloc-test-api.vcxproj b/ide/vs2022/mimalloc-test-api.vcxproj
index babe7f96..27247569 100644
--- a/ide/vs2022/mimalloc-test-api.vcxproj
+++ b/ide/vs2022/mimalloc-test-api.vcxproj
@@ -5,6 +5,10 @@
Debug
ARM64
+
+ Debug
+ ARM64EC
+
Debug
Win32
@@ -13,6 +17,10 @@
Release
ARM64
+
+ Release
+ ARM64EC
+
Release
Win32
@@ -55,6 +63,11 @@
true
v143
+
+ Application
+ true
+ v143
+
Application
false
@@ -67,6 +80,12 @@
v143
true
+
+ Application
+ false
+ v143
+ true
+
@@ -84,12 +103,18 @@
+
+
+
+
+
+
$(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
@@ -107,6 +132,10 @@
$(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
$(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+
$(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
$(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
@@ -115,6 +144,10 @@
$(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
$(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+
Level3
@@ -151,6 +184,18 @@
Console
+
+
+ Level3
+ Disabled
+ true
+ true
+ ..\..\include
+
+
+ Console
+
+
Level3
@@ -202,18 +247,38 @@
Console
+
+
+ Level3
+ MaxSpeed
+ true
+ true
+ true
+ true
+ ..\..\include
+ %(PreprocessorDefinitions);NDEBUG
+
+
+ true
+ true
+ Console
+
+
true
true
true
true
+ true
true
true
+ true
false
false
+ false
diff --git a/ide/vs2022/mimalloc-test-stress.vcxproj b/ide/vs2022/mimalloc-test-stress.vcxproj
index c033aaeb..fd88cd8e 100644
--- a/ide/vs2022/mimalloc-test-stress.vcxproj
+++ b/ide/vs2022/mimalloc-test-stress.vcxproj
@@ -5,6 +5,10 @@
Debug
ARM64
+
+ Debug
+ ARM64EC
+
Debug
Win32
@@ -13,6 +17,10 @@
Release
ARM64
+
+ Release
+ ARM64EC
+
Release
Win32
@@ -55,6 +63,11 @@
true
v143
+
+ Application
+ true
+ v143
+
Application
false
@@ -67,6 +80,12 @@
v143
true
+
+ Application
+ false
+ v143
+ true
+
@@ -84,12 +103,18 @@
+
+
+
+
+
+
$(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
@@ -107,6 +132,10 @@
$(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
$(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+
$(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
$(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
@@ -115,6 +144,10 @@
$(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
$(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+
Level3
@@ -151,6 +184,18 @@
Console
+
+
+ Level3
+ Disabled
+ true
+ true
+ ..\..\include
+
+
+ Console
+
+
Level3
@@ -203,14 +248,34 @@
Console
+
+
+ Level3
+ MaxSpeed
+ true
+ true
+ true
+ true
+ ..\..\include
+ %(PreprocessorDefinitions);NDEBUG
+ CPUExtensionRequirementsARMv81
+
+
+ true
+ true
+ Console
+
+
false
false
false
+ false
false
false
false
+ false
diff --git a/ide/vs2022/mimalloc-test.vcxproj b/ide/vs2022/mimalloc-test.vcxproj
index bfd72287..fc9e9102 100644
--- a/ide/vs2022/mimalloc-test.vcxproj
+++ b/ide/vs2022/mimalloc-test.vcxproj
@@ -5,6 +5,10 @@
Debug
ARM64
+
+ Debug
+ ARM64EC
+
Debug
Win32
@@ -13,6 +17,10 @@
Release
ARM64
+
+ Release
+ ARM64EC
+
Release
Win32
@@ -55,6 +63,11 @@
true
v143
+
+ Application
+ true
+ v143
+
Application
false
@@ -67,6 +80,12 @@
v143
true
+
+ Application
+ false
+ v143
+ true
+
@@ -84,12 +103,18 @@
+
+
+
+
+
+
$(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
@@ -107,6 +132,10 @@
$(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
$(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+
$(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
$(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
@@ -115,6 +144,10 @@
$(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
$(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(Configuration)\
+ $(ProjectDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+
Level3
@@ -154,6 +187,19 @@
Console
+
+
+ Level3
+ Disabled
+ true
+ true
+ ..\..\include
+ stdcpp17
+
+
+ Console
+
+
Level3
@@ -208,6 +254,24 @@
Console
+
+
+ Level3
+ MaxSpeed
+ true
+ true
+ true
+ true
+ ..\..\include
+ _MBCS;%(PreprocessorDefinitions);NDEBUG
+ stdcpp17
+
+
+ true
+ true
+ Console
+
+
{abb5eae7-b3e6-432e-b636-333449892ea6}
diff --git a/ide/vs2022/mimalloc.sln b/ide/vs2022/mimalloc.sln
index e4a6538b..5a55c98b 100644
--- a/ide/vs2022/mimalloc.sln
+++ b/ide/vs2022/mimalloc.sln
@@ -1,7 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
-VisualStudioVersion = 17.12.35527.113 d17.12
+VisualStudioVersion = 17.12.35527.113
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mimalloc", "mimalloc.vcxproj", "{ABB5EAE7-B3E6-432E-B636-333449892EA6}"
EndProject
@@ -18,81 +18,107 @@ EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|ARM64 = Debug|ARM64
+ Debug|ARM64EC = Debug|ARM64EC
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|ARM64 = Release|ARM64
+ Release|ARM64EC = Release|ARM64EC
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{ABB5EAE7-B3E6-432E-B636-333449892EA6}.Debug|ARM64.ActiveCfg = Debug|ARM64
{ABB5EAE7-B3E6-432E-B636-333449892EA6}.Debug|ARM64.Build.0 = Debug|ARM64
+ {ABB5EAE7-B3E6-432E-B636-333449892EA6}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC
+ {ABB5EAE7-B3E6-432E-B636-333449892EA6}.Debug|ARM64EC.Build.0 = Debug|ARM64EC
{ABB5EAE7-B3E6-432E-B636-333449892EA6}.Debug|x64.ActiveCfg = Debug|x64
{ABB5EAE7-B3E6-432E-B636-333449892EA6}.Debug|x64.Build.0 = Debug|x64
{ABB5EAE7-B3E6-432E-B636-333449892EA6}.Debug|x86.ActiveCfg = Debug|Win32
{ABB5EAE7-B3E6-432E-B636-333449892EA6}.Debug|x86.Build.0 = Debug|Win32
{ABB5EAE7-B3E6-432E-B636-333449892EA6}.Release|ARM64.ActiveCfg = Release|ARM64
{ABB5EAE7-B3E6-432E-B636-333449892EA6}.Release|ARM64.Build.0 = Release|ARM64
+ {ABB5EAE7-B3E6-432E-B636-333449892EA6}.Release|ARM64EC.ActiveCfg = Release|ARM64EC
+ {ABB5EAE7-B3E6-432E-B636-333449892EA6}.Release|ARM64EC.Build.0 = Release|ARM64EC
{ABB5EAE7-B3E6-432E-B636-333449892EA6}.Release|x64.ActiveCfg = Release|x64
{ABB5EAE7-B3E6-432E-B636-333449892EA6}.Release|x64.Build.0 = Release|x64
{ABB5EAE7-B3E6-432E-B636-333449892EA6}.Release|x86.ActiveCfg = Release|Win32
{ABB5EAE7-B3E6-432E-B636-333449892EA6}.Release|x86.Build.0 = Release|Win32
{FEF7858F-750E-4C21-A04D-22707CC66878}.Debug|ARM64.ActiveCfg = Debug|ARM64
{FEF7858F-750E-4C21-A04D-22707CC66878}.Debug|ARM64.Build.0 = Debug|ARM64
+ {FEF7858F-750E-4C21-A04D-22707CC66878}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC
+ {FEF7858F-750E-4C21-A04D-22707CC66878}.Debug|ARM64EC.Build.0 = Debug|ARM64EC
{FEF7858F-750E-4C21-A04D-22707CC66878}.Debug|x64.ActiveCfg = Debug|x64
{FEF7858F-750E-4C21-A04D-22707CC66878}.Debug|x64.Build.0 = Debug|x64
{FEF7858F-750E-4C21-A04D-22707CC66878}.Debug|x86.ActiveCfg = Debug|Win32
{FEF7858F-750E-4C21-A04D-22707CC66878}.Debug|x86.Build.0 = Debug|Win32
{FEF7858F-750E-4C21-A04D-22707CC66878}.Release|ARM64.ActiveCfg = Release|ARM64
{FEF7858F-750E-4C21-A04D-22707CC66878}.Release|ARM64.Build.0 = Release|ARM64
+ {FEF7858F-750E-4C21-A04D-22707CC66878}.Release|ARM64EC.ActiveCfg = Release|ARM64EC
+ {FEF7858F-750E-4C21-A04D-22707CC66878}.Release|ARM64EC.Build.0 = Release|ARM64EC
{FEF7858F-750E-4C21-A04D-22707CC66878}.Release|x64.ActiveCfg = Release|x64
{FEF7858F-750E-4C21-A04D-22707CC66878}.Release|x64.Build.0 = Release|x64
{FEF7858F-750E-4C21-A04D-22707CC66878}.Release|x86.ActiveCfg = Release|Win32
{FEF7858F-750E-4C21-A04D-22707CC66878}.Release|x86.Build.0 = Release|Win32
{ABB5EAE7-B3E6-432E-B636-333449892EA7}.Debug|ARM64.ActiveCfg = Debug|ARM64
{ABB5EAE7-B3E6-432E-B636-333449892EA7}.Debug|ARM64.Build.0 = Debug|ARM64
+ {ABB5EAE7-B3E6-432E-B636-333449892EA7}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC
+ {ABB5EAE7-B3E6-432E-B636-333449892EA7}.Debug|ARM64EC.Build.0 = Debug|ARM64EC
{ABB5EAE7-B3E6-432E-B636-333449892EA7}.Debug|x64.ActiveCfg = Debug|x64
{ABB5EAE7-B3E6-432E-B636-333449892EA7}.Debug|x64.Build.0 = Debug|x64
{ABB5EAE7-B3E6-432E-B636-333449892EA7}.Debug|x86.ActiveCfg = Debug|Win32
{ABB5EAE7-B3E6-432E-B636-333449892EA7}.Debug|x86.Build.0 = Debug|Win32
{ABB5EAE7-B3E6-432E-B636-333449892EA7}.Release|ARM64.ActiveCfg = Release|ARM64
{ABB5EAE7-B3E6-432E-B636-333449892EA7}.Release|ARM64.Build.0 = Release|ARM64
+ {ABB5EAE7-B3E6-432E-B636-333449892EA7}.Release|ARM64EC.ActiveCfg = Release|ARM64EC
+ {ABB5EAE7-B3E6-432E-B636-333449892EA7}.Release|ARM64EC.Build.0 = Release|ARM64EC
{ABB5EAE7-B3E6-432E-B636-333449892EA7}.Release|x64.ActiveCfg = Release|x64
{ABB5EAE7-B3E6-432E-B636-333449892EA7}.Release|x64.Build.0 = Release|x64
{ABB5EAE7-B3E6-432E-B636-333449892EA7}.Release|x86.ActiveCfg = Release|Win32
{ABB5EAE7-B3E6-432E-B636-333449892EA7}.Release|x86.Build.0 = Release|Win32
{FEF7868F-750E-4C21-A04D-22707CC66879}.Debug|ARM64.ActiveCfg = Debug|ARM64
{FEF7868F-750E-4C21-A04D-22707CC66879}.Debug|ARM64.Build.0 = Debug|ARM64
+ {FEF7868F-750E-4C21-A04D-22707CC66879}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC
+ {FEF7868F-750E-4C21-A04D-22707CC66879}.Debug|ARM64EC.Build.0 = Debug|ARM64EC
{FEF7868F-750E-4C21-A04D-22707CC66879}.Debug|x64.ActiveCfg = Debug|x64
{FEF7868F-750E-4C21-A04D-22707CC66879}.Debug|x64.Build.0 = Debug|x64
{FEF7868F-750E-4C21-A04D-22707CC66879}.Debug|x86.ActiveCfg = Debug|Win32
{FEF7868F-750E-4C21-A04D-22707CC66879}.Debug|x86.Build.0 = Debug|Win32
{FEF7868F-750E-4C21-A04D-22707CC66879}.Release|ARM64.ActiveCfg = Release|ARM64
{FEF7868F-750E-4C21-A04D-22707CC66879}.Release|ARM64.Build.0 = Release|ARM64
+ {FEF7868F-750E-4C21-A04D-22707CC66879}.Release|ARM64EC.ActiveCfg = Release|ARM64EC
+ {FEF7868F-750E-4C21-A04D-22707CC66879}.Release|ARM64EC.Build.0 = Release|ARM64EC
{FEF7868F-750E-4C21-A04D-22707CC66879}.Release|x64.ActiveCfg = Release|x64
{FEF7868F-750E-4C21-A04D-22707CC66879}.Release|x64.Build.0 = Release|x64
{FEF7868F-750E-4C21-A04D-22707CC66879}.Release|x86.ActiveCfg = Release|Win32
{FEF7868F-750E-4C21-A04D-22707CC66879}.Release|x86.Build.0 = Release|Win32
{FEF7958F-750E-4C21-A04D-22707CC66878}.Debug|ARM64.ActiveCfg = Debug|ARM64
{FEF7958F-750E-4C21-A04D-22707CC66878}.Debug|ARM64.Build.0 = Debug|ARM64
+ {FEF7958F-750E-4C21-A04D-22707CC66878}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC
+ {FEF7958F-750E-4C21-A04D-22707CC66878}.Debug|ARM64EC.Build.0 = Debug|ARM64EC
{FEF7958F-750E-4C21-A04D-22707CC66878}.Debug|x64.ActiveCfg = Debug|x64
{FEF7958F-750E-4C21-A04D-22707CC66878}.Debug|x64.Build.0 = Debug|x64
{FEF7958F-750E-4C21-A04D-22707CC66878}.Debug|x86.ActiveCfg = Debug|Win32
{FEF7958F-750E-4C21-A04D-22707CC66878}.Debug|x86.Build.0 = Debug|Win32
{FEF7958F-750E-4C21-A04D-22707CC66878}.Release|ARM64.ActiveCfg = Release|ARM64
{FEF7958F-750E-4C21-A04D-22707CC66878}.Release|ARM64.Build.0 = Release|ARM64
+ {FEF7958F-750E-4C21-A04D-22707CC66878}.Release|ARM64EC.ActiveCfg = Release|ARM64EC
+ {FEF7958F-750E-4C21-A04D-22707CC66878}.Release|ARM64EC.Build.0 = Release|ARM64EC
{FEF7958F-750E-4C21-A04D-22707CC66878}.Release|x64.ActiveCfg = Release|x64
{FEF7958F-750E-4C21-A04D-22707CC66878}.Release|x64.Build.0 = Release|x64
{FEF7958F-750E-4C21-A04D-22707CC66878}.Release|x86.ActiveCfg = Release|Win32
{FEF7958F-750E-4C21-A04D-22707CC66878}.Release|x86.Build.0 = Release|Win32
{FFF7958F-750E-4C21-A04D-22707CC66878}.Debug|ARM64.ActiveCfg = Debug|ARM64
{FFF7958F-750E-4C21-A04D-22707CC66878}.Debug|ARM64.Build.0 = Debug|ARM64
+ {FFF7958F-750E-4C21-A04D-22707CC66878}.Debug|ARM64EC.ActiveCfg = Debug|ARM64EC
+ {FFF7958F-750E-4C21-A04D-22707CC66878}.Debug|ARM64EC.Build.0 = Debug|ARM64EC
{FFF7958F-750E-4C21-A04D-22707CC66878}.Debug|x64.ActiveCfg = Debug|x64
{FFF7958F-750E-4C21-A04D-22707CC66878}.Debug|x64.Build.0 = Debug|x64
{FFF7958F-750E-4C21-A04D-22707CC66878}.Debug|x86.ActiveCfg = Debug|Win32
{FFF7958F-750E-4C21-A04D-22707CC66878}.Debug|x86.Build.0 = Debug|Win32
{FFF7958F-750E-4C21-A04D-22707CC66878}.Release|ARM64.ActiveCfg = Release|ARM64
{FFF7958F-750E-4C21-A04D-22707CC66878}.Release|ARM64.Build.0 = Release|ARM64
+ {FFF7958F-750E-4C21-A04D-22707CC66878}.Release|ARM64EC.ActiveCfg = Release|ARM64EC
+ {FFF7958F-750E-4C21-A04D-22707CC66878}.Release|ARM64EC.Build.0 = Release|ARM64EC
{FFF7958F-750E-4C21-A04D-22707CC66878}.Release|x64.ActiveCfg = Release|x64
{FFF7958F-750E-4C21-A04D-22707CC66878}.Release|x64.Build.0 = Release|x64
{FFF7958F-750E-4C21-A04D-22707CC66878}.Release|x86.ActiveCfg = Release|Win32
diff --git a/ide/vs2022/mimalloc.vcxproj b/ide/vs2022/mimalloc.vcxproj
index 2ac86259..e631051b 100644
--- a/ide/vs2022/mimalloc.vcxproj
+++ b/ide/vs2022/mimalloc.vcxproj
@@ -5,6 +5,10 @@
Debug
ARM64
+
+ Debug
+ ARM64EC
+
Debug
Win32
@@ -13,6 +17,10 @@
Release
ARM64
+
+ Release
+ ARM64EC
+
Release
Win32
@@ -55,6 +63,11 @@
true
v143
+
+ StaticLibrary
+ true
+ v143
+
StaticLibrary
false
@@ -67,6 +80,12 @@
v143
true
+
+ StaticLibrary
+ false
+ v143
+ true
+
@@ -84,12 +103,18 @@
+
+
+
+
+
+
$(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\
@@ -115,6 +140,12 @@
.lib
mimalloc-static
+
+ $(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\
+ $(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+ .lib
+ mimalloc-static
+
$(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\
$(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
@@ -127,6 +158,12 @@
.lib
mimalloc-static
+
+ $(SolutionDir)..\..\out\msvc-$(Platform)\$(Configuration)\
+ $(SolutionDir)..\..\out\msvc-$(Platform)\$(ProjectName)\$(Configuration)\
+ .lib
+ mimalloc-static
+
Level4
@@ -200,6 +237,33 @@
+
+
+ Level4
+ Disabled
+ true
+ Default
+ ../../include
+ MI_DEBUG=3;MI_GUARDED=0;%(PreprocessorDefinitions);
+ CompileAsCpp
+ false
+ stdcpp20
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Level4
@@ -299,22 +363,62 @@
+
+
+ Level4
+ MaxSpeed
+ true
+ Default
+ ../../include
+ %(PreprocessorDefinitions);NDEBUG
+ AssemblyAndSourceCode
+ $(IntDir)
+ false
+ false
+ Default
+ CompileAsCpp
+ true
+ stdcpp20
+ CPUExtensionRequirementsARMv81
+ Sync
+
+
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
false
false
false
+ false
false
false
false
+ false
true
true
true
true
+ true
true
true
+ true
@@ -323,14 +427,17 @@
false
false
+ false
true
true
+ true
true
true
true
true
+ true
@@ -342,8 +449,10 @@
true
true
true
+ true
true
true
+ true
@@ -351,8 +460,10 @@
true
true
true
+ true
true
true
+ true
diff --git a/include/mimalloc/bits.h b/include/mimalloc/bits.h
index c0405d6f..32b9d528 100644
--- a/include/mimalloc/bits.h
+++ b/include/mimalloc/bits.h
@@ -73,12 +73,12 @@ typedef int32_t mi_ssize_t;
Architecture
-------------------------------------------------------------------------------- */
-#if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64)
+#if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) // consider arm64ec as arm64
+#define MI_ARCH_ARM64 1
+#elif defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64)
#define MI_ARCH_X64 1
#elif defined(__i386__) || defined(__i386) || defined(_M_IX86) || defined(_X86_) || defined(__X86__)
#define MI_ARCH_X86 1
-#elif defined(__aarch64__) || defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC)
-#define MI_ARCH_ARM64 1
#elif defined(__arm__) || defined(_ARM) || defined(_M_ARM) || defined(_M_ARMT) || defined(__arm)
#define MI_ARCH_ARM32 1
#elif defined(__riscv) || defined(_M_RISCV)
@@ -97,10 +97,10 @@ typedef int32_t mi_ssize_t;
#include
#endif
-#if defined(__AVX2__) && !defined(__BMI2__) // msvc
+#if MI_ARCH_X64 && defined(__AVX2__) && !defined(__BMI2__) // msvc
#define __BMI2__ 1
#endif
-#if (defined(__AVX2__) || defined(__BMI2__)) && !defined(__BMI1__) // msvc
+#if MI_ARCH_X64 && (defined(__AVX2__) || defined(__BMI2__)) && !defined(__BMI1__) // msvc
#define __BMI1__ 1
#endif
@@ -177,8 +177,6 @@ static inline size_t mi_ctz(size_t x) {
size_t r;
__asm ("tzcnt\t%1, %0" : "=r"(r) : "r"(x) : "cc");
return r;
- #elif MI_ARCH_X64 && defined(__BMI1__)
- return (size_t)_tzcnt_u64(x);
#elif defined(_MSC_VER) && (MI_ARCH_X64 || MI_ARCH_X86 || MI_ARCH_ARM64 || MI_ARCH_ARM32)
unsigned long idx;
return (mi_msc_builtinz(_BitScanForward)(&idx, x) ? (size_t)idx : MI_SIZE_BITS);
@@ -202,8 +200,6 @@ static inline size_t mi_clz(size_t x) {
size_t r;
__asm ("lzcnt\t%1, %0" : "=r"(r) : "r"(x) : "cc");
return r;
- #elif MI_ARCH_X64 && defined(__BMI1__)
- return (size_t)_lzcnt_u64(x);
#elif defined(_MSC_VER) && (MI_ARCH_X64 || MI_ARCH_X86 || MI_ARCH_ARM64 || MI_ARCH_ARM32)
unsigned long idx;
return (mi_msc_builtinz(_BitScanReverse)(&idx, x) ? MI_SIZE_BITS - 1 - (size_t)idx : MI_SIZE_BITS);
diff --git a/readme.md b/readme.md
index a0296b43..564ac6d7 100644
--- a/readme.md
+++ b/readme.md
@@ -164,7 +164,7 @@ The `mimalloc` project builds a static library (in `out/msvc-x64`), while the
`mimalloc-override` project builds a DLL for overriding malloc
in the entire program.
-## macOS, Linux, BSD, etc.
+## Linux, macOS, BSD, etc.
We use [`cmake`](https://cmake.org)1 as the build system:
@@ -200,13 +200,26 @@ free lists, etc., as:
> make
```
This will name the shared library as `libmimalloc-secure.so`.
-Use `ccmake`2 instead of `cmake`
-to see and customize all the available build options.
+Use `cmake ../.. -LH` to see all the available build options.
-Notes:
-1. Install CMake: `sudo apt-get install cmake`
-2. Install CCMake: `sudo apt-get install cmake-curses-gui`
+The examples use the default compiler. If you like to use another, use:
+```
+> CC=clang CXX=clang++ cmake ../..
+```
+## Cmake with Visual Studio
+
+You can also use cmake on Windows. Open a Visual Studio development prompt
+and invoke `cmake` with the right [generator](https://cmake.org/cmake/help/latest/generator/Visual%20Studio%2017%202022.html)
+and architecture, like:
+```
+> cmake ..\.. -G "Visual Studio 17 2022" -A x64 -DMI_OVERRIDE=ON
+```
+
+The cmake build type is specified when actually building, for example:
+```
+> cmake --build . --config=Release
+```
## Single source
diff --git a/test/main-override.cpp b/test/main-override.cpp
index af7f5b6f..bc1a1125 100644
--- a/test/main-override.cpp
+++ b/test/main-override.cpp
@@ -47,6 +47,7 @@ int main() {
mi_stats_reset(); // ignore earlier allocations
various_tests();
test_mixed1();
+
//test_std_string();
//test_thread_local();
// heap_thread_free_huge();
@@ -107,6 +108,9 @@ static void various_tests() {
t = new (tbuf) Test(42);
t->~Test();
delete[] tbuf;
+
+ const char* ptr = ::_Getdays(); // test _base overrid
+ free((void*)ptr);
}
class Static {