From 40d8ec4be9e207735d6ba4fb161d92d3f1f51c68 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Fri, 10 Oct 2025 17:06:26 +0200 Subject: [PATCH] cmake: cannot use CheckSymbolExists for _alloca _alloca is an intrinsic function on MSVC, which means it has no address and is no symbol. Hence CheckSymbolExists will always fail finding it. --- CMakeLists.txt | 9 ++++++++- cmake/PreseedEmscriptenCache.cmake | 1 + cmake/PreseedMSVCCache.cmake | 3 ++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 77892a2203..f26a33a675 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1005,7 +1005,14 @@ set(SDL_DISABLE_ALLOCA 0) check_include_file("alloca.h" "HAVE_ALLOCA_H") if(MSVC) check_include_file("malloc.h" "HAVE_MALLOC_H") - check_symbol_exists("_alloca" "malloc.h" _ALLOCA_IN_MALLOC_H) + # Cannot use CheckSymbolExists for _alloca: purely intrinsic functions have no address (C7552) + if(NOT DEFINED _ALLOCA_IN_MALLOC_H) + message(STATUS "Looking for _alloca in malloc.h") + set(testsrc "${CMAKE_CURRENT_SOURCE_DIR}/test_malloc_alloca.c") + file(WRITE "${testsrc}" "#include \n\nint main(int argc, char *argv[]) { void *ptr = _alloca(argc * (int)argv[0][0]); return ptr != (void *)0; }") + try_compile(_ALLOCA_IN_MALLOC_H "${CMAKE_CURRENT_BINARY_DIR}/alloca_in_malloc_h" SOURCES "${testsrc}") + message(STATUS "Looking for _alloca in malloc.h - ${_ALLOCA_IN_MALLOC_H}") + endif() if(NOT HAVE_ALLOCA_H AND NOT _ALLOCA_IN_MALLOC_H) set(SDL_DISABLE_ALLOCA 1) endif() diff --git a/cmake/PreseedEmscriptenCache.cmake b/cmake/PreseedEmscriptenCache.cmake index 5a34ab5ac2..ea0f04beb6 100644 --- a/cmake/PreseedEmscriptenCache.cmake +++ b/cmake/PreseedEmscriptenCache.cmake @@ -4,6 +4,7 @@ if(EMSCRIPTEN) set(HAVE_ALLOCA_H "1" CACHE INTERNAL "Have include alloca.h") set(HAVE_LIBM "1" CACHE INTERNAL "Have library m") set(HAVE_MALLOC "1" CACHE INTERNAL "Have include malloc.h") + set(HAVE_MALLOC_H "1" CACHE INTERNAL "Have include malloc.h") set(LIBC_HAS_ABS "1" CACHE INTERNAL "Have symbol abs") set(LIBC_HAS_ACOS "1" CACHE INTERNAL "Have symbol acos") set(LIBC_HAS_ACOSF "1" CACHE INTERNAL "Have symbol acosf") diff --git a/cmake/PreseedMSVCCache.cmake b/cmake/PreseedMSVCCache.cmake index e6fe70a335..81f7d01ed4 100644 --- a/cmake/PreseedMSVCCache.cmake +++ b/cmake/PreseedMSVCCache.cmake @@ -21,6 +21,7 @@ if(MSVC) set(HAVE_DXGI_H "1" CACHE INTERNAL "Have include dxgi.h") set(HAVE_LIBM "" CACHE INTERNAL "Have library m") set(HAVE_MALLOC "1" CACHE INTERNAL "Have include malloc.h") + set(HAVE_MALLOC_H "1" CACHE INTERNAL "Have include malloc.h") set(HAVE_MMDEVICEAPI_H "1" CACHE INTERNAL "Have include mmdeviceapi.h") set(HAVE_SENSORSAPI_H "1" CACHE INTERNAL "Have include sensorsapi.h") set(HAVE_SHELLSCALINGAPI_H "1" CACHE INTERNAL "Have include shellscalingapi.h") @@ -157,7 +158,7 @@ if(MSVC) set(LIBC_HAS__ULTOA "1" CACHE INTERNAL "Have symbol _ultoa") set(LIBC_HAS__WCSDUP "1" CACHE INTERNAL "Have symbol _wcsdup") set(LIBC_IS_GLIBC "" CACHE INTERNAL "Have symbol __GLIBC__") - set(_ALLOCA_IN_MALLOC_H "" CACHE INTERNAL "Have symbol _alloca") + set(_ALLOCA_IN_MALLOC_H "1" CACHE INTERNAL "Have symbol _alloca") if(CHECK_CPU_ARCHITECTURE_X86) set(COMPILER_SUPPORTS_AVX "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_AVX")