[wasm][R2R] testing ... - #132419

Draft
pavelsavara wants to merge 8 commits into
dotnet:mainfrom
pavelsavara:browsehost_load_r2r_4
Draft

[wasm][R2R] testing ...#132419
pavelsavara wants to merge 8 commits into
dotnet:mainfrom
pavelsavara:browsehost_load_r2r_4

Conversation

@pavelsavara

Copy link
Copy Markdown
Member

just testing

@pavelsavarapavelsavara added this to the 12.0.0 milestone Aug 17, 2026
@pavelsavarapavelsavara self-assigned this Aug 17, 2026
CopilotAI lite review requested due to automatic review settings August 17, 2026 17:26
@pavelsavarapavelsavara added NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) NO-REVIEW Experimental/testing PR, do NOT review it arch-wasm WebAssembly architecture area-ReadyToRun labels Aug 17, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the WebAssembly build/pack pipeline to support (and validate) staging ReadyToRun (R2R) “webcil-in-wasm” images for CoreCLR browser-wasm, adds a basic regression test for the staged framework R2R marker, and includes a small CoreCLR ETW robustness fix.

Changes:

  • Add MSBuild/SDK plumbing to stage prebuilt R2R webcil-in-wasm images during build/publish for CoreCLR browser-wasm, and to generate framework R2R images into the runtime pack layout.
  • Extend Crossgen2 task RID/arch handling for browser/wasi and wasm, and adjust local test infra for CoreCLR wasm toolchain discovery.
  • Add/adjust wasm test coverage around staged framework R2R and improve EventPipe diagnostics test resiliency.

Reviewed changes

Copilot reviewed 18 out of 18 changed files in this pull request and generated 4 comments.

Show a summary per file
FileDescription
src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ConvertDllsToWebCil.csAdds probing/staging of prebuilt R2R webcil-in-wasm images via new PrebuiltR2RDirectories input.
src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.csAdds a new task parameter for composite extra args (currently not wired into command generation).
src/tasks/Crossgen2Tasks/ResolveReadyToRunCompilers.csAdds browser/wasi target OS mapping and wasm architecture support.
src/mono/wasm/Wasm.Build.Tests/Wasm.Build.Tests.csprojAdjusts local EMSDK path fallback to use the shared tool cache sentinel.
src/mono/wasm/Wasm.Build.Tests/ReadyToRunTests.csNew test asserting framework webcil R2R marker is present/absent based on PublishReadyToRun.
src/mono/wasm/Wasm.Build.Tests/Blazor/EventPipeDiagnosticsTests.csAdds timeout + runtime-failure detection to avoid hanging on trapped runtimes.
src/mono/sample/wasm/console-node/Wasm.Console.Node.Sample.csprojEnables PublishReadyToRun for CoreCLR (when UseMonoRuntime == false).
src/mono/sample/wasm/browser-advanced/Wasm.Advanced.Sample.csprojAdds commented guidance for enabling PublishReadyToRun in the sample.
src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targetsPlumbs PrebuiltR2RDirectories into ConvertDllsToWebcil and imports CoreCLR-specific targets for R2R.
src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.CoreCLR.targetsNew CoreCLR browser-wasm targets enabling/staging R2R and trimming/publish ordering hooks.
src/mono/browser/build/WasmApp.ReadyToRun.targetsIn-tree override of ResolveReadyToRunCompilers to use in-build crossgen2.
src/mono/browser/build/WasmApp.InTree.propsHooks in-tree builds to import the override targets/props for CoreCLR browser R2R.
src/mono/browser/build/BrowserWasmApp.CoreCLR.targetsRemaps managed-assembly scanning to trimmed IL when publish outputs are R2R webcil-in-wasm.
src/installer/pkg/sfx/Microsoft.NETCore.App/Microsoft.NETCore.App.Runtime.CoreCLR.sfxprojAdds framework R2R generation/packaging for CoreCLR browser runtime pack (native/r2r).
src/coreclr/vm/eventtrace.cppAvoids ETW method rundown work when EECodeInfo is invalid.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.csAdds wasm-only guard to reject methods that would create un-encodable TypeHandle fixups.
src/coreclr/jit/CMakeLists.txtInstalls the wasm universal JIT into the alljits component.
eng/testing/scenarios/BuildWasmAppsJobsListCoreCLR.txtAdds Wasm.Build.Tests.ReadyToRunTests to the CoreCLR wasm job list.

/// .dll candidate with empty <c>R2RWebcilPath</c>, the first matching image is staged instead of
/// converting the IL. Empty for Mono.
/// </summary>
public string[] PrebuiltR2RDirectories { get; set; }
Comment on lines 23 to 27
public bool ShowCompilerWarnings { get; set; }
public bool UseCrossgen2 { get; set; }
public string Crossgen2ExtraCommandLineArgs { get; set; }
public string Crossgen2CompositeExtraCommandLineArgs { get; set; }
public ITaskItem[] Crossgen2PgoFiles { get; set; }
Comment on lines +105 to +106
<Exec Condition="Exists('$(_WasmCrossgen2Exe)')"
Command="&quot;$(_WasmCrossgen2Exe)&quot; -o:&quot;%(_WasmFrameworkR2RInput.OutputWasm)&quot; -r:&quot;$(LibrariesSharedFrameworkBinArtifactsPath)*.dll&quot; -r:&quot;$(_WasmCoreLibIL)&quot; --targetarch:$(TargetArchitecture) --targetos:$(TargetOS) --obj-format:wasm --codegenopt:JitWasmNyiToR2RUnsupported=1 --codegenopt:JitWasmSimdNyiToR2RUnsupported=1 -O &quot;%(_WasmFrameworkR2RInput.FullPath)&quot;" />
Comment on lines +11 to +16
namespace Wasm.Build.Tests
{
// CoreCLR browser-wasm ships framework ReadyToRun images as webcil-in-wasm; a non-zero R2R table
// size in the framework webcil is the marker that R2R was produced and staged. See dotnet/runtime#121257.
public class ReadyToRunTests : WasmTemplateTestsBase
{
CopilotAI review requested due to automatic review settings August 18, 2026 11:14

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 18 out of 18 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.cs:27

  • Crossgen2CompositeExtraCommandLineArgs is added as a public task parameter but is never used when building the crossgen2 response file, so any MSBuild plumbing that sets it will have no effect (composite builds will silently ignore these args). Either wire it into GenerateCrossgen2ResponseFile (likely only when _createCompositeImage is true) or remove the property to avoid a misleading knob.
 public bool ShowCompilerWarnings { get; set; }
public bool UseCrossgen2 { get; set; }
public string Crossgen2ExtraCommandLineArgs { get; set; }
public string Crossgen2CompositeExtraCommandLineArgs { get; set; }
public ITaskItem[] Crossgen2PgoFiles { get; set; }

src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ConvertDllsToWebCil.cs:31

  • PrebuiltR2RDirectories is optional (the code explicitly handles it being absent), but the property is declared as non-nullable. In projects with nullable enabled this is misleading and can produce warnings; it also obscures the MSBuild contract that the parameter may be omitted/empty.
 /// <summary>
/// Directories holding prebuilt R2R webcil-in-wasm images (CoreCLR browser). For a managed non-culture
/// .dll candidate with empty <c>R2RWebcilPath</c>, the first matching image is staged instead of
/// converting the IL. Empty for Mono.
/// </summary>
public string[] PrebuiltR2RDirectories { get; set; }

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 44 out of 44 changed files in this pull request and generated no new comments.

Suppressed comments (3)

src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.cs:27

  • The new property Crossgen2CompositeExtraCommandLineArgs is declared but never referenced anywhere in this task (and there are no MSBuild uses in the repo). As-is, it adds surface area/confusion without changing behavior. Either wire it into GenerateCrossgen2ResponseFile() (likely only for _createCompositeImage), or remove it until it’s needed.
    src/libraries/System.Collections/tests/System.Collections.Tests.csproj:13
  • The comment says this project always references the NetCoreAppMinimum Formatters build for a functional BinaryFormatter, but the reference is now conditional and skipped for browser/wasi. Please update the comment to reflect the new conditional behavior (this same comment exists in multiple test csprojs touched by this PR).
 <ItemGroup>
<!-- Reference the `NetCoreAppMinimum` build which has a functional BinaryFormatter and force a private copy to ensure it's not excluded -->
<ProjectReference Include="$(LibrariesProjectRoot)System.Runtime.Serialization.Formatters\src\System.Runtime.Serialization.Formatters.csproj" Private="true" SetTargetFramework="TargetFramework=$(NetCoreAppMinimum)" Condition="'$(TargetOS)' != 'browser' and '$(TargetOS)' != 'wasi'" />
</ItemGroup>

src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.CoreCLR.targets:8

  • The PR description is "just testing", but this change introduces substantial new behavior across build tasks, MSBuild targets, CoreCLR tooling, and test infrastructure for WASM ReadyToRun. Please update the PR description to clearly state the motivation, intended scenarios, and any validation performed so reviewers can assess risk and correctness.

CopilotAI review requested due to automatic review settings August 18, 2026 16:33

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 44 out of 44 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.cs:27

  • Crossgen2CompositeExtraCommandLineArgs is introduced but not used anywhere in RunReadyToRunCompiler (and there are no call sites in the repo). This adds dead API surface and can confuse callers about whether composite builds support distinct extra args.
    src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.CoreCLR.targets:8
  • The PR description ('just testing') doesn’t match the scope of this change set (new CoreCLR browser-wasm R2R targets, task API surface, CoreCLR VM changes, etc.). Please update the PR description to clearly state the problem being solved, the intended scenarios (build vs publish, trimmed vs untrimmed), and how the changes are validated (build/test matrix).

CopilotAI review requested due to automatic review settings August 18, 2026 17:28

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 44 out of 44 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.cs:27

  • The new Crossgen2CompositeExtraCommandLineArgs property is not used anywhere in RunReadyToRunCompiler (and it isn’t passed from Microsoft.NET.CrossGen.targets either), so it currently adds public surface area without affecting behavior. Consider removing it until there’s a concrete use (or wire it into GenerateCrossgen2ResponseFile in a follow-up).
    src/mono/wasm/Wasm.Build.Tests/ReadyToRunTests.cs:15
  • Tests in this repo generally avoid embedding GitHub issue/PR references in comments unless required. Please drop the dotnet/runtime#121257 reference here and keep the comment focused on the behavior being asserted.

CopilotAI review requested due to automatic review settings August 20, 2026 04:55

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 28 out of 28 changed files in this pull request and generated no new comments.

Suppressed comments (3)

src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.cs:2728

  • CanEncodeTypeInSignature returns true for non-Ecma type definitions, but SignatureBuilder.EmitTypeSignature casts named types to EcmaType. This can incorrectly treat non-metadata (e.g., NoMetadataType) types as encodable and later cause InvalidCastException or incorrect signature emission. Return false when the type definition is not an EcmaType.
 if (typeDefinition is not EcmaType ecmaTypeDefinition)
return true;

src/tests/readytorun/tests/mainv3.csproj:12

  • Typo in comment: "non-sanitzed" should be "non-sanitized".
 <!-- This test launches crossgen2 with dotnet, so we would need a non-sanitzed jitinterface library. To simplify our infrastructure, we'll instead skip this test. -->

src/coreclr/inc/readytorun.h:23

  • The PR description ("just testing") doesn’t match the scope here (format version bump and broader R2R/Wasm/CoreCLR plumbing). Please update the PR title/description to reflect the actual intent and rationale (and ideally link the driving issue/design), or split into focused PRs.
// If you update this, ensure you run `git grep MINIMUM_READYTORUN_MAJOR_VERSION`
// and handle pending work.
#define READYTORUN_MAJOR_VERSION 26
#define READYTORUN_MINOR_VERSION 0x0002

…l-in-wasm as-is
PrepareForReadyToRunCompilation writes the per-app R2R output as <name>.wasm when the container format is wasm, so the published candidate hits the pass-through path instead of PE conversion. ConvertDllsToWebCil recognizes a webcil-in-wasm candidate (\0asm magic) and stages it as-is rather than failing PEReader with 'Unknown file format'.
Enable PublishReadyToRun by default for CoreCLR browser, always source build-phase webcil staging from the runtime-pack native/r2r images, and add the Browser.ReadyToRun.targets crossgen2 override (activated only when an in-build crossgen2 is provided) so in-tree/WBT publish uses the wasm-aware non-composite Crossgen2Tasks shim and bypasses the base SDK's NETSDK1095 gate. _GatherWasmFilesToPublish no longer clears the bundle list when publish assets are webcil (.wasm), and the ManagedToNativeGenerator scan set is remapped to IL for both trimmed (linker output) and untrimmed (pack IL) R2R.
Drop the now-redundant per-project PublishReadyToRun opt-in from the JS interop tests (the SDK pack defaults it on) and enable TestTrimming there. Suppress WasmWarnOnUnresolvedPInvokeModules for CoreCLR wasm tests, and clarify the sfxproj comment on why framework R2R uses the CoreLib model instead of the SDK's in-place R2R.
The per-app R2R crossgen build otherwise exceeds the 4h job timeout. Add build-time TestAssemblyShardCount/Index partitioning in tests.proj (stable hash of the project file name, XUnitLogChecker kept on every shard) and split the browser CoreCLR library-tests leg into 8 shards. Inert unless TestAssemblyShardCount > 1.
Add ReadyToRunTests covering build (pack framework R2R) and publish (per-app crossgen2, trimmed/untrimmed, with and without native relink), asserting a non-zero R2R table in the CoreLib webcil and driving all Blazor pages in a real browser with no exceptions. Adds a self-contained Weather page to BlazorBasicTestApp and a BASE_DIR env accessor to locate the in-tree crossgen2 and Crossgen2Tasks shim.
Browser.props already wires the crossgen2 override generically (gated on Crossgen2InBuildDir, which in-tree builds set) and is imported via the SDK's Sdk.props, so WasmApp.InTree.props re-importing Crossgen2SdkOverridePropsPath produced MSB4011. Drop the redundant in-tree block and delete the now-orphaned WasmApp.ReadyToRun.targets (Browser.ReadyToRun.targets is an equivalent superset); fix the stale mirror comments.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

arch-wasmWebAssembly architecturearea-ReadyToRunNO-MERGEThe PR is not ready for merge yet (see discussion for detailed reasons)NO-REVIEWExperimental/testing PR, do NOT review it

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@pavelsavara
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

[wasm][R2R] testing ... - #132419

Draft
pavelsavara wants to merge 8 commits into
dotnet:mainfrom
pavelsavara:browsehost_load_r2r_4
Draft

[wasm][R2R] testing ...#132419
pavelsavara wants to merge 8 commits into
dotnet:mainfrom
pavelsavara:browsehost_load_r2r_4

Conversation

@pavelsavara

Copy link
Copy Markdown
Member

just testing

@pavelsavarapavelsavara added this to the 12.0.0 milestone Aug 17, 2026
@pavelsavarapavelsavara self-assigned this Aug 17, 2026
CopilotAI lite review requested due to automatic review settings August 17, 2026 17:26
@pavelsavarapavelsavara added NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) NO-REVIEW Experimental/testing PR, do NOT review it arch-wasm WebAssembly architecture area-ReadyToRun labels Aug 17, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the WebAssembly build/pack pipeline to support (and validate) staging ReadyToRun (R2R) “webcil-in-wasm” images for CoreCLR browser-wasm, adds a basic regression test for the staged framework R2R marker, and includes a small CoreCLR ETW robustness fix.

Changes:

