Browse Source

MSVC: Add support for ARM64 architecture

Visual Studio 15.4 adds support for this architecture.

Fixes: #17213
Minmin Gong 8 years ago
parent
commit
bc7c94fe13

+ 5 - 0
Help/release/dev/msvc-arm64.rst

@@ -0,0 +1,5 @@
+msvc-arm64
+----------
+
+* Support for the MSVC ARM64 architecture was added.
+  Visual Studio 2017 Update 4 and above offer an ARM64 toolchain.

+ 3 - 1
Modules/CMakeDetermineCompilerId.cmake

@@ -220,7 +220,9 @@ Id flags: ${testflags} ${CMAKE_${lang}_COMPILER_ID_FLAGS_ALWAYS}
     if(CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION)
       set(id_WindowsTargetPlatformVersion "<WindowsTargetPlatformVersion>${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}</WindowsTargetPlatformVersion>")
     endif()
-    if(id_platform STREQUAL ARM)
+    if(id_platform STREQUAL ARM64)
+      set(id_WindowsSDKDesktopARMSupport "<WindowsSDKDesktopARM64Support>true</WindowsSDKDesktopARM64Support>")
+    elseif(id_platform STREQUAL ARM)
       set(id_WindowsSDKDesktopARMSupport "<WindowsSDKDesktopARMSupport>true</WindowsSDKDesktopARMSupport>")
     else()
       set(id_WindowsSDKDesktopARMSupport "")

+ 2 - 0
Modules/CMakeGenericSystem.cmake

@@ -76,6 +76,8 @@ function(GetDefaultWindowsPrefixBase var)
   #
   if("${CMAKE_GENERATOR}" MATCHES "(Win64|IA64)")
     set(arch_hint "x64")
+  elseif("${CMAKE_GENERATOR_PLATFORM}" MATCHES "ARM64")
+    set(arch_hint "ARM64")
   elseif("${CMAKE_GENERATOR}" MATCHES "ARM")
     set(arch_hint "ARM")
   elseif("${CMAKE_SIZEOF_VOID_P}" STREQUAL "8")

+ 3 - 0
Modules/CMakePlatformId.h.in

@@ -114,6 +114,9 @@
 # elif defined(_M_IX86)
 #  define ARCHITECTURE_ID "X86"
 
+# elif defined(_M_ARM64)
+#  define ARCHITECTURE_ID "ARM64"
+
 # elif defined(_M_ARM)
 #  if _M_ARM == 4
 #   define ARCHITECTURE_ID "ARMV4I"

+ 9 - 3
Modules/Platform/Windows-MSVC.cmake

@@ -122,7 +122,9 @@ 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")
+  if(_MSVC_${lang}_ARCHITECTURE_FAMILY MATCHES "^ARM64")
+    set(_MSVC_${lang}_ARCHITECTURE_FAMILY "ARM64")
+  elseif(_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")
@@ -175,7 +177,7 @@ elseif(WINDOWS_PHONE OR WINDOWS_STORE)
     set(CMAKE_C_STANDARD_LIBRARIES_INIT "WindowsApp.lib")
   elseif(WINDOWS_PHONE)
     set(CMAKE_C_STANDARD_LIBRARIES_INIT "WindowsPhoneCore.lib RuntimeObject.lib PhoneAppModelHost.lib")
-  elseif(_MSVC_C_ARCHITECTURE_FAMILY STREQUAL "ARM" OR _MSVC_CXX_ARCHITECTURE_FAMILY STREQUAL "ARM")
+  elseif(_MSVC_C_ARCHITECTURE_FAMILY STREQUAL "ARM" OR _MSVC_CXX_ARCHITECTURE_FAMILY STREQUAL "ARM" OR _MSVC_C_ARCHITECTURE_FAMILY STREQUAL "ARM64" OR _MSVC_CXX_ARCHITECTURE_FAMILY STREQUAL "ARM64")
     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")
@@ -183,7 +185,7 @@ elseif(WINDOWS_PHONE OR WINDOWS_STORE)
 else()
   set(_PLATFORM_DEFINES "/DWIN32")
 
-  if(_MSVC_C_ARCHITECTURE_FAMILY STREQUAL "ARM" OR _MSVC_CXX_ARCHITECTURE_FAMILY STREQUAL "ARM")
+  if(_MSVC_C_ARCHITECTURE_FAMILY STREQUAL "ARM" OR _MSVC_CXX_ARCHITECTURE_FAMILY STREQUAL "ARM" OR _MSVC_C_ARCHITECTURE_FAMILY STREQUAL "ARM64" OR _MSVC_CXX_ARCHITECTURE_FAMILY STREQUAL "ARM64")
     set(CMAKE_C_STANDARD_LIBRARIES_INIT "kernel32.lib user32.lib")
   elseif(MSVC_VERSION GREATER 1310)
     if(CMAKE_VS_PLATFORM_TOOLSET MATCHES "(v[0-9]+_clang_.*|LLVM-vs[0-9]+.*)")
@@ -215,6 +217,8 @@ set (CMAKE_LINK_DEF_FILE_FLAG "/DEF:")
 if(MSVC_C_ARCHITECTURE_ID)
   if(MSVC_C_ARCHITECTURE_ID MATCHES "^ARMV.I")
     set(_MACHINE_ARCH_FLAG "/machine:THUMB")
+  elseif(_MSVC_C_ARCHITECTURE_FAMILY STREQUAL "ARM64")
+    set(_MACHINE_ARCH_FLAG "/machine:ARM64")
   elseif(_MSVC_C_ARCHITECTURE_FAMILY STREQUAL "ARM")
     set(_MACHINE_ARCH_FLAG "/machine:ARM")
   else()
@@ -223,6 +227,8 @@ if(MSVC_C_ARCHITECTURE_ID)
 elseif(MSVC_CXX_ARCHITECTURE_ID)
   if(MSVC_CXX_ARCHITECTURE_ID MATCHES "^ARMV.I")
     set(_MACHINE_ARCH_FLAG "/machine:THUMB")
+  elseif(_MSVC_CXX_ARCHITECTURE_FAMILY STREQUAL "ARM64")
+    set(_MACHINE_ARCH_FLAG "/machine:ARM64")
   elseif(_MSVC_CXX_ARCHITECTURE_FAMILY STREQUAL "ARM")
     set(_MACHINE_ARCH_FLAG "/machine:ARM")
   else()

+ 6 - 1
Source/cmGlobalVisualStudio10Generator.cxx

@@ -695,7 +695,12 @@ bool cmGlobalVisualStudio10Generator::FindVCTargetsPath(cmMakefile* mf)
         xw.Content(this->WindowsTargetPlatformVersion);
        xw.EndElement(); // WindowsTargetPlatformVersion
      }
