Ver Fonte

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 há 10 anos atrás
pai
commit
886dcaa7c5

+ 0 - 2
Modules/CMakeDetermineCompilerId.cmake

@@ -508,8 +508,6 @@ function(CMAKE_DETERMINE_COMPILER_ID_CHECK lang file)
         set(ARCHITECTURE_ID "SH4")
         set(ARCHITECTURE_ID "SH4")
       elseif(peheader STREQUAL "50450000a801")
       elseif(peheader STREQUAL "50450000a801")
         set(ARCHITECTURE_ID "SH5")
         set(ARCHITECTURE_ID "SH5")
-      elseif(peheader STREQUAL "50450000c201")
-        set(ARCHITECTURE_ID "THUMB")
       endif()
       endif()
     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.  */
 /* Identify known platforms by name.  */
 #if defined(__linux) || defined(__linux__) || defined(linux)
 #if defined(__linux) || defined(__linux__) || defined(linux)
 # define PLATFORM_ID "Linux"
 # define PLATFORM_ID "Linux"
@@ -112,7 +115,13 @@
 #  define ARCHITECTURE_ID "X86"
 #  define ARCHITECTURE_ID "X86"
 
 
 # elif defined(_M_ARM)
 # 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)
 # elif defined(_M_MIPS)
 #  define ARCHITECTURE_ID "MIPS"
 #  define ARCHITECTURE_ID "MIPS"

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

@@ -131,14 +131,18 @@ endif()
 # default to Debug builds
 # default to Debug builds
 set(CMAKE_BUILD_TYPE_INIT Debug)
 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)
 if(WINCE)
   foreach(lang C CXX)
   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)
     string(TOUPPER "${_MSVC_${lang}_ARCHITECTURE_FAMILY}" _MSVC_${lang}_ARCHITECTURE_FAMILY_UPPER)
   endforeach()
   endforeach()
 
 
@@ -168,7 +172,7 @@ elseif(WINDOWS_PHONE OR WINDOWS_STORE)
   set(_FLAGS_CXX " /DUNICODE /D_UNICODE /GR /EHsc")
   set(_FLAGS_CXX " /DUNICODE /D_UNICODE /GR /EHsc")
   if(WINDOWS_PHONE)
   if(WINDOWS_PHONE)
     set(CMAKE_C_STANDARD_LIBRARIES_INIT "WindowsPhoneCore.lib RuntimeObject.lib PhoneAppModelHost.lib")
     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")
     set(CMAKE_C_STANDARD_LIBRARIES_INIT "kernel32.lib user32.lib")
   else()
   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")
     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()
 else()
   set(_PLATFORM_DEFINES "/DWIN32")
   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")
     set(CMAKE_C_STANDARD_LIBRARIES_INIT "kernel32.lib user32.lib")
   elseif(MSVC_VERSION GREATER 1310)
   elseif(MSVC_VERSION GREATER 1310)
     set(_RTC1 "/RTC1")
     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 (CMAKE_LINK_DEF_FILE_FLAG "/DEF:")
 # set the machine type
 # set the machine type
 if(MSVC_C_ARCHITECTURE_ID)
 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)
 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)
 elseif(MSVC_Fortran_ARCHITECTURE_ID)
   set(_MACHINE_ARCH_FLAG "/machine:${MSVC_Fortran_ARCHITECTURE_ID}")
   set(_MACHINE_ARCH_FLAG "/machine:${MSVC_Fortran_ARCHITECTURE_ID}")
 endif()
 endif()