  • Add MSBuild/SDK plumbing to stage prebuilt R2R webcil-in-wasm images during build/publish for CoreCLR browser-wasm, and to generate framework R2R images into the runtime pack layout.
  • Extend Crossgen2 task RID/arch handling for browser/wasi and wasm, and adjust local test infra for CoreCLR wasm toolchain discovery.
  • Add/adjust wasm test coverage around staged framework R2R and improve EventPipe diagnostics test resiliency.

Reviewed changes

Copilot reviewed 18 out of 18 changed files in this pull request and generated 4 comments.

Show a summary per file
FileDescription
src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ConvertDllsToWebCil.csAdds probing/staging of prebuilt R2R webcil-in-wasm images via new PrebuiltR2RDirectories input.
src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.csAdds a new task parameter for composite extra args (currently not wired into command generation).
src/tasks/Crossgen2Tasks/ResolveReadyToRunCompilers.csAdds browser/wasi target OS mapping and wasm architecture support.
src/mono/wasm/Wasm.Build.Tests/Wasm.Build.Tests.csprojAdjusts local EMSDK path fallback to use the shared tool cache sentinel.
src/mono/wasm/Wasm.Build.Tests/ReadyToRunTests.csNew test asserting framework webcil R2R marker is present/absent based on PublishReadyToRun.
src/mono/wasm/Wasm.Build.Tests/Blazor/EventPipeDiagnosticsTests.csAdds timeout + runtime-failure detection to avoid hanging on trapped runtimes.
src/mono/sample/wasm/console-node/Wasm.Console.Node.Sample.csprojEnables PublishReadyToRun for CoreCLR (when UseMonoRuntime == false).
src/mono/sample/wasm/browser-advanced/Wasm.Advanced.Sample.csprojAdds commented guidance for enabling PublishReadyToRun in the sample.
src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targetsPlumbs PrebuiltR2RDirectories into ConvertDllsToWebcil and imports CoreCLR-specific targets for R2R.
src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.CoreCLR.targetsNew CoreCLR browser-wasm targets enabling/staging R2R and trimming/publish ordering hooks.
src/mono/browser/build/WasmApp.ReadyToRun.targetsIn-tree override of ResolveReadyToRunCompilers to use in-build crossgen2.
src/mono/browser/build/WasmApp.InTree.propsHooks in-tree builds to import the override targets/props for CoreCLR browser R2R.
src/mono/browser/build/BrowserWasmApp.CoreCLR.targetsRemaps managed-assembly scanning to trimmed IL when publish outputs are R2R webcil-in-wasm.
src/installer/pkg/sfx/Microsoft.NETCore.App/Microsoft.NETCore.App.Runtime.CoreCLR.sfxprojAdds framework R2R generation/packaging for CoreCLR browser runtime pack (native/r2r).
src/coreclr/vm/eventtrace.cppAvoids ETW method rundown work when EECodeInfo is invalid.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.csAdds wasm-only guard to reject methods that would create un-encodable TypeHandle fixups.
src/coreclr/jit/CMakeLists.txtInstalls the wasm universal JIT into the alljits component.
eng/testing/scenarios/BuildWasmAppsJobsListCoreCLR.txtAdds Wasm.Build.Tests.ReadyToRunTests to the CoreCLR wasm job list.

/// .dll candidate with empty <c>R2RWebcilPath</c>, the first matching image is staged instead of
/// converting the IL. Empty for Mono.
/// </summary>
public string[] PrebuiltR2RDirectories { get; set; }
Comment on lines 23 to 27
public bool ShowCompilerWarnings { get; set; }
public bool UseCrossgen2 { get; set; }
public string Crossgen2ExtraCommandLineArgs { get; set; }
public string Crossgen2CompositeExtraCommandLineArgs { get; set; }
public ITaskItem[] Crossgen2PgoFiles { get; set; }
Comment on lines +105 to +106
<Exec Condition="Exists('$(_WasmCrossgen2Exe)')"
Command="&quot;$(_WasmCrossgen2Exe)&quot; -o:&quot;%(_WasmFrameworkR2RInput.OutputWasm)&quot; -r:&quot;$(LibrariesSharedFrameworkBinArtifactsPath)*.dll&quot; -r:&quot;$(_WasmCoreLibIL)&quot; --targetarch:$(TargetArchitecture) --targetos:$(TargetOS) --obj-format:wasm --codegenopt:JitWasmNyiToR2RUnsupported=1 --codegenopt:JitWasmSimdNyiToR2RUnsupported=1 -O &quot;%(_WasmFrameworkR2RInput.FullPath)&quot;" />
Comment on lines +11 to +16
namespace Wasm.Build.Tests
{
// CoreCLR browser-wasm ships framework ReadyToRun images as webcil-in-wasm; a non-zero R2R table
// size in the framework webcil is the marker that R2R was produced and staged. See dotnet/runtime#121257.
public class ReadyToRunTests : WasmTemplateTestsBase
{
CopilotAI review requested due to automatic review settings August 18, 2026 11:14

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 18 out of 18 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.cs:27

  • Crossgen2CompositeExtraCommandLineArgs is added as a public task parameter but is never used when building the crossgen2 response file, so any MSBuild plumbing that sets it will have no effect (composite builds will silently ignore these args). Either wire it into GenerateCrossgen2ResponseFile (likely only when _createCompositeImage is true) or remove the property to avoid a misleading knob.
 public bool ShowCompilerWarnings { get; set; }
public bool UseCrossgen2 { get; set; }
public string Crossgen2ExtraCommandLineArgs { get; set; }
public string Crossgen2CompositeExtraCommandLineArgs { get; set; }
public ITaskItem[] Crossgen2PgoFiles { get; set; }

src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ConvertDllsToWebCil.cs:31

  • PrebuiltR2RDirectories is optional (the code explicitly handles it being absent), but the property is declared as non-nullable. In projects with nullable enabled this is misleading and can produce warnings; it also obscures the MSBuild contract that the parameter may be omitted/empty.
 /// <summary>
/// Directories holding prebuilt R2R webcil-in-wasm images (CoreCLR browser). For a managed non-culture
/// .dll candidate with empty <c>R2RWebcilPath</c>, the first matching image is staged instead of
/// converting the IL. Empty for Mono.
/// </summary>
public string[] PrebuiltR2RDirectories { get; set; }

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 44 out of 44 changed files in this pull request and generated no new comments.

Suppressed comments (3)

src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.cs:27

  • The new property Crossgen2CompositeExtraCommandLineArgs is declared but never referenced anywhere in this task (and there are no MSBuild uses in the repo). As-is, it adds surface area/confusion without changing behavior. Either wire it into GenerateCrossgen2ResponseFile() (likely only for _createCompositeImage), or remove it until it’s needed.
    src/libraries/System.Collections/tests/System.Collections.Tests.csproj:13
  • The comment says this project always references the NetCoreAppMinimum Formatters build for a functional BinaryFormatter, but the reference is now conditional and skipped for browser/wasi. Please update the comment to reflect the new conditional behavior (this same comment exists in multiple test csprojs touched by this PR).
 <ItemGroup>
<!-- Reference the `NetCoreAppMinimum` build which has a functional BinaryFormatter and force a private copy to ensure it's not excluded -->
<ProjectReference Include="$(LibrariesProjectRoot)System.Runtime.Serialization.Formatters\src\System.Runtime.Serialization.Formatters.csproj" Private="true" SetTargetFramework="TargetFramework=$(NetCoreAppMinimum)" Condition="'$(TargetOS)' != 'browser' and '$(TargetOS)' != 'wasi'" />
</ItemGroup>

src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.CoreCLR.targets:8

  • The PR description is "just testing", but this change introduces substantial new behavior across build tasks, MSBuild targets, CoreCLR tooling, and test infrastructure for WASM ReadyToRun. Please update the PR description to clearly state the motivation, intended scenarios, and any validation performed so reviewers can assess risk and correctness.

CopilotAI review requested due to automatic review settings August 18, 2026 16:33

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 44 out of 44 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.cs:27

  • Crossgen2CompositeExtraCommandLineArgs is introduced but not used anywhere in RunReadyToRunCompiler (and there are no call sites in the repo). This adds dead API surface and can confuse callers about whether composite builds support distinct extra args.
    src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.CoreCLR.targets:8
  • The PR description ('just testing') doesn’t match the scope of this change set (new CoreCLR browser-wasm R2R targets, task API surface, CoreCLR VM changes, etc.). Please update the PR description to clearly state the problem being solved, the intended scenarios (build vs publish, trimmed vs untrimmed), and how the changes are validated (build/test matrix).

CopilotAI review requested due to automatic review settings August 18, 2026 17:28

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 44 out of 44 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.cs:27

  • The new Crossgen2CompositeExtraCommandLineArgs property is not used anywhere in RunReadyToRunCompiler (and it isn’t passed from Microsoft.NET.CrossGen.targets either), so it currently adds public surface area without affecting behavior. Consider removing it until there’s a concrete use (or wire it into GenerateCrossgen2ResponseFile in a follow-up).
    src/mono/wasm/Wasm.Build.Tests/ReadyToRunTests.cs:15
  • Tests in this repo generally avoid embedding GitHub issue/PR references in comments unless required. Please drop the dotnet/runtime#121257 reference here and keep the comment focused on the behavior being asserted.

CopilotAI review requested due to automatic review settings August 20, 2026 04:55

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 28 out of 28 changed files in this pull request and generated no new comments.

Suppressed comments (3)

src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.cs:2728

  • CanEncodeTypeInSignature returns true for non-Ecma type definitions, but SignatureBuilder.EmitTypeSignature casts named types to EcmaType. This can incorrectly treat non-metadata (e.g., NoMetadataType) types as encodable and later cause InvalidCastException or incorrect signature emission. Return false when the type definition is not an EcmaType.
 if (typeDefinition is not EcmaType ecmaTypeDefinition)
return true;

src/tests/readytorun/tests/mainv3.csproj:12

  • Typo in comment: "non-sanitzed" should be "non-sanitized".
 <!-- This test launches crossgen2 with dotnet, so we would need a non-sanitzed jitinterface library. To simplify our infrastructure, we'll instead skip this test. -->

src/coreclr/inc/readytorun.h:23

  • The PR description ("just testing") doesn’t match the scope here (format version bump and broader R2R/Wasm/CoreCLR plumbing). Please update the PR title/description to reflect the actual intent and rationale (and ideally link the driving issue/design), or split into focused PRs.
// If you update this, ensure you run `git grep MINIMUM_READYTORUN_MAJOR_VERSION`
// and handle pending work.
#define READYTORUN_MAJOR_VERSION 26
#define READYTORUN_MINOR_VERSION 0x0002

…l-in-wasm as-is
PrepareForReadyToRunCompilation writes the per-app R2R output as <name>.wasm when the container format is wasm, so the published candidate hits the pass-through path instead of PE conversion. ConvertDllsToWebCil recognizes a webcil-in-wasm candidate (\0asm magic) and stages it as-is rather than failing PEReader with 'Unknown file format'.
Enable PublishReadyToRun by default for CoreCLR browser, always source build-phase webcil staging from the runtime-pack native/r2r images, and add the Browser.ReadyToRun.targets crossgen2 override (activated only when an in-build crossgen2 is provided) so in-tree/WBT publish uses the wasm-aware non-composite Crossgen2Tasks shim and bypasses the base SDK's NETSDK1095 gate. _GatherWasmFilesToPublish no longer clears the bundle list when publish assets are webcil (.wasm), and the ManagedToNativeGenerator scan set is remapped to IL for both trimmed (linker output) and untrimmed (pack IL) R2R.
Drop the now-redundant per-project PublishReadyToRun opt-in from the JS interop tests (the SDK pack defaults it on) and enable TestTrimming there. Suppress WasmWarnOnUnresolvedPInvokeModules for CoreCLR wasm tests, and clarify the sfxproj comment on why framework R2R uses the CoreLib model instead of the SDK's in-place R2R.
The per-app R2R crossgen build otherwise exceeds the 4h job timeout. Add build-time TestAssemblyShardCount/Index partitioning in tests.proj (stable hash of the project file name, XUnitLogChecker kept on every shard) and split the browser CoreCLR library-tests leg into 8 shards. Inert unless TestAssemblyShardCount > 1.
Add ReadyToRunTests covering build (pack framework R2R) and publish (per-app crossgen2, trimmed/untrimmed, with and without native relink), asserting a non-zero R2R table in the CoreLib webcil and driving all Blazor pages in a real browser with no exceptions. Adds a self-contained Weather page to BlazorBasicTestApp and a BASE_DIR env accessor to locate the in-tree crossgen2 and Crossgen2Tasks shim.
Browser.props already wires the crossgen2 override generically (gated on Crossgen2InBuildDir, which in-tree builds set) and is imported via the SDK's Sdk.props, so WasmApp.InTree.props re-importing Crossgen2SdkOverridePropsPath produced MSB4011. Drop the redundant in-tree block and delete the now-orphaned WasmApp.ReadyToRun.targets (Browser.ReadyToRun.targets is an equivalent superset); fix the stale mirror comments.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

arch-wasmWebAssembly architecturearea-ReadyToRunNO-MERGEThe PR is not ready for merge yet (see discussion for detailed reasons)NO-REVIEWExperimental/testing PR, do NOT review it

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@pavelsavara
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[wasm][R2R] testing ... - #132419

Draft
pavelsavara wants to merge 8 commits into
dotnet:mainfrom
pavelsavara:browsehost_load_r2r_4
Draft

[wasm][R2R] testing ...#132419
pavelsavara wants to merge 8 commits into
dotnet:mainfrom
pavelsavara:browsehost_load_r2r_4

Conversation

@pavelsavara

Copy link
Copy Markdown
Member

just testing

@pavelsavarapavelsavara added this to the 12.0.0 milestone Aug 17, 2026
@pavelsavarapavelsavara self-assigned this Aug 17, 2026
CopilotAI lite review requested due to automatic review settings August 17, 2026 17:26
@pavelsavarapavelsavara added NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) NO-REVIEW Experimental/testing PR, do NOT review it arch-wasm WebAssembly architecture area-ReadyToRun labels Aug 17, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the WebAssembly build/pack pipeline to support (and validate) staging ReadyToRun (R2R) “webcil-in-wasm” images for CoreCLR browser-wasm, adds a basic regression test for the staged framework R2R marker, and includes a small CoreCLR ETW robustness fix.

Changes:

