Initial commit to build Win32 Arm CoreCLR
authorGaurav Khanna <gkhanna@microsoft.com>
Mon, 22 Aug 2016 16:45:43 +0000 (09:45 -0700)
committerGaurav Khanna <gkhanna@microsoft.com>
Wed, 24 Aug 2016 05:54:56 +0000 (22:54 -0700)
25 files changed:
CMakeLists.txt
Documentation/building/windows-instructions.md
build.cmd
clrdefinitions.cmake
dir.props
functions.cmake
src/.nuget/Microsoft.NETCore.ILAsm/Microsoft.NETCore.ILAsm.builds
src/.nuget/Microsoft.NETCore.ILAsm/Microsoft.NETCore.ILAsm.pkgproj
src/.nuget/Microsoft.NETCore.ILDAsm/Microsoft.NETCore.ILDAsm.builds
src/.nuget/Microsoft.NETCore.ILDAsm/Microsoft.NETCore.ILDAsm.pkgproj
src/.nuget/Microsoft.NETCore.Jit/Microsoft.NETCore.Jit.builds
src/.nuget/Microsoft.NETCore.Jit/Microsoft.NETCore.Jit.pkgproj
src/.nuget/Microsoft.NETCore.Runtime.CoreCLR/Microsoft.NETCore.Runtime.CoreCLR.builds
src/.nuget/Microsoft.NETCore.Runtime.CoreCLR/Microsoft.NETCore.Runtime.CoreCLR.pkgproj
src/.nuget/Microsoft.NETCore.TestHost/Microsoft.NETCore.TestHost.builds
src/.nuget/Microsoft.NETCore.TestHost/Microsoft.NETCore.TestHost.pkgproj
src/ToolBox/superpmi/superpmi-shared/compileresult.cpp
src/debug/ee/wks/CMakeLists.txt
src/gcinfo/CMakeLists.txt
src/pal/tools/gen-buildsys-win.bat
src/unwinder/CMakeLists.txt
src/vm/CMakeLists.txt
src/vm/arm/memcpy.asm
src/vm/arm/patchedcode.asm
src/vm/wks/CMakeLists.txt

index 56c2283..ab86511 100644 (file)
@@ -11,6 +11,10 @@ project(CoreCLR)
 # Include cmake functions
 include(functions.cmake)
 
+message(STATUS "CMAKE_VS_PLATFORM_TOOLSET is ${CMAKE_VS_PLATFORM_TOOLSET}")
+message(STATUS "CMAKE_VS_PLATFORM_NAME is ${CMAKE_VS_PLATFORM_NAME}")
+message(STATUS "CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION is ${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}")
+
 # Set commonly used directory names
 set(CLR_DIR ${CMAKE_CURRENT_SOURCE_DIR})
 set(VM_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/vm)
@@ -33,7 +37,19 @@ endif()
 
 # Ensure other tools are present
 if (WIN32)
-    enable_language(ASM_MASM)
+    if(CLR_CMAKE_HOST_ARCH STREQUAL arm)
+      # Explicitly specify the assembler to be used for Arm32 compile
+      file(TO_CMAKE_PATH "$ENV{VCINSTALLDIR}\\bin\\x86_arm\\armasm.exe" CMAKE_ASM_COMPILER)
+
+      set(CMAKE_ASM_MASM_COMPILER ${CMAKE_ASM_COMPILER})
+      message(CMAKE_ASM_MASM_COMPILER explicitly set to: ${CMAKE_ASM_MASM_COMPILER}) 
+      
+      # Enable generic assembly compilation to avoid CMake generate VS proj files that explicitly
+      # use ml[64].exe as the assembler.
+      enable_language(ASM)
+    else()
+      enable_language(ASM_MASM)
+    endif()
 
     # Ensure that MC is present
     find_program(MC mc)
@@ -186,6 +202,8 @@ elseif(WIN32)
     set(CLR_CMAKE_PLATFORM_ARCH_AMD64 1)
   elseif(CLR_CMAKE_HOST_ARCH STREQUAL x86)
     set(CLR_CMAKE_PLATFORM_ARCH_I386 1)
+  elseif(CLR_CMAKE_HOST_ARCH STREQUAL arm)
+    set(CLR_CMAKE_PLATFORM_ARCH_ARM 1)
   elseif(CLR_CMAKE_HOST_ARCH STREQUAL arm64)
     set(CLR_CMAKE_PLATFORM_ARCH_ARM64 1)
   else()
@@ -542,4 +560,4 @@ if(CLR_CMAKE_BUILD_TESTS)
   add_subdirectory(tests)
 endif(CLR_CMAKE_BUILD_TESTS)
 
