From 95a819649076abe2d9f4489db5b084d221ffdd6a Mon Sep 17 00:00:00 2001 From: Daan Date: Thu, 3 Feb 2022 19:15:10 -0800 Subject: [PATCH] fix compilation on macOS --- include/mimalloc-types.h | 2 +- src/init.c | 2 +- src/options.c | 62 ++++++++++++++++++++++++++-------------- 3 files changed, 42 insertions(+), 24 deletions(-) diff --git a/include/mimalloc-types.h b/include/mimalloc-types.h index 2acabfaf..79beb176 100644 --- a/include/mimalloc-types.h +++ b/include/mimalloc-types.h @@ -65,7 +65,7 @@ terms of the MIT license. A copy of the license can be found in the file #endif #if !defined(MI_DEBUG_TRACE_LEN) -#define MI_DEBUG_TRACE_LEN (7) // store up to N frames if tracing is enabled +#define MI_DEBUG_TRACE_LEN (8) // store up to N frames if tracing is enabled #endif #if !defined(MI_PADDING_EXTRA) // use extra padding bytes? (so a stack trace can be preserved or next block corruption prevented) diff --git a/src/init.c b/src/init.c index ce932cd6..938f8101 100644 --- a/src/init.c +++ b/src/init.c @@ -434,7 +434,7 @@ static void mi_allocator_done(void) { // Called once by the process loader static void mi_process_load(void) { mi_heap_main_init(); - #if defined(MI_TLS_RECURSE_GUARD) + #if defined(__APPLE__) || defined(MI_TLS_RECURSE_GUARD) volatile mi_heap_t* dummy = _mi_heap_default; // access TLS to allocate it before setting tls_initialized to true; MI_UNUSED(dummy); #endif diff --git a/src/options.c b/src/options.c index db7b2eaa..911775bb 100644 --- a/src/options.c +++ b/src/options.c @@ -375,22 +375,31 @@ void _mi_stack_trace_capture(void** strace, size_t len, size_t skip) { void _mi_stack_trace_print(const char* msg, void** strace, size_t len, const mi_block_t* block, size_t bsize, size_t avail) { _mi_fprintf(NULL, NULL, "trace %s at %p of size %zu (%zub usable), allocated at:\n", (msg==NULL ? "block" : msg), block, avail, bsize); - PSYMBOL_INFO info = (PSYMBOL_INFO)_malloca(sizeof(SYMBOL_INFO) + 256 * sizeof(TCHAR)); - if (info==NULL) return; - memset(info, 0, sizeof(info)); - info->MaxNameLen = 255; - info->SizeOfStruct = sizeof(SYMBOL_INFO); - HANDLE current_process = GetCurrentProcess(); - if (!SymInitialize(current_process, NULL, TRUE)) return; - for (size_t i = 0; i < len && strace[i] != NULL; i++) { - if (SymFromAddr(current_process, (DWORD64)(strace[i]), 0, info)) { - _mi_fprintf(NULL, NULL, " %2zu: %8p: %s\n", i, strace[i], info->Name); - } - else { - _mi_fprintf(NULL, NULL, " %2zu: %8p: \n", i, strace[i], GetLastError()); - } - } - SymCleanup(current_process); + uintptr_t uninit = 0; + for( size_t i = 0; i < MI_INTPTR_SIZE; i++ ) { + uninit = (uninit << 8) | MI_DEBUG_UNINIT; + } + if (strace == NULL || uninit == (uintptr_t)strace[0]) { + _mi_fprintf(NULL, NULL, " (uninitialized trace)\n"); + } + else { + PSYMBOL_INFO info = (PSYMBOL_INFO)_malloca(sizeof(SYMBOL_INFO) + 256 * sizeof(TCHAR)); + if (info==NULL) return; + memset(info, 0, sizeof(info)); + info->MaxNameLen = 255; + info->SizeOfStruct = sizeof(SYMBOL_INFO); + HANDLE current_process = GetCurrentProcess(); + if (!SymInitialize(current_process, NULL, TRUE)) return; + for (size_t i = 0; i < len && strace[i] != NULL; i++) { + if (SymFromAddr(current_process, (DWORD64)(strace[i]), 0, info)) { + _mi_fprintf(NULL, NULL, " %2zu: %8p: %s\n", i, strace[i], info->Name); + } + else { + _mi_fprintf(NULL, NULL, " %2zu: %8p: \n", i, strace[i], GetLastError()); + } + } + SymCleanup(current_process); + } } #elif (MI_DEBUG_TRACE > 0) && (defined(__linux__) || defined(__FreeBSD__) || defined(__APPLE__)) #include @@ -413,13 +422,22 @@ void _mi_stack_trace_capture(void** strace, size_t len, size_t skip) { void _mi_stack_trace_print(const char* msg, void** strace, size_t len, const mi_block_t* block, size_t bsize, size_t avail) { _mi_fprintf(NULL, NULL, "trace %s at %p of size %zu (%zub usable), allocated at:\n", (msg==NULL ? "block" : msg), block, avail, bsize); - while( len > 0 && strace[len-1] == NULL) { len--; } - if (len == 0) return; - char** names = backtrace_symbols(strace, len); - for (size_t i = 0; i < len && strace[i] != NULL; i++) { - _mi_fprintf(NULL, NULL, " %2zu: %8p: %s\n", i, strace[i], (names == NULL || names[i] == NULL ? "" : names[i])); + uintptr_t uninit = 0; + for( size_t i = 0; i < MI_INTPTR_SIZE; i++ ) { + uninit = (uninit << 8) | MI_DEBUG_UNINIT; + } + if (strace == NULL || uninit == (uintptr_t)strace[0]) { + _mi_fprintf(NULL, NULL, " (uninitialized trace)\n"); + } + else { + while( len > 0 && strace[len-1] == NULL) { len--; } + if (len == 0) return; + char** names = backtrace_symbols(strace, len); + for (size_t i = 0; i < len && strace[i] != NULL; i++) { + _mi_fprintf(NULL, NULL, " %2zu: %8p: %s\n", i, strace[i], (names == NULL || names[i] == NULL ? "" : names[i])); + } + // free(names); // avoid potential recursion and leak the trace } - // free(names); // avoid potential recursion and leak the trace } #else void _mi_stack_trace_capture(void** strace, size_t len, size_t skip) {