  • Add MSBuild/SDK plumbing to stage prebuilt R2R webcil-in-wasm images during build/publish for CoreCLR browser-wasm, and to generate framework R2R images into the runtime pack layout.
  • Extend Crossgen2 task RID/arch handling for browser/wasi and wasm, and adjust local test infra for CoreCLR wasm toolchain discovery.
  • Add/adjust wasm test coverage around staged framework R2R and improve EventPipe diagnostics test resiliency.

Reviewed changes

Copilot reviewed 18 out of 18 changed files in this pull request and generated 4 comments.

Show a summary per file
FileDescription
src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ConvertDllsToWebCil.csAdds probing/staging of prebuilt R2R webcil-in-wasm images via new PrebuiltR2RDirectories input.
src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.csAdds a new task parameter for composite extra args (currently not wired into command generation).
src/tasks/Crossgen2Tasks/ResolveReadyToRunCompilers.csAdds browser/wasi target OS mapping and wasm architecture support.
src/mono/wasm/Wasm.Build.Tests/Wasm.Build.Tests.csprojAdjusts local EMSDK path fallback to use the shared tool cache sentinel.
src/mono/wasm/Wasm.Build.Tests/ReadyToRunTests.csNew test asserting framework webcil R2R marker is present/absent based on PublishReadyToRun.
src/mono/wasm/Wasm.Build.Tests/Blazor/EventPipeDiagnosticsTests.csAdds timeout + runtime-failure detection to avoid hanging on trapped runtimes.
src/mono/sample/wasm/console-node/Wasm.Console.Node.Sample.csprojEnables PublishReadyToRun for CoreCLR (when UseMonoRuntime == false).
src/mono/sample/wasm/browser-advanced/Wasm.Advanced.Sample.csprojAdds commented guidance for enabling PublishReadyToRun in the sample.
src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targetsPlumbs PrebuiltR2RDirectories into ConvertDllsToWebcil and imports CoreCLR-specific targets for R2R.
src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.CoreCLR.targetsNew CoreCLR browser-wasm targets enabling/staging R2R and trimming/publish ordering hooks.
src/mono/browser/build/WasmApp.ReadyToRun.targetsIn-tree override of ResolveReadyToRunCompilers to use in-build crossgen2.
src/mono/browser/build/WasmApp.InTree.propsHooks in-tree builds to import the override targets/props for CoreCLR browser R2R.
src/mono/browser/build/BrowserWasmApp.CoreCLR.targetsRemaps managed-assembly scanning to trimmed IL when publish outputs are R2R webcil-in-wasm.
src/installer/pkg/sfx/Microsoft.NETCore.App/Microsoft.NETCore.App.Runtime.CoreCLR.sfxprojAdds framework R2R generation/packaging for CoreCLR browser runtime pack (native/r2r).
src/coreclr/vm/eventtrace.cppAvoids ETW method rundown work when EECodeInfo is invalid.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.csAdds wasm-only guard to reject methods that would create un-encodable TypeHandle fixups.
src/coreclr/jit/CMakeLists.txtInstalls the wasm universal JIT into the alljits component.
eng/testing/scenarios/BuildWasmAppsJobsListCoreCLR.txtAdds Wasm.Build.Tests.ReadyToRunTests to the CoreCLR wasm job list.

/// .dll candidate with empty <c>R2RWebcilPath</c>, the first matching image is staged instead of
/// converting the IL. Empty for Mono.
/// </summary>
public string[] PrebuiltR2RDirectories { get; set; }
Comment on lines 23 to 27
public bool ShowCompilerWarnings { get; set; }
public bool UseCrossgen2 { get; set; }
public string Crossgen2ExtraCommandLineArgs { get; set; }
public string Crossgen2CompositeExtraCommandLineArgs { get; set; }
public ITaskItem[] Crossgen2PgoFiles { get; set; }
Comment on lines +105 to +106
<Exec Condition="Exists('$(_WasmCrossgen2Exe)')"
Command="&quot;$(_WasmCrossgen2Exe)&quot; -o:&quot;%(_WasmFrameworkR2RInput.OutputWasm)&quot; -r:&quot;$(LibrariesSharedFrameworkBinArtifactsPath)*.dll&quot; -r:&quot;$(_WasmCoreLibIL)&quot; --targetarch:$(TargetArchitecture) --targetos:$(TargetOS) --obj-format:wasm --codegenopt:JitWasmNyiToR2RUnsupported=1 --codegenopt:JitWasmSimdNyiToR2RUnsupported=1 -O &quot;%(_WasmFrameworkR2RInput.FullPath)&quot;" />
Comment on lines +11 to +16
namespace Wasm.Build.Tests
{
// CoreCLR browser-wasm ships framework ReadyToRun images as webcil-in-wasm; a non-zero R2R table
// size in the framework webcil is the marker that R2R was produced and staged. See dotnet/runtime#121257.
public class ReadyToRunTests : WasmTemplateTestsBase
{
CopilotAI review requested due to automatic review settings August 18, 2026 11:14

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 18 out of 18 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.cs:27

  • Crossgen2CompositeExtraCommandLineArgs is added as a public task parameter but is never used when building the crossgen2 response file, so any MSBuild plumbing that sets it will have no effect (composite builds will silently ignore these args). Either wire it into GenerateCrossgen2ResponseFile (likely only when _createCompositeImage is true) or remove the property to avoid a misleading knob.
 public bool ShowCompilerWarnings { get; set; }
public bool UseCrossgen2 { get; set; }
public string Crossgen2ExtraCommandLineArgs { get; set; }
public string Crossgen2CompositeExtraCommandLineArgs { get; set; }
public ITaskItem[] Crossgen2PgoFiles { get; set; }

src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ConvertDllsToWebCil.cs:31

  • PrebuiltR2RDirectories is optional (the code explicitly handles it being absent), but the property is declared as non-nullable. In projects with nullable enabled this is misleading and can produce warnings; it also obscures the MSBuild contract that the parameter may be omitted/empty.
 /// <summary>
/// Directories holding prebuilt R2R webcil-in-wasm images (CoreCLR browser). For a managed non-culture
/// .dll candidate with empty <c>R2RWebcilPath</c>, the first matching image is staged instead of
/// converting the IL. Empty for Mono.
/// </summary>
public string[] PrebuiltR2RDirectories { get; set; }

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 44 out of 44 changed files in this pull request and generated no new comments.

Suppressed comments (3)

src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.cs:27

  • The new property Crossgen2CompositeExtraCommandLineArgs is declared but never referenced anywhere in this task (and there are no MSBuild uses in the repo). As-is, it adds surface area/confusion without changing behavior. Either wire it into GenerateCrossgen2ResponseFile() (likely only for _createCompositeImage), or remove it until it’s needed.
    src/libraries/System.Collections/tests/System.Collections.Tests.csproj:13
  • The comment says this project always references the NetCoreAppMinimum Formatters build for a functional BinaryFormatter, but the reference is now conditional and skipped for browser/wasi. Please update the comment to reflect the new conditional behavior (this same comment exists in multiple test csprojs touched by this PR).
 <ItemGroup>
<!-- Reference the `NetCoreAppMinimum` build which has a functional BinaryFormatter and force a private copy to ensure it's not excluded -->
<ProjectReference Include="$(LibrariesProjectRoot)System.Runtime.Serialization.Formatters\src\System.Runtime.Serialization.Formatters.csproj" Private="true" SetTargetFramework="TargetFramework=$(NetCoreAppMinimum)" Condition="'$(TargetOS)' != 'browser' and '$(TargetOS)' != 'wasi'" />
</ItemGroup>

src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.CoreCLR.targets:8

  • The PR description is "just testing", but this change introduces substantial new behavior across build tasks, MSBuild targets, CoreCLR tooling, and test infrastructure for WASM ReadyToRun. Please update the PR description to clearly state the motivation, intended scenarios, and any validation performed so reviewers can assess risk and correctness.

CopilotAI review requested due to automatic review settings August 18, 2026 16:33

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 44 out of 44 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.cs:27

  • Crossgen2CompositeExtraCommandLineArgs is introduced but not used anywhere in RunReadyToRunCompiler (and there are no call sites in the repo). This adds dead API surface and can confuse callers about whether composite builds support distinct extra args.
    src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.CoreCLR.targets:8
  • The PR description ('just testing') doesn’t match the scope of this change set (new CoreCLR browser-wasm R2R targets, task API surface, CoreCLR VM changes, etc.). Please update the PR description to clearly state the problem being solved, the intended scenarios (build vs publish, trimmed vs untrimmed), and how the changes are validated (build/test matrix).

CopilotAI review requested due to automatic review settings August 18, 2026 17:28

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 44 out of 44 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.cs:27

  • The new Crossgen2CompositeExtraCommandLineArgs property is not used anywhere in RunReadyToRunCompiler (and it isn’t passed from Microsoft.NET.CrossGen.targets either), so it currently adds public surface area without affecting behavior. Consider removing it until there’s a concrete use (or wire it into GenerateCrossgen2ResponseFile in a follow-up).
    src/mono/wasm/Wasm.Build.Tests/ReadyToRunTests.cs:15
  • Tests in this repo generally avoid embedding GitHub issue/PR references in comments unless required. Please drop the dotnet/runtime#121257 reference here and keep the comment focused on the behavior being asserted.

CopilotAI review requested due to automatic review settings August 20, 2026 04:55

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 28 out of 28 changed files in this pull request and generated no new comments.

Suppressed comments (3)

src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.cs:2728

  • CanEncodeTypeInSignature returns true for non-Ecma type definitions, but SignatureBuilder.EmitTypeSignature casts named types to EcmaType. This can incorrectly treat non-metadata (e.g., NoMetadataType) types as encodable and later cause InvalidCastException or incorrect signature emission. Return false when the type definition is not an EcmaType.
 if (typeDefinition is not EcmaType ecmaTypeDefinition)
return true;

src/tests/readytorun/tests/mainv3.csproj:12

  • Typo in comment: "non-sanitzed" should be "non-sanitized".
 <!-- This test launches crossgen2 with dotnet, so we would need a non-sanitzed jitinterface library. To simplify our infrastructure, we'll instead skip this test. -->

src/coreclr/inc/readytorun.h:23

  • The PR description ("just testing") doesn’t match the scope here (format version bump and broader R2R/Wasm/CoreCLR plumbing). Please update the PR title/description to reflect the actual intent and rationale (and ideally link the driving issue/design), or split into focused PRs.
// If you update this, ensure you run `git grep MINIMUM_READYTORUN_MAJOR_VERSION`
// and handle pending work.
#define READYTORUN_MAJOR_VERSION 26
#define READYTORUN_MINOR_VERSION 0x0002

…l-in-wasm as-is
PrepareForReadyToRunCompilation writes the per-app R2R output as <name>.wasm when the container format is wasm, so the published candidate hits the pass-through path instead of PE conversion. ConvertDllsToWebCil recognizes a webcil-in-wasm candidate (\0asm magic) and stages it as-is rather than failing PEReader with 'Unknown file format'.
Enable PublishReadyToRun by default for CoreCLR browser, always source build-phase webcil staging from the runtime-pack native/r2r images, and add the Browser.ReadyToRun.targets crossgen2 override (activated only when an in-build crossgen2 is provided) so in-tree/WBT publish uses the wasm-aware non-composite Crossgen2Tasks shim and bypasses the base SDK's NETSDK1095 gate. _GatherWasmFilesToPublish no longer clears the bundle list when publish assets are webcil (.wasm), and the ManagedToNativeGenerator scan set is remapped to IL for both trimmed (linker output) and untrimmed (pack IL) R2R.
Drop the now-redundant per-project PublishReadyToRun opt-in from the JS interop tests (the SDK pack defaults it on) and enable TestTrimming there. Suppress WasmWarnOnUnresolvedPInvokeModules for CoreCLR wasm tests, and clarify the sfxproj comment on why framework R2R uses the CoreLib model instead of the SDK's in-place R2R.
The per-app R2R crossgen build otherwise exceeds the 4h job timeout. Add build-time TestAssemblyShardCount/Index partitioning in tests.proj (stable hash of the project file name, XUnitLogChecker kept on every shard) and split the browser CoreCLR library-tests leg into 8 shards. Inert unless TestAssemblyShardCount > 1.
Add ReadyToRunTests covering build (pack framework R2R) and publish (per-app crossgen2, trimmed/untrimmed, with and without native relink), asserting a non-zero R2R table in the CoreLib webcil and driving all Blazor pages in a real browser with no exceptions. Adds a self-contained Weather page to BlazorBasicTestApp and a BASE_DIR env accessor to locate the in-tree crossgen2 and Crossgen2Tasks shim.
Browser.props already wires the crossgen2 override generically (gated on Crossgen2InBuildDir, which in-tree builds set) and is imported via the SDK's Sdk.props, so WasmApp.InTree.props re-importing Crossgen2SdkOverridePropsPath produced MSB4011. Drop the redundant in-tree block and delete the now-orphaned WasmApp.ReadyToRun.targets (Browser.ReadyToRun.targets is an equivalent superset); fix the stale mirror comments.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

arch-wasmWebAssembly architecturearea-ReadyToRunNO-MERGEThe PR is not ready for merge yet (see discussion for detailed reasons)NO-REVIEWExperimental/testing PR, do NOT review it

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@pavelsavara
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[wasm][R2R] testing ... - #132419

Draft
pavelsavara wants to merge 8 commits into
dotnet:mainfrom
pavelsavara:browsehost_load_r2r_4
Draft

[wasm][R2R] testing ...#132419
pavelsavara wants to merge 8 commits into
dotnet:mainfrom
pavelsavara:browsehost_load_r2r_4

Conversation

@pavelsavara

Copy link
Copy Markdown
Member

just testing

@pavelsavarapavelsavara added this to the 12.0.0 milestone Aug 17, 2026
@pavelsavarapavelsavara self-assigned this Aug 17, 2026
CopilotAI lite review requested due to automatic review settings August 17, 2026 17:26
@pavelsavarapavelsavara added NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) NO-REVIEW Experimental/testing PR, do NOT review it arch-wasm WebAssembly architecture area-ReadyToRun labels Aug 17, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the WebAssembly build/pack pipeline to support (and validate) staging ReadyToRun (R2R) “webcil-in-wasm” images for CoreCLR browser-wasm, adds a basic regression test for the staged framework R2R marker, and includes a small CoreCLR ETW robustness fix.

Changes:

