diff --git a/src/libraries/System.Runtime/tests/System.IO.FileSystem.Tests/Base/BaseGetSetTimes.cs b/src/libraries/System.Runtime/tests/System.IO.FileSystem.Tests/Base/BaseGetSetTimes.cs index dfebe3e9c3a065..754db1aa0aa943 100644 --- a/src/libraries/System.Runtime/tests/System.IO.FileSystem.Tests/Base/BaseGetSetTimes.cs +++ b/src/libraries/System.Runtime/tests/System.IO.FileSystem.Tests/Base/BaseGetSetTimes.cs @@ -18,7 +18,7 @@ public abstract class BaseGetSetTimes : FileSystemTest protected static bool isHFS => driveFormat != null && driveFormat.Equals(HFS, StringComparison.InvariantCultureIgnoreCase); - protected static bool LowTemporalResolution => PlatformDetection.IsBrowser || isHFS; + protected static bool LowTemporalResolution => isHFS; protected static bool HighTemporalResolution => !LowTemporalResolution; protected abstract bool CanBeReadOnly { get; } @@ -268,7 +268,7 @@ public void TimesIncludeMillisecondPart() public void TimesIncludeMillisecondPart_LowTempRes() { T item = GetExistingItem(); - // OSX HFS driver format and Browser do not support millisec granularity + // OSX HFS driver format does not support millisec granularity Assert.All(TimeFunctions(), (function) => { DateTime time = function.Getter(item); diff --git a/src/libraries/System.Runtime/tests/System.IO.FileSystem.Tests/FileInfo/GetSetTimes.cs b/src/libraries/System.Runtime/tests/System.IO.FileSystem.Tests/FileInfo/GetSetTimes.cs index 1b4d2f2c22c46a..731e0aecc52cbf 100644 --- a/src/libraries/System.Runtime/tests/System.IO.FileSystem.Tests/FileInfo/GetSetTimes.cs +++ b/src/libraries/System.Runtime/tests/System.IO.FileSystem.Tests/FileInfo/GetSetTimes.cs @@ -128,6 +128,7 @@ public void CopyToMillisecondPresent() } [ConditionalFact(nameof(HighTemporalResolution))] + [ActiveIssue("https://github.com/dotnet/runtime/issues/83197", TestPlatforms.Browser)] public void CopyToNanosecondsPresent() { FileInfo input = GetNonZeroNanoseconds(); diff --git a/src/mono/browser/browser.proj b/src/mono/browser/browser.proj index 2088d661ad7943..ff985a44586c11 100644 --- a/src/mono/browser/browser.proj +++ b/src/mono/browser/browser.proj @@ -124,6 +124,16 @@ + + + + + + + + + + @@ -229,10 +239,7 @@ - - - - <_EmccLinkFlags Include="-s TEXTDECODER=0"/> + diff --git a/src/mono/browser/build/EmSdkRepo.Defaults.props b/src/mono/browser/build/EmSdkRepo.Defaults.props index aa94ded228bfc7..5a9fafe045a5e1 100644 --- a/src/mono/browser/build/EmSdkRepo.Defaults.props +++ b/src/mono/browser/build/EmSdkRepo.Defaults.props @@ -8,7 +8,7 @@ $([MSBuild]::NormalizeDirectory($(EmscriptenSdkToolsPath), 'emscripten')) - $([MSBuild]::NormalizeDirectory($(EmscriptenSdkToolsPath), 'node', 'bin')) + $([MSBuild]::NormalizeDirectory($(EmscriptenSdkToolsPath), 'node','22.16.0_64bit', 'bin')) <_UsingEMSDK_PATH>true diff --git a/src/mono/browser/emscripten-version.txt b/src/mono/browser/emscripten-version.txt index 4a8bd23c1443d4..2da71d0eb1cee4 100644 --- a/src/mono/browser/emscripten-version.txt +++ b/src/mono/browser/emscripten-version.txt @@ -1 +1 @@ -3.1.56 \ No newline at end of file +4.0.14 \ No newline at end of file diff --git a/src/mono/browser/env/emsdk_env.cmd b/src/mono/browser/env/emsdk_env.cmd new file mode 100644 index 00000000000000..3cda1d6a74f10d --- /dev/null +++ b/src/mono/browser/env/emsdk_env.cmd @@ -0,0 +1,63 @@ +@echo off + +set CURRENT_SCRIPT=%~dp0 +set EMSDK_PATH=%CURRENT_SCRIPT:~0,-1%\ + +set EMSDK_PYTHON=%EMSDK_PATH%python\python.exe +set DOTNET_EMSCRIPTEN_LLVM_ROOT=%EMSDK_PATH%bin\ +set DOTNET_EMSCRIPTEN_NODE_JS=%EMSDK_PATH%node\22.16.0_64bit\bin\node.exe +set DOTNET_EMSCRIPTEN_BINARYEN_ROOT=%EMSDK_PATH% +@echo off +echo *** .NET EMSDK path setup *** +REM emscripten (emconfigure, em++, etc) +if "%EMSDK_PATH%"=="" ( +echo %EMSDK_PATH% is empty +exit /b 1 +) +set "TOADD_PATH_EMSCRIPTEN=%EMSDK_PATH%emscripten" +echo Prepending to PATH: %TOADD_PATH_EMSCRIPTEN% +set "PATH=%TOADD_PATH_EMSCRIPTEN%;%PATH%" +REM python +if "%EMSDK_PYTHON%"=="" ( +echo %EMSDK_PYTHON% is empty +exit /b 1 +) +for %%i in ("%EMSDK_PYTHON%") do set "TOADD_PATH_PYTHON=%%~dpi" +echo Prepending to PATH: %TOADD_PATH_PYTHON% +set "PATH=%TOADD_PATH_PYTHON%;%PATH%" +REM llvm (clang, etc) +if "%DOTNET_EMSCRIPTEN_LLVM_ROOT%"=="" ( +echo %DOTNET_EMSCRIPTEN_LLVM_ROOT% is empty +exit /b 1 +) +set "TOADD_PATH_LLVM=%DOTNET_EMSCRIPTEN_LLVM_ROOT%" +if not "%TOADD_PATH_EMSCRIPTEN%"=="%TOADD_PATH_LLVM%" ( +echo Prepending to PATH: %TOADD_PATH_LLVM% +set "PATH=%TOADD_PATH_LLVM%;%PATH%" +) +REM nodejs (node) +if "%DOTNET_EMSCRIPTEN_NODE_JS%"=="" ( +echo %DOTNET_EMSCRIPTEN_NODE_JS% is empty +exit /b 1 +) +for %%i in ("%DOTNET_EMSCRIPTEN_NODE_JS%") do set "TOADD_PATH_NODEJS=%%~dpi" +if not "%TOADD_PATH_EMSCRIPTEN%"=="%TOADD_PATH_NODEJS%" ( +if not "%TOADD_PATH_LLVM%"=="%TOADD_PATH_NODEJS%" ( +echo Prepending to PATH: %TOADD_PATH_NODEJS% +set "PATH=%TOADD_PATH_NODEJS%;%PATH%" +) +) +REM binaryen (wasm-opt, etc) +if "%DOTNET_EMSCRIPTEN_BINARYEN_ROOT%"=="" ( +echo %DOTNET_EMSCRIPTEN_BINARYEN_ROOT% is empty +exit /b 1 +) +set "TOADD_PATH_BINARYEN=%DOTNET_EMSCRIPTEN_BINARYEN_ROOT%bin\" +if not "%TOADD_PATH_EMSCRIPTEN%"=="%TOADD_PATH_BINARYEN%" ( +if not "%TOADD_PATH_LLVM%"=="%TOADD_PATH_BINARYEN%" ( +if not "%TOADD_PATH_NODEJS%"=="%TOADD_PATH_BINARYEN%" ( +echo Prepending to PATH: %TOADD_PATH_BINARYEN% +set "PATH=%TOADD_PATH_BINARYEN%;%PATH%" +) +) +) diff --git a/src/mono/browser/env/emsdk_env.sh b/src/mono/browser/env/emsdk_env.sh new file mode 100644 index 00000000000000..2fb5293cdf39d7 --- /dev/null +++ b/src/mono/browser/env/emsdk_env.sh @@ -0,0 +1,44 @@ +#!/bin/bash +echo "*** .NET EMSDK path setup ***" + +# emscripten (emconfigure, em++, etc) +if [ -z "${EMSDK_PATH}" ]; then + echo "\$EMSDK_PATH is empty" + exit 1 +fi +TOADD_PATH_EMSCRIPTEN="$(realpath ${EMSDK_PATH}/emscripten)" +echo "Prepending to PATH: ${TOADD_PATH_EMSCRIPTEN}" +export PATH=${TOADD_PATH_EMSCRIPTEN}:$PATH + +# llvm (clang, etc) +if [ -z "${DOTNET_EMSCRIPTEN_LLVM_ROOT}" ]; then + echo "\$DOTNET_EMSCRIPTEN_LLVM_ROOT is empty" + exit 1 +fi +TOADD_PATH_LLVM="$(realpath ${DOTNET_EMSCRIPTEN_LLVM_ROOT})" +if [ "${TOADD_PATH_EMSCRIPTEN}" != "${TOADD_PATH_LLVM}" ]; then + echo "Prepending to PATH: ${TOADD_PATH_LLVM}" + export PATH=${TOADD_PATH_LLVM}:$PATH +fi + +# nodejs (node) +if [ -z "${DOTNET_EMSCRIPTEN_NODE_JS}" ]; then + echo "\$DOTNET_EMSCRIPTEN_NODE_JS is empty" + exit 1 +fi +TOADD_PATH_NODEJS="$(dirname ${DOTNET_EMSCRIPTEN_NODE_JS})" +if [ "${TOADD_PATH_EMSCRIPTEN}" != "${TOADD_PATH_NODEJS}" ] && [ "${TOADD_PATH_LLVM}" != "${TOADD_PATH_NODEJS}" ]; then + echo "Prepending to PATH: ${TOADD_PATH_NODEJS}" + export PATH=${TOADD_PATH_NODEJS}:$PATH +fi + +# binaryen (wasm-opt, etc) +if [ -z "${DOTNET_EMSCRIPTEN_BINARYEN_ROOT}" ]; then + echo "\$DOTNET_EMSCRIPTEN_BINARYEN_ROOT is empty" + exit 1 +fi +TOADD_PATH_BINARYEN="$(realpath ${DOTNET_EMSCRIPTEN_BINARYEN_ROOT}/bin)" +if [ "${TOADD_PATH_EMSCRIPTEN}" != "${TOADD_PATH_BINARYEN}" ] && [ "${TOADD_PATH_LLVM}" != "${TOADD_PATH_BINARYEN}" ] && [ "${TOADD_PATH_NODEJS}" != "${TOADD_PATH_BINARYEN}" ]; then + echo "Prepending to PATH: ${TOADD_PATH_BINARYEN}" + export PATH=${TOADD_PATH_BINARYEN}:$PATH +fi diff --git a/src/mono/browser/runtime/CMakeLists.txt b/src/mono/browser/runtime/CMakeLists.txt index 1fd1db756049e3..6aeba796ef72da 100644 --- a/src/mono/browser/runtime/CMakeLists.txt +++ b/src/mono/browser/runtime/CMakeLists.txt @@ -44,7 +44,7 @@ set(ignoreMeEmsdkPath "${EMSDK_PATH}") if(CMAKE_BUILD_TYPE STREQUAL "Release") add_custom_command(TARGET dotnet.native - POST_BUILD COMMAND ${EMSDK_PATH}/bin/wasm-opt --enable-exception-handling --enable-simd --enable-bulk-memory ${CONFIGURATION_WASM_OPT_FLAGS} --strip-dwarf ${NATIVE_BIN_DIR}/dotnet.native.wasm -o ${NATIVE_BIN_DIR}/dotnet.native.wasm + POST_BUILD COMMAND ${EMSDK_PATH}/bin/wasm-opt --enable-exception-handling --enable-simd --enable-bulk-memory --enable-nontrapping-float-to-int ${CONFIGURATION_WASM_OPT_FLAGS} --strip-dwarf ${NATIVE_BIN_DIR}/dotnet.native.wasm -o ${NATIVE_BIN_DIR}/dotnet.native.wasm COMMENT "Stripping debug symbols from dotnet.native.wasm using wasm-opt") endif() diff --git a/src/mono/mono.proj b/src/mono/mono.proj index bba99d6c631ef8..fef0b9025e147f 100644 --- a/src/mono/mono.proj +++ b/src/mono/mono.proj @@ -229,7 +229,7 @@ export EMSDK_PATH=%24{DIR}/ unset DIR export DOTNET_EMSCRIPTEN_LLVM_ROOT=%24{EMSDK_PATH}bin/ -export DOTNET_EMSCRIPTEN_NODE_JS=%24{EMSDK_PATH}node/bin/node +export DOTNET_EMSCRIPTEN_NODE_JS=%24{EMSDK_PATH}node/22.16.0_64bit/bin/node export DOTNET_EMSCRIPTEN_BINARYEN_ROOT=%24{EMSDK_PATH} @@ -241,7 +241,7 @@ set EMSDK_PATH=%CURRENT_SCRIPT:~0,-1%\ set EMSDK_PYTHON=%EMSDK_PATH%python\python.exe set DOTNET_EMSCRIPTEN_LLVM_ROOT=%EMSDK_PATH%bin\ -set DOTNET_EMSCRIPTEN_NODE_JS=%EMSDK_PATH%node\bin\node.exe +set DOTNET_EMSCRIPTEN_NODE_JS=%EMSDK_PATH%node\22.16.0_64bit\bin\node.exe set DOTNET_EMSCRIPTEN_BINARYEN_ROOT=%EMSDK_PATH% @@ -251,7 +251,7 @@ import os emsdk_path = os.path.dirname(os.path.dirname(os.path.realpath(os.getenv('EM_CONFIG')).replace('\\', '/'))) LLVM_ROOT = emsdk_path + '/bin' -NODE_JS = emsdk_path + '/node/bin/node' +NODE_JS = emsdk_path + '/node/22.16.0_64bit/bin/node' BINARYEN_ROOT = emsdk_path FROZEN_CACHE = bool(os.getenv('EM_FROZEN_CACHE', 'True')) @@ -263,24 +263,39 @@ JS_ENGINES = [NODE_JS] + + $(EMSDK_PATH)/emsdk$(EmsdkExt) install $(EmscriptenVersion) + $(EMSDK_PATH)/emsdk$(EmsdkExt) activate $(EmscriptenVersion) + powershell -NonInteractive -command "& $(InstallCmd); Exit $LastExitCode " + powershell -NonInteractive -command "& $(ActivateCmd); Exit $LastExitCode " + setlocal EnableDelayedExpansion && call "$([MSBuild]::NormalizePath('$(EMSDK_PATH)', 'emsdk_env.bat'))" && !EMSDK_PYTHON! + + + + + + - - - + <_EmsdkFiles Include="$(EMSDK_PATH)/upstream/**/*" /> + <_PythonFiles Include="$(EMSDK_PATH)/python/3.13.3_64bit/**/*" /> + <_ShellFiles Include="$(MSBuildThisFileDirectory)browser/env/**/*" /> - - - - - - - - + + + + @@ -290,15 +305,6 @@ JS_ENGINES = [NODE_JS] - - - - - false diff --git a/src/mono/mono/mini/llvm-intrinsics.h b/src/mono/mono/mini/llvm-intrinsics.h index d1cb974e41e118..dfb8953e80039c 100644 --- a/src/mono/mono/mini/llvm-intrinsics.h +++ b/src/mono/mono/mini/llvm-intrinsics.h @@ -247,13 +247,12 @@ INTRINS(AESNI_AESDECLAST, x86_aesni_aesdeclast, X86) INTRINS(AESNI_AESENC, x86_aesni_aesenc, X86) INTRINS(AESNI_AESENCLAST, x86_aesni_aesenclast, X86) INTRINS(AESNI_AESIMC, x86_aesni_aesimc, X86) - +#endif +#if defined(TARGET_AMD64) || defined(TARGET_X86) || defined(TARGET_WASM) INTRINS_OVR(SSE_SSUB_SATI8, ssub_sat, Generic, v128_i1_t) INTRINS_OVR(SSE_USUB_SATI8, usub_sat, Generic, v128_i1_t) INTRINS_OVR(SSE_SSUB_SATI16, ssub_sat, Generic, v128_i2_t) INTRINS_OVR(SSE_USUB_SATI16, usub_sat, Generic, v128_i2_t) -#endif -#if defined(TARGET_AMD64) || defined(TARGET_X86) || defined(TARGET_WASM) INTRINS_OVR(SSE_SADD_SATI8, sadd_sat, Generic, v128_i1_t) INTRINS_OVR(SSE_UADD_SATI8, uadd_sat, Generic, v128_i1_t) INTRINS_OVR(SSE_SADD_SATI16, sadd_sat, Generic, v128_i2_t) @@ -298,10 +297,6 @@ INTRINS_OVR(WASM_PMAX_V4, fabs, Generic, sse_r4_t) INTRINS_OVR(WASM_PMAX_V2, fabs, Generic, sse_r8_t) INTRINS(WASM_Q15MULR_SAT_SIGNED, wasm_q15mulr_sat_signed, Wasm) INTRINS(WASM_SHUFFLE, wasm_shuffle, Wasm) -INTRINS_OVR(WASM_SUB_SAT_SIGNED_V16, wasm_sub_sat_signed, Wasm, sse_i1_t) -INTRINS_OVR(WASM_SUB_SAT_SIGNED_V8, wasm_sub_sat_signed, Wasm, sse_i2_t) -INTRINS_OVR(WASM_SUB_SAT_UNSIGNED_V16, wasm_sub_sat_unsigned, Wasm, sse_i1_t) -INTRINS_OVR(WASM_SUB_SAT_UNSIGNED_V8, wasm_sub_sat_unsigned, Wasm, sse_i2_t) INTRINS(WASM_SWIZZLE, wasm_swizzle, Wasm) INTRINS(WASM_GET_EXCEPTION, wasm_get_exception, Wasm) INTRINS(WASM_GET_EHSELECTOR, wasm_get_ehselector, Wasm) diff --git a/src/mono/mono/mini/simd-intrinsics.c b/src/mono/mono/mini/simd-intrinsics.c index ebe0637605fe5a..873f53217d113d 100644 --- a/src/mono/mono/mini/simd-intrinsics.c +++ b/src/mono/mono/mini/simd-intrinsics.c @@ -6823,16 +6823,16 @@ emit_wasm_supported_intrinsics ( switch (arg0_type) { case MONO_TYPE_I1: - c0 = INTRINS_WASM_SUB_SAT_SIGNED_V16; + c0 = INTRINS_SSE_SSUB_SATI8; break; case MONO_TYPE_I2: - c0 = INTRINS_WASM_SUB_SAT_SIGNED_V8; + c0 = INTRINS_SSE_SSUB_SATI16; break; case MONO_TYPE_U1: - c0 = INTRINS_WASM_SUB_SAT_UNSIGNED_V16; + c0 = INTRINS_SSE_USUB_SATI8; break; case MONO_TYPE_U2: - c0 = INTRINS_WASM_SUB_SAT_UNSIGNED_V8; + c0 = INTRINS_SSE_USUB_SATI16; break; } diff --git a/src/mono/wasi/wasi.proj b/src/mono/wasi/wasi.proj index 266af5227107c6..9e98dcee6106ae 100644 --- a/src/mono/wasi/wasi.proj +++ b/src/mono/wasi/wasi.proj @@ -60,7 +60,7 @@ - + diff --git a/src/mono/wasm/build/WasmApp.Common.targets b/src/mono/wasm/build/WasmApp.Common.targets index d9bf8e3b931dae..6c0de25f61d51b 100644 --- a/src/mono/wasm/build/WasmApp.Common.targets +++ b/src/mono/wasm/build/WasmApp.Common.targets @@ -911,8 +911,8 @@ - - + diff --git a/src/native/libs/CMakeLists.txt b/src/native/libs/CMakeLists.txt index 5fd8f0d051a9d8..9ead4737fef598 100644 --- a/src/native/libs/CMakeLists.txt +++ b/src/native/libs/CMakeLists.txt @@ -134,6 +134,7 @@ if (CLR_CMAKE_TARGET_UNIX OR CLR_CMAKE_TARGET_BROWSER OR CLR_CMAKE_TARGET_WASI) if (CLR_CMAKE_TARGET_BROWSER OR CLR_CMAKE_TARGET_WASI) add_compile_options(-Wno-unsafe-buffer-usage) add_compile_options(-Wno-cast-function-type-strict) + add_compile_options(-Wno-c++-keyword) endif () endif () diff --git a/src/native/libs/System.Globalization.Native/pal_icushim_static.c b/src/native/libs/System.Globalization.Native/pal_icushim_static.c index ba6d76d82c9837..506ee3304be4bd 100644 --- a/src/native/libs/System.Globalization.Native/pal_icushim_static.c +++ b/src/native/libs/System.Globalization.Native/pal_icushim_static.c @@ -25,6 +25,11 @@ static int32_t isLoaded = 0; static int32_t isDataSet = 0; +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wjump-misses-init" +#endif + static void log_shim_error(const char* format, ...) { va_list args; @@ -85,7 +90,7 @@ int32_t mono_wasi_load_icu_data(const void* pData) static int32_t load_icu_data(const void* pData) { - UErrorCode status = 0; + UErrorCode status = U_ZERO_ERROR; udata_setCommonData(pData, &status); if (U_FAILURE(status)) @@ -132,7 +137,7 @@ cstdlib_load_icu_data(const char *path) goto error; } - file_buf = malloc(sizeof(char) * (unsigned long)(file_buf_size + 1)); + file_buf = (char *) malloc(sizeof(char) * (unsigned long)(file_buf_size + 1)); if (file_buf == NULL) { @@ -225,7 +230,7 @@ int32_t GlobalizationNative_LoadICU(void) } #endif - UErrorCode status = 0; + UErrorCode status = U_ZERO_ERROR; UVersionInfo version; // Request the CLDR version to perform basic ICU initialization and find out // whether it worked. diff --git a/src/native/libs/System.Native/pal_networking.c b/src/native/libs/System.Native/pal_networking.c index 38486322526b08..79bb1258e902eb 100644 --- a/src/native/libs/System.Native/pal_networking.c +++ b/src/native/libs/System.Native/pal_networking.c @@ -74,6 +74,10 @@ #include #endif +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wjump-misses-init" +#endif #if HAVE_KQUEUE #if KEVENT_HAS_VOID_UDATA diff --git a/src/native/libs/System.Native/pal_signal.c b/src/native/libs/System.Native/pal_signal.c index bf59c24b9df96d..352458c8719f08 100644 --- a/src/native/libs/System.Native/pal_signal.c +++ b/src/native/libs/System.Native/pal_signal.c @@ -130,7 +130,7 @@ static bool TryConvertSignalCodeToPosixSignal(int signalCode, PosixSignal* posix return true; default: - *posixSignal = signalCode; + *posixSignal = (PosixSignal)signalCode; return false; } } diff --git a/src/native/libs/System.Native/pal_threading.c b/src/native/libs/System.Native/pal_threading.c index 1d573af075355c..b90b2b23c494fe 100644 --- a/src/native/libs/System.Native/pal_threading.c +++ b/src/native/libs/System.Native/pal_threading.c @@ -24,6 +24,10 @@ #endif #include +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wjump-misses-init" +#endif //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // LowLevelMonitor - Represents a non-recursive mutex and condition