Browse Source

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.
Anonymous Maarten 1 day ago
parent
commit
40d8ec4be9
3 changed files with 11 additions and 2 deletions
  1. 8 1
      CMakeLists.txt
  2. 1 0
      cmake/PreseedEmscriptenCache.cmake
  3. 2 1
      cmake/PreseedMSVCCache.cmake

+ 8 - 1
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 <malloc.h>\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()

+ 1 - 0
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")

+ 2 - 1
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")