  • Add MSBuild/SDK plumbing to stage prebuilt R2R webcil-in-wasm images during build/publish for CoreCLR browser-wasm, and to generate framework R2R images into the runtime pack layout.
  • Extend Crossgen2 task RID/arch handling for browser/wasi and wasm, and adjust local test infra for CoreCLR wasm toolchain discovery.
  • Add/adjust wasm test coverage around staged framework R2R and improve EventPipe diagnostics test resiliency.

Reviewed changes

Copilot reviewed 18 out of 18 changed files in this pull request and generated 4 comments.

Show a summary per file
FileDescription
src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ConvertDllsToWebCil.csAdds probing/staging of prebuilt R2R webcil-in-wasm images via new PrebuiltR2RDirectories input.
src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.csAdds a new task parameter for composite extra args (currently not wired into command generation).
src/tasks/Crossgen2Tasks/ResolveReadyToRunCompilers.csAdds browser/wasi target OS mapping and wasm architecture support.
src/mono/wasm/Wasm.Build.Tests/Wasm.Build.Tests.csprojAdjusts local EMSDK path fallback to use the shared tool cache sentinel.
src/mono/wasm/Wasm.Build.Tests/ReadyToRunTests.csNew test asserting framework webcil R2R marker is present/absent based on PublishReadyToRun.
src/mono/wasm/Wasm.Build.Tests/Blazor/EventPipeDiagnosticsTests.csAdds timeout + runtime-failure detection to avoid hanging on trapped runtimes.
src/mono/sample/wasm/console-node/Wasm.Console.Node.Sample.csprojEnables PublishReadyToRun for CoreCLR (when UseMonoRuntime == false).
src/mono/sample/wasm/browser-advanced/Wasm.Advanced.Sample.csprojAdds commented guidance for enabling PublishReadyToRun in the sample.
src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targetsPlumbs PrebuiltR2RDirectories into ConvertDllsToWebcil and imports CoreCLR-specific targets for R2R.
src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.CoreCLR.targetsNew CoreCLR browser-wasm targets enabling/staging R2R and trimming/publish ordering hooks.
src/mono/browser/build/WasmApp.ReadyToRun.targetsIn-tree override of ResolveReadyToRunCompilers to use in-build crossgen2.
src/mono/browser/build/WasmApp.InTree.propsHooks in-tree builds to import the override targets/props for CoreCLR browser R2R.
src/mono/browser/build/BrowserWasmApp.CoreCLR.targetsRemaps managed-assembly scanning to trimmed IL when publish outputs are R2R webcil-in-wasm.
src/installer/pkg/sfx/Microsoft.NETCore.App/Microsoft.NETCore.App.Runtime.CoreCLR.sfxprojAdds framework R2R generation/packaging for CoreCLR browser runtime pack (native/r2r).
src/coreclr/vm/eventtrace.cppAvoids ETW method rundown work when EECodeInfo is invalid.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.csAdds wasm-only guard to reject methods that would create un-encodable TypeHandle fixups.
src/coreclr/jit/CMakeLists.txtInstalls the wasm universal JIT into the alljits component.
eng/testing/scenarios/BuildWasmAppsJobsListCoreCLR.txtAdds Wasm.Build.Tests.ReadyToRunTests to the CoreCLR wasm job list.

/// .dll candidate with empty <c>R2RWebcilPath</c>, the first matching image is staged instead of
/// converting the IL. Empty for Mono.
/// </summary>
public string[] PrebuiltR2RDirectories { get; set; }
Comment on lines 23 to 27
public bool ShowCompilerWarnings { get; set; }
public bool UseCrossgen2 { get; set; }
public string Crossgen2ExtraCommandLineArgs { get; set; }
public string Crossgen2CompositeExtraCommandLineArgs { get; set; }
public ITaskItem[] Crossgen2PgoFiles { get; set; }
Comment on lines +105 to +106
<Exec Condition="Exists('$(_WasmCrossgen2Exe)')"
Command="&quot;$(_WasmCrossgen2Exe)&quot; -o:&quot;%(_WasmFrameworkR2RInput.OutputWasm)&quot; -r:&quot;$(LibrariesSharedFrameworkBinArtifactsPath)*.dll&quot; -r:&quot;$(_WasmCoreLibIL)&quot; --targetarch:$(TargetArchitecture) --targetos:$(TargetOS) --obj-format:wasm --codegenopt:JitWasmNyiToR2RUnsupported=1 --codegenopt:JitWasmSimdNyiToR2RUnsupported=1 -O &quot;%(_WasmFrameworkR2RInput.FullPath)&quot;" />
Comment on lines +11 to +16
namespace Wasm.Build.Tests
{
// CoreCLR browser-wasm ships framework ReadyToRun images as webcil-in-wasm; a non-zero R2R table
// size in the framework webcil is the marker that R2R was produced and staged. See dotnet/runtime#121257.
public class ReadyToRunTests : WasmTemplateTestsBase
{
CopilotAI review requested due to automatic review settings August 18, 2026 11:14

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 18 out of 18 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.cs:27

  • Crossgen2CompositeExtraCommandLineArgs is added as a public task parameter but is never used when building the crossgen2 response file, so any MSBuild plumbing that sets it will have no effect (composite builds will silently ignore these args). Either wire it into GenerateCrossgen2ResponseFile (likely only when _createCompositeImage is true) or remove the property to avoid a misleading knob.
 public bool ShowCompilerWarnings { get; set; }
public bool UseCrossgen2 { get; set; }
public string Crossgen2ExtraCommandLineArgs { get; set; }
public string Crossgen2CompositeExtraCommandLineArgs { get; set; }
public ITaskItem[] Crossgen2PgoFiles { get; set; }

src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ConvertDllsToWebCil.cs:31

  • PrebuiltR2RDirectories is optional (the code explicitly handles it being absent), but the property is declared as non-nullable. In projects with nullable enabled this is misleading and can produce warnings; it also obscures the MSBuild contract that the parameter may be omitted/empty.
 /// <summary>
/// Directories holding prebuilt R2R webcil-in-wasm images (CoreCLR browser). For a managed non-culture
/// .dll candidate with empty <c>R2RWebcilPath</c>, the first matching image is staged instead of
/// converting the IL. Empty for Mono.
/// </summary>
public string[] PrebuiltR2RDirectories { get; set; }

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 44 out of 44 changed files in this pull request and generated no new comments.

Suppressed comments (3)

src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.cs:27

  • The new property Crossgen2CompositeExtraCommandLineArgs is declared but never referenced anywhere in this task (and there are no MSBuild uses in the repo). As-is, it adds surface area/confusion without changing behavior. Either wire it into GenerateCrossgen2ResponseFile() (likely only for _createCompositeImage), or remove it until it’s needed.
    src/libraries/System.Collections/tests/System.Collections.Tests.csproj:13
  • The comment says this project always references the NetCoreAppMinimum Formatters build for a functional BinaryFormatter, but the reference is now conditional and skipped for browser/wasi. Please update the comment to reflect the new conditional behavior (this same comment exists in multiple test csprojs touched by this PR).
 <ItemGroup>
<!-- Reference the `NetCoreAppMinimum` build which has a functional BinaryFormatter and force a private copy to ensure it's not excluded -->
<ProjectReference Include="$(LibrariesProjectRoot)System.Runtime.Serialization.Formatters\src\System.Runtime.Serialization.Formatters.csproj" Private="true" SetTargetFramework="TargetFramework=$(NetCoreAppMinimum)" Condition="'$(TargetOS)' != 'browser' and '$(TargetOS)' != 'wasi'" />
</ItemGroup>

src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.CoreCLR.targets:8

  • The PR description is "just testing", but this change introduces substantial new behavior across build tasks, MSBuild targets, CoreCLR tooling, and test infrastructure for WASM ReadyToRun. Please update the PR description to clearly state the motivation, intended scenarios, and any validation performed so reviewers can assess risk and correctness.

CopilotAI review requested due to automatic review settings August 18, 2026 16:33

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 44 out of 44 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.cs:27

  • Crossgen2CompositeExtraCommandLineArgs is introduced but not used anywhere in RunReadyToRunCompiler (and there are no call sites in the repo). This adds dead API surface and can confuse callers about whether composite builds support distinct extra args.
    src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.CoreCLR.targets:8
  • The PR description ('just testing') doesn’t match the scope of this change set (new CoreCLR browser-wasm R2R targets, task API surface, CoreCLR VM changes, etc.). Please update the PR description to clearly state the problem being solved, the intended scenarios (build vs publish, trimmed vs untrimmed), and how the changes are validated (build/test matrix).

CopilotAI review requested due to automatic review settings August 18, 2026 17:28

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 44 out of 44 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.cs:27

  • The new Crossgen2CompositeExtraCommandLineArgs property is not used anywhere in RunReadyToRunCompiler (and it isn’t passed from Microsoft.NET.CrossGen.targets either), so it currently adds public surface area without affecting behavior. Consider removing it until there’s a concrete use (or wire it into GenerateCrossgen2ResponseFile in a follow-up).
    src/mono/wasm/Wasm.Build.Tests/ReadyToRunTests.cs:15
  • Tests in this repo generally avoid embedding GitHub issue/PR references in comments unless required. Please drop the dotnet/runtime#121257 reference here and keep the comment focused on the behavior being asserted.

CopilotAI review requested due to automatic review settings August 20, 2026 04:55

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 28 out of 28 changed files in this pull request and generated no new comments.

Suppressed comments (3)

src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.cs:2728

  • CanEncodeTypeInSignature returns true for non-Ecma type definitions, but SignatureBuilder.EmitTypeSignature casts named types to EcmaType. This can incorrectly treat non-metadata (e.g., NoMetadataType) types as encodable and later cause InvalidCastException or incorrect signature emission. Return false when the type definition is not an EcmaType.
 if (typeDefinition is not EcmaType ecmaTypeDefinition)
return true;

src/tests/readytorun/tests/mainv3.csproj:12

  • Typo in comment: "non-sanitzed" should be "non-sanitized".
 <!-- This test launches crossgen2 with dotnet, so we would need a non-sanitzed jitinterface library. To simplify our infrastructure, we'll instead skip this test. -->

src/coreclr/inc/readytorun.h:23

  • The PR description ("just testing") doesn’t match the scope here (format version bump and broader R2R/Wasm/CoreCLR plumbing). Please update the PR title/description to reflect the actual intent and rationale (and ideally link the driving issue/design), or split into focused PRs.
// If you update this, ensure you run `git grep MINIMUM_READYTORUN_MAJOR_VERSION`
// and handle pending work.
#define READYTORUN_MAJOR_VERSION 26
#define READYTORUN_MINOR_VERSION 0x0002

…l-in-wasm as-is
PrepareForReadyToRunCompilation writes the per-app R2R output as <name>.wasm when the container format is wasm, so the published candidate hits the pass-through path instead of PE conversion. ConvertDllsToWebCil recognizes a webcil-in-wasm candidate (\0asm magic) and stages it as-is rather than failing PEReader with 'Unknown file format'.
Enable PublishReadyToRun by default for CoreCLR browser, always source build-phase webcil staging from the runtime-pack native/r2r images, and add the Browser.ReadyToRun.targets crossgen2 override (activated only when an in-build crossgen2 is provided) so in-tree/WBT publish uses the wasm-aware non-composite Crossgen2Tasks shim and bypasses the base SDK's NETSDK1095 gate. _GatherWasmFilesToPublish no longer clears the bundle list when publish assets are webcil (.wasm), and the ManagedToNativeGenerator scan set is remapped to IL for both trimmed (linker output) and untrimmed (pack IL) R2R.
Drop the now-redundant per-project PublishReadyToRun opt-in from the JS interop tests (the SDK pack defaults it on) and enable TestTrimming there. Suppress WasmWarnOnUnresolvedPInvokeModules for CoreCLR wasm tests, and clarify the sfxproj comment on why framework R2R uses the CoreLib model instead of the SDK's in-place R2R.
The per-app R2R crossgen build otherwise exceeds the 4h job timeout. Add build-time TestAssemblyShardCount/Index partitioning in tests.proj (stable hash of the project file name, XUnitLogChecker kept on every shard) and split the browser CoreCLR library-tests leg into 8 shards. Inert unless TestAssemblyShardCount > 1.
Add ReadyToRunTests covering build (pack framework R2R) and publish (per-app crossgen2, trimmed/untrimmed, with and without native relink), asserting a non-zero R2R table in the CoreLib webcil and driving all Blazor pages in a real browser with no exceptions. Adds a self-contained Weather page to BlazorBasicTestApp and a BASE_DIR env accessor to locate the in-tree crossgen2 and Crossgen2Tasks shim.
Browser.props already wires the crossgen2 override generically (gated on Crossgen2InBuildDir, which in-tree builds set) and is imported via the SDK's Sdk.props, so WasmApp.InTree.props re-importing Crossgen2SdkOverridePropsPath produced MSB4011. Drop the redundant in-tree block and delete the now-orphaned WasmApp.ReadyToRun.targets (Browser.ReadyToRun.targets is an equivalent superset); fix the stale mirror comments.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

arch-wasmWebAssembly architecturearea-ReadyToRunNO-MERGEThe PR is not ready for merge yet (see discussion for detailed reasons)NO-REVIEWExperimental/testing PR, do NOT review it

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@pavelsavara
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

[wasm][R2R] testing ... - #132419

Draft
pavelsavara wants to merge 8 commits into
dotnet:mainfrom
pavelsavara:browsehost_load_r2r_4
Draft

[wasm][R2R] testing ...#132419
pavelsavara wants to merge 8 commits into
dotnet:mainfrom
pavelsavara:browsehost_load_r2r_4

Conversation

@pavelsavara

Copy link
Copy Markdown
Member

just testing

@pavelsavarapavelsavara added this to the 12.0.0 milestone Aug 17, 2026
@pavelsavarapavelsavara self-assigned this Aug 17, 2026
CopilotAI lite review requested due to automatic review settings August 17, 2026 17:26
@pavelsavarapavelsavara added NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) NO-REVIEW Experimental/testing PR, do NOT review it arch-wasm WebAssembly architecture area-ReadyToRun labels Aug 17, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the WebAssembly build/pack pipeline to support (and validate) staging ReadyToRun (R2R) “webcil-in-wasm” images for CoreCLR browser-wasm, adds a basic regression test for the staged framework R2R marker, and includes a small CoreCLR ETW robustness fix.

Changes:

