1
0
Эх сурвалжийг харах

Implement __chkstk for arm64

Lifted from a previously built SDL3.dll
Anonymous Maarten 3 сар өмнө
parent
commit
4fbf59ac3a

+ 19 - 3
CMakeLists.txt

@@ -505,9 +505,14 @@ if(MSVC AND TARGET SDL3-shared AND NOT SDL_LIBC)
     target_compile_options(SDL3-shared PRIVATE "$<$<COMPILE_LANGUAGE:ASM_MASM>:/nologo>")
     set_property(SOURCE "${asm_src}" PROPERTY LANGUAGE "ASM_MASM")
     target_sources(SDL3-shared PRIVATE "${asm_src}")
-  elseif(SDL_CPU_ARM32 OR SDL_CPU_ARM64)
-    # FIXME: ARM assembler (armasm.exe/armasm64.exe) is NOT ASM_MASM, and does currently not work with CMake
-    # (https://gitlab.kitware.com/cmake/cmake/-/issues/18912)
+  elseif(SDL_CPU_ARM64)
+    enable_language(ASM_MARMASM)
+    set(asm_src "${SDL3_SOURCE_DIR}/src/stdlib/SDL_mslibc_arm64.masm")
+    target_compile_options(SDL3-shared PRIVATE "$<$<COMPILE_LANGUAGE:ASM_MARMASM>:/nologo>")
+    set_property(SOURCE "${asm_src}" PROPERTY LANGUAGE "ASM_MARMASM")
+    target_sources(SDL3-shared PRIVATE "${asm_src}")
+  elseif(SDL_CPU_ARM32)
+    # FIXME
   endif()
 endif()
 
@@ -3388,6 +3393,17 @@ if(SDL_SHARED)
         # (__rt_sdiv, __rt_udiv, __rt_sdiv64, _rt_udiv64, __dtou64, __u64tod, __i64tos)
         target_link_libraries(SDL3-shared PRIVATE msvcrt.lib)
       endif()
+      find_library(HAVE_ONECORE_LIB NAMES "onecore.lib")
+      if(HAVE_ONECORE_LIB)
+        # SDL_malloc.c: __imp_MapViewOfFileNuma2 referenced in function MapViewOfFile2
+        target_link_libraries(SDL3-shared PRIVATE onecore.lib)
+      endif()
+      find_library(HAVE_VOLATILEACCESSU_LIB NAMES "volatileaccessu.lib")
+      if(HAVE_VOLATILEACCESSU_LIB)
+        # SDL_malloc.c : RtlSetVolatileMemory referenced in function RtlFillVolatileMemory
+        # SDL_malloc.c : RtlFillDeviceMemory referenced in function RtlZeroDeviceMemory
+        target_link_libraries(SDL3-shared PRIVATE volatileaccessu.lib)
+      endif()
     endif()
     if(HAS_Q_NO_USE_LIBIRC)
       target_compile_options(SDL3-shared PRIVATE /Q_no-use-libirc)

+ 2 - 2
cmake/sdlcompilers.cmake

@@ -34,7 +34,7 @@ function(SDL_AddCommonCompilerFlags TARGET)
     cmake_push_check_state()
     check_c_compiler_flag("/W3" COMPILER_SUPPORTS_W3)
     if(COMPILER_SUPPORTS_W3)
-      target_compile_options(${TARGET} PRIVATE "/W3")
+      target_compile_options(${TARGET} PRIVATE "$<$<COMPILE_LANGUAGE:C,CXX>:/W3>")
     endif()
     cmake_pop_check_state()
   endif()
@@ -131,7 +131,7 @@ function(SDL_AddCommonCompilerFlags TARGET)
     if(MSVC)
       check_c_compiler_flag(/WX HAVE_WX)
       if(HAVE_WX)
-        target_compile_options(${TARGET} PRIVATE "/WX")
+        target_compile_options(${TARGET} PRIVATE "$<$<COMPILE_LANGUAGE:C,CXX>:/WX>")
       endif()
     elseif(USE_GCC OR USE_CLANG OR USE_INTELCC OR USE_QNX)
       check_c_compiler_flag(-Werror HAVE_WERROR)

+ 0 - 8
src/stdlib/SDL_mslibc.c

@@ -728,14 +728,6 @@ void __declspec(naked) _alloca_probe_16(void)
 
 #endif // _M_IX86
 
-#ifdef _M_ARM64
-
-void __chkstk(void);
-void __chkstk() {
-}
-
-#endif
-
 #endif // MSC_VER
 
 #ifdef __ICL

+ 26 - 0
src/stdlib/SDL_mslibc_arm64.masm

@@ -0,0 +1,26 @@
+TeStackLimit EQU 0x00010
+PAGE_SIZE equ 0x1000
+
+    AREA CODE, READONLY
+
+    EXPORT __chkstk
+
+__chkstk PROC
+    ldr                          x17,[x18, #TeStackLimit]
+    subs                         x16,sp,x15, LSL  #0x4
+    csel                         x16,xzr,x16,cc
+    cmp                          x16,x17
+    b.cc                         chkstk_start_loop
+    ret
+chkstk_start_loop
+    and                          x16,x16,#-PAGE_SIZE
+chkstk_loop
+    sub                          x17,x17,#0x1, LSL #12
+    ldr                          xzr,[x17]
+    cmp                          x17,x16
+    b.ne                         chkstk_loop
+    ret
+
+    ENDP
+
+    END