Build support for s390x: mono runtime (#52841)
authorUlrich Weigand <ulrich.weigand@de.ibm.com>
Mon, 17 May 2021 16:23:07 +0000 (18:23 +0200)
committerGitHub <noreply@github.com>
Mon, 17 May 2021 16:23:07 +0000 (18:23 +0200)
Adds cmake and proj entries to support building for s390x.

Includes a bug fix to CMakeLists.txt where IS_BIG_ENDIAN
was used before it was defined, causing failures on big-
endian platforms.

src/mono/CMakeLists.txt
src/mono/mono.proj
src/mono/mono/mini/CMakeLists.txt
src/mono/mono/utils/CMakeLists.txt

index d9efdcf..9142cbc 100644 (file)
@@ -345,6 +345,8 @@ elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64")
   set(HOST_ARM64 1)
 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm")
   set(HOST_ARM 1)
+elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "s390x")
+  set(HOST_S390X 1)
 elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "wasm")
   set(HOST_WASM 1)
 else()
@@ -395,6 +397,11 @@ elseif(TARGET_ARCH MATCHES "arm")
   add_definitions("-DARM_FPU_VFP=1")
   set(TARGET_SIZEOF_VOID_P 4)
   set(SIZEOF_REGISTER 4)
+elseif(TARGET_ARCH STREQUAL "s390x")
+  set(TARGET_S390X 1)
+  set(MONO_ARCHITECTURE "\"s390x\"")
+  set(TARGET_SIZEOF_VOID_P 8)
+  set(SIZEOF_REGISTER 8)
 elseif(TARGET_ARCH STREQUAL "wasm")
   set(TARGET_WASM 1)
   set(MONO_ARCHITECTURE "\"wasm\"")
@@ -604,6 +611,14 @@ if(GCC)
   endif()
 endif()
 
+TEST_BIG_ENDIAN(IS_BIG_ENDIAN)
+
+if(IS_BIG_ENDIAN)
+  set(TARGET_BYTE_ORDER G_BIG_ENDIAN)
+else()
+  set(TARGET_BYTE_ORDER G_LITTLE_ENDIAN)
+endif()
+
 if(IS_BIG_ENDIAN)
   set(ORDER G_BIG_ENDIAN)
 else()
@@ -632,14 +647,6 @@ set(GSSIZE "ptrdiff_t")
 # END OF EGLIB CHECKS
 #
 
-TEST_BIG_ENDIAN(IS_BIG_ENDIAN)
-
-if(IS_BIG_ENDIAN)
-  set(TARGET_BYTE_ORDER G_BIG_ENDIAN)
-else()
-  set(TARGET_BYTE_ORDER G_LITTLE_ENDIAN)
-endif()
-
 ######################################
 # DEBUG BUILD CHECKS
 ######################################
index d0681b4..39f20db 100644 (file)
       <_MonoBuildEnv Condition="'$(Platform)' == 'arm'" Include="PKG_CONFIG_PATH=$(MonoCrossDir)/usr/lib/arm-linux-gnueabihf/pkgconfig" />
     </ItemGroup>
 
+    <!-- s390x Linux cross build options -->
+    <ItemGroup Condition="'$(MonoCrossDir)' != '' and '$(TargetArchitecture)' == 's390x'">
+      <_MonoCMakeArgs Include="-DCMAKE_TOOLCHAIN_FILE=$([MSBuild]::NormalizePath('$(RepositoryEngineeringDir)', 'common', 'cross', 'toolchain.cmake'))" />
+      <_MonoBuildEnv Include="TARGET_BUILD_ARCH=s390x" />
+      <_MonoBuildEnv Include="PKG_CONFIG_PATH=$(MonoCrossDir)/usr/lib/s390x-linux-gnu/pkgconfig" />
+    </ItemGroup>
+
     <!-- Windows specific options -->
     <ItemGroup Condition="'$(TargetsWindows)' == 'true'">
       <_MonoCPPFLAGS Include="-DWIN32" />
index d6f0b75..ba786bc 100644 (file)
@@ -216,6 +216,13 @@ set(arm_sources
     tramp-arm-gsharedvt.c
     cpu-arm.h)
 
+set(s390x_sources
+    mini-s390x.c
+    mini-s390x.h
+    exceptions-s390x.c
+    tramp-s390x.c
+    cpu-s390x.h)
+
 set(wasm_sources
     mini-wasm.c
     tramp-wasm.c
@@ -233,6 +240,8 @@ elseif(TARGET_ARM64)
 set(arch_sources ${arm64_sources})
 elseif(TARGET_ARM)
 set(arch_sources ${arm_sources})
+elseif(TARGET_S390X)
+set(arch_sources ${s390x_sources})
 elseif(TARGET_WASM)
 set(arch_sources ${wasm_sources})
 endif()
@@ -412,6 +421,12 @@ add_custom_command(
 )
 
 add_custom_command(
+  OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/cpu-s390x.h
+  COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/genmdesc.py TARGET_S390X ${CMAKE_CURRENT_SOURCE_DIR} cpu-s390x.h s390x_cpu_desc ${CMAKE_CURRENT_SOURCE_DIR}/cpu-s390x.md
+  VERBATIM
+)
+
+add_custom_command(
   OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/cpu-wasm.h
   COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/genmdesc.py TARGET_WASM ${CMAKE_CURRENT_SOURCE_DIR} cpu-wasm.h wasm_desc ${CMAKE_CURRENT_SOURCE_DIR}/cpu-wasm.md
   VERBATIM
index 115570c..dde7ba5 100644 (file)
@@ -231,6 +231,8 @@ elseif(TARGET_ARM64)
 set(utils_arch_sources "${utils_arch_sources};mono-hwcap-arm64.c")
 elseif(TARGET_ARM)
 set(utils_arch_sources "${utils_arch_sources};mono-hwcap-arm.c")
+elseif(TARGET_S390X)
+set(utils_arch_sources "${utils_arch_sources};mono-hwcap-s390x.c")
 elseif(TARGET_WASM)
 set(utils_arch_sources "${utils_arch_sources};mono-hwcap-wasm.c;mono-mmap-wasm.c")
 else()