  • Add MSBuild/SDK plumbing to stage prebuilt R2R webcil-in-wasm images during build/publish for CoreCLR browser-wasm, and to generate framework R2R images into the runtime pack layout.
  • Extend Crossgen2 task RID/arch handling for browser/wasi and wasm, and adjust local test infra for CoreCLR wasm toolchain discovery.
  • Add/adjust wasm test coverage around staged framework R2R and improve EventPipe diagnostics test resiliency.

Reviewed changes

Copilot reviewed 18 out of 18 changed files in this pull request and generated 4 comments.

Show a summary per file
FileDescription
src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ConvertDllsToWebCil.csAdds probing/staging of prebuilt R2R webcil-in-wasm images via new PrebuiltR2RDirectories input.
src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.csAdds a new task parameter for composite extra args (currently not wired into command generation).
src/tasks/Crossgen2Tasks/ResolveReadyToRunCompilers.csAdds browser/wasi target OS mapping and wasm architecture support.
src/mono/wasm/Wasm.Build.Tests/Wasm.Build.Tests.csprojAdjusts local EMSDK path fallback to use the shared tool cache sentinel.
src/mono/wasm/Wasm.Build.Tests/ReadyToRunTests.csNew test asserting framework webcil R2R marker is present/absent based on PublishReadyToRun.
src/mono/wasm/Wasm.Build.Tests/Blazor/EventPipeDiagnosticsTests.csAdds timeout + runtime-failure detection to avoid hanging on trapped runtimes.
src/mono/sample/wasm/console-node/Wasm.Console.Node.Sample.csprojEnables PublishReadyToRun for CoreCLR (when UseMonoRuntime == false).
src/mono/sample/wasm/browser-advanced/Wasm.Advanced.Sample.csprojAdds commented guidance for enabling PublishReadyToRun in the sample.
src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targetsPlumbs PrebuiltR2RDirectories into ConvertDllsToWebcil and imports CoreCLR-specific targets for R2R.
src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.CoreCLR.targetsNew CoreCLR browser-wasm targets enabling/staging R2R and trimming/publish ordering hooks.
src/mono/browser/build/WasmApp.ReadyToRun.targetsIn-tree override of ResolveReadyToRunCompilers to use in-build crossgen2.
src/mono/browser/build/WasmApp.InTree.propsHooks in-tree builds to import the override targets/props for CoreCLR browser R2R.
src/mono/browser/build/BrowserWasmApp.CoreCLR.targetsRemaps managed-assembly scanning to trimmed IL when publish outputs are R2R webcil-in-wasm.
src/installer/pkg/sfx/Microsoft.NETCore.App/Microsoft.NETCore.App.Runtime.CoreCLR.sfxprojAdds framework R2R generation/packaging for CoreCLR browser runtime pack (native/r2r).
src/coreclr/vm/eventtrace.cppAvoids ETW method rundown work when EECodeInfo is invalid.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.csAdds wasm-only guard to reject methods that would create un-encodable TypeHandle fixups.
src/coreclr/jit/CMakeLists.txtInstalls the wasm universal JIT into the alljits component.
eng/testing/scenarios/BuildWasmAppsJobsListCoreCLR.txtAdds Wasm.Build.Tests.ReadyToRunTests to the CoreCLR wasm job list.

/// .dll candidate with empty <c>R2RWebcilPath</c>, the first matching image is staged instead of
/// converting the IL. Empty for Mono.
/// </summary>
public string[] PrebuiltR2RDirectories { get; set; }
Comment on lines 23 to 27
public bool ShowCompilerWarnings { get; set; }
public bool UseCrossgen2 { get; set; }
public string Crossgen2ExtraCommandLineArgs { get; set; }
public string Crossgen2CompositeExtraCommandLineArgs { get; set; }
public ITaskItem[] Crossgen2PgoFiles { get; set; }
Comment on lines +105 to +106
<Exec Condition="Exists('$(_WasmCrossgen2Exe)')"
Command="&quot;$(_WasmCrossgen2Exe)&quot; -o:&quot;%(_WasmFrameworkR2RInput.OutputWasm)&quot; -r:&quot;$(LibrariesSharedFrameworkBinArtifactsPath)*.dll&quot; -r:&quot;$(_WasmCoreLibIL)&quot; --targetarch:$(TargetArchitecture) --targetos:$(TargetOS) --obj-format:wasm --codegenopt:JitWasmNyiToR2RUnsupported=1 --codegenopt:JitWasmSimdNyiToR2RUnsupported=1 -O &quot;%(_WasmFrameworkR2RInput.FullPath)&quot;" />
Comment on lines +11 to +16
namespace Wasm.Build.Tests
{
// CoreCLR browser-wasm ships framework ReadyToRun images as webcil-in-wasm; a non-zero R2R table
// size in the framework webcil is the marker that R2R was produced and staged. See dotnet/runtime#121257.
public class ReadyToRunTests : WasmTemplateTestsBase
{
CopilotAI review requested due to automatic review settings August 18, 2026 11:14

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 18 out of 18 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.cs:27

  • Crossgen2CompositeExtraCommandLineArgs is added as a public task parameter but is never used when building the crossgen2 response file, so any MSBuild plumbing that sets it will have no effect (composite builds will silently ignore these args). Either wire it into GenerateCrossgen2ResponseFile (likely only when _createCompositeImage is true) or remove the property to avoid a misleading knob.
 public bool ShowCompilerWarnings { get; set; }
public bool UseCrossgen2 { get; set; }
public string Crossgen2ExtraCommandLineArgs { get; set; }
public string Crossgen2CompositeExtraCommandLineArgs { get; set; }
public ITaskItem[] Crossgen2PgoFiles { get; set; }

src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ConvertDllsToWebCil.cs:31

  • PrebuiltR2RDirectories is optional (the code explicitly handles it being absent), but the property is declared as non-nullable. In projects with nullable enabled this is misleading and can produce warnings; it also obscures the MSBuild contract that the parameter may be omitted/empty.
 /// <summary>
/// Directories holding prebuilt R2R webcil-in-wasm images (CoreCLR browser). For a managed non-culture
/// .dll candidate with empty <c>R2RWebcilPath</c>, the first matching image is staged instead of
/// converting the IL. Empty for Mono.
/// </summary>
public string[] PrebuiltR2RDirectories { get; set; }

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 44 out of 44 changed files in this pull request and generated no new comments.

Suppressed comments (3)

src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.cs:27

  • The new property Crossgen2CompositeExtraCommandLineArgs is declared but never referenced anywhere in this task (and there are no MSBuild uses in the repo). As-is, it adds surface area/confusion without changing behavior. Either wire it into GenerateCrossgen2ResponseFile() (likely only for _createCompositeImage), or remove it until it’s needed.
    src/libraries/System.Collections/tests/System.Collections.Tests.csproj:13
  • The comment says this project always references the NetCoreAppMinimum Formatters build for a functional BinaryFormatter, but the reference is now conditional and skipped for browser/wasi. Please update the comment to reflect the new conditional behavior (this same comment exists in multiple test csprojs touched by this PR).
 <ItemGroup>
<!-- Reference the `NetCoreAppMinimum` build which has a functional BinaryFormatter and force a private copy to ensure it's not excluded -->
<ProjectReference Include="$(LibrariesProjectRoot)System.Runtime.Serialization.Formatters\src\System.Runtime.Serialization.Formatters.csproj" Private="true" SetTargetFramework="TargetFramework=$(NetCoreAppMinimum)" Condition="'$(TargetOS)' != 'browser' and '$(TargetOS)' != 'wasi'" />
</ItemGroup>

src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.CoreCLR.targets:8

  • The PR description is "just testing", but this change introduces substantial new behavior across build tasks, MSBuild targets, CoreCLR tooling, and test infrastructure for WASM ReadyToRun. Please update the PR description to clearly state the motivation, intended scenarios, and any validation performed so reviewers can assess risk and correctness.

CopilotAI review requested due to automatic review settings August 18, 2026 16:33

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 44 out of 44 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.cs:27

  • Crossgen2CompositeExtraCommandLineArgs is introduced but not used anywhere in RunReadyToRunCompiler (and there are no call sites in the repo). This adds dead API surface and can confuse callers about whether composite builds support distinct extra args.
    src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.CoreCLR.targets:8
  • The PR description ('just testing') doesn’t match the scope of this change set (new CoreCLR browser-wasm R2R targets, task API surface, CoreCLR VM changes, etc.). Please update the PR description to clearly state the problem being solved, the intended scenarios (build vs publish, trimmed vs untrimmed), and how the changes are validated (build/test matrix).

CopilotAI review requested due to automatic review settings August 18, 2026 17:28

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 44 out of 44 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.cs:27

  • The new Crossgen2CompositeExtraCommandLineArgs property is not used anywhere in RunReadyToRunCompiler (and it isn’t passed from Microsoft.NET.CrossGen.targets either), so it currently adds public surface area without affecting behavior. Consider removing it until there’s a concrete use (or wire it into GenerateCrossgen2ResponseFile in a follow-up).
    src/mono/wasm/Wasm.Build.Tests/ReadyToRunTests.cs:15
  • Tests in this repo generally avoid embedding GitHub issue/PR references in comments unless required. Please drop the dotnet/runtime#121257 reference here and keep the comment focused on the behavior being asserted.

CopilotAI review requested due to automatic review settings August 20, 2026 04:55

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 28 out of 28 changed files in this pull request and generated no new comments.

Suppressed comments (3)

src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.cs:2728

  • CanEncodeTypeInSignature returns true for non-Ecma type definitions, but SignatureBuilder.EmitTypeSignature casts named types to EcmaType. This can incorrectly treat non-metadata (e.g., NoMetadataType) types as encodable and later cause InvalidCastException or incorrect signature emission. Return false when the type definition is not an EcmaType.
 if (typeDefinition is not EcmaType ecmaTypeDefinition)
return true;

src/tests/readytorun/tests/mainv3.csproj:12

  • Typo in comment: "non-sanitzed" should be "non-sanitized".
 <!-- This test launches crossgen2 with dotnet, so we would need a non-sanitzed jitinterface library. To simplify our infrastructure, we'll instead skip this test. -->

src/coreclr/inc/readytorun.h:23

  • The PR description ("just testing") doesn’t match the scope here (format version bump and broader R2R/Wasm/CoreCLR plumbing). Please update the PR title/description to reflect the actual intent and rationale (and ideally link the driving issue/design), or split into focused PRs.
// If you update this, ensure you run `git grep MINIMUM_READYTORUN_MAJOR_VERSION`
// and handle pending work.
#define READYTORUN_MAJOR_VERSION 26
#define READYTORUN_MINOR_VERSION 0x0002

…l-in-wasm as-is
PrepareForReadyToRunCompilation writes the per-app R2R output as <name>.wasm when the container format is wasm, so the published candidate hits the pass-through path instead of PE conversion. ConvertDllsToWebCil recognizes a webcil-in-wasm candidate (\0asm magic) and stages it as-is rather than failing PEReader with 'Unknown file format'.
Enable PublishReadyToRun by default for CoreCLR browser, always source build-phase webcil staging from the runtime-pack native/r2r images, and add the Browser.ReadyToRun.targets crossgen2 override (activated only when an in-build crossgen2 is provided) so in-tree/WBT publish uses the wasm-aware non-composite Crossgen2Tasks shim and bypasses the base SDK's NETSDK1095 gate. _GatherWasmFilesToPublish no longer clears the bundle list when publish assets are webcil (.wasm), and the ManagedToNativeGenerator scan set is remapped to IL for both trimmed (linker output) and untrimmed (pack IL) R2R.
Drop the now-redundant per-project PublishReadyToRun opt-in from the JS interop tests (the SDK pack defaults it on) and enable TestTrimming there. Suppress WasmWarnOnUnresolvedPInvokeModules for CoreCLR wasm tests, and clarify the sfxproj comment on why framework R2R uses the CoreLib model instead of the SDK's in-place R2R.
The per-app R2R crossgen build otherwise exceeds the 4h job timeout. Add build-time TestAssemblyShardCount/Index partitioning in tests.proj (stable hash of the project file name, XUnitLogChecker kept on every shard) and split the browser CoreCLR library-tests leg into 8 shards. Inert unless TestAssemblyShardCount > 1.
Add ReadyToRunTests covering build (pack framework R2R) and publish (per-app crossgen2, trimmed/untrimmed, with and without native relink), asserting a non-zero R2R table in the CoreLib webcil and driving all Blazor pages in a real browser with no exceptions. Adds a self-contained Weather page to BlazorBasicTestApp and a BASE_DIR env accessor to locate the in-tree crossgen2 and Crossgen2Tasks shim.
Browser.props already wires the crossgen2 override generically (gated on Crossgen2InBuildDir, which in-tree builds set) and is imported via the SDK's Sdk.props, so WasmApp.InTree.props re-importing Crossgen2SdkOverridePropsPath produced MSB4011. Drop the redundant in-tree block and delete the now-orphaned WasmApp.ReadyToRun.targets (Browser.ReadyToRun.targets is an equivalent superset); fix the stale mirror comments.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

arch-wasmWebAssembly architecturearea-ReadyToRunNO-MERGEThe PR is not ready for merge yet (see discussion for detailed reasons)NO-REVIEWExperimental/testing PR, do NOT review it

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@pavelsavara
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[wasm][R2R] testing ... - #132419

Draft
pavelsavara wants to merge 8 commits into
dotnet:mainfrom
pavelsavara:browsehost_load_r2r_4
Draft

[wasm][R2R] testing ...#132419
pavelsavara wants to merge 8 commits into
dotnet:mainfrom
pavelsavara:browsehost_load_r2r_4

Conversation

@pavelsavara

Copy link
Copy Markdown
Member

just testing

@pavelsavarapavelsavara added this to the 12.0.0 milestone Aug 17, 2026
@pavelsavarapavelsavara self-assigned this Aug 17, 2026
CopilotAI lite review requested due to automatic review settings August 17, 2026 17:26
@pavelsavarapavelsavara added NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) NO-REVIEW Experimental/testing PR, do NOT review it arch-wasm WebAssembly architecture area-ReadyToRun labels Aug 17, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the WebAssembly build/pack pipeline to support (and validate) staging ReadyToRun (R2R) “webcil-in-wasm” images for CoreCLR browser-wasm, adds a basic regression test for the staged framework R2R marker, and includes a small CoreCLR ETW robustness fix.

Changes:

  • Add MSBuild/SDK plumbing to stage prebuilt R2R webcil-in-wasm images during build/publish for CoreCLR browser-wasm, and to generate framework R2R images into the runtime pack layout.
  • Extend Crossgen2 task RID/arch handling for browser/wasi and wasm, and adjust local test infra for CoreCLR wasm toolchain discovery.
  • Add/adjust wasm test coverage around staged framework R2R and improve EventPipe diagnostics test resiliency.

Reviewed changes

Copilot reviewed 18 out of 18 changed files in this pull request and generated 4 comments.

Show a summary per file
FileDescription
src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ConvertDllsToWebCil.csAdds probing/staging of prebuilt R2R webcil-in-wasm images via new PrebuiltR2RDirectories input.
src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.csAdds a new task parameter for composite extra args (currently not wired into command generation).
src/tasks/Crossgen2Tasks/ResolveReadyToRunCompilers.csAdds browser/wasi target OS mapping and wasm architecture support.
src/mono/wasm/Wasm.Build.Tests/Wasm.Build.Tests.csprojAdjusts local EMSDK path fallback to use the shared tool cache sentinel.
src/mono/wasm/Wasm.Build.Tests/ReadyToRunTests.csNew test asserting framework webcil R2R marker is present/absent based on PublishReadyToRun.
src/mono/wasm/Wasm.Build.Tests/Blazor/EventPipeDiagnosticsTests.csAdds timeout + runtime-failure detection to avoid hanging on trapped runtimes.
src/mono/sample/wasm/console-node/Wasm.Console.Node.Sample.csprojEnables PublishReadyToRun for CoreCLR (when UseMonoRuntime == false).
src/mono/sample/wasm/browser-advanced/Wasm.Advanced.Sample.csprojAdds commented guidance for enabling PublishReadyToRun in the sample.
src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targetsPlumbs PrebuiltR2RDirectories into ConvertDllsToWebcil and imports CoreCLR-specific targets for R2R.
src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.CoreCLR.targetsNew CoreCLR browser-wasm targets enabling/staging R2R and trimming/publish ordering hooks.
src/mono/browser/build/WasmApp.ReadyToRun.targetsIn-tree override of ResolveReadyToRunCompilers to use in-build crossgen2.
src/mono/browser/build/WasmApp.InTree.propsHooks in-tree builds to import the override targets/props for CoreCLR browser R2R.
src/mono/browser/build/BrowserWasmApp.CoreCLR.targetsRemaps managed-assembly scanning to trimmed IL when publish outputs are R2R webcil-in-wasm.
src/installer/pkg/sfx/Microsoft.NETCore.App/Microsoft.NETCore.App.Runtime.CoreCLR.sfxprojAdds framework R2R generation/packaging for CoreCLR browser runtime pack (native/r2r).
src/coreclr/vm/eventtrace.cppAvoids ETW method rundown work when EECodeInfo is invalid.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.csAdds wasm-only guard to reject methods that would create un-encodable TypeHandle fixups.
src/coreclr/jit/CMakeLists.txtInstalls the wasm universal JIT into the alljits component.
eng/testing/scenarios/BuildWasmAppsJobsListCoreCLR.txtAdds Wasm.Build.Tests.ReadyToRunTests to the CoreCLR wasm job list.

/// .dll candidate with empty <c>R2RWebcilPath</c>, the first matching image is staged instead of
/// converting the IL. Empty for Mono.
/// </summary>
public string[] PrebuiltR2RDirectories { get; set; }
Comment on lines 23 to 27
public bool ShowCompilerWarnings { get; set; }
public bool UseCrossgen2 { get; set; }
public string Crossgen2ExtraCommandLineArgs { get; set; }
public string Crossgen2CompositeExtraCommandLineArgs { get; set; }
public ITaskItem[] Crossgen2PgoFiles { get; set; }
Comment on lines +105 to +106
<Exec Condition="Exists('$(_WasmCrossgen2Exe)')"
Command="&quot;$(_WasmCrossgen2Exe)&quot; -o:&quot;%(_WasmFrameworkR2RInput.OutputWasm)&quot; -r:&quot;$(LibrariesSharedFrameworkBinArtifactsPath)*.dll&quot; -r:&quot;$(_WasmCoreLibIL)&quot; --targetarch:$(TargetArchitecture) --targetos:$(TargetOS) --obj-format:wasm --codegenopt:JitWasmNyiToR2RUnsupported=1 --codegenopt:JitWasmSimdNyiToR2RUnsupported=1 -O &quot;%(_WasmFrameworkR2RInput.FullPath)&quot;" />
Comment on lines +11 to +16
namespace Wasm.Build.Tests
{
// CoreCLR browser-wasm ships framework ReadyToRun images as webcil-in-wasm; a non-zero R2R table
// size in the framework webcil is the marker that R2R was produced and staged. See dotnet/runtime#121257.
public class ReadyToRunTests : WasmTemplateTestsBase
{
CopilotAI review requested due to automatic review settings August 18, 2026 11:14

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 18 out of 18 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.cs:27

  • Crossgen2CompositeExtraCommandLineArgs is added as a public task parameter but is never used when building the crossgen2 response file, so any MSBuild plumbing that sets it will have no effect (composite builds will silently ignore these args). Either wire it into GenerateCrossgen2ResponseFile (likely only when _createCompositeImage is true) or remove the property to avoid a misleading knob.
 public bool ShowCompilerWarnings { get; set; }
public bool UseCrossgen2 { get; set; }
public string Crossgen2ExtraCommandLineArgs { get; set; }
public string Crossgen2CompositeExtraCommandLineArgs { get; set; }
public ITaskItem[] Crossgen2PgoFiles { get; set; }

src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ConvertDllsToWebCil.cs:31

  • PrebuiltR2RDirectories is optional (the code explicitly handles it being absent), but the property is declared as non-nullable. In projects with nullable enabled this is misleading and can produce warnings; it also obscures the MSBuild contract that the parameter may be omitted/empty.
 /// <summary>
/// Directories holding prebuilt R2R webcil-in-wasm images (CoreCLR browser). For a managed non-culture
/// .dll candidate with empty <c>R2RWebcilPath</c>, the first matching image is staged instead of
/// converting the IL. Empty for Mono.
/// </summary>
public string[] PrebuiltR2RDirectories { get; set; }

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 44 out of 44 changed files in this pull request and generated no new comments.

Suppressed comments (3)

src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.cs:27

  • The new property Crossgen2CompositeExtraCommandLineArgs is declared but never referenced anywhere in this task (and there are no MSBuild uses in the repo). As-is, it adds surface area/confusion without changing behavior. Either wire it into GenerateCrossgen2ResponseFile() (likely only for _createCompositeImage), or remove it until it’s needed.
    src/libraries/System.Collections/tests/System.Collections.Tests.csproj:13
  • The comment says this project always references the NetCoreAppMinimum Formatters build for a functional BinaryFormatter, but the reference is now conditional and skipped for browser/wasi. Please update the comment to reflect the new conditional behavior (this same comment exists in multiple test csprojs touched by this PR).
 <ItemGroup>
<!-- Reference the `NetCoreAppMinimum` build which has a functional BinaryFormatter and force a private copy to ensure it's not excluded -->
<ProjectReference Include="$(LibrariesProjectRoot)System.Runtime.Serialization.Formatters\src\System.Runtime.Serialization.Formatters.csproj" Private="true" SetTargetFramework="TargetFramework=$(NetCoreAppMinimum)" Condition="'$(TargetOS)' != 'browser' and '$(TargetOS)' != 'wasi'" />
</ItemGroup>

src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.CoreCLR.targets:8

  • The PR description is "just testing", but this change introduces substantial new behavior across build tasks, MSBuild targets, CoreCLR tooling, and test infrastructure for WASM ReadyToRun. Please update the PR description to clearly state the motivation, intended scenarios, and any validation performed so reviewers can assess risk and correctness.

CopilotAI review requested due to automatic review settings August 18, 2026 16:33

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 44 out of 44 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.cs:27

  • Crossgen2CompositeExtraCommandLineArgs is introduced but not used anywhere in RunReadyToRunCompiler (and there are no call sites in the repo). This adds dead API surface and can confuse callers about whether composite builds support distinct extra args.
    src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.CoreCLR.targets:8
  • The PR description ('just testing') doesn’t match the scope of this change set (new CoreCLR browser-wasm R2R targets, task API surface, CoreCLR VM changes, etc.). Please update the PR description to clearly state the problem being solved, the intended scenarios (build vs publish, trimmed vs untrimmed), and how the changes are validated (build/test matrix).

CopilotAI review requested due to automatic review settings August 18, 2026 17:28

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 44 out of 44 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.cs:27

  • The new Crossgen2CompositeExtraCommandLineArgs property is not used anywhere in RunReadyToRunCompiler (and it isn’t passed from Microsoft.NET.CrossGen.targets either), so it currently adds public surface area without affecting behavior. Consider removing it until there’s a concrete use (or wire it into GenerateCrossgen2ResponseFile in a follow-up).
    src/mono/wasm/Wasm.Build.Tests/ReadyToRunTests.cs:15
  • Tests in this repo generally avoid embedding GitHub issue/PR references in comments unless required. Please drop the dotnet/runtime#121257 reference here and keep the comment focused on the behavior being asserted.

CopilotAI review requested due to automatic review settings August 20, 2026 04:55

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 28 out of 28 changed files in this pull request and generated no new comments.

Suppressed comments (3)

src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.cs:2728

  • CanEncodeTypeInSignature returns true for non-Ecma type definitions, but SignatureBuilder.EmitTypeSignature casts named types to EcmaType. This can incorrectly treat non-metadata (e.g., NoMetadataType) types as encodable and later cause InvalidCastException or incorrect signature emission. Return false when the type definition is not an EcmaType.
 if (typeDefinition is not EcmaType ecmaTypeDefinition)
return true;

src/tests/readytorun/tests/mainv3.csproj:12

  • Typo in comment: "non-sanitzed" should be "non-sanitized".
 <!-- This test launches crossgen2 with dotnet, so we would need a non-sanitzed jitinterface library. To simplify our infrastructure, we'll instead skip this test. -->

src/coreclr/inc/readytorun.h:23

  • The PR description ("just testing") doesn’t match the scope here (format version bump and broader R2R/Wasm/CoreCLR plumbing). Please update the PR title/description to reflect the actual intent and rationale (and ideally link the driving issue/design), or split into focused PRs.
// If you update this, ensure you run `git grep MINIMUM_READYTORUN_MAJOR_VERSION`
// and handle pending work.
#define READYTORUN_MAJOR_VERSION 26
#define READYTORUN_MINOR_VERSION 0x0002

…l-in-wasm as-is
PrepareForReadyToRunCompilation writes the per-app R2R output as <name>.wasm when the container format is wasm, so the published candidate hits the pass-through path instead of PE conversion. ConvertDllsToWebCil recognizes a webcil-in-wasm candidate (\0asm magic) and stages it as-is rather than failing PEReader with 'Unknown file format'.
Enable PublishReadyToRun by default for CoreCLR browser, always source build-phase webcil staging from the runtime-pack native/r2r images, and add the Browser.ReadyToRun.targets crossgen2 override (activated only when an in-build crossgen2 is provided) so in-tree/WBT publish uses the wasm-aware non-composite Crossgen2Tasks shim and bypasses the base SDK's NETSDK1095 gate. _GatherWasmFilesToPublish no longer clears the bundle list when publish assets are webcil (.wasm), and the ManagedToNativeGenerator scan set is remapped to IL for both trimmed (linker output) and untrimmed (pack IL) R2R.
Drop the now-redundant per-project PublishReadyToRun opt-in from the JS interop tests (the SDK pack defaults it on) and enable TestTrimming there. Suppress WasmWarnOnUnresolvedPInvokeModules for CoreCLR wasm tests, and clarify the sfxproj comment on why framework R2R uses the CoreLib model instead of the SDK's in-place R2R.
The per-app R2R crossgen build otherwise exceeds the 4h job timeout. Add build-time TestAssemblyShardCount/Index partitioning in tests.proj (stable hash of the project file name, XUnitLogChecker kept on every shard) and split the browser CoreCLR library-tests leg into 8 shards. Inert unless TestAssemblyShardCount > 1.
Add ReadyToRunTests covering build (pack framework R2R) and publish (per-app crossgen2, trimmed/untrimmed, with and without native relink), asserting a non-zero R2R table in the CoreLib webcil and driving all Blazor pages in a real browser with no exceptions. Adds a self-contained Weather page to BlazorBasicTestApp and a BASE_DIR env accessor to locate the in-tree crossgen2 and Crossgen2Tasks shim.
Browser.props already wires the crossgen2 override generically (gated on Crossgen2InBuildDir, which in-tree builds set) and is imported via the SDK's Sdk.props, so WasmApp.InTree.props re-importing Crossgen2SdkOverridePropsPath produced MSB4011. Drop the redundant in-tree block and delete the now-orphaned WasmApp.ReadyToRun.targets (Browser.ReadyToRun.targets is an equivalent superset); fix the stale mirror comments.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

arch-wasmWebAssembly architecturearea-ReadyToRunNO-MERGEThe PR is not ready for merge yet (see discussion for detailed reasons)NO-REVIEWExperimental/testing PR, do NOT review it

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@pavelsavara
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[wasm][R2R] testing ... - #132419

Draft
pavelsavara wants to merge 8 commits into
dotnet:mainfrom
pavelsavara:browsehost_load_r2r_4
Draft

[wasm][R2R] testing ...#132419
pavelsavara wants to merge 8 commits into
dotnet:mainfrom
pavelsavara:browsehost_load_r2r_4

Conversation

@pavelsavara

Copy link
Copy Markdown
Member

just testing

@pavelsavarapavelsavara added this to the 12.0.0 milestone Aug 17, 2026
@pavelsavarapavelsavara self-assigned this Aug 17, 2026
CopilotAI lite review requested due to automatic review settings August 17, 2026 17:26
@pavelsavarapavelsavara added NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) NO-REVIEW Experimental/testing PR, do NOT review it arch-wasm WebAssembly architecture area-ReadyToRun labels Aug 17, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the WebAssembly build/pack pipeline to support (and validate) staging ReadyToRun (R2R) “webcil-in-wasm” images for CoreCLR browser-wasm, adds a basic regression test for the staged framework R2R marker, and includes a small CoreCLR ETW robustness fix.

Changes:

  • Add MSBuild/SDK plumbing to stage prebuilt R2R webcil-in-wasm images during build/publish for CoreCLR browser-wasm, and to generate framework R2R images into the runtime pack layout.
  • Extend Crossgen2 task RID/arch handling for browser/wasi and wasm, and adjust local test infra for CoreCLR wasm toolchain discovery.
  • Add/adjust wasm test coverage around staged framework R2R and improve EventPipe diagnostics test resiliency.

Reviewed changes

Copilot reviewed 18 out of 18 changed files in this pull request and generated 4 comments.

Show a summary per file
FileDescription
src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ConvertDllsToWebCil.csAdds probing/staging of prebuilt R2R webcil-in-wasm images via new PrebuiltR2RDirectories input.
src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.csAdds a new task parameter for composite extra args (currently not wired into command generation).
src/tasks/Crossgen2Tasks/ResolveReadyToRunCompilers.csAdds browser/wasi target OS mapping and wasm architecture support.
src/mono/wasm/Wasm.Build.Tests/Wasm.Build.Tests.csprojAdjusts local EMSDK path fallback to use the shared tool cache sentinel.
src/mono/wasm/Wasm.Build.Tests/ReadyToRunTests.csNew test asserting framework webcil R2R marker is present/absent based on PublishReadyToRun.
src/mono/wasm/Wasm.Build.Tests/Blazor/EventPipeDiagnosticsTests.csAdds timeout + runtime-failure detection to avoid hanging on trapped runtimes.
src/mono/sample/wasm/console-node/Wasm.Console.Node.Sample.csprojEnables PublishReadyToRun for CoreCLR (when UseMonoRuntime == false).
src/mono/sample/wasm/browser-advanced/Wasm.Advanced.Sample.csprojAdds commented guidance for enabling PublishReadyToRun in the sample.
src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targetsPlumbs PrebuiltR2RDirectories into ConvertDllsToWebcil and imports CoreCLR-specific targets for R2R.
src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.CoreCLR.targetsNew CoreCLR browser-wasm targets enabling/staging R2R and trimming/publish ordering hooks.
src/mono/browser/build/WasmApp.ReadyToRun.targetsIn-tree override of ResolveReadyToRunCompilers to use in-build crossgen2.
src/mono/browser/build/WasmApp.InTree.propsHooks in-tree builds to import the override targets/props for CoreCLR browser R2R.
src/mono/browser/build/BrowserWasmApp.CoreCLR.targetsRemaps managed-assembly scanning to trimmed IL when publish outputs are R2R webcil-in-wasm.
src/installer/pkg/sfx/Microsoft.NETCore.App/Microsoft.NETCore.App.Runtime.CoreCLR.sfxprojAdds framework R2R generation/packaging for CoreCLR browser runtime pack (native/r2r).
src/coreclr/vm/eventtrace.cppAvoids ETW method rundown work when EECodeInfo is invalid.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.csAdds wasm-only guard to reject methods that would create un-encodable TypeHandle fixups.
src/coreclr/jit/CMakeLists.txtInstalls the wasm universal JIT into the alljits component.
eng/testing/scenarios/BuildWasmAppsJobsListCoreCLR.txtAdds Wasm.Build.Tests.ReadyToRunTests to the CoreCLR wasm job list.

/// .dll candidate with empty <c>R2RWebcilPath</c>, the first matching image is staged instead of
/// converting the IL. Empty for Mono.
/// </summary>
public string[] PrebuiltR2RDirectories { get; set; }
Comment on lines 23 to 27
public bool ShowCompilerWarnings { get; set; }
public bool UseCrossgen2 { get; set; }
public string Crossgen2ExtraCommandLineArgs { get; set; }
public string Crossgen2CompositeExtraCommandLineArgs { get; set; }
public ITaskItem[] Crossgen2PgoFiles { get; set; }
Comment on lines +105 to +106
<Exec Condition="Exists('$(_WasmCrossgen2Exe)')"
Command="&quot;$(_WasmCrossgen2Exe)&quot; -o:&quot;%(_WasmFrameworkR2RInput.OutputWasm)&quot; -r:&quot;$(LibrariesSharedFrameworkBinArtifactsPath)*.dll&quot; -r:&quot;$(_WasmCoreLibIL)&quot; --targetarch:$(TargetArchitecture) --targetos:$(TargetOS) --obj-format:wasm --codegenopt:JitWasmNyiToR2RUnsupported=1 --codegenopt:JitWasmSimdNyiToR2RUnsupported=1 -O &quot;%(_WasmFrameworkR2RInput.FullPath)&quot;" />
Comment on lines +11 to +16
namespace Wasm.Build.Tests
{
// CoreCLR browser-wasm ships framework ReadyToRun images as webcil-in-wasm; a non-zero R2R table
// size in the framework webcil is the marker that R2R was produced and staged. See dotnet/runtime#121257.
public class ReadyToRunTests : WasmTemplateTestsBase
{
CopilotAI review requested due to automatic review settings August 18, 2026 11:14

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 18 out of 18 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.cs:27

  • Crossgen2CompositeExtraCommandLineArgs is added as a public task parameter but is never used when building the crossgen2 response file, so any MSBuild plumbing that sets it will have no effect (composite builds will silently ignore these args). Either wire it into GenerateCrossgen2ResponseFile (likely only when _createCompositeImage is true) or remove the property to avoid a misleading knob.
 public bool ShowCompilerWarnings { get; set; }
public bool UseCrossgen2 { get; set; }
public string Crossgen2ExtraCommandLineArgs { get; set; }
public string Crossgen2CompositeExtraCommandLineArgs { get; set; }
public ITaskItem[] Crossgen2PgoFiles { get; set; }

src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ConvertDllsToWebCil.cs:31

  • PrebuiltR2RDirectories is optional (the code explicitly handles it being absent), but the property is declared as non-nullable. In projects with nullable enabled this is misleading and can produce warnings; it also obscures the MSBuild contract that the parameter may be omitted/empty.
 /// <summary>
/// Directories holding prebuilt R2R webcil-in-wasm images (CoreCLR browser). For a managed non-culture
/// .dll candidate with empty <c>R2RWebcilPath</c>, the first matching image is staged instead of
/// converting the IL. Empty for Mono.
/// </summary>
public string[] PrebuiltR2RDirectories { get; set; }

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 44 out of 44 changed files in this pull request and generated no new comments.

Suppressed comments (3)

src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.cs:27

  • The new property Crossgen2CompositeExtraCommandLineArgs is declared but never referenced anywhere in this task (and there are no MSBuild uses in the repo). As-is, it adds surface area/confusion without changing behavior. Either wire it into GenerateCrossgen2ResponseFile() (likely only for _createCompositeImage), or remove it until it’s needed.
    src/libraries/System.Collections/tests/System.Collections.Tests.csproj:13
  • The comment says this project always references the NetCoreAppMinimum Formatters build for a functional BinaryFormatter, but the reference is now conditional and skipped for browser/wasi. Please update the comment to reflect the new conditional behavior (this same comment exists in multiple test csprojs touched by this PR).
 <ItemGroup>
<!-- Reference the `NetCoreAppMinimum` build which has a functional BinaryFormatter and force a private copy to ensure it's not excluded -->
<ProjectReference Include="$(LibrariesProjectRoot)System.Runtime.Serialization.Formatters\src\System.Runtime.Serialization.Formatters.csproj" Private="true" SetTargetFramework="TargetFramework=$(NetCoreAppMinimum)" Condition="'$(TargetOS)' != 'browser' and '$(TargetOS)' != 'wasi'" />
</ItemGroup>

src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.CoreCLR.targets:8

  • The PR description is "just testing", but this change introduces substantial new behavior across build tasks, MSBuild targets, CoreCLR tooling, and test infrastructure for WASM ReadyToRun. Please update the PR description to clearly state the motivation, intended scenarios, and any validation performed so reviewers can assess risk and correctness.

CopilotAI review requested due to automatic review settings August 18, 2026 16:33

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 44 out of 44 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.cs:27

  • Crossgen2CompositeExtraCommandLineArgs is introduced but not used anywhere in RunReadyToRunCompiler (and there are no call sites in the repo). This adds dead API surface and can confuse callers about whether composite builds support distinct extra args.
    src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.CoreCLR.targets:8
  • The PR description ('just testing') doesn’t match the scope of this change set (new CoreCLR browser-wasm R2R targets, task API surface, CoreCLR VM changes, etc.). Please update the PR description to clearly state the problem being solved, the intended scenarios (build vs publish, trimmed vs untrimmed), and how the changes are validated (build/test matrix).

CopilotAI review requested due to automatic review settings August 18, 2026 17:28

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 44 out of 44 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.cs:27

  • The new Crossgen2CompositeExtraCommandLineArgs property is not used anywhere in RunReadyToRunCompiler (and it isn’t passed from Microsoft.NET.CrossGen.targets either), so it currently adds public surface area without affecting behavior. Consider removing it until there’s a concrete use (or wire it into GenerateCrossgen2ResponseFile in a follow-up).
    src/mono/wasm/Wasm.Build.Tests/ReadyToRunTests.cs:15
  • Tests in this repo generally avoid embedding GitHub issue/PR references in comments unless required. Please drop the dotnet/runtime#121257 reference here and keep the comment focused on the behavior being asserted.

CopilotAI review requested due to automatic review settings August 20, 2026 04:55

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 28 out of 28 changed files in this pull request and generated no new comments.

Suppressed comments (3)

src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.cs:2728

  • CanEncodeTypeInSignature returns true for non-Ecma type definitions, but SignatureBuilder.EmitTypeSignature casts named types to EcmaType. This can incorrectly treat non-metadata (e.g., NoMetadataType) types as encodable and later cause InvalidCastException or incorrect signature emission. Return false when the type definition is not an EcmaType.
 if (typeDefinition is not EcmaType ecmaTypeDefinition)
return true;

src/tests/readytorun/tests/mainv3.csproj:12

  • Typo in comment: "non-sanitzed" should be "non-sanitized".
 <!-- This test launches crossgen2 with dotnet, so we would need a non-sanitzed jitinterface library. To simplify our infrastructure, we'll instead skip this test. -->

src/coreclr/inc/readytorun.h:23

  • The PR description ("just testing") doesn’t match the scope here (format version bump and broader R2R/Wasm/CoreCLR plumbing). Please update the PR title/description to reflect the actual intent and rationale (and ideally link the driving issue/design), or split into focused PRs.
// If you update this, ensure you run `git grep MINIMUM_READYTORUN_MAJOR_VERSION`
// and handle pending work.
#define READYTORUN_MAJOR_VERSION 26
#define READYTORUN_MINOR_VERSION 0x0002

…l-in-wasm as-is
PrepareForReadyToRunCompilation writes the per-app R2R output as <name>.wasm when the container format is wasm, so the published candidate hits the pass-through path instead of PE conversion. ConvertDllsToWebCil recognizes a webcil-in-wasm candidate (\0asm magic) and stages it as-is rather than failing PEReader with 'Unknown file format'.
Enable PublishReadyToRun by default for CoreCLR browser, always source build-phase webcil staging from the runtime-pack native/r2r images, and add the Browser.ReadyToRun.targets crossgen2 override (activated only when an in-build crossgen2 is provided) so in-tree/WBT publish uses the wasm-aware non-composite Crossgen2Tasks shim and bypasses the base SDK's NETSDK1095 gate. _GatherWasmFilesToPublish no longer clears the bundle list when publish assets are webcil (.wasm), and the ManagedToNativeGenerator scan set is remapped to IL for both trimmed (linker output) and untrimmed (pack IL) R2R.
Drop the now-redundant per-project PublishReadyToRun opt-in from the JS interop tests (the SDK pack defaults it on) and enable TestTrimming there. Suppress WasmWarnOnUnresolvedPInvokeModules for CoreCLR wasm tests, and clarify the sfxproj comment on why framework R2R uses the CoreLib model instead of the SDK's in-place R2R.
The per-app R2R crossgen build otherwise exceeds the 4h job timeout. Add build-time TestAssemblyShardCount/Index partitioning in tests.proj (stable hash of the project file name, XUnitLogChecker kept on every shard) and split the browser CoreCLR library-tests leg into 8 shards. Inert unless TestAssemblyShardCount > 1.
Add ReadyToRunTests covering build (pack framework R2R) and publish (per-app crossgen2, trimmed/untrimmed, with and without native relink), asserting a non-zero R2R table in the CoreLib webcil and driving all Blazor pages in a real browser with no exceptions. Adds a self-contained Weather page to BlazorBasicTestApp and a BASE_DIR env accessor to locate the in-tree crossgen2 and Crossgen2Tasks shim.
Browser.props already wires the crossgen2 override generically (gated on Crossgen2InBuildDir, which in-tree builds set) and is imported via the SDK's Sdk.props, so WasmApp.InTree.props re-importing Crossgen2SdkOverridePropsPath produced MSB4011. Drop the redundant in-tree block and delete the now-orphaned WasmApp.ReadyToRun.targets (Browser.ReadyToRun.targets is an equivalent superset); fix the stale mirror comments.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

arch-wasmWebAssembly architecturearea-ReadyToRunNO-MERGEThe PR is not ready for merge yet (see discussion for detailed reasons)NO-REVIEWExperimental/testing PR, do NOT review it

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@pavelsavara
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

[wasm][R2R] testing ... - #132419

Draft
pavelsavara wants to merge 8 commits into
dotnet:mainfrom
pavelsavara:browsehost_load_r2r_4
Draft

[wasm][R2R] testing ...#132419
pavelsavara wants to merge 8 commits into
dotnet:mainfrom
pavelsavara:browsehost_load_r2r_4

Conversation

@pavelsavara

Copy link
Copy Markdown
Member

just testing

@pavelsavarapavelsavara added this to the 12.0.0 milestone Aug 17, 2026
@pavelsavarapavelsavara self-assigned this Aug 17, 2026
CopilotAI lite review requested due to automatic review settings August 17, 2026 17:26
@pavelsavarapavelsavara added NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) NO-REVIEW Experimental/testing PR, do NOT review it arch-wasm WebAssembly architecture area-ReadyToRun labels Aug 17, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the WebAssembly build/pack pipeline to support (and validate) staging ReadyToRun (R2R) “webcil-in-wasm” images for CoreCLR browser-wasm, adds a basic regression test for the staged framework R2R marker, and includes a small CoreCLR ETW robustness fix.

Changes:

  • Add MSBuild/SDK plumbing to stage prebuilt R2R webcil-in-wasm images during build/publish for CoreCLR browser-wasm, and to generate framework R2R images into the runtime pack layout.
  • Extend Crossgen2 task RID/arch handling for browser/wasi and wasm, and adjust local test infra for CoreCLR wasm toolchain discovery.
  • Add/adjust wasm test coverage around staged framework R2R and improve EventPipe diagnostics test resiliency.

Reviewed changes

Copilot reviewed 18 out of 18 changed files in this pull request and generated 4 comments.

Show a summary per file
FileDescription
src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ConvertDllsToWebCil.csAdds probing/staging of prebuilt R2R webcil-in-wasm images via new PrebuiltR2RDirectories input.
src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.csAdds a new task parameter for composite extra args (currently not wired into command generation).
src/tasks/Crossgen2Tasks/ResolveReadyToRunCompilers.csAdds browser/wasi target OS mapping and wasm architecture support.
src/mono/wasm/Wasm.Build.Tests/Wasm.Build.Tests.csprojAdjusts local EMSDK path fallback to use the shared tool cache sentinel.
src/mono/wasm/Wasm.Build.Tests/ReadyToRunTests.csNew test asserting framework webcil R2R marker is present/absent based on PublishReadyToRun.
src/mono/wasm/Wasm.Build.Tests/Blazor/EventPipeDiagnosticsTests.csAdds timeout + runtime-failure detection to avoid hanging on trapped runtimes.
src/mono/sample/wasm/console-node/Wasm.Console.Node.Sample.csprojEnables PublishReadyToRun for CoreCLR (when UseMonoRuntime == false).
src/mono/sample/wasm/browser-advanced/Wasm.Advanced.Sample.csprojAdds commented guidance for enabling PublishReadyToRun in the sample.
src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targetsPlumbs PrebuiltR2RDirectories into ConvertDllsToWebcil and imports CoreCLR-specific targets for R2R.
src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.CoreCLR.targetsNew CoreCLR browser-wasm targets enabling/staging R2R and trimming/publish ordering hooks.
src/mono/browser/build/WasmApp.ReadyToRun.targetsIn-tree override of ResolveReadyToRunCompilers to use in-build crossgen2.
src/mono/browser/build/WasmApp.InTree.propsHooks in-tree builds to import the override targets/props for CoreCLR browser R2R.
src/mono/browser/build/BrowserWasmApp.CoreCLR.targetsRemaps managed-assembly scanning to trimmed IL when publish outputs are R2R webcil-in-wasm.
src/installer/pkg/sfx/Microsoft.NETCore.App/Microsoft.NETCore.App.Runtime.CoreCLR.sfxprojAdds framework R2R generation/packaging for CoreCLR browser runtime pack (native/r2r).
src/coreclr/vm/eventtrace.cppAvoids ETW method rundown work when EECodeInfo is invalid.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.csAdds wasm-only guard to reject methods that would create un-encodable TypeHandle fixups.
src/coreclr/jit/CMakeLists.txtInstalls the wasm universal JIT into the alljits component.
eng/testing/scenarios/BuildWasmAppsJobsListCoreCLR.txtAdds Wasm.Build.Tests.ReadyToRunTests to the CoreCLR wasm job list.

/// .dll candidate with empty <c>R2RWebcilPath</c>, the first matching image is staged instead of
/// converting the IL. Empty for Mono.
/// </summary>
public string[] PrebuiltR2RDirectories { get; set; }
Comment on lines 23 to 27
public bool ShowCompilerWarnings { get; set; }
public bool UseCrossgen2 { get; set; }
public string Crossgen2ExtraCommandLineArgs { get; set; }
public string Crossgen2CompositeExtraCommandLineArgs { get; set; }
public ITaskItem[] Crossgen2PgoFiles { get; set; }
Comment on lines +105 to +106
<Exec Condition="Exists('$(_WasmCrossgen2Exe)')"
Command="&quot;$(_WasmCrossgen2Exe)&quot; -o:&quot;%(_WasmFrameworkR2RInput.OutputWasm)&quot; -r:&quot;$(LibrariesSharedFrameworkBinArtifactsPath)*.dll&quot; -r:&quot;$(_WasmCoreLibIL)&quot; --targetarch:$(TargetArchitecture) --targetos:$(TargetOS) --obj-format:wasm --codegenopt:JitWasmNyiToR2RUnsupported=1 --codegenopt:JitWasmSimdNyiToR2RUnsupported=1 -O &quot;%(_WasmFrameworkR2RInput.FullPath)&quot;" />
Comment on lines +11 to +16
namespace Wasm.Build.Tests
{
// CoreCLR browser-wasm ships framework ReadyToRun images as webcil-in-wasm; a non-zero R2R table
// size in the framework webcil is the marker that R2R was produced and staged. See dotnet/runtime#121257.
public class ReadyToRunTests : WasmTemplateTestsBase
{
CopilotAI review requested due to automatic review settings August 18, 2026 11:14

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 18 out of 18 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.cs:27

  • Crossgen2CompositeExtraCommandLineArgs is added as a public task parameter but is never used when building the crossgen2 response file, so any MSBuild plumbing that sets it will have no effect (composite builds will silently ignore these args). Either wire it into GenerateCrossgen2ResponseFile (likely only when _createCompositeImage is true) or remove the property to avoid a misleading knob.
 public bool ShowCompilerWarnings { get; set; }
public bool UseCrossgen2 { get; set; }
public string Crossgen2ExtraCommandLineArgs { get; set; }
public string Crossgen2CompositeExtraCommandLineArgs { get; set; }
public ITaskItem[] Crossgen2PgoFiles { get; set; }

src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ConvertDllsToWebCil.cs:31

  • PrebuiltR2RDirectories is optional (the code explicitly handles it being absent), but the property is declared as non-nullable. In projects with nullable enabled this is misleading and can produce warnings; it also obscures the MSBuild contract that the parameter may be omitted/empty.
 /// <summary>
/// Directories holding prebuilt R2R webcil-in-wasm images (CoreCLR browser). For a managed non-culture
/// .dll candidate with empty <c>R2RWebcilPath</c>, the first matching image is staged instead of
/// converting the IL. Empty for Mono.
/// </summary>
public string[] PrebuiltR2RDirectories { get; set; }

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 44 out of 44 changed files in this pull request and generated no new comments.

Suppressed comments (3)

src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.cs:27

  • The new property Crossgen2CompositeExtraCommandLineArgs is declared but never referenced anywhere in this task (and there are no MSBuild uses in the repo). As-is, it adds surface area/confusion without changing behavior. Either wire it into GenerateCrossgen2ResponseFile() (likely only for _createCompositeImage), or remove it until it’s needed.
    src/libraries/System.Collections/tests/System.Collections.Tests.csproj:13
  • The comment says this project always references the NetCoreAppMinimum Formatters build for a functional BinaryFormatter, but the reference is now conditional and skipped for browser/wasi. Please update the comment to reflect the new conditional behavior (this same comment exists in multiple test csprojs touched by this PR).
 <ItemGroup>
<!-- Reference the `NetCoreAppMinimum` build which has a functional BinaryFormatter and force a private copy to ensure it's not excluded -->
<ProjectReference Include="$(LibrariesProjectRoot)System.Runtime.Serialization.Formatters\src\System.Runtime.Serialization.Formatters.csproj" Private="true" SetTargetFramework="TargetFramework=$(NetCoreAppMinimum)" Condition="'$(TargetOS)' != 'browser' and '$(TargetOS)' != 'wasi'" />
</ItemGroup>

src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.CoreCLR.targets:8

  • The PR description is "just testing", but this change introduces substantial new behavior across build tasks, MSBuild targets, CoreCLR tooling, and test infrastructure for WASM ReadyToRun. Please update the PR description to clearly state the motivation, intended scenarios, and any validation performed so reviewers can assess risk and correctness.

CopilotAI review requested due to automatic review settings August 18, 2026 16:33

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 44 out of 44 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.cs:27

  • Crossgen2CompositeExtraCommandLineArgs is introduced but not used anywhere in RunReadyToRunCompiler (and there are no call sites in the repo). This adds dead API surface and can confuse callers about whether composite builds support distinct extra args.
    src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.CoreCLR.targets:8
  • The PR description ('just testing') doesn’t match the scope of this change set (new CoreCLR browser-wasm R2R targets, task API surface, CoreCLR VM changes, etc.). Please update the PR description to clearly state the problem being solved, the intended scenarios (build vs publish, trimmed vs untrimmed), and how the changes are validated (build/test matrix).

CopilotAI review requested due to automatic review settings August 18, 2026 17:28

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 44 out of 44 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/tasks/Crossgen2Tasks/RunReadyToRunCompiler.cs:27

  • The new Crossgen2CompositeExtraCommandLineArgs property is not used anywhere in RunReadyToRunCompiler (and it isn’t passed from Microsoft.NET.CrossGen.targets either), so it currently adds public surface area without affecting behavior. Consider removing it until there’s a concrete use (or wire it into GenerateCrossgen2ResponseFile in a follow-up).
    src/mono/wasm/Wasm.Build.Tests/ReadyToRunTests.cs:15
  • Tests in this repo generally avoid embedding GitHub issue/PR references in comments unless required. Please drop the dotnet/runtime#121257 reference here and keep the comment focused on the behavior being asserted.

CopilotAI review requested due to automatic review settings August 20, 2026 04:55

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 28 out of 28 changed files in this pull request and generated no new comments.

Suppressed comments (3)

src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.cs:2728

  • CanEncodeTypeInSignature returns true for non-Ecma type definitions, but SignatureBuilder.EmitTypeSignature casts named types to EcmaType. This can incorrectly treat non-metadata (e.g., NoMetadataType) types as encodable and later cause InvalidCastException or incorrect signature emission. Return false when the type definition is not an EcmaType.
 if (typeDefinition is not EcmaType ecmaTypeDefinition)
return true;

src/tests/readytorun/tests/mainv3.csproj:12

  • Typo in comment: "non-sanitzed" should be "non-sanitized".
 <!-- This test launches crossgen2 with dotnet, so we would need a non-sanitzed jitinterface library. To simplify our infrastructure, we'll instead skip this test. -->

src/coreclr/inc/readytorun.h:23

  • The PR description ("just testing") doesn’t match the scope here (format version bump and broader R2R/Wasm/CoreCLR plumbing). Please update the PR title/description to reflect the actual intent and rationale (and ideally link the driving issue/design), or split into focused PRs.
// If you update this, ensure you run `git grep MINIMUM_READYTORUN_MAJOR_VERSION`
// and handle pending work.
#define READYTORUN_MAJOR_VERSION 26
#define READYTORUN_MINOR_VERSION 0x0002

…l-in-wasm as-is
PrepareForReadyToRunCompilation writes the per-app R2R output as <name>.wasm when the container format is wasm, so the published candidate hits the pass-through path instead of PE conversion. ConvertDllsToWebCil recognizes a webcil-in-wasm candidate (\0asm magic) and stages it as-is rather than failing PEReader with 'Unknown file format'.
Enable PublishReadyToRun by default for CoreCLR browser, always source build-phase webcil staging from the runtime-pack native/r2r images, and add the Browser.ReadyToRun.targets crossgen2 override (activated only when an in-build crossgen2 is provided) so in-tree/WBT publish uses the wasm-aware non-composite Crossgen2Tasks shim and bypasses the base SDK's NETSDK1095 gate. _GatherWasmFilesToPublish no longer clears the bundle list when publish assets are webcil (.wasm), and the ManagedToNativeGenerator scan set is remapped to IL for both trimmed (linker output) and untrimmed (pack IL) R2R.
Drop the now-redundant per-project PublishReadyToRun opt-in from the JS interop tests (the SDK pack defaults it on) and enable TestTrimming there. Suppress WasmWarnOnUnresolvedPInvokeModules for CoreCLR wasm tests, and clarify the sfxproj comment on why framework R2R uses the CoreLib model instead of the SDK's in-place R2R.
The per-app R2R crossgen build otherwise exceeds the 4h job timeout. Add build-time TestAssemblyShardCount/Index partitioning in tests.proj (stable hash of the project file name, XUnitLogChecker kept on every shard) and split the browser CoreCLR library-tests leg into 8 shards. Inert unless TestAssemblyShardCount > 1.
Add ReadyToRunTests covering build (pack framework R2R) and publish (per-app crossgen2, trimmed/untrimmed, with and without native relink), asserting a non-zero R2R table in the CoreLib webcil and driving all Blazor pages in a real browser with no exceptions. Adds a self-contained Weather page to BlazorBasicTestApp and a BASE_DIR env accessor to locate the in-tree crossgen2 and Crossgen2Tasks shim.
Browser.props already wires the crossgen2 override generically (gated on Crossgen2InBuildDir, which in-tree builds set) and is imported via the SDK's Sdk.props, so WasmApp.InTree.props re-importing Crossgen2SdkOverridePropsPath produced MSB4011. Drop the redundant in-tree block and delete the now-orphaned WasmApp.ReadyToRun.targets (Browser.ReadyToRun.targets is an equivalent superset); fix the stale mirror comments.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

arch-wasmWebAssembly architecturearea-ReadyToRunNO-MERGEThe PR is not ready for merge yet (see discussion for detailed reasons)NO-REVIEWExperimental/testing PR, do NOT review it

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@pavelsavara