-include(definitionsconsistencycheck.cmake)
+include(definitionsconsistencycheck.cmake)
\ No newline at end of file
index 4013649..f68ed2c 100644 (file)
@@ -15,16 +15,18 @@ Visual Studio must be installed. Supported versions:
 
 - [Visual Studio 2015](https://www.visualstudio.com/downloads/visual-studio-2015-downloads-vs) (Community, Professional, Enterprise)
 
-To debug managed code, ensure you have installed atleast [Visual Studio 2015 Update 3](https://blogs.msdn.microsoft.com/visualstudio/2016/06/07/visual-studio-2015-update-3-rc/).
+To debug managed code, ensure you have installed atleast [Visual Studio 2015 Update 3](https://www.visualstudio.com/en-us/news/releasenotes/vs2015-update3-vs).
 
-Make sure that you install "VC++ Tools". By default they will not be installed.
+Make sure that you install "VC++ Tools". By default, they will not be installed.
+
+To build for Arm32, you need to have [Windows SDK for Windows 10](https://developer.microsoft.com/en-us/windows/downloads) installed. 
 
 Visual Studio Express is not supported.
 
 CMake
 -----
 
-The CoreCLR build relies on CMake for the build. We are currently using CMake 3.0.2, although later versions likely work.
+The CoreCLR repo build has been validated using CMake 3.5.2. 
 
 - Install [CMake](http://www.cmake.org/download) for Windows.
 - Add it to the PATH environment variable.
index 01b48de..2c870ea 100644 (file)
--- a/build.cmd
+++ b/build.cmd
@@ -122,7 +122,10 @@ if %__TotalSpecifiedBuildArch% GTR 1 (
 
 if %__BuildArchX64%==1      set __BuildArch=x64
 if %__BuildArchX86%==1      set __BuildArch=x86
-if %__BuildArchArm%==1      set __BuildArch=arm
+if %__BuildArchArm%==1 (
+    set __BuildArch=arm
+    set __CrossArch=x86
+)
 if %__BuildArchArm64%==1 (
     set __BuildArch=arm64
     set __CrossArch=x64
@@ -207,6 +210,7 @@ if %__BuildNative% EQU 1 (
     :: Set the environment for the native build
     set __VCBuildArch=x86_amd64
     if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
+    if /i "%__BuildArch%" == "arm" (set __VCBuildArch=x86_arm)
     echo %__MsgPrefix%Using environment: "%__VSToolsRoot%\..\..\VC\vcvarsall.bat" !__VCBuildArch!
     call                                 "%__VSToolsRoot%\..\..\VC\vcvarsall.bat" !__VCBuildArch!
        @if defined __echo @echo on
@@ -251,9 +255,15 @@ REM === Build Cross-Architecture Native Components (if applicable)
 REM ===
 REM =========================================================================================
 
-REM cross-arch build only enabled for arm64
-
 if /i "%__BuildArch%"=="arm64" (
+    set __DoCrossArchBuild=1
+    )
+
+if /i "%__BuildArch%"=="arm" (
+    set __DoCrossArchBuild=1
+    )
+
+if /i "%__DoCrossArchBuild%"=="1" (
 
     echo %__MsgPrefix%Commencing build of cross architecture native components for %__BuildOS%.%__BuildArch%.%__BuildType%
 
@@ -297,6 +307,7 @@ if /i "%__BuildArch%"=="arm64" (
 )
 
 :SkipCrossCompBuild
+
 REM =========================================================================================
 REM ===
 REM === CoreLib and NuGet package build section.
@@ -355,7 +366,6 @@ if %__BuildNativeCoreLib% EQU 1 (
 )
 
 if %__BuildPackages% EQU 1 (
-
     set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.log"
        set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.wrn"
        set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__LogsDir%\Nuget_%__BuildOS%__%__BuildArch%__%__BuildType%.err"
index 3520795..1622377 100644 (file)
@@ -31,6 +31,10 @@ elseif (CLR_CMAKE_TARGET_ARCH_ARM64)
 elseif (CLR_CMAKE_TARGET_ARCH_ARM)
   if (CLR_CMAKE_PLATFORM_UNIX)
     add_definitions(-DDBG_TARGET_ARM_UNIX)
+  elseif (WIN32 AND NOT DEFINED CLR_CROSS_COMPONENTS_BUILD)
+    # Set this to ensure we can use Arm SDK for Desktop binary linkage when doing native (Arm32) build
+    add_definitions(-D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE=1)
+    add_definitions(-D_ARM_WORKAROUND_)
   endif (CLR_CMAKE_PLATFORM_UNIX)
   add_definitions(-D_TARGET_ARM_=1)
   add_definitions(-DDBG_TARGET_32BIT=1)
index e5cac55..cf42c79 100644 (file)
--- a/dir.props
+++ b/dir.props
     <MinOSForArch Condition="'$(PackagePlatform)' == 'arm'">win8</MinOSForArch>
     <MinOSForArch Condition="'$(PackagePlatform)' == 'arm64'">win10</MinOSForArch>
 
-    <!-- Arm64 cross target components are x64 hosted -->
-    <HasCrossTargetComponents Condition="'$(PackagePlatform)' =='arm64'">true</HasCrossTargetComponents>
+    <!-- Define packaging attributes for cross target components -->
+    <HasCrossTargetComponents Condition="'$(TargetsWindows)' == 'true' and ('$(PackagePlatform)' =='arm64' or '$(PackagePlatform)' =='arm')">true</HasCrossTargetComponents>
     <CrossTargetComponentFolder Condition="'$(PackagePlatform)' == 'arm64'">x64</CrossTargetComponentFolder>
+    <CrossTargetComponentFolder Condition="'$(PackagePlatform)' == 'arm'">x86</CrossTargetComponentFolder>
 
     <PackageOutputPath>$(PackagesBinDir)/pkg/</PackageOutputPath>
     <SymbolPackageOutputPath>$(PackagesBinDir)/symbolpkg/</SymbolPackageOutputPath>
index bbc571b..df2216c 100644 (file)
@@ -1,6 +1,6 @@
 function(clr_unknown_arch)
     if (WIN32)
-        message(FATAL_ERROR "Only AMD64, ARM64 and I386 are supported")
+        message(FATAL_ERROR "Only AMD64, ARM64, ARM and I386 are supported")
     else()
         message(FATAL_ERROR "Only AMD64, ARM64 and ARM are supported")
     endif()
@@ -24,15 +24,40 @@ function(get_compile_definitions DefinitionName)
     set(${DefinitionName} ${DEFINITIONS} PARENT_SCOPE)
 endfunction(get_compile_definitions)
 
-# Build a list of include directories by putting -I in front of each include dir.
+# Build a list of include directories
 function(get_include_directories IncludeDirectories)
     get_directory_property(dirs INCLUDE_DIRECTORIES)
     foreach(dir IN LISTS dirs)
+
+      if (CLR_CMAKE_PLATFORM_ARCH_ARM AND WIN32)
+        list(APPEND INC_DIRECTORIES /I${dir})
+      else()
         list(APPEND INC_DIRECTORIES -I${dir})
+      endif(CLR_CMAKE_PLATFORM_ARCH_ARM AND WIN32)
+
     endforeach()
     set(${IncludeDirectories} ${INC_DIRECTORIES} PARENT_SCOPE)
 endfunction(get_include_directories)
 
+# Build a list of include directories for consumption by the assembler
+function(get_include_directories_asm IncludeDirectories)
+    get_directory_property(dirs INCLUDE_DIRECTORIES)
+    
+    if (CLR_CMAKE_PLATFORM_ARCH_ARM AND WIN32)
+        list(APPEND INC_DIRECTORIES "-I ")
+    endif()
+    
+    foreach(dir IN LISTS dirs)
+      if (CLR_CMAKE_PLATFORM_ARCH_ARM AND WIN32)
+        list(APPEND INC_DIRECTORIES ${dir};)
+      else()
+        list(APPEND INC_DIRECTORIES -I${dir})
+      endif()
+    endforeach()
+
+    set(${IncludeDirectories} ${INC_DIRECTORIES} PARENT_SCOPE)
+endfunction(get_include_directories_asm)
+
 # Set the passed in RetSources variable to the list of sources with added current source directory
 # to form absolute paths.
 # The parameters after the RetSources are the input files.
@@ -52,7 +77,7 @@ function(preprocess_def_file inputFilename outputFilename)
     OUTPUT ${outputFilename}
     COMMAND ${CMAKE_CXX_COMPILER} ${ASM_INCLUDE_DIRECTORIES} /P /EP /TC ${PREPROCESS_DEFINITIONS}  /Fi${outputFilename}  ${inputFilename}
     DEPENDS ${inputFilename}
-    COMMENT "Preprocessing ${inputFilename}"
+    COMMENT "Preprocessing ${inputFilename} - ${CMAKE_CXX_COMPILER} ${ASM_INCLUDE_DIRECTORIES} /P /EP /TC ${PREPROCESS_DEFINITIONS}  /Fi${outputFilename}  ${inputFilename}"
   )
 
   set_source_files_properties(${outputFilename}
index c98d876..7ac4e3f 100644 (file)
       <OSGroup>Windows_NT</OSGroup>
       <Platform>x86</Platform>
     </Project>
+    <Project Condition="'$(TargetsWindows)' == 'true'" Include="win/Microsoft.NETCore.ILAsm.pkgproj">
+      <OSGroup>Windows_NT</OSGroup>
+      <Platform>arm</Platform>
+    </Project>
     <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroRid)' == 'debian.8-x64'" Include="debian/Microsoft.NETCore.ILAsm.pkgproj">
       <OSGroup>Linux</OSGroup>
       <Platform>amd64</Platform>
index 9f837c4..d1beacb 100644 (file)
@@ -5,7 +5,7 @@
     <Version>1.1.0</Version>
     <SkipPackageFileCheck>true</SkipPackageFileCheck>
     <SkipValidatePackage>true</SkipValidatePackage>
-    <PackagePlatforms>x64;x86;arm64;arm</PackagePlatforms>
+    <PackagePlatforms>x64;x86;arm64;arm;</PackagePlatforms>
     <OutputPath>$(PackagesOutputPath)</OutputPath>
     <IncludeRuntimeJson>true</IncludeRuntimeJson>
   </PropertyGroup>
@@ -20,6 +20,9 @@
     <ProjectReference Include="win\Microsoft.NETCore.ILAsm.pkgproj">
       <Platform>x86</Platform>
     </ProjectReference>
+    <ProjectReference Include="win\Microsoft.NETCore.ILAsm.pkgproj">
+      <Platform>arm</Platform>
+    </ProjectReference>
     <ProjectReference Include="debian\Microsoft.NETCore.ILAsm.pkgproj">
       <Platform>amd64</Platform>
     </ProjectReference>
index 0152167..fd9ced9 100644 (file)
       <OSGroup>Windows_NT</OSGroup>
       <Platform>x86</Platform>
     </Project>
+    <Project Condition="'$(TargetsWindows)' == 'true'" Include="win/Microsoft.NETCore.ILDAsm.pkgproj">
+      <OSGroup>Windows_NT</OSGroup>
+      <Platform>arm</Platform>
+    </Project>
     <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroRid)' == 'debian.8-x64'" Include="debian/Microsoft.NETCore.ILDAsm.pkgproj">
       <OSGroup>Linux</OSGroup>
       <Platform>amd64</Platform>
index b5d47a9..bca9bf7 100644 (file)
@@ -5,7 +5,7 @@
     <Version>1.1.0</Version>
     <SkipPackageFileCheck>true</SkipPackageFileCheck>
     <SkipValidatePackage>true</SkipValidatePackage>
-    <PackagePlatforms>x64;x86;arm64;arm</PackagePlatforms>
+    <PackagePlatforms>x64;x86;arm64;arm;</PackagePlatforms>
     <OutputPath>$(PackagesOutputPath)</OutputPath>
     <IncludeRuntimeJson>true</IncludeRuntimeJson>
   </PropertyGroup>
@@ -20,6 +20,9 @@
     <ProjectReference Include="win\Microsoft.NETCore.ILDAsm.pkgproj">
       <Platform>x86</Platform>
     </ProjectReference>
+    <ProjectReference Include="win\Microsoft.NETCore.ILDAsm.pkgproj">
+      <Platform>arm</Platform>
+    </ProjectReference>
     <ProjectReference Include="debian\Microsoft.NETCore.ILDAsm.pkgproj">
       <Platform>amd64</Platform>
     </ProjectReference>
index 6e3ebfb..0eca997 100644 (file)
       <OSGroup>Windows_NT</OSGroup>
       <Platform>x86</Platform>
     </Project>
+    <Project Condition="'$(TargetsWindows)' == 'true'" Include="win/Microsoft.NETCore.Jit.pkgproj">
+      <OSGroup>Windows_NT</OSGroup>
+      <Platform>arm</Platform>
+    </Project>
     <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroRid)' == 'debian.8-x64'" Include="debian/Microsoft.NETCore.Jit.pkgproj">
       <OSGroup>Linux</OSGroup>
       <Platform>amd64</Platform>
index 02629bd..f3b539b 100644 (file)
@@ -5,7 +5,7 @@
     <Version>1.1.0</Version>
     <SkipPackageFileCheck>true</SkipPackageFileCheck>
     <SkipValidatePackage>true</SkipValidatePackage>
-    <PackagePlatforms>x64;x86;arm64;arm</PackagePlatforms>
+    <PackagePlatforms>x64;x86;arm64;arm;</PackagePlatforms>
     <OutputPath>$(PackagesOutputPath)</OutputPath>
     <IncludeRuntimeJson>true</IncludeRuntimeJson>
   </PropertyGroup>
@@ -19,6 +19,9 @@
     <ProjectReference Include="win\Microsoft.NETCore.Jit.pkgproj">
       <Platform>x86</Platform>
     </ProjectReference>
+    <ProjectReference Include="win\Microsoft.NETCore.Jit.pkgproj">
+      <Platform>arm</Platform>
+    </ProjectReference>
     <ProjectReference Include="debian\Microsoft.NETCore.Jit.pkgproj">
       <Platform>amd64</Platform>
     </ProjectReference>
index 39ace1a..f4b5e18 100644 (file)
       <OSGroup>Windows_NT</OSGroup>
       <Platform>x86</Platform>
     </Project>
+    <Project Condition="'$(TargetsWindows)' == 'true'" Include="win/Microsoft.NETCore.Runtime.CoreCLR.pkgproj">
+      <OSGroup>Windows_NT</OSGroup>
+      <Platform>arm</Platform>
+    </Project>
     <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroRid)' == 'debian.8-x64'" Include="debian/Microsoft.NETCore.Runtime.CoreCLR.pkgproj">
       <OSGroup>Linux</OSGroup>
       <Platform>amd64</Platform>
index 634af4f..0af50e1 100644 (file)
@@ -5,12 +5,14 @@
     <Version>1.1.0</Version>
     <SkipPackageFileCheck>true</SkipPackageFileCheck>
     <SkipValidatePackage>true</SkipValidatePackage>
-    <PackagePlatforms>x64;x86;arm64;arm</PackagePlatforms>
+    <PackagePlatforms>x64;x86;arm64;arm;</PackagePlatforms>
     <OutputPath>$(PackagesOutputPath)</OutputPath>
     <IncludeRuntimeJson>true</IncludeRuntimeJson>
   </PropertyGroup>
   <ItemGroup>
-    <!-- Declare a runtime dependency on the win8-arm CoreCLR built using the TFS builds -->
+    <!-- ARM32_TODO: Clean this up.
+      Declare a runtime dependency on the win8-arm CoreCLR built using the TFS builds 
+    -->
     <RuntimeDependency Include="runtime.win8-arm.Microsoft.NETCore.Runtime.CoreCLR">
       <TargetRuntime>win8-arm</TargetRuntime>
       <Version>1.1.0-$(ExternalExpectedPrerelease)</Version>
@@ -30,6 +32,9 @@
     <ProjectReference Include="win\Microsoft.NETCore.Runtime.CoreCLR.pkgproj">
       <Platform>x86</Platform>
     </ProjectReference>
+    <ProjectReference Include="win\Microsoft.NETCore.Runtime.CoreCLR.pkgproj">
+      <Platform>arm</Platform>
+    </ProjectReference>
     <ProjectReference Include="debian\Microsoft.NETCore.Runtime.CoreCLR.pkgproj">
       <Platform>amd64</Platform>
     </ProjectReference>
index 1cfff1b..54b5207 100644 (file)
       <OSGroup>Windows_NT</OSGroup>
       <Platform>x86</Platform>
     </Project>
+    <Project Condition="'$(TargetsWindows)' == 'true'" Include="win/Microsoft.NETCore.TestHost.pkgproj">
+      <OSGroup>Windows_NT</OSGroup>
+      <Platform>arm</Platform>
+    </Project>
     <Project Condition="'$(TargetsLinux)' == 'true' and '$(DistroRid)' == 'debian.8-x64'" Include="debian/Microsoft.NETCore.TestHost.pkgproj">
       <OSGroup>Linux</OSGroup>
       <Platform>amd64</Platform>
index fd9c919..bf20136 100644 (file)
@@ -5,7 +5,7 @@
     <Version>1.1.0</Version>
     <SkipPackageFileCheck>true</SkipPackageFileCheck>
     <SkipValidatePackage>true</SkipValidatePackage>
-    <PackagePlatforms>x64;x86;arm64;arm</PackagePlatforms>
+    <PackagePlatforms>x64;x86;arm64;arm;</PackagePlatforms>
     <OutputPath>$(PackagesOutputPath)</OutputPath>
     <IncludeRuntimeJson>true</IncludeRuntimeJson>
   </PropertyGroup>
@@ -24,6 +24,9 @@
     <ProjectReference Include="win\Microsoft.NETCore.TestHost.pkgproj">
       <Platform>x86</Platform>
     </ProjectReference>
+    <ProjectReference Include="win\Microsoft.NETCore.TestHost.pkgproj">
+      <Platform>arm</Platform>
+    </ProjectReference>
     <ProjectReference Include="debian\Microsoft.NETCore.TestHost.pkgproj">
       <Platform>amd64</Platform>
     </ProjectReference>
index 8b7961d..b15c51f 100644 (file)
@@ -729,7 +729,7 @@ void CompileResult::applyRelocs(unsigned char *block1, ULONG blocksize1, void *o
             break;
         #endif // _TARGET_X86_
 
-        #if defined(_TARGET_X86_) || defined(_TARGET_AMD64_) || defined(_TARGET_ARM64_)
+        #if defined(_TARGET_X86_) || defined(_TARGET_AMD64_) || defined(_TARGET_ARM64_) || defined(_TARGET_ARM_)
         case IMAGE_REL_BASED_REL32:
             {
                 DWORDLONG target = tmp.target + tmp.addlDelta;
@@ -770,7 +770,7 @@ void CompileResult::applyRelocs(unsigned char *block1, ULONG blocksize1, void *o
                 }
             }
             break;
-        #endif // defined(_TARGET_X86_) || defined(_TARGET_AMD64_) || defined(_TARGET_ARM64_)
+        #endif // defined(_TARGET_X86_) || defined(_TARGET_AMD64_) || defined(_TARGET_ARM64_) || defined(_TARGET_ARM_)
 
         #if defined(_TARGET_AMD64_) || defined(_TARGET_ARM64_)
         case IMAGE_REL_BASED_DIR64:
index a3cb483..1f6d435 100644 (file)
@@ -12,24 +12,44 @@ endif (CLR_CMAKE_PLATFORM_ARCH_I386)
 
 set(ASM_FILE ${CORDBEE_DIR}/${ARCH_SOURCES_DIR}/dbghelpers.asm)
 # asm files require preprocessing using cl.exe on arm64
-  if(CLR_CMAKE_PLATFORM_ARCH_ARM64)
-      get_filename_component(name ${ASM_FILE} NAME_WE)
-      set(ASM_PREPROCESSED_FILE ${CMAKE_CURRENT_BINARY_DIR}/${name}.asm)
-      preprocess_def_file(${ASM_FILE} ${ASM_PREPROCESSED_FILE})
-      set(CORDBEE_SOURCES_WKS_PREPROCESSED_ASM  ${ASM_PREPROCESSED_FILE})
-      set_property(SOURCE ${CORDBEE_SOURCES_WKS_PREPROCESSED_ASM} PROPERTY COMPILE_DEFINITIONS ${ASM_DEFINITIONS})
-      set_property(SOURCE ${CORDBEE_SOURCES_WKS_PREPROCESSED_ASM} PROPERTY COMPILE_DEFINITIONS ${ASM_OPTIONS})
-      add_library_clr(cordbee_wks ${CORDBEE_SOURCES_WKS} ${CORDBEE_SOURCES_WKS_PREPROCESSED_ASM})
-  else ()
-
-      # Need to compile asm file using custom command as include directories are not provided to asm compiler
-      add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/dbghelpers.obj
-                           COMMAND ${CMAKE_ASM_MASM_COMPILER} ${ASM_INCLUDE_DIRECTORIES} ${ASM_DEFINITIONS} ${ASM_OPTIONS} /Fo${CMAKE_CURRENT_BINARY_DIR}/dbghelpers.obj /Ta${ASM_FILE}
-                           DEPENDS ${ASM_FILE}
-                           COMMENT "Compiling dbghelpers.asm")
-
-      add_library_clr(cordbee_wks ${CORDBEE_SOURCES_WKS} ${CMAKE_CURRENT_BINARY_DIR}/dbghelpers.obj)
-  endif(CLR_CMAKE_PLATFORM_ARCH_ARM64)
+if(CLR_CMAKE_PLATFORM_ARCH_ARM64)
+    get_filename_component(name ${ASM_FILE} NAME_WE)
+    set(ASM_PREPROCESSED_FILE ${CMAKE_CURRENT_BINARY_DIR}/${name}.asm)
+    preprocess_def_file(${ASM_FILE} ${ASM_PREPROCESSED_FILE})
+    set(CORDBEE_SOURCES_WKS_PREPROCESSED_ASM  ${ASM_PREPROCESSED_FILE})
+    set_property(SOURCE ${CORDBEE_SOURCES_WKS_PREPROCESSED_ASM} PROPERTY COMPILE_DEFINITIONS ${ASM_DEFINITIONS})
+    set_property(SOURCE ${CORDBEE_SOURCES_WKS_PREPROCESSED_ASM} PROPERTY COMPILE_DEFINITIONS ${ASM_OPTIONS})
+    add_library_clr(cordbee_wks ${CORDBEE_SOURCES_WKS} ${CORDBEE_SOURCES_WKS_PREPROCESSED_ASM})
+elseif(CLR_CMAKE_PLATFORM_ARCH_ARM)
+    
+    # On Arm32 for Windows, use C++ compiler to process the .asm since it includes C-style headers.
+    set(DBGHELPERS_ASM $ENV{__IntermediatesDir}/dbghelpers.asm)
+    set(ASM_OPTIONS " -g ")
+    
+    preprocess_def_file(${ASM_FILE} ${DBGHELPERS_ASM})
+    
+    # We do not pass any defines since we have already done pre-processing above
+    set (DBGHELPERS_ASM_CMDLINE "-o ${CMAKE_CURRENT_BINARY_DIR}/dbghelpers.obj ${DBGHELPERS_ASM}")
+
+    file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/runasm.cmd"
+                CONTENT "\"${CMAKE_ASM_MASM_COMPILER}\" ${ASM_OPTIONS} ${DBGHELPERS_ASM_CMDLINE}")
+
+    # Need to compile asm file using custom command as include directories are not provided to asm compiler
+    add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/dbghelpers.obj
+                       COMMAND ${CMAKE_CURRENT_BINARY_DIR}/runasm.cmd
+                       DEPENDS ${DBGHELPERS_ASM}
+                       COMMENT "Compiling dbghelpers.asm - ${CMAKE_CURRENT_BINARY_DIR}/runasm.cmd")
+    add_library_clr(cordbee_wks ${CORDBEE_SOURCES_WKS} ${CMAKE_CURRENT_BINARY_DIR}/dbghelpers.obj)
+else ()
+
+    # Need to compile asm file using custom command as include directories are not provided to asm compiler
+    add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/dbghelpers.obj
+                         COMMAND ${CMAKE_ASM_MASM_COMPILER} ${ASM_INCLUDE_DIRECTORIES} ${ASM_DEFINITIONS} ${ASM_OPTIONS} /Fo${CMAKE_CURRENT_BINARY_DIR}/dbghelpers.obj /Ta${ASM_FILE}
+                         DEPENDS ${ASM_FILE}
+                         COMMENT "Compiling dbghelpers.asm")
+
+    add_library_clr(cordbee_wks ${CORDBEE_SOURCES_WKS} ${CMAKE_CURRENT_BINARY_DIR}/dbghelpers.obj)
+endif(CLR_CMAKE_PLATFORM_ARCH_ARM64)
 
 else ()
 
index 016e1e2..e4730c6 100644 (file)
@@ -5,12 +5,14 @@ set( GCINFO_SOURCES
   gcinfoencoder.cpp
 )
 
-if(CLR_CMAKE_PLATFORM_ARCH_I386)
+
+if(CLR_CMAKE_TARGET_ARCH_I386)
   list(APPEND GCINFO_SOURCES
     ../gcdump/gcdump.cpp
     ../gcdump/${ARCH_SOURCES_DIR}/gcdumpx86.cpp
   )
-endif(CLR_CMAKE_PLATFORM_ARCH_I386)
+endif(CLR_CMAKE_TARGET_ARCH_I386)
+
 
 convert_to_absolute_path(GCINFO_SOURCES ${GCINFO_SOURCES})
 
index 3e9e4c2..c2d8987 100644 (file)
@@ -45,7 +45,7 @@ GOTO :DONE
   echo "Usage..."
   echo "gen-buildsys-win.bat <path to top level CMakeLists.txt> <VSVersion>"
   echo "Specify the path to the top level CMake file - <ProjectK>/src/NDP"
-  echo "Specify the VSVersion to be used - VS2013 or VS2015"
+  echo "Specify the VSVersion to be used - VS2015"
   EXIT /B 1
 
 :DONE
index 5ddbf42..bf1cfa2 100644 (file)
@@ -11,7 +11,8 @@ set(UNWINDER_SOURCES
     unwinder.cpp
 )
 
-if(NOT DEFINED CLR_CMAKE_PLATFORM_ARCH_I386)    
+# Include platform specific unwinder for applicable (native and cross-target) builds.
+if(NOT DEFINED CLR_CMAKE_TARGET_ARCH_I386)    
     include_directories(${ARCH_SOURCES_DIR})
     list(APPEND UNWINDER_SOURCES
         ${ARCH_SOURCES_DIR}/unwinder_${ARCH_SOURCES_DIR}.cpp
index 66fc643..6f17a90 100644 (file)
@@ -328,6 +328,15 @@ elseif(CLR_CMAKE_TARGET_ARCH_I386)
         ${ARCH_SOURCES_DIR}/gmsasm.asm
         ${ARCH_SOURCES_DIR}/jithelp.asm
     )
+elseif(CLR_CMAKE_TARGET_ARCH_ARM)
+    set(VM_SOURCES_WKS_ARCH_ASM
+        ${ARCH_SOURCES_DIR}/asmhelpers.asm
+        ${ARCH_SOURCES_DIR}/CrtHelpers.asm
+        ${ARCH_SOURCES_DIR}/ehhelpers.asm
+        ${ARCH_SOURCES_DIR}/memcpy.asm
+        ${ARCH_SOURCES_DIR}/patchedcode.asm
+        ${ARCH_SOURCES_DIR}/PInvokeStubs.asm
+    )
 elseif(CLR_CMAKE_TARGET_ARCH_ARM64)
     set(VM_SOURCES_WKS_ARCH_ASM
         ${ARCH_SOURCES_DIR}/AsmHelpers.asm
index 65c662c..9a0e7d3 100644 (file)
@@ -31,7 +31,7 @@
         pld     [r1]                                    ; preload the first cache line
         cmp     r2, #16                                 ; less than 16 bytes?
         mov     r3, r0                                  ; use r3 as our destination
-        bhs     __FCallMemcpy_large                     ; go to the large copy case directly
+        bhs.W     __FCallMemcpy_large                   ; go to the large copy case directly. ".W" indicates encoding using 32bits
 
 CpySmal tbb     [pc, r2]                                ; branch to specialized bits for small copies
 __SwitchTable1_Copy
index 2ccda58..2ef175e 100644 (file)
@@ -119,6 +119,8 @@ $label
 ; patchable location where the write-barriers are copied over at runtime
  
     LEAF_ENTRY JIT_PatchedWriteBarrierStart
+        ; Cannot be empty function to prevent LNK1223
+        bx lr
     LEAF_END
  
     ; These write barriers are overwritten on the fly
@@ -139,6 +141,8 @@ $label
     LEAF_END_MARKED JIT_ByRefWriteBarrier 
 
     LEAF_ENTRY JIT_PatchedWriteBarrierLast
+        ; Cannot be empty function to prevent LNK1223
+        bx lr
     LEAF_END
 
 ; JIT Allocation helpers when TLS Index for Thread is low enough for fast helpers
index 0ff0ccb..48ca6b0 100644 (file)
@@ -1,3 +1,4 @@
+
 if (WIN32)
   add_precompiled_header(common.h ../common.cpp VM_SOURCES_WKS)
   # mscorlib.cpp does not compile with precompiled header file
@@ -5,63 +6,111 @@ if (WIN32)
   # .c file cannot use cpp precompiled header 
   set_source_files_properties(../microsoft.comservices_i.c PROPERTIES COMPILE_FLAGS "/Y-") 
 
-  # asm files require preprocessing using cl.exe on arm64
+  # asm files require preprocessing using cl.exe on arm32 and arm64
   if(CLR_CMAKE_PLATFORM_ARCH_ARM64)
+
       foreach(ASM_FILE ${VM_SOURCES_WKS_ARCH_ASM})
+
+          # Preprocess each asm source file
           get_filename_component(name ${ASM_FILE} NAME_WE)
           set(ASM_PREPROCESSED_FILE ${CMAKE_CURRENT_BINARY_DIR}/${name}.asm)
           preprocess_def_file(${ASM_FILE} ${ASM_PREPROCESSED_FILE})
+
           set(VM_SOURCES_WKS_ARM64_PREPROCESSED_ASM ${VM_SOURCES_WKS_ARM64_PREPROCESSED_ASM} ${ASM_PREPROCESSED_FILE})
+
       endforeach()
 
       set(VM_SOURCES_WKS_ARCH_ASM ${VM_SOURCES_WKS_ARM64_PREPROCESSED_ASM})
+
+  elseif(CLR_CMAKE_PLATFORM_ARCH_ARM)
+
+      get_include_directories_asm(ASM_INCLUDE_DIRECTORIES)
+
+      foreach(ASM_FILE ${VM_SOURCES_WKS_ARCH_ASM})
+
+          # Inserts a custom command in CMake build to preprocess each asm source file
+          get_filename_component(name ${ASM_FILE} NAME_WE)
+          file(TO_CMAKE_PATH "$ENV{__IntermediatesDir}/${name}.asm" ASM_PREPROCESSED_FILE)
+          preprocess_def_file(${ASM_FILE} ${ASM_PREPROCESSED_FILE})
+
+          # On Arm32, compile the preprocessed binary to .obj
+          # We do not pass any defines since we have already done pre-processing above
+          set (ASM_CMDLINE "-o ${CMAKE_CURRENT_BINARY_DIR}/${name}.obj ${ASM_PREPROCESSED_FILE}")
+
+          # Generate the batch file that will invoke the assembler
+          file(TO_CMAKE_PATH "${CMAKE_CURRENT_BINARY_DIR}/runasm_${name}_${CMAKE_BUILD_TYPE}.cmd" ASM_SCRIPT_FILE)
+
+          # ARM32TODO: Set asm options global so that all invocations can use it.
+          file(GENERATE OUTPUT "${ASM_SCRIPT_FILE}"
+                    CONTENT "\"${CMAKE_ASM_MASM_COMPILER}\" -g ${ASM_INCLUDE_DIRECTORIES} ${ASM_DEFINITIONS} ${ASM_CMDLINE}")
+
+          message("Generated  - ${ASM_SCRIPT_FILE}")
+
+          # Need to compile asm file using custom command as include directories are not provided to asm compiler
+          add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${name}.obj
+                             COMMAND ${ASM_SCRIPT_FILE}
+                             DEPENDS ${ASM_PREPROCESSED_FILE}
+                             COMMENT "Assembling ${ASM_PREPROCESSED_FILE} - ${ASM_SCRIPT_FILE}")
+
+          # mark obj as source that does not require compile
+          set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/${name}.obj PROPERTIES EXTERNAL_OBJECT TRUE)
+
+          # Add the generated OBJ in the dependency list so that it gets consumed during linkage
+          set(VM_SOURCES_WKS_ARCH_ASM ${VM_SOURCES_WKS_ARCH_ASM} ${CMAKE_CURRENT_BINARY_DIR}/${name}.obj)
+
+      endforeach()
+
   endif(CLR_CMAKE_PLATFORM_ARCH_ARM64)
+
 endif (WIN32)
 
 add_library_clr(cee_wks ${VM_SOURCES_WKS} ${VM_SOURCES_WKS_ARCH_ASM})
 
 if (WIN32)
-# Get the current list of definitions
-get_compile_definitions(DEFINITIONS)
-
-get_directory_property(COMPILE_DEFINITIONS_LIST COMPILE_DEFINITIONS)
-
-# Extract the definitions for the ASM code. Since there is a bug in the cmake that prevents us from
-# using the generator expressions, we split the definitions into lists based on the configuration.
-foreach(DEFINITION IN LISTS COMPILE_DEFINITIONS_LIST)
-    if (${DEFINITION} MATCHES "^\\$<\\$<CONFIG:([^>]+)>:([^>]+)>$")
-        # The entry contains generator expression, so insert the definition into a definitions list
-        # corresponding to the config
-        string(TOUPPER ${CMAKE_MATCH_1} CONFIG)
-        set(ASM_DEFINITIONS_${CONFIG} ${ASM_DEFINITIONS_${CONFIG}} ${CMAKE_MATCH_2}) 
-    else()
-        list(APPEND ASM_DEFINITIONS ${DEFINITION})        
+
+  if(NOT CLR_CMAKE_PLATFORM_ARCH_ARM)
+    # Get the current list of definitions
+    get_compile_definitions(DEFINITIONS)
+
+    get_directory_property(COMPILE_DEFINITIONS_LIST COMPILE_DEFINITIONS)
+
+    # Extract the definitions for the ASM code. Since there is a bug in the cmake that prevents us from
+    # using the generator expressions, we split the definitions into lists based on the configuration.
+    foreach(DEFINITION IN LISTS COMPILE_DEFINITIONS_LIST)
+        if (${DEFINITION} MATCHES "^\\$<\\$<CONFIG:([^>]+)>:([^>]+)>$")
+            # The entry contains generator expression, so insert the definition into a definitions list
+            # corresponding to the config
+            string(TOUPPER ${CMAKE_MATCH_1} CONFIG)
+            set(ASM_DEFINITIONS_${CONFIG} ${ASM_DEFINITIONS_${CONFIG}} ${CMAKE_MATCH_2}) 
+        else()
+            list(APPEND ASM_DEFINITIONS ${DEFINITION})        
+        endif()
+    endforeach()
+
+    # Add defines for the ASM. Unfortunately setting it on the target is ignored for asm by the cmake, so we have
+    # to set it on the sources.
+    set_property(SOURCE ${VM_SOURCES_WKS_ARCH_ASM} PROPERTY COMPILE_DEFINITIONS ${ASM_DEFINITIONS})
+    foreach(CONFIG IN LISTS CMAKE_CONFIGURATION_TYPES)
+        string(TOUPPER ${CONFIG} CONFIG)
+        set_property(SOURCE ${VM_SOURCES_WKS_ARCH_ASM} PROPERTY COMPILE_DEFINITIONS_${CONFIG} ${ASM_DEFINITIONS_${CONFIG}})
+    endforeach()
+
+    if (CLR_CMAKE_PLATFORM_ARCH_I386)
+        set_source_files_properties(${VM_SOURCES_WKS_ARCH_ASM} PROPERTIES COMPILE_FLAGS "/Zm /safeseh")
+    endif (CLR_CMAKE_PLATFORM_ARCH_I386)
+
+    # Convert AsmConstants.h into AsmConstants.inc
+    find_program(POWERSHELL powershell)
+    if (POWERSHELL STREQUAL "POWERSHELL-NOTFOUND")
+        message(FATAL_ERROR "POWERSHELL not found")
     endif()
-endforeach()
-
-# Add defines for the ASM. Unfortunately setting it on the target is ignored for asm by the cmake, so we have
-# to set it on the sources.
-set_property(SOURCE ${VM_SOURCES_WKS_ARCH_ASM} PROPERTY COMPILE_DEFINITIONS ${ASM_DEFINITIONS})
-foreach(CONFIG IN LISTS CMAKE_CONFIGURATION_TYPES)
-    string(TOUPPER ${CONFIG} CONFIG)
-    set_property(SOURCE ${VM_SOURCES_WKS_ARCH_ASM} PROPERTY COMPILE_DEFINITIONS_${CONFIG} ${ASM_DEFINITIONS_${CONFIG}})
-endforeach()
-
-if (CLR_CMAKE_PLATFORM_ARCH_I386)
-    set_source_files_properties(${VM_SOURCES_WKS_ARCH_ASM} PROPERTIES COMPILE_FLAGS "/Zm /safeseh")
-endif (CLR_CMAKE_PLATFORM_ARCH_I386)
-
-# Convert AsmConstants.h into AsmConstants.inc
-find_program(POWERSHELL powershell)
-if (POWERSHELL STREQUAL "POWERSHELL-NOTFOUND")
-    message(FATAL_ERROR "POWERSHELL not found")
-endif()
-
-add_custom_command(
-    # The AsmConstants.inc will be built in the pre-build phase of the cee_wks build
-    TARGET cee_wks PRE_BUILD 
-    COMMAND ${POWERSHELL} -NoProfile -ExecutionPolicy Bypass -NonInteractive \"& \"\"${VM_DIR}/h2inc.ps1\"\"\" \"\"\"${VM_DIR}/${ARCH_SOURCES_DIR}/asmconstants.h\"\"\" >"${CMAKE_CURRENT_BINARY_DIR}/AsmConstants.tmp"
-    COMMAND ${CMAKE_CXX_COMPILER} ${DEFINITIONS} /EP "${CMAKE_CURRENT_BINARY_DIR}/AsmConstants.tmp" >"${CMAKE_CURRENT_BINARY_DIR}/AsmConstants.inc"
-)
+
+    add_custom_command(
+        # The AsmConstants.inc will be built in the pre-build phase of the cee_wks build
+        TARGET cee_wks PRE_BUILD 
+        COMMAND ${POWERSHELL} -NoProfile -ExecutionPolicy Bypass -NonInteractive \"& \"\"${VM_DIR}/h2inc.ps1\"\"\" \"\"\"${VM_DIR}/${ARCH_SOURCES_DIR}/asmconstants.h\"\"\" >"${CMAKE_CURRENT_BINARY_DIR}/AsmConstants.tmp"
+        COMMAND ${CMAKE_CXX_COMPILER} ${DEFINITIONS} /EP "${CMAKE_CURRENT_BINARY_DIR}/AsmConstants.tmp" >"${CMAKE_CURRENT_BINARY_DIR}/AsmConstants.inc"
+    )
+  endif(NOT CLR_CMAKE_PLATFORM_ARCH_ARM)
 
 endif (WIN32)