Skip to content

Commit 64fa6e2

Browse files
committed
fixup! mimalloc: offer a build-time option to enable it
By defining `USE_MIMALLOC`, Git can now be compiled with that nicely-fast and small allocator. Note that we have to disable a couple `DEVELOPER` options to build mimalloc's source code, as it makes heavy use of declarations after statements, among other things that disagree with Git's conventions. We even have to silence some GCC warnings in non-DEVELOPER mode. For example, the `-Wno-array-bounds` flag is needed because in `-O2` builds, trying to call `NtCurrentTeb()` (which `_mi_thread_id()` does on Windows) causes the bogus warning about a system header, likely related to https://sourceforge.net/p/mingw-w64/mailman/message/37674519/ and to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99578: C:/git-sdk-64-minimal/mingw64/include/psdk_inc/intrin-impl.h:838:1: error: array subscript 0 is outside array bounds of 'long long unsigned int[0]' [-Werror=array-bounds] 838 | __buildreadseg(__readgsqword, unsigned __int64, "gs", "q") | ^~~~~~~~~~~~~~ Also: The `mimalloc` library uses C11-style atomics, therefore we must require that standard when compiling with GCC if we want to use `mimalloc` (instead of requiring "only" C99). This is what we do in the CMake definition already, therefore this commit does not need to touch `contrib/buildsystems/`. Signed-off-by: Johannes Schindelin <[email protected]>
1 parent ab1a8a0 commit 64fa6e2

File tree

4 files changed

+50
-1
lines changed

4 files changed

+50
-1
lines changed

Makefile

+37
Original file line numberDiff line numberDiff line change
@@ -2076,6 +2076,43 @@ ifdef USE_NED_ALLOCATOR
20762076
OVERRIDE_STRDUP = YesPlease
20772077
endif
20782078

2079+
ifdef USE_MIMALLOC
2080+
MIMALLOC_OBJS = \
2081+
compat/mimalloc/alloc-aligned.o \
2082+
compat/mimalloc/alloc.o \
2083+
compat/mimalloc/arena.o \
2084+
compat/mimalloc/bitmap.o \
2085+
compat/mimalloc/heap.o \
2086+
compat/mimalloc/init.o \
2087+
compat/mimalloc/options.o \
2088+
compat/mimalloc/os.o \
2089+
compat/mimalloc/page.o \
2090+
compat/mimalloc/random.o \
2091+
compat/mimalloc/prim/windows/prim.o \
2092+
compat/mimalloc/segment.o \
2093+
compat/mimalloc/segment-cache.o \
2094+
compat/mimalloc/segment-map.o \
2095+
compat/mimalloc/stats.o
2096+
2097+
COMPAT_CFLAGS += -Icompat/mimalloc -DMI_DEBUG=0 -DUSE_MIMALLOC --std=gnu11
2098+
COMPAT_OBJS += $(MIMALLOC_OBJS)
2099+
2100+
$(MIMALLOC_OBJS): COMPAT_CFLAGS += -DBANNED_H
2101+
2102+
$(MIMALLOC_OBJS): COMPAT_CFLAGS += \
2103+
-Wno-attributes \
2104+
-Wno-unknown-pragmas \
2105+
-Wno-array-bounds
2106+
2107+
ifdef DEVELOPER
2108+
$(MIMALLOC_OBJS): COMPAT_CFLAGS += \
2109+
-Wno-pedantic \
2110+
-Wno-declaration-after-statement \
2111+
-Wno-old-style-definition \
2112+
-Wno-missing-prototypes
2113+
endif
2114+
endif
2115+
20792116
ifdef OVERRIDE_STRDUP
20802117
COMPAT_CFLAGS += -DOVERRIDE_STRDUP
20812118
COMPAT_OBJS += compat/strdup.o

config.mak.dev

+2
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@ endif
2222

2323
ifneq ($(uname_S),FreeBSD)
2424
ifneq ($(or $(filter gcc6,$(COMPILER_FEATURES)),$(filter clang7,$(COMPILER_FEATURES))),)
25+
ifndef USE_MIMALLOC
2526
DEVELOPER_CFLAGS += -std=gnu99
2627
endif
28+
endif
2729
else
2830
# FreeBSD cannot limit to C99 because its system headers unconditionally
2931
# rely on C11 features.

config.mak.uname

+1-1
Original file line numberDiff line numberDiff line change
@@ -482,7 +482,7 @@ endif
482482
CC = compat/vcbuild/scripts/clink.pl
483483
AR = compat/vcbuild/scripts/lib.pl
484484
CFLAGS =
485-
BASIC_CFLAGS = -nologo -I. -Icompat/vcbuild/include -DWIN32 -D_CONSOLE -DHAVE_STRING_H -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE
485+
BASIC_CFLAGS = -nologo -I. -Icompat/vcbuild/include -DWIN32 -D_CONSOLE -DHAVE_STRING_H -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE -MP -std:c11
486486
COMPAT_OBJS = compat/msvc.o compat/winansi.o \
487487
compat/win32/flush.o \
488488
compat/win32/path-utils.o \

git-compat-util.h

+10
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,16 @@ char *gitdirname(char *);
408408
# include <sys/sysinfo.h>
409409
#endif
410410

411+
#ifdef USE_MIMALLOC
412+
#include "mimalloc.h"
413+
#define malloc mi_malloc
414+
#define calloc mi_calloc
415+
#define realloc mi_realloc
416+
#define free mi_free
417+
#define strdup mi_strdup
418+
#define strndup mi_strndup
419+
#endif
420+
411421
/* On most systems <netdb.h> would have given us this, but
412422
* not on some systems (e.g. z/OS).
413423
*/

0 commit comments

Comments
 (0)