From 8516ec562b1f7696e68c110a3ad1cd270b92b24a Mon Sep 17 00:00:00 2001 From: Sapana Khemkar Date: Tue, 3 May 2022 05:44:12 +0000 Subject: [PATCH 1/6] mono add support to build for ppc64le --- src/mono/CMakeLists.txt | 11 +++++++++-- .../System.Private.CoreLib.csproj | 6 +++++- src/mono/mono.proj | 8 ++++++++ src/mono/mono/mini/CMakeLists.txt | 15 +++++++++++++++ src/mono/mono/utils/CMakeLists.txt | 2 ++ 5 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/mono/CMakeLists.txt b/src/mono/CMakeLists.txt index b47e9288dd26d9..588b2444b2bef2 100644 --- a/src/mono/CMakeLists.txt +++ b/src/mono/CMakeLists.txt @@ -377,6 +377,8 @@ elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "s390x") set(HOST_S390X 1) elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "wasm" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "wasm32") set(HOST_WASM 1) +elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64le") + set(HOST_POWERPC64 1) else() message(FATAL_ERROR "CMAKE_SYSTEM_PROCESSOR='${CMAKE_SYSTEM_PROCESSOR}' not supported.") endif() @@ -450,8 +452,13 @@ elseif(TARGET_ARCH STREQUAL "wasm" OR TARGET_ARCH STREQUAL "wasm32") set(TARGET_SIZEOF_VOID_P 4) set(SIZEOF_REGISTER 4) elseif(TARGET_ARCH STREQUAL "ppc64le") - # TODO: not complete - set(__mono_ppc64__ 1) + set(TARGET_POWERPC 1) + set(TARGET_POWERPC64 1) + set(MONO_ARCHITECTURE "\"ppc64le\"") + set(TARGET_SIZEOF_VOID_P 8) + set(SIZEOF_REGISTER 8) + add_definitions("-D__mono_ppc__") + add_definitions("-D__mono_ppc64__") else() message(FATAL_ERROR "TARGET_ARCH='${TARGET_ARCH}' not supported.") endif() diff --git a/src/mono/System.Private.CoreLib/System.Private.CoreLib.csproj b/src/mono/System.Private.CoreLib/System.Private.CoreLib.csproj index 18ec40cc3ca0b2..0ddc54cb637b1b 100644 --- a/src/mono/System.Private.CoreLib/System.Private.CoreLib.csproj +++ b/src/mono/System.Private.CoreLib/System.Private.CoreLib.csproj @@ -10,7 +10,7 @@ $(RuntimeBinDir)IL/ Debug;Release;Checked - x64;x86;arm;armv6;arm64;s390x;wasm + x64;x86;arm;armv6;arm64;s390x;wasm;ppc64le true @@ -75,6 +75,10 @@ AnyCPU $(DefineConstants);TARGET_WASM + + AnyCPU + $(DefineConstants);TARGET_POWERPC64 + diff --git a/src/mono/mono.proj b/src/mono/mono.proj index 83c32e6df65cc5..0ee7e27eb61317 100644 --- a/src/mono/mono.proj +++ b/src/mono/mono.proj @@ -265,6 +265,13 @@ <_MonoBuildEnv Include="PKG_CONFIG_PATH=$(MonoCrossDir)/usr/lib/s390x-linux-gnu/pkgconfig" /> + + + <_MonoCMakeArgs Include="-DCMAKE_TOOLCHAIN_FILE=$(CrossToolchainFile)" /> + <_MonoBuildEnv Include="TARGET_BUILD_ARCH=ppc64le" /> + <_MonoBuildEnv Include="PKG_CONFIG_PATH=$(MonoCrossDir)/usr/lib/powerpc64le-linux-gnu/pkgconfig" /> + + <_MonoCMakeArgs Include="-DCMAKE_TOOLCHAIN_FILE=$(CrossToolchainFile)" /> @@ -543,6 +550,7 @@ <_Objcopy Condition="'$(Platform)' == 'armv6'">arm-linux-$(_LinuxAbi)eabi$(_LinuxFloatAbi)-$(_Objcopy) <_Objcopy Condition="'$(Platform)' == 'arm64'">aarch64-linux-$(_LinuxAbi)-$(_Objcopy) <_Objcopy Condition="'$(Platform)' == 's390x'">s390x-linux-$(_LinuxAbi)-$(_Objcopy) + <_Objcopy Condition="'$(Platform)' == 'ppc64le'">ppc64le-linux-$(_LinuxAbi)-$(_Objcopy) <_Objcopy Condition="'$(Platform)' == 'x64'">x86_64-linux-$(_LinuxAbi)-$(_Objcopy) <_Objcopy Condition="'$(Platform)' == 'x86'">i686-linux-$(_LinuxAbi)-$(_Objcopy) <_Objcopy Condition="'$(TargetsAndroid)' == 'true'">$(ANDROID_NDK_ROOT)/toolchains/llvm/prebuilt/$(MonoToolchainPrebuiltOS)/bin/llvm-objcopy diff --git a/src/mono/mono/mini/CMakeLists.txt b/src/mono/mono/mini/CMakeLists.txt index e09b23e4380eb9..c9698736b08a74 100644 --- a/src/mono/mono/mini/CMakeLists.txt +++ b/src/mono/mono/mini/CMakeLists.txt @@ -216,6 +216,13 @@ set(wasm_sources wasm_m2n_invoke.g.h cpu-wasm.h) +set(powerpc64_sources + mini-ppc.c + mini-ppc.h + exceptions-ppc.c + tramp-ppc.c + cpu-ppc64.h) + if(TARGET_AMD64) set(arch_sources ${amd64_sources}) elseif(TARGET_X86) @@ -228,6 +235,8 @@ elseif(TARGET_S390X) set(arch_sources ${s390x_sources}) elseif(TARGET_WASM) set(arch_sources ${wasm_sources}) +elseif(TARGET_POWERPC) +set(arch_sources ${powerpc64_sources}) endif() set(darwin_sources @@ -475,6 +484,12 @@ add_custom_command( VERBATIM ) +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/cpu-ppc64.h + COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/genmdesc.py TARGET_POWERPC ${CMAKE_CURRENT_SOURCE_DIR} cpu-ppc64.h ppc64_cpu_desc ${CMAKE_CURRENT_SOURCE_DIR}/cpu-ppc64.mdesc + VERBATIM +) + if(NOT DISABLE_EXECUTABLES) set(sgen_sources "main-sgen.c") if(HOST_WIN32) diff --git a/src/mono/mono/utils/CMakeLists.txt b/src/mono/mono/utils/CMakeLists.txt index d0a01e77935507..47634e0be3e9fa 100644 --- a/src/mono/mono/utils/CMakeLists.txt +++ b/src/mono/mono/utils/CMakeLists.txt @@ -221,6 +221,8 @@ 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") +elseif(TARGET_POWERPC) +set(utils_arch_sources "${utils_arch_sources};mono-hwcap-ppc.c") else() message(FATAL_ERROR "") endif() From 36ecd884f85a82c2b5281850b8b99898a4760b44 Mon Sep 17 00:00:00 2001 From: Sapana Khemkar Date: Tue, 3 May 2022 05:47:29 +0000 Subject: [PATCH 2/6] fix build failures in mini-ppc.c --- src/mono/mono/mini/mini-ppc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mono/mono/mini/mini-ppc.c b/src/mono/mono/mini/mini-ppc.c index a50ddc6b89cb9d..60715fc5ae3e9b 100644 --- a/src/mono/mono/mini/mini-ppc.c +++ b/src/mono/mono/mini/mini-ppc.c @@ -1824,7 +1824,7 @@ void mono_arch_emit_setret (MonoCompile *cfg, MonoMethod *method, MonoInst *val) { MonoType *ret = mini_get_underlying_type (mono_method_signature_internal (method)->ret); - if (!rm_type_is_byref (ret)) { + if (!m_type_is_byref (ret)) { #ifndef __mono_ppc64__ if (ret->type == MONO_TYPE_I8 || ret->type == MONO_TYPE_U8) { MonoInst *ins; @@ -1963,7 +1963,7 @@ mono_arch_peephole_pass_2 (MonoCompile *cfg, MonoBasicBlock *bb) MONO_DELETE_INS (bb, ins); continue; } - } else if (inst->inst_imm > 0) { + } else if (ins->inst_imm > 0) { int power2 = mono_is_power_of_two (ins->inst_imm); if (power2 > 0) { ins->opcode = OP_SHL_IMM; @@ -5753,7 +5753,7 @@ host_mgreg_t* mono_arch_context_get_int_reg_address (MonoContext *ctx, int reg) { if (reg == ppc_r1) - return (host_mgreg_t)(gsize)&MONO_CONTEXT_GET_SP (ctx); + return (host_mgreg_t)(gsize)MONO_CONTEXT_GET_SP (ctx); return &ctx->regs [reg]; } From 2e156171aa70b3b45d1bdcb613db96128df4ec16 Mon Sep 17 00:00:00 2001 From: Sapana Khemkar Date: Tue, 3 May 2022 05:53:23 +0000 Subject: [PATCH 3/6] handle unhandled exception ids --- src/mono/mono/mini/mini-ppc.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/mono/mono/mini/mini-ppc.c b/src/mono/mono/mini/mini-ppc.c index 60715fc5ae3e9b..322a1171785e66 100644 --- a/src/mono/mono/mini/mini-ppc.c +++ b/src/mono/mono/mini/mini-ppc.c @@ -5309,6 +5309,10 @@ exception_id_by_name (const char *name) return MONO_EXC_ARRAY_TYPE_MISMATCH; if (strcmp (name, "ArgumentException") == 0) return MONO_EXC_ARGUMENT; + if (strcmp (name, "ArgumentOutOfRangeException") == 0) + return MONO_EXC_ARGUMENT_OUT_OF_RANGE; + if (strcmp (name, "OutOfMemoryException") == 0) + return MONO_EXC_ARGUMENT_OUT_OF_MEMORY; g_error ("Unknown intrinsic exception %s\n", name); return 0; } From 5e43414242f5a865fd007a6d3a41c4e48d8884db Mon Sep 17 00:00:00 2001 From: Sapana Khemkar Date: Tue, 3 May 2022 06:26:40 +0000 Subject: [PATCH 4/6] donot use std/ld inst when address is not div by 4. This adds fix for test failure in System.Buffers.Binary.Tests.BinaryReaderUnitTestsw.ReadingStructFieldByFieldOrReadAndReverseEndianness --- src/mono/mono/arch/ppc/ppc-codegen.h | 1 + src/mono/mono/mini/mini-ppc.c | 21 ++++++++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/mono/mono/arch/ppc/ppc-codegen.h b/src/mono/mono/arch/ppc/ppc-codegen.h index a52d17ab767f0c..ca3c13791ffda9 100644 --- a/src/mono/mono/arch/ppc/ppc-codegen.h +++ b/src/mono/mono/arch/ppc/ppc-codegen.h @@ -129,6 +129,7 @@ enum { #define ppc_is_imm16(val) ((((val)>> 15) == 0) || (((val)>> 15) == -1)) #define ppc_is_uimm16(val) ((glong)(val) >= 0L && (glong)(val) <= 65535L) #define ppc_ha(val) (((val >> 16) + ((val & 0x8000) ? 1 : 0)) & 0xffff) +#define ppc_is_dsoffset_valid(offset) (((offset)& 3) == 0) #define ppc_load32(c,D,v) G_STMT_START { \ ppc_lis ((c), (D), (guint32)(v) >> 16); \ diff --git a/src/mono/mono/mini/mini-ppc.c b/src/mono/mono/mini/mini-ppc.c index 322a1171785e66..53fb851d8622fb 100644 --- a/src/mono/mono/mini/mini-ppc.c +++ b/src/mono/mono/mini/mini-ppc.c @@ -3116,7 +3116,12 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) break; case OP_STORE_MEMBASE_REG: if (ppc_is_imm16 (ins->inst_offset)) { - ppc_stptr (code, ins->sreg1, ins->inst_offset, ins->inst_destbasereg); + if (ppc_is_dsoffset_valid(ins->inst_offset)) { + ppc_stptr (code, ins->sreg1, ins->inst_offset, ins->inst_destbasereg); + } else { + ppc_load (code, ppc_r0, ins->inst_offset); + ppc_stptr_indexed(code, ins->sreg1, ins->inst_destbasereg, ppc_r0); + } } else { if (ppc_is_imm32 (ins->inst_offset)) { ppc_addis (code, ppc_r11, ins->inst_destbasereg, ppc_ha(ins->inst_offset)); @@ -3151,7 +3156,12 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) break; case OP_LOAD_MEMBASE: if (ppc_is_imm16 (ins->inst_offset)) { - ppc_ldptr (code, ins->dreg, ins->inst_offset, ins->inst_basereg); + if( ppc_is_dsoffset_valid (ins->inst_offset)) { + ppc_ldptr (code, ins->dreg, ins->inst_offset, ins->inst_basereg); + } else { + ppc_load (code, ppc_r0, ins->inst_offset); + ppc_ldptr_indexed (code, ins->dreg, ins->inst_basereg, ppc_r0); + } } else { if (ppc_is_imm32 (ins->inst_offset) && (ins->dreg > 0)) { ppc_addis (code, ins->dreg, ins->inst_basereg, ppc_ha(ins->inst_offset)); @@ -3165,7 +3175,12 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_LOADI4_MEMBASE: #ifdef __mono_ppc64__ if (ppc_is_imm16 (ins->inst_offset)) { - ppc_lwa (code, ins->dreg, ins->inst_offset, ins->inst_basereg); + if(ppc_is_dsoffset_valid (ins->inst_offset)) { + ppc_lwa (code, ins->dreg, ins->inst_offset, ins->inst_basereg); + } else { + ppc_load (code, ppc_r0, ins->inst_offset); + ppc_lwax (code, ins->dreg, ins->inst_basereg, ppc_r0); + } } else { if (ppc_is_imm32 (ins->inst_offset) && (ins->dreg > 0)) { ppc_addis (code, ins->dreg, ins->inst_basereg, ppc_ha(ins->inst_offset)); From c4d6cab8ce762b2b5359bcc2d1e68b1dfa232b7b Mon Sep 17 00:00:00 2001 From: Sapana Khemkar Date: Tue, 3 May 2022 06:29:07 +0000 Subject: [PATCH 5/6] Fixed failing test cases from System.Numerics.Vectors.Tests --- src/mono/mono/mini/mini-ppc.c | 42 ++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/src/mono/mono/mini/mini-ppc.c b/src/mono/mono/mini/mini-ppc.c index 53fb851d8622fb..581775a34613c3 100644 --- a/src/mono/mono/mini/mini-ppc.c +++ b/src/mono/mono/mini/mini-ppc.c @@ -1179,23 +1179,35 @@ get_call_info (MonoMethodSignature *sig) } else #endif { - align_size += (sizeof (target_mgreg_t) - 1); - align_size &= ~(sizeof (target_mgreg_t) - 1); - nregs = (align_size + sizeof (target_mgreg_t) -1 ) / sizeof (target_mgreg_t); - n_in_regs = MIN (rest, nregs); - if (n_in_regs < 0) - n_in_regs = 0; + if (is_all_floats && (mbr_cnt > 0)) { + rest = PPC_LAST_ARG_REG - gr + 1; + nregs = mbr_cnt; + n_in_regs = (rest >= mbr_cnt) ? MIN (rest, nregs) : 0; + cinfo->args [n].regtype = RegTypeStructByVal; + cinfo->args [n].vtregs = n_in_regs; + cinfo->args [n].size = mbr_size; + cinfo->args [n].vtsize = nregs - n_in_regs; + cinfo->args [n].reg = gr; + gr += n_in_regs; + } else { + align_size += (sizeof (target_mgreg_t) - 1); + align_size &= ~(sizeof (target_mgreg_t) - 1); + nregs = (align_size + sizeof (target_mgreg_t) -1 ) / sizeof (target_mgreg_t); + n_in_regs = MIN (rest, nregs); + if (n_in_regs < 0) + n_in_regs = 0; #ifdef __APPLE__ - /* FIXME: check this */ - if (size >= 3 && size % 4 != 0) - n_in_regs = 0; + /* FIXME: check this */ + if (size >= 3 && size % 4 != 0) + n_in_regs = 0; #endif - cinfo->args [n].regtype = RegTypeStructByVal; - cinfo->args [n].vtregs = n_in_regs; - cinfo->args [n].size = n_in_regs; - cinfo->args [n].vtsize = nregs - n_in_regs; - cinfo->args [n].reg = gr; - gr += n_in_regs; + cinfo->args [n].regtype = RegTypeStructByVal; + cinfo->args [n].vtregs = n_in_regs; + cinfo->args [n].size = n_in_regs; + cinfo->args [n].vtsize = nregs - n_in_regs; + cinfo->args [n].reg = gr; + gr += n_in_regs; + } } #ifdef __mono_ppc64__ From bff42ad2c1a4ddc063084856392317d61f6c290f Mon Sep 17 00:00:00 2001 From: Sapana Khemkar Date: Wed, 4 May 2022 05:46:56 +0000 Subject: [PATCH 6/6] change objcopy name for ppc64le from ppc64le-linux-gnu-objcopy to powerpcle-linux-gnu-objcopy --- src/mono/mono.proj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mono/mono.proj b/src/mono/mono.proj index 0ee7e27eb61317..829160a3846301 100644 --- a/src/mono/mono.proj +++ b/src/mono/mono.proj @@ -550,7 +550,7 @@ <_Objcopy Condition="'$(Platform)' == 'armv6'">arm-linux-$(_LinuxAbi)eabi$(_LinuxFloatAbi)-$(_Objcopy) <_Objcopy Condition="'$(Platform)' == 'arm64'">aarch64-linux-$(_LinuxAbi)-$(_Objcopy) <_Objcopy Condition="'$(Platform)' == 's390x'">s390x-linux-$(_LinuxAbi)-$(_Objcopy) - <_Objcopy Condition="'$(Platform)' == 'ppc64le'">ppc64le-linux-$(_LinuxAbi)-$(_Objcopy) + <_Objcopy Condition="'$(Platform)' == 'ppc64le'">powerpc64le-linux-$(_LinuxAbi)-$(_Objcopy) <_Objcopy Condition="'$(Platform)' == 'x64'">x86_64-linux-$(_LinuxAbi)-$(_Objcopy) <_Objcopy Condition="'$(Platform)' == 'x86'">i686-linux-$(_LinuxAbi)-$(_Objcopy) <_Objcopy Condition="'$(TargetsAndroid)' == 'true'">$(ANDROID_NDK_ROOT)/toolchains/llvm/prebuilt/$(MonoToolchainPrebuiltOS)/bin/llvm-objcopy