diff --git a/.github/workflows/test-wasm-arm64.yml b/.github/workflows/test-wasm-arm64.yml new file mode 100644 index 0000000000000..009cec91e0803 --- /dev/null +++ b/.github/workflows/test-wasm-arm64.yml @@ -0,0 +1,33 @@ +name: Testing dotnet with emsdk arm64 + +on: + pull_request: + branches: [ "main" ] + workflow_dispatch: + +jobs: + test-dotnet-emsdk-arm64: + runs-on: [self-hosted, Windows, ARM64, WASM] + + steps: + - name: Git checkout + uses: actions/checkout@v3 + + - name: Build dotnet with emsdk arm64 + run: | + Set-PSDebug -Trace 1 + git clone https://github.com/Windows-on-ARM-Experiments/emsdk + cd emsdk + ./emsdk install latest + ./emsdk activate latest + cd .. + $env:EMSDK_PATH = $PWD.Path + "\emsdk" + ./build.cmd -bl -os browser -subset mono+libs+packs -c Release + + - name: Test dotnet with emsdk arm64 + run: | + Set-PSDebug -Trace 1 + .\dotnet.cmd build -c Release /t:RunSample -p:RunAOTCompilation=false .\src\mono\sample\wasm\console-node\Wasm.Console.Node.Sample.csproj + .\dotnet.cmd build -c Release -p:RunAOTCompilation=false .\src\mono\sample\wasm\browser\Wasm.Browser.Sample.csproj + .\dotnet.cmd build -c Release -p:RunAOTCompilation=false .\src\mono\sample\wasm\browser-advanced\Wasm.Advanced.Sample.csproj + .\dotnet.cmd build -c Release -p:RunAOTCompilation=false .\src\mono\sample\wasm\browser-bench\Wasm.Browser.Bench.Sample.csproj diff --git a/eng/native/init-vs-env.cmd b/eng/native/init-vs-env.cmd index 68242ed725f67..6c1ad8f3a1786 100644 --- a/eng/native/init-vs-env.cmd +++ b/eng/native/init-vs-env.cmd @@ -8,7 +8,7 @@ if /i "%~1" == "x86" (set __VCBuildArch=x86) if /i "%~1" == "x64" (set __VCBuildArch=x86_amd64) if /i "%~1" == "arm" (set __VCBuildArch=x86_arm) if /i "%~1" == "arm64" (set __VCBuildArch=x86_arm64) -if /i "%~1" == "wasm" (set __VCBuildArch=x86_amd64) +if /i "%~1" == "wasm" (if /i "%PROCESSOR_ARCHITECTURE%" == "ARM64" (set __VCBuildArch=x86_arm64) else (set __VCBuildArch=x86_amd64)) :: Default to highest Visual Studio version available that has Visual C++ tools. :: diff --git a/src/mono/CMakeLists.txt b/src/mono/CMakeLists.txt index 7b57776aa007c..e4863f7dbf05d 100644 --- a/src/mono/CMakeLists.txt +++ b/src/mono/CMakeLists.txt @@ -40,9 +40,11 @@ set(CMAKE_MODULE_PATH ) set(CMAKE_INSTALL_MESSAGE LAZY) -find_program(CCACHE_PROGRAM ccache) -if(CCACHE_PROGRAM) - set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}") +if(USE_CCACHE) + find_program(CCACHE_PROGRAM ccache) + if(CCACHE_PROGRAM) + set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}") + endif() endif() function(append value) diff --git a/src/mono/mono.proj b/src/mono/mono.proj index 695064cc7663b..da81b42e1b2b2 100644 --- a/src/mono/mono.proj +++ b/src/mono/mono.proj @@ -745,7 +745,6 @@ $(MonoLLVMDir)/$(BuildArchitecture)/lib/libclang.dylib $(MonoLLVMDir)/$(BuildArchitecture)/lib/libclang.so $([MSBuild]::NormalizePath('$(MonoLLVMDir)', '$(BuildArchitecture)', 'bin', 'libclang.dll')) - setlocal EnableDelayedExpansion && call "$([MSBuild]::NormalizePath('$(EMSDK_PATH)', 'emsdk_env.bat'))" && !EMSDK_PYTHON! <_ForceRelease Condition="$([MSBuild]::IsOSPlatform('Windows')) and '$(TargetArchitecture)' == 'wasm' and '$(Configuration)' == 'Debug'">true diff --git a/src/mono/mono/metadata/coree.c b/src/mono/mono/metadata/coree.c index 2efdfd25adb64..37c94daf32fdb 100644 --- a/src/mono/mono/metadata/coree.c +++ b/src/mono/mono/metadata/coree.c @@ -646,7 +646,7 @@ STDAPI MonoFixupCorEE(HMODULE ModuleHandle) *(Trampoline)++ = 0xFF; *(Trampoline)++ = 0xE3; #else -#error Unsupported architecture. + g_assert_not_reached(); #endif #else ProcRva = (DWORD)(ExportFixup->ProcAddress.DWordPtr - (DWORD_PTR)DosHeader); diff --git a/src/mono/mono/mini/mini-windows.c b/src/mono/mono/mini/mini-windows.c index c678f4c4594c4..f5d81c537a691 100644 --- a/src/mono/mono/mini/mini-windows.c +++ b/src/mono/mono/mini/mini-windows.c @@ -283,7 +283,9 @@ thread_timer_expired (HANDLE thread) if (GetThreadContext (thread, &context)) { guchar *ip; -#ifdef _WIN64 +#ifdef _ARM64_ + ip = (guchar *) context.Pc; +#elif _WIN64 ip = (guchar *) context.Rip; #else ip = (guchar *) context.Eip; diff --git a/src/mono/mono/utils/mono-threads-coop.c b/src/mono/mono/utils/mono-threads-coop.c index 4ed659d66058c..b6263bd844cea 100644 --- a/src/mono/mono/utils/mono-threads-coop.c +++ b/src/mono/mono/utils/mono-threads-coop.c @@ -219,6 +219,7 @@ typedef struct { __declspec(naked) void __cdecl copy_stack_data_internal_win32_wrapper (MonoThreadInfo *info, MonoStackData *stackdata_begin, MonoBuiltinUnwindInfo *unwind_info_data, CopyStackDataFunc func) { +#if defined(TARGET_X86) || defined(TARGET_AMD64) __asm { mov edx, dword ptr [esp + 0Ch] mov dword ptr [edx + 00h], ebx @@ -230,6 +231,7 @@ copy_stack_data_internal_win32_wrapper (MonoThreadInfo *info, MonoStackData *sta mov edx, dword ptr [esp + 10h] jmp edx }; +#endif } #endif diff --git a/src/mono/wasm/wasm.proj b/src/mono/wasm/wasm.proj index 9755e405afed4..8342ee12786eb 100644 --- a/src/mono/wasm/wasm.proj +++ b/src/mono/wasm/wasm.proj @@ -293,7 +293,6 @@ <_EmccLinkFlags Include="-s EXPORTED_RUNTIME_METHODS=$(_EmccExportedRuntimeMethods)" /> <_EmccLinkFlags Include="-s EXPORTED_FUNCTIONS=$(_EmccExportedFunctions)" /> <_EmccLinkFlags Include="--source-map-base http://example.com" /> - <_EmccLinkFlags Include="-s STRICT_JS=1" /> <_EmccLinkFlags Include="-s WASM_BIGINT=1" /> <_EmccLinkFlags Include="-s EXPORT_NAME="'createDotnetRuntime'"" /> <_EmccLinkFlags Include="-s MODULARIZE=1"/>