Browse Source

MSVC: Distinguish among ARM architectures more precisely (#14552)

Detect the exact ARM architecture instead of just "ARM".  Treat "ARM" as
an architecture family that includes THUMB (ARMV4I and ARMV5I).
Gunnar Roth 10 năm trước cách đây
mục cha
commit
886dcaa7c5

+ 0 - 2
Modules/CMakeDetermineCompilerId.cmake

@@ -508,8 +508,6 @@ function(CMAKE_DETERMINE_COMPILER_ID_CHECK lang file)
         set(ARCHITECTURE_ID "SH4")
       elseif(peheader STREQUAL "50450000a801")
         set(ARCHITECTURE_ID "SH5")
-      elseif(peheader STREQUAL "50450000c201")
-        set(ARCHITECTURE_ID "THUMB")
       endif()
     endif()
 

+ 10 - 1
Modules/CMakePlatformId.h.in

@@ -1,3 +1,6 @@
+#define STRINGIFY_HELPER(X) #X
+#define STRINGIFY(X) STRINGIFY_HELPER(X)
+
 /* Identify known platforms by name.  */
 #if defined(__linux) || defined(__linux__) || defined(linux)
 # define PLATFORM_ID "Linux"
@@ -112,7 +115,13 @@
 #  define ARCHITECTURE_ID "X86"
 
 # elif defined(_M_ARM)
-#  define ARCHITECTURE_ID "ARM"
+#  if _M_ARM == 4
+#   define ARCHITECTURE_ID "ARMV4I"
+#  elif _M_ARM == 5
+#   define ARCHITECTURE_ID "ARMV5I"
+#  else
+#   define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM)
+#  endif
 
 # elif defined(_M_MIPS)
 #  define ARCHITECTURE_ID "MIPS"

+ 26 - 10
Modules/Platform/Windows-MSVC.cmake

@@ -131,14 +131,18 @@ endif()
 # default to Debug builds
 set(CMAKE_BUILD_TYPE_INIT Debug)
 
+# Compute an architecture family from the architecture id.
+foreach(lang C CXX)
+  set(_MSVC_${lang}_ARCHITECTURE_FAMILY "${MSVC_${lang}_ARCHITECTURE_ID}")
+  if(_MSVC_${lang}_ARCHITECTURE_FAMILY MATCHES "^ARM")
+    set(_MSVC_${lang}_ARCHITECTURE_FAMILY "ARM")
+  elseif(_MSVC_${lang}_ARCHITECTURE_FAMILY MATCHES "^SH")
+    set(_MSVC_${lang}_ARCHITECTURE_FAMILY "SHx")
+  endif()
+endforeach()
+
 if(WINCE)
   foreach(lang C CXX)
-    set(_MSVC_${lang}_ARCHITECTURE_FAMILY "${MSVC_${lang}_ARCHITECTURE_ID}")
-    if(_MSVC_${lang}_ARCHITECTURE_FAMILY STREQUAL "THUMB")
-      set(_MSVC_${lang}_ARCHITECTURE_FAMILY "ARM")
-    elseif(_MSVC_${lang}_ARCHITECTURE_FAMILY MATCHES "^SH")
-      set(_MSVC_${lang}_ARCHITECTURE_FAMILY "SHx")
-    endif()
     string(TOUPPER "${_MSVC_${lang}_ARCHITECTURE_FAMILY}" _MSVC_${lang}_ARCHITECTURE_FAMILY_UPPER)
   endforeach()
 
@@ -168,7 +172,7 @@ elseif(WINDOWS_PHONE OR WINDOWS_STORE)
   set(_FLAGS_CXX " /DUNICODE /D_UNICODE /GR /EHsc")
   if(WINDOWS_PHONE)
     set(CMAKE_C_STANDARD_LIBRARIES_INIT "WindowsPhoneCore.lib RuntimeObject.lib PhoneAppModelHost.lib")
-  elseif(MSVC_C_ARCHITECTURE_ID STREQUAL ARM OR MSVC_CXX_ARCHITECTURE_ID STREQUAL ARM)
+  elseif(_MSVC_C_ARCHITECTURE_FAMILY STREQUAL "ARM" OR _MSVC_CXX_ARCHITECTURE_FAMILY STREQUAL "ARM")
     set(CMAKE_C_STANDARD_LIBRARIES_INIT "kernel32.lib user32.lib")
   else()
     set(CMAKE_C_STANDARD_LIBRARIES_INIT "kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib")
@@ -176,7 +180,7 @@ elseif(WINDOWS_PHONE OR WINDOWS_STORE)
 else()
   set(_PLATFORM_DEFINES "/DWIN32")
 
-  if(MSVC_C_ARCHITECTURE_ID STREQUAL ARM OR MSVC_CXX_ARCHITECTURE_ID STREQUAL ARM)
+  if(_MSVC_C_ARCHITECTURE_FAMILY STREQUAL "ARM" OR _MSVC_CXX_ARCHITECTURE_FAMILY STREQUAL "ARM")
     set(CMAKE_C_STANDARD_LIBRARIES_INIT "kernel32.lib user32.lib")
   elseif(MSVC_VERSION GREATER 1310)
     set(_RTC1 "/RTC1")
@@ -200,9 +204,21 @@ set(CMAKE_CXX_STANDARD_LIBRARIES_INIT "${CMAKE_C_STANDARD_LIBRARIES_INIT}")
 set (CMAKE_LINK_DEF_FILE_FLAG "/DEF:")
 # set the machine type
 if(MSVC_C_ARCHITECTURE_ID)
-  set(_MACHINE_ARCH_FLAG "/machine:${MSVC_C_ARCHITECTURE_ID}")
+  if(MSVC_C_ARCHITECTURE_ID MATCHES "^ARMV.I")
+    set(_MACHINE_ARCH_FLAG "/machine:THUMB")
+  elseif(_MSVC_C_ARCHITECTURE_FAMILY STREQUAL "ARM")
+    set(_MACHINE_ARCH_FLAG "/machine:ARM")
+  else()
+    set(_MACHINE_ARCH_FLAG "/machine:${MSVC_C_ARCHITECTURE_ID}")
+  endif()
 elseif(MSVC_CXX_ARCHITECTURE_ID)
-  set(_MACHINE_ARCH_FLAG "/machine:${MSVC_CXX_ARCHITECTURE_ID}")
+  if(MSVC_CXX_ARCHITECTURE_ID MATCHES "^ARMV.I")
+    set(_MACHINE_ARCH_FLAG "/machine:THUMB")
+  elseif(_MSVC_CXX_ARCHITECTURE_FAMILY STREQUAL "ARM")
+    set(_MACHINE_ARCH_FLAG "/machine:ARM")
+  else()
+    set(_MACHINE_ARCH_FLAG "/machine:${MSVC_CXX_ARCHITECTURE_ID}")
+  endif()
 elseif(MSVC_Fortran_ARCHITECTURE_ID)
   set(_MACHINE_ARCH_FLAG "/machine:${MSVC_Fortran_ARCHITECTURE_ID}")
 endif()