未验证 提交 6ecdf9ed 编写于 作者: S Sapana-Khemkar 提交者: GitHub

[mono] add support to build for ppc64le architecture (#68802)

* mono add support to build for ppc64le

* fix build failures in mini-ppc.c

* handle unhandled exception ids

* 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

* Fixed failing test cases from System.Numerics.Vectors.Tests

* change objcopy name for ppc64le from ppc64le-linux-gnu-objcopy to powerpcle-linux-gnu-objcopy
上级 fc538c23
......@@ -375,6 +375,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()
......@@ -448,8 +450,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()
......
......@@ -10,7 +10,7 @@
<!-- Force System.Private.CoreLib.dll into a special IL output directory -->
<OutputPath>$(RuntimeBinDir)IL/</OutputPath>
<Configurations>Debug;Release;Checked</Configurations>
<Platforms>x64;x86;arm;armv6;arm64;s390x;wasm</Platforms>
<Platforms>x64;x86;arm;armv6;arm64;s390x;wasm;ppc64le</Platforms>
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
</PropertyGroup>
......@@ -75,6 +75,10 @@
<PlatformTarget>AnyCPU</PlatformTarget>
<DefineConstants>$(DefineConstants);TARGET_WASM</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="'$(Platform)' == 'ppc64le'">
<PlatformTarget>AnyCPU</PlatformTarget>
<DefineConstants>$(DefineConstants);TARGET_POWERPC64</DefineConstants>
</PropertyGroup>
<!-- Configuration specific properties -->
<PropertyGroup Condition="'$(Configuration)' == 'Debug' or '$(Configuration)' == 'Checked'">
......
......@@ -265,6 +265,13 @@
<_MonoBuildEnv Include="PKG_CONFIG_PATH=$(MonoCrossDir)/usr/lib/s390x-linux-gnu/pkgconfig" />
</ItemGroup>
<!-- ppc64le Linux cross build options -->
<ItemGroup Condition="'$(MonoCrossDir)' != '' and '$(TargetArchitecture)' == 'ppc64le'">
<_MonoCMakeArgs Include="-DCMAKE_TOOLCHAIN_FILE=$(CrossToolchainFile)" />
<_MonoBuildEnv Include="TARGET_BUILD_ARCH=ppc64le" />
<_MonoBuildEnv Include="PKG_CONFIG_PATH=$(MonoCrossDir)/usr/lib/powerpc64le-linux-gnu/pkgconfig" />
</ItemGroup>
<!-- x64 FreeBSD cross build options -->
<ItemGroup Condition="'$(TargetsFreeBSD)' == 'true' and '$(MonoCrossDir)' != ''">
<_MonoCMakeArgs Include="-DCMAKE_TOOLCHAIN_FILE=$(CrossToolchainFile)" />
......@@ -546,6 +553,7 @@
<_Objcopy Condition="'$(Platform)' == 'armv6'">arm-linux-$(_LinuxAbi)eabi$(_LinuxFloatAbi)-$(_Objcopy)</_Objcopy>
<_Objcopy Condition="'$(Platform)' == 'arm64'">aarch64-linux-$(_LinuxAbi)-$(_Objcopy)</_Objcopy>
<_Objcopy Condition="'$(Platform)' == 's390x'">s390x-linux-$(_LinuxAbi)-$(_Objcopy)</_Objcopy>
<_Objcopy Condition="'$(Platform)' == 'ppc64le'">powerpc64le-linux-$(_LinuxAbi)-$(_Objcopy)</_Objcopy>
<_Objcopy Condition="'$(Platform)' == 'x64'">x86_64-linux-$(_LinuxAbi)-$(_Objcopy)</_Objcopy>
<_Objcopy Condition="'$(Platform)' == 'x86'">i686-linux-$(_LinuxAbi)-$(_Objcopy)</_Objcopy>
<_Objcopy Condition="'$(TargetsAndroid)' == 'true' or '$(TargetsLinuxBionic)' == 'true'">$(ANDROID_NDK_ROOT)/toolchains/llvm/prebuilt/$(MonoToolchainPrebuiltOS)/bin/llvm-objcopy</_Objcopy>
......
......@@ -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); \
......
......@@ -222,6 +222,13 @@ set(wasm_sources
exceptions-wasm.c
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)
......@@ -234,6 +241,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
......@@ -480,6 +489,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(main_sources "main.c")
if(HOST_WIN32)
......
......@@ -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__
......@@ -1824,7 +1836,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 +1975,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;
......@@ -3116,7 +3128,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 +3168,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 +3187,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));
......@@ -5309,6 +5336,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;
}
......@@ -5753,7 +5784,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];
}
......
......@@ -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()
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册