-     if (this->GetPlatformName() == "ARM") {
+     if (this->GetPlatformName() == "ARM64") {
+       xw.StartElement("WindowsSDKDesktopARM64Support");
+        xw.Content("true");
+       xw.EndElement(); // WindowsSDK64DesktopARMSupport
+     }
+     else if (this->GetPlatformName() == "ARM") {
        xw.StartElement("WindowsSDKDesktopARMSupport");
         xw.Content("true");
        xw.EndElement(); // WindowsSDKDesktopARMSupport

+ 1 - 0
Source/cmLocalVisualStudio7Generator.cxx

@@ -526,6 +526,7 @@ cmVS7FlagTable cmLocalVisualStudio7GeneratorLinkFlagTable[] = {
   { "TargetMachine", "MACHINE:SH5", "Machine SH5", "15", 0 },
   { "TargetMachine", "MACHINE:THUMB", "Machine THUMB", "16", 0 },
   { "TargetMachine", "MACHINE:X64", "Machine x64", "17", 0 },
+  { "TargetMachine", "MACHINE:ARM64", "Machine ARM64", "18", 0 },
   { "TurnOffAssemblyGeneration", "NOASSEMBLY",
     "No assembly even if CLR information is present in objects.", "true", 0 },
   { "ModuleDefinitionFile", "DEF:", "add an export def file", "",

+ 1 - 0
Source/cmVS141LinkFlagTable.h

@@ -87,6 +87,7 @@ static cmVS7FlagTable cmVS141LinkFlagTable[] = {
 
   { "TargetMachine", "", "Not Set", "NotSet", 0 },
   { "TargetMachine", "MACHINE:ARM", "MachineARM", "MachineARM", 0 },
+  { "TargetMachine", "MACHINE:ARM64", "MachineARM64", "MachineARM64", 0 },
   { "TargetMachine", "MACHINE:EBC", "MachineEBC", "MachineEBC", 0 },
   { "TargetMachine", "MACHINE:IA64", "MachineIA64", "MachineIA64", 0 },
   { "TargetMachine", "MACHINE:MIPS", "MachineMIPS", "MachineMIPS", 0 },

+ 1 - 0
Source/cmVS14LibFlagTable.h

@@ -11,6 +11,7 @@ static cmVS7FlagTable cmVS14LibFlagTable[] = {
     0 },
 
   { "TargetMachine", "MACHINE:ARM", "MachineARM", "MachineARM", 0 },
+  { "TargetMachine", "MACHINE:ARM64", "MachineARM64", "MachineARM64", 0 },
   { "TargetMachine", "MACHINE:EBC", "MachineEBC", "MachineEBC", 0 },
   { "TargetMachine", "MACHINE:IA64", "MachineIA64", "MachineIA64", 0 },
   { "TargetMachine", "MACHINE:MIPS", "MachineMIPS", "MachineMIPS", 0 },

+ 4 - 0
Source/cmVisualStudio10TargetGenerator.cxx

@@ -3893,6 +3893,10 @@ void cmVisualStudio10TargetGenerator::WriteApplicationTypeSettings()
     this->WriteString("<AppContainerApplication>true"
                       "</AppContainerApplication>\n",
                       2);
+  } else if (this->Platform == "ARM64") {
+    this->WriteString("<WindowsSDKDesktopARM64Support>true"
+                      "</WindowsSDKDesktopARM64Support>\n",
+                      2);
   } else if (this->Platform == "ARM") {
     this->WriteString("<WindowsSDKDesktopARMSupport>true"
                       "</WindowsSDKDesktopARMSupport>\n",