diff --git a/buildscripts/build-managed.sh b/buildscripts/build-managed.sh index ffa8cf0e8a7..f25581eec6b 100755 --- a/buildscripts/build-managed.sh +++ b/buildscripts/build-managed.sh @@ -31,7 +31,13 @@ build_managed_corert() ToolchainMilestone=testing fi - $__ProjectRoot/Tools/msbuild.sh "$__buildproj" /m /nologo /verbosity:minimal "/fileloggerparameters:Verbosity=normal;LogFile=$__buildlog" /t:Build /p:RepoPath=$__ProjectRoot /p:RepoLocalBuild="true" /p:RelativeProductBinDir=$__RelativeProductBinDir /p:CleanedTheBuild=$__CleanBuild /p:NuPkgRid=$__NugetRuntimeId /p:TestNugetRuntimeId=$__NugetRuntimeId /p:OSGroup=$__BuildOS /p:Configuration=$__BuildType /p:Platform=$__BuildArch /p:COMPUTERNAME=$(hostname) /p:USERNAME=$(id -un) /p:ToolchainMilestone=${ToolchainMilestone} $__UnprocessedBuildArgs $__ExtraMsBuildArgs + __buildarch="$__BuildArch" + if [ "$__buildarch" = "armel" ]; then + __buildarch=arm + __ExtraMsBuildArgs="$__ExtraMsBuildArgs /p:BinDirPlatform=armel" + fi + + $__ProjectRoot/Tools/msbuild.sh "$__buildproj" /m /nologo /verbosity:minimal "/fileloggerparameters:Verbosity=normal;LogFile=$__buildlog" /t:Build /p:RepoPath=$__ProjectRoot /p:RepoLocalBuild="true" /p:RelativeProductBinDir=$__RelativeProductBinDir /p:CleanedTheBuild=$__CleanBuild /p:NuPkgRid=$__NugetRuntimeId /p:TestNugetRuntimeId=$__NugetRuntimeId /p:OSGroup=$__BuildOS /p:Configuration=$__BuildType /p:Platform=$__buildarch /p:COMPUTERNAME=$(hostname) /p:USERNAME=$(id -un) /p:ToolchainMilestone=${ToolchainMilestone} $__UnprocessedBuildArgs $__ExtraMsBuildArgs export BUILDERRORLEVEL=$? echo @@ -56,4 +62,4 @@ if $__buildmanaged; then build_managed_corert # Build complete -fi \ No newline at end of file +fi diff --git a/buildscripts/build-tests.sh b/buildscripts/build-tests.sh index be0c595ebc0..2127f3f1af9 100755 --- a/buildscripts/build-tests.sh +++ b/buildscripts/build-tests.sh @@ -7,9 +7,9 @@ if [ "$BUILDVARS_DONE" != 1 ]; then fi pushd ${__ProjectRoot}/tests -source ${__ProjectRoot}/tests/runtest.sh $__BuildOS $__BuildArch $__BuildType -dotnetclipath $__dotnetclipath +source ${__ProjectRoot}/tests/runtest.sh $__BuildOS $__BuildArch $__BuildType -cross $__CrossBuild -dotnetclipath $__dotnetclipath TESTERRORLEVEL=$? popd if [ $TESTERRORLEVEL != 0 ]; then exit $TESTERRORLEVEL -fi \ No newline at end of file +fi diff --git a/src/Native/Runtime/arm/AllocFast.S b/src/Native/Runtime/arm/AllocFast.S index de818954b6a..e24c657855d 100644 --- a/src/Native/Runtime/arm/AllocFast.S +++ b/src/Native/Runtime/arm/AllocFast.S @@ -4,4 +4,87 @@ #include +.syntax unified +.thumb + // TODO: Implement Arm support + +// Allocate non-array, non-finalizable object. If the allocation doesn't fit into the current thread's +// allocation context then automatically fallback to the slow allocation path. +// r0 == EEType + LEAF_ENTRY RhpNewFast, _TEXT +#ifdef _DEBUG + bl C_FUNC(NYI_Assert) +#endif + LEAF_END RhpNewFast, _TEXT + +// Allocate non-array object with finalizer. +// r0 == EEType + LEAF_ENTRY RhpNewFinalizable, _TEXT +#ifdef _DEBUG + bl C_FUNC(NYI_Assert) +#endif + LEAF_END RhpNewFinalizable, _TEXT + +// Allocate non-array object. +// r0 == EEType +// r1 == alloc flags + NESTED_ENTRY RhpNewObject, _TEXT, NoHandler +#ifdef _DEBUG + bl C_FUNC(NYI_Assert) +#endif + NESTED_END RhpNewObject, _TEXT + +// Allocate one dimensional, zero based array (SZARRAY). +// r0 == EEType +// r1 == element count + LEAF_ENTRY RhpNewArray, _TEXT +#ifdef _DEBUG + bl C_FUNC(NYI_Assert) +#endif + LEAF_END RhpNewArray, _TEXT + +// Allocate one dimensional, zero based array (SZARRAY) using the slow path that calls a runtime helper. +// r0 == EEType +// r1 == element count +// r2 == array size + Thread::m_alloc_context::alloc_ptr +// r3 == Thread + NESTED_ENTRY RhpNewArrayRare, _TEXT, NoHandler +#ifdef _DEBUG + bl C_FUNC(NYI_Assert) +#endif + NESTED_END RhpNewArrayRare, _TEXT + +// Allocate simple object (not finalizable, array or value type) on an 8 byte boundary. +// r0 == EEType + LEAF_ENTRY RhpNewFastAlign8, _TEXT +#ifdef _DEBUG + bl C_FUNC(NYI_Assert) +#endif + LEAF_END RhpNewFastAlign8, _TEXT + +// Allocate a finalizable object (by definition not an array or value type) on an 8 byte boundary. +// r0 == EEType + LEAF_ENTRY RhpNewFinalizableAlign8, _TEXT +#ifdef _DEBUG + bl C_FUNC(NYI_Assert) +#endif + LEAF_END RhpNewFinalizableAlign8, _TEXT + +// Allocate a value type object (i.e. box it) on an 8 byte boundary + 4 (so that the value type payload +// itself is 8 byte aligned). +// r0 == EEType + LEAF_ENTRY RhpNewFastMisalign, _TEXT +#ifdef _DEBUG + bl C_FUNC(NYI_Assert) +#endif + LEAF_END RhpNewFastMisalign, _TEXT + +// Allocate an array on an 8 byte boundary. +// r0 == EEType +// r1 == element count + NESTED_ENTRY RhpNewArrayAlign8, _TEXT, NoHandler +#ifdef _DEBUG + bl C_FUNC(NYI_Assert) +#endif + NESTED_END RhpNewArrayAlign8, _TEXT diff --git a/src/Native/Runtime/portable.cpp b/src/Native/Runtime/portable.cpp index 20a7b959c44..57c659fb1d1 100644 --- a/src/Native/Runtime/portable.cpp +++ b/src/Native/Runtime/portable.cpp @@ -171,6 +171,36 @@ COOP_PINVOKE_HELPER(Array *, RhpNewArray, (EEType * pArrayEEType, int numElement return pObject; } +#ifdef _ARM_ +COOP_PINVOKE_HELPER(Object *, RhpNewFinalizableAlign8, (EEType* pEEType)) +{ + Object * pObject = nullptr; + /* TODO */ ASSERT_UNCONDITIONALLY("NYI"); + return pObject; +} + +COOP_PINVOKE_HELPER(Object *, RhpNewFastMisalign, (EEType* pEEType)) +{ + Object * pObject = nullptr; + /* TODO */ ASSERT_UNCONDITIONALLY("NYI"); + return pObject; +} + +COOP_PINVOKE_HELPER(Object *, RhpNewFastAlign8, (EEType* pEEType)) +{ + Object * pObject = nullptr; + /* TODO */ ASSERT_UNCONDITIONALLY("NYI"); + return pObject; +} + +COOP_PINVOKE_HELPER(Array *, RhpNewArrayAlign8, (EEType * pArrayEEType, int numElements)) +{ + Array * pObject = nullptr; + /* TODO */ ASSERT_UNCONDITIONALLY("NYI"); + return pObject; +} +#endif + // // PInvoke // diff --git a/src/Native/Runtime/rhassert.cpp b/src/Native/Runtime/rhassert.cpp index 1639f66d3bc..4928befa084 100644 --- a/src/Native/Runtime/rhassert.cpp +++ b/src/Native/Runtime/rhassert.cpp @@ -95,4 +95,8 @@ void Assert(const char * expr, const char * file, UInt32 line_num, const char * #endif //!DACCESS_COMPILE } +void NYI_Assert() +{ + ASSERT_UNCONDITIONALLY("NYI"); +} #endif // _DEBUG diff --git a/src/Native/Runtime/rhassert.h b/src/Native/Runtime/rhassert.h index 2bf59aa5911..dd91420abe6 100644 --- a/src/Native/Runtime/rhassert.h +++ b/src/Native/Runtime/rhassert.h @@ -26,6 +26,8 @@ void Assert(const char * expr, const char * file, unsigned int line_num, const char * message); +void NYI_Assert(); + #else #define ASSERT(expr) diff --git a/tests/runtest.cmd b/tests/runtest.cmd index 34886bbd730..3c424f5eb08 100644 --- a/tests/runtest.cmd +++ b/tests/runtest.cmd @@ -207,9 +207,9 @@ goto :eof ) ) - echo msbuild /m /ConsoleLoggerParameters:ForceNoAlign "/p:IlcPath=%CoreRT_ToolchainDir%" "/p:Configuration=%CoreRT_BuildType%" "/p:RepoLocalBuild=true" "/p:FrameworkLibPath=%~dp0\..\bin\Product\%CoreRT_BuildOS%.%CoreRT_BuildArch%.%CoreRT_BuildType%\lib" "/p:FrameworkObjPath=%~dp0\..\bin\obj\Product\%CoreRT_BuildOS%.%CoreRT_BuildArch%.%CoreRT_BuildType%\Framework" !extraArgs! !__SourceFile!.csproj + echo msbuild /m /ConsoleLoggerParameters:ForceNoAlign "/p:IlcPath=%CoreRT_ToolchainDir%" "/p:Configuration=%CoreRT_BuildType%" "/p:Platform=%CoreRT_BuildArch%" "/p:RepoLocalBuild=true" "/p:FrameworkLibPath=%~dp0\..\bin\Product\%CoreRT_BuildOS%.%CoreRT_BuildArch%.%CoreRT_BuildType%\lib" "/p:FrameworkObjPath=%~dp0\..\bin\obj\Product\%CoreRT_BuildOS%.%CoreRT_BuildArch%.%CoreRT_BuildType%\Framework" !extraArgs! !__SourceFile!.csproj echo. - msbuild /m /ConsoleLoggerParameters:ForceNoAlign "/p:IlcPath=%CoreRT_ToolchainDir%" "/p:Configuration=%CoreRT_BuildType%" "/p:RepoLocalBuild=true" "/p:FrameworkLibPath=%~dp0\..\bin\Product\%CoreRT_BuildOS%.%CoreRT_BuildArch%.%CoreRT_BuildType%\lib" "/p:FrameworkObjPath=%~dp0\..\bin\obj\Product\%CoreRT_BuildOS%.%CoreRT_BuildArch%.%CoreRT_BuildType%\Framework" !extraArgs! !__SourceFile!.csproj + msbuild /m /ConsoleLoggerParameters:ForceNoAlign "/p:IlcPath=%CoreRT_ToolchainDir%" "/p:Configuration=%CoreRT_BuildType%" "/p:Platform=%CoreRT_BuildArch%" "/p:RepoLocalBuild=true" "/p:FrameworkLibPath=%~dp0\..\bin\Product\%CoreRT_BuildOS%.%CoreRT_BuildArch%.%CoreRT_BuildType%\lib" "/p:FrameworkObjPath=%~dp0\..\bin\obj\Product\%CoreRT_BuildOS%.%CoreRT_BuildArch%.%CoreRT_BuildType%\Framework" !extraArgs! !__SourceFile!.csproj endlocal set __SavedErrorLevel=%ErrorLevel% @@ -218,7 +218,7 @@ goto :eof if "%__SavedErrorLevel%"=="0" ( echo. echo Running test !__SourceFileName! - call !__SourceFile!.cmd !__SourceFolder!\bin\%CoreRT_BuildType%\native !__SourceFileName!.exe + call !__SourceFile!.cmd !__SourceFolder!\bin\%CoreRT_BuildType%\%CoreRT_BuildArch%\native !__SourceFileName!.exe set __SavedErrorLevel=!ErrorLevel! ) diff --git a/tests/runtest.sh b/tests/runtest.sh index 09a44946f29..86713cdc9f3 100755 --- a/tests/runtest.sh +++ b/tests/runtest.sh @@ -20,7 +20,7 @@ runtest() __SourceFolder=$1 __SourceFileName=$2 __SourceFile=${__SourceFolder}/${__SourceFileName} - ${__SourceFile}.sh $1/bin/${CoreRT_BuildType}/native $2 + ${__SourceFile}.sh $1/bin/${CoreRT_BuildType}/${CoreRT_BuildArch}/native $2 return $? } @@ -28,21 +28,34 @@ run_test_dir() { local __test_dir=$1 local __mode=$2 + local __extra_cxxflags=$3 + local __extra_linkflags=$4 local __dir_path=`dirname ${__test_dir}` local __filename=`basename ${__dir_path}` local __extra_args="" if [ "${__mode}" = "Cpp" ]; then - __extra_args="${__extra_args} /p:NativeCodeGen=cpp" + __extra_args="${__extra_args} /p:NativeCodeGen=cpp" + fi + if [ -n "${__extra_cxxflags}" ]; then + __extra_cxxflags="/p:AdditionalCppCompilerFlags=\"${__extra_cxxflags}\"" + fi + if [ -n "${__extra_cxxflags}" ]; then + __extra_linkflags="/p:AdditionalLinkerFlags=\"${__extra_linkflags}\"" fi rm -rf ${__dir_path}/bin ${__dir_path}/obj local __msbuild_dir=${CoreRT_TestRoot}/../Tools - echo ${__msbuild_dir}/msbuild.sh /m /p:IlcPath=${CoreRT_ToolchainDir} /p:Configuration=${CoreRT_BuildType} /p:RepoLocalBuild=true ${__extra_args} ${__dir_path}/${__filename}.csproj - ${__msbuild_dir}/msbuild.sh /m /p:IlcPath=${CoreRT_ToolchainDir} /p:Configuration=${CoreRT_BuildType} /p:RepoLocalBuild=true ${__extra_args} ${__dir_path}/${__filename}.csproj + echo ${__msbuild_dir}/dotnetcli/dotnet ${__msbuild_dir}/MSBuild.exe /ds /m /p:IlcPath=${CoreRT_ToolchainDir} /p:Configuration=${CoreRT_BuildType} /p:Platform=${CoreRT_BuildArch} /p:RepoLocalBuild=true ${__extra_args} "${__extra_cxxflags}" "${__extra_linkflags}" ${__dir_path}/${__filename}.csproj + ${__msbuild_dir}/dotnetcli/dotnet ${__msbuild_dir}/MSBuild.exe /ds /m /p:IlcPath=${CoreRT_ToolchainDir} /p:Configuration=${CoreRT_BuildType} /p:Platform=${CoreRT_BuildArch} /p:RepoLocalBuild=true ${__extra_args} "${__extra_cxxflags}" "${__extra_linkflags}" ${__dir_path}/${__filename}.csproj - runtest ${__dir_path} ${__filename} local __exitcode=$? + + if [ ${CoreRT_TestRun} == true ]; then + runtest ${__dir_path} ${__filename} + __exitcode=$? + fi + if [ ${__exitcode} == 0 ]; then local __pass_var=__${__mode}PassedTests eval ${__pass_var}=$((${__pass_var} + 1)) @@ -122,6 +135,9 @@ CoreRT_BuildArch=x64 CoreRT_BuildType=Debug CoreRT_TestRun=true CoreRT_TestCompileMode=ryujit +CoreRT_CrossRootFS= +CoreRT_CrossCXXFlags= +CoreRT_CrossLinkerFlags= while [ "$1" != "" ]; do lowerI="$(echo $1 | awk '{print tolower($0)}')" @@ -139,6 +155,9 @@ while [ "$1" != "" ]; do arm) CoreRT_BuildArch=arm ;; + armel) + CoreRT_BuildArch=armel + ;; arm64) CoreRT_BuildArch=arm64 ;; @@ -160,6 +179,10 @@ while [ "$1" != "" ]; do shift CoreRT_CliBinDir=$1 ;; + -cross) + shift + CoreRT_CrossBuild=$1 + ;; -coreclr) CoreRT_RunCoreCLRTests=true; shift @@ -178,6 +201,50 @@ while [ "$1" != "" ]; do shift done +CoreRT_ExtraCXXFlags= +CoreRT_ExtraLinkFlags= +if [ ${CoreRT_CrossBuild} != 0 ]; then + CoreRT_TestRun=false + CoreRT_CrossRootFS=${CoreRT_TestRoot}/../cross/rootfs/${CoreRT_BuildArch} + # all values are brought from the appropriate toolchain.cmake's + case $CoreRT_BuildArch in + arm) + CoreRT_CrossCXXFlags="-target armv7-linux-gnueabihf -mthumb -mfpu=vfpv3 --sysroot=${CoreRT_CrossRootFS}" + CoreRT_CrossLinkerFlags="-target arm-linux-gnueabihf -B ${CoreRT_CrossRootFS}/usr/lib/gcc/arm-linux-gnueabihf ` + `-L${CorRT_CrossRootFS}/lib/arm-linux-gnueabihf --sysroot=${CoreRT_CrossRootFS}" + ;; + arm64) + CoreRT_CrossCXXFlags="-target aarch64-linux-gnu --sysroot=${CoreRT_CrossRootFS}" + CoreRT_CrossLinkerFlags="-target aarch64-linux-gnu -B ${CoreRT_CrossRootFS}/usr/lib/gcc/aarch64-linux-gnu ` + `-L${CoreRT_CrossRootFS}/lib/aarch64-linux-gnu --sysroot=${CoreRT_CrossRootFS}" + ;; + armel) + CoreRT_CrossCXXFlags="-target armv7-linux-gnueabi -mthumb -mfpu=vfpv3 -mfloat-abi=softfp --sysroot=${CoreRT_CrossRootFS}" + CoreRT_CrossLinkerFlags="-target arm-linux-gnueabi --sysroot=${CoreRT_CrossRootFS}" + ID= + if [ -e $ROOTFS_DIR/etc/os-release ]; then + source $ROOTFS_DIR/etc/os-release + fi + if [ "$ID" = "tizen" ]; then + CoreRT_CrossCXXFlags="${CoreRT_CrossCXXFlags} -isystem ${CoreRT_CrossRootFS}/usr/lib/gcc/armv7l-tizen-linux-gnueabi/4.9.2/include/c++ ` + `-isystem ${CoreRT_CrossRootFS}//usr/lib/gcc/armv7l-tizen-linux-gnueabi/4.9.2/include/c++/armv7l-tizen-linux-gnueabi ` + `-isystem ${CoreRT_CrossRootFS}/armel/usr/include" + TIZEN_TOOLCHAIN="armv7l-tizen-linux-gnueabi/4.9.2" + CoreRT_CrossLinkerFlags="${CoreRT_CrossLinkerFlags} -B${CoreRT_CrossRootFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN} ` + `-L${CoreRT_CrossRootFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}" + else + TOOLCHAIN="arm-linux-gnueabi" + CoreRT_CrossCXXFlags="${CoreRT_CrossCXXFlags} -isystem ${CoreRT_CrossRootFS}/usr/include/c++/4.9 ` + `-isystem ${CoreRT_CrossRootFS}/usr/include/arm-linux-gnueabi/c++/4.9 " + CoreRT_CrossLinkerFlags="${CoreRT_CrossLinkerFlags} -B${CoreRT_CrossRootFS}/usr/lib/gcc/${TOOLCHAIN}/4.9 ` + `-L${CoreRT_CrossRootFS}/usr/lib/gcc/${TOOLCHAIN}/4.9" + fi + ;; + esac + CoreRT_ExtraCXXFlags="$CoreRT_ExtraCXXFlags $CoreRT_CrossCXXFlags" + CoreRT_ExtraLinkFlags="$CoreRT_ExtraLinkFlags $CoreRT_CrossLinkerFlags" +fi + source "$CoreRT_TestRoot/testenv.sh" __BuildStr=${CoreRT_BuildOS}.${CoreRT_BuildArch}.${CoreRT_BuildType} @@ -213,7 +280,7 @@ do if [ ! -e `dirname ${csproj}`/no_unix ]; then run_test_dir ${csproj} "Jit" if [ ! -e `dirname ${csproj}`/no_cpp ]; then - run_test_dir ${csproj} "Cpp" + run_test_dir ${csproj} "Cpp" "$CoreRT_ExtraCXXFlags" "$CoreRT_ExtraLinkFlags" fi fi done diff --git a/tests/src/Simple/PInvoke/PInvoke.csproj b/tests/src/Simple/PInvoke/PInvoke.csproj index 2774d969ac4..83dd24aad21 100644 --- a/tests/src/Simple/PInvoke/PInvoke.csproj +++ b/tests/src/Simple/PInvoke/PInvoke.csproj @@ -8,7 +8,7 @@ - $(MSBuildProjectDirectory)\obj\$(Configuration)\native\ + $(MSBuildProjectDirectory)\obj\$(Configuration)\$(Platform)\native\ PInvokeNative .obj .o diff --git a/tests/src/Simple/SimpleTest.targets b/tests/src/Simple/SimpleTest.targets index cfd481c5db4..ba0cd5cdc94 100644 --- a/tests/src/Simple/SimpleTest.targets +++ b/tests/src/Simple/SimpleTest.targets @@ -3,8 +3,8 @@ Exe - $(MSBuildProjectDirectory)\bin\$(Configuration)\ - $(MSBuildProjectDirectory)\obj\$(Configuration)\ + $(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\ + $(MSBuildProjectDirectory)\obj\$(Configuration)\$(Platform)\ @@ -35,4 +35,9 @@ - \ No newline at end of file + + + + + + diff --git a/tests/testenv.sh b/tests/testenv.sh index c8cd3e23c4e..f324fba421d 100755 --- a/tests/testenv.sh +++ b/tests/testenv.sh @@ -23,6 +23,9 @@ for i in "$@" arm) CoreRT_BuildArch=arm ;; + armel) + CoreRT_BuildArch=armel + ;; arm64) CoreRT_BuildArch=arm64 ;;