Skip to content

Commit 40d8ec4

Browse files
committed
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.
1 parent 6677fad commit 40d8ec4

File tree

3 files changed

+11
-2
lines changed

3 files changed

+11
-2
lines changed

CMakeLists.txt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1005,7 +1005,14 @@ set(SDL_DISABLE_ALLOCA 0)
10051005
check_include_file("alloca.h" "HAVE_ALLOCA_H")
10061006
if(MSVC)
10071007
check_include_file("malloc.h" "HAVE_MALLOC_H")
1008-
check_symbol_exists("_alloca" "malloc.h" _ALLOCA_IN_MALLOC_H)
1008+
# Cannot use CheckSymbolExists for _alloca: purely intrinsic functions have no address (C7552)
1009+
if(NOT DEFINED _ALLOCA_IN_MALLOC_H)
1010+
message(STATUS "Looking for _alloca in malloc.h")
1011+
set(testsrc "${CMAKE_CURRENT_SOURCE_DIR}/test_malloc_alloca.c")
1012+
file(WRITE "${testsrc}" "#include <malloc.h>\n\nint main(int argc, char *argv[]) { void *ptr = _alloca(argc * (int)argv[0][0]); return ptr != (void *)0; }")
1013+
try_compile(_ALLOCA_IN_MALLOC_H "${CMAKE_CURRENT_BINARY_DIR}/alloca_in_malloc_h" SOURCES "${testsrc}")
1014+
message(STATUS "Looking for _alloca in malloc.h - ${_ALLOCA_IN_MALLOC_H}")
1015+
endif()
10091016
if(NOT HAVE_ALLOCA_H AND NOT _ALLOCA_IN_MALLOC_H)
10101017
set(SDL_DISABLE_ALLOCA 1)
10111018
endif()

cmake/PreseedEmscriptenCache.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ if(EMSCRIPTEN)
44
set(HAVE_ALLOCA_H "1" CACHE INTERNAL "Have include alloca.h")
55
set(HAVE_LIBM "1" CACHE INTERNAL "Have library m")
66
set(HAVE_MALLOC "1" CACHE INTERNAL "Have include malloc.h")
7+
set(HAVE_MALLOC_H "1" CACHE INTERNAL "Have include malloc.h")
78
set(LIBC_HAS_ABS "1" CACHE INTERNAL "Have symbol abs")
89
set(LIBC_HAS_ACOS "1" CACHE INTERNAL "Have symbol acos")
910
set(LIBC_HAS_ACOSF "1" CACHE INTERNAL "Have symbol acosf")

cmake/PreseedMSVCCache.cmake

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ if(MSVC)
2121
set(HAVE_DXGI_H "1" CACHE INTERNAL "Have include dxgi.h")
2222
set(HAVE_LIBM "" CACHE INTERNAL "Have library m")
2323
set(HAVE_MALLOC "1" CACHE INTERNAL "Have include malloc.h")
24+
set(HAVE_MALLOC_H "1" CACHE INTERNAL "Have include malloc.h")
2425
set(HAVE_MMDEVICEAPI_H "1" CACHE INTERNAL "Have include mmdeviceapi.h")
2526
set(HAVE_SENSORSAPI_H "1" CACHE INTERNAL "Have include sensorsapi.h")
2627
set(HAVE_SHELLSCALINGAPI_H "1" CACHE INTERNAL "Have include shellscalingapi.h")
@@ -157,7 +158,7 @@ if(MSVC)
157158
set(LIBC_HAS__ULTOA "1" CACHE INTERNAL "Have symbol _ultoa")
158159
set(LIBC_HAS__WCSDUP "1" CACHE INTERNAL "Have symbol _wcsdup")
159160
set(LIBC_IS_GLIBC "" CACHE INTERNAL "Have symbol __GLIBC__")
160-
set(_ALLOCA_IN_MALLOC_H "" CACHE INTERNAL "Have symbol _alloca")
161+
set(_ALLOCA_IN_MALLOC_H "1" CACHE INTERNAL "Have symbol _alloca")
161162

162163
if(CHECK_CPU_ARCHITECTURE_X86)
163164
set(COMPILER_SUPPORTS_AVX "1" CACHE INTERNAL "Test COMPILER_SUPPORTS_AVX")

0 commit comments

Comments
 (0)