[browser][coreCLR] Loading WebCIL - 2nd attempt - #124904

Merged
pavelsavara merged 26 commits into
dotnet:mainfrom
pavelsavara:loading_webcil2
Mar 13, 2026
Merged

[browser][coreCLR] Loading WebCIL - 2nd attempt#124904
pavelsavara merged 26 commits into
dotnet:mainfrom
pavelsavara:loading_webcil2

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Feb 26, 2026

Copy link
Copy Markdown
Member

Enable Webcil loading in CoreCLR for Browser/WASM

Summary

Adds native Webcil container format support to the CoreCLR runtime, enabling CoreCLR-on-WASM to load .wasm-wrapped assemblies directly — previously only supported by the Mono runtime. Removes the WasmEnableWebcil=false override that was forcing CoreCLR browser builds to use raw .dll files.

Changes

CoreCLR Webcil decoder (src/coreclr/)

  • New WebcilDecoder class (webcildecoder.h, webcildecoder.cpp) — standalone reader for the Webcil container format with full RVA/offset translation, COR header resolution, metadata access, section validation, IL method checking, debug directory support, and DAC enumeration.
  • FEATURE_WEBCIL cmake gate enabled for CLR_CMAKE_TARGET_BROWSER (clrfeatures.cmake, clrdefinitions.cmake).

PEImageLayout composition refactor (src/coreclr/vm/)

  • PEImageLayout no longer inherits from PEDecoder; instead holds m_peDecoder (and conditionally m_webcilDecoder) as members with an ImageFormat discriminator (FORMAT_PE/FORMAT_WEBCIL).
  • ~160 inline forwarding methods in peimagelayout.inl dispatch to the active decoder via DECODER_DISPATCH/DECODER_CHECK/PE_OR_WEBCIL macros.
  • PEDecoder public API split: methods needed by PEImageLayout forwarding stay public; PE-internal helpers (GetHeaders, GetDirectoryEntry, CheckDirectoryEntry, relocation/TLS/strong-name internals, etc.) moved to a private section accessible only via friend class PEImageLayout.
  • FlatImageLayout constructor detects Webcil magic and initializes both decoders (Webcil for format operations, PE decoder for base/size/flags used by cDAC).
  • New HasHeaders() abstraction on PEImageLayout and PEImage — returns HasWebcilHeaders() or HasNTHeaders() depending on format. Callers in peassembly.cpp, peimage.cpp, eventtrace.cpp updated from HasNTHeaders() to HasHeaders().
  • debugdebugger.cpp: switched from PEDecoder* to PEImageLayout* and uses format-agnostic GetDirectoryEntryData instead of raw GetDirectoryEntry+GetDirectoryData.
  • ceeload.cpp: same PEDecoder*PEImageLayout* fix for IJW host lookup.
  • peassembly.cpp: accept IMAGE_FILE_MACHINE_UNKNOWN (Webcil machine type) for IL-only validation; guard 32-bit NT header check with HasNTHeaders().
  • assemblybindercommon.cpp: treat IMAGE_FILE_MACHINE_UNKNOWN as processor-agnostic MSIL.

cDAC diagnostics (src/native/managed/cdac/)

  • PEImageLayout data descriptor gains Format field (datadescriptor.inc, PEImageLayout.cs).
  • Loader_1.cs: Webcil-aware RvaToOffset path that reads the Webcil section table directly from the target memory when IsWebcilFormat is set.

Build/infrastructure

  • Removed WasmEnableWebcil=false from CoreCLR browser build properties (WasmApp.InTree.props, tests.browser.targets).
  • MSBuild task renames: WebCilCandidatesWebcilCandidates, IsWebCilEnabledIsWebcilEnabled, _WasmBuildWebCilPath_WasmBuildWebcilPath and related properties.
  • Test infrastructure: BuildEnvironment.cs removes CoreCLR Webcil exclusion; env var WasmEnableWebCilWasmEnableWebcil.

@pavelsavarapavelsavara added this to the 11.0.0 milestone Feb 26, 2026
@pavelsavarapavelsavara self-assigned this Feb 26, 2026
CopilotAI review requested due to automatic review settings February 26, 2026 14:56
@pavelsavarapavelsavara added arch-wasm WebAssembly architecture area-AssemblyLoader-coreclr only use for closed issues os-browser Browser variant of arch-wasm labels Feb 26, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @elinor-fung
See info in area-owners.md if you want to be subscribed.

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

Enables CoreCLR-on-Browser/WASM to load assemblies packaged in the Webcil container format (i.e., .wasm-wrapped assemblies), aligning CoreCLR behavior with existing Mono Webcil support and removing prior build/test overrides that forced raw .dll usage.

Changes:

  • Adds CoreCLR-side Webcil decoding and wires it into PEImageLayout via format-dispatched forwarding to either PEDecoder (PE) or WebcilDecoder (Webcil).
  • Updates the Webcil tooling pipeline (converter/reader/wrapper + MSBuild tasks/targets) including 16-byte section alignment and property renames (WebCil*Webcil*).
  • Extends cDAC contracts/readers and WASM test infrastructure to understand and exercise Webcil images.

Reviewed changes

Copilot reviewed 35 out of 35 changed files in this pull request and generated 6 comments.

Show a summary per file
FileDescription
src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilWasmWrapper.csImproves wrapper error message for payload offset validation.
src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilReader.csUpdates to PascalCase header fields and adds bounds checking in RVA translation.
src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilHeader.csRenames Webcil header fields to PascalCase for consistency.
src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilConverter.csImplements 16-byte section alignment, debug directory translation, and related validations.
src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ConvertDllsToWebCil.csRenames output item list to WebcilCandidates.
src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ComputeWasmPublishAssets.csRenames task property to IsWebcilEnabled and updates usage.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/PEImageLayout.csAdds Format field to contract + helper to detect Webcil format.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Loader_1.csAdds Webcil-aware RVA-to-offset logic by reading Webcil section table from target memory.
src/mono/wasm/features.mdDocumentation update: “WebCIL” → “Webcil”.
src/mono/wasm/Wasm.Build.Tests/Common/BuildEnvironment.csRemoves CoreCLR Webcil exclusion; renames env var WasmEnableWebcil.
src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targetsRenames MSBuild properties/items/parameters from WebCilWebcil.
src/mono/cmake/options.cmakeDocumentation string update for ENABLE_WEBCIL.
src/mono/cmake/config.h.inComment update for ENABLE_WEBCIL.
src/mono/browser/debugger/BrowserDebugProxy/DebugStore.csDocumentation wording update for Webcil handling.
src/mono/browser/build/WasmApp.InTree.propsRemoves CoreCLR WasmEnableWebcil=false override.
src/coreclr/vm/peimagelayout.inlAdds decoder-dispatch forwarding methods; introduces format-agnostic header checks.
src/coreclr/vm/peimagelayout.hRefactors PEImageLayout to composition with PEDecoder/WebcilDecoder and ImageFormat discriminator.
src/coreclr/vm/peimagelayout.cppInitializes Webcil decoder on detection; updates PEDecoder init/reset call sites; DAC enumeration dispatch.
src/coreclr/vm/peimage.inlAdds PEImage::HasHeaders() helper.
src/coreclr/vm/peimage.hDeclares HasHeaders() in PEImage.
src/coreclr/vm/peimage.cppUses HasHeaders() instead of HasNTHeaders() in metadata/debug-directory paths.
src/coreclr/vm/peassembly.cppAccepts IMAGE_FILE_MACHINE_UNKNOWN for IL-only validation; guards 32-bit header check.
src/coreclr/vm/eventtrace.cppSwitches checks from NT headers to format-agnostic headers.
src/coreclr/vm/debugdebugger.cppSwitches from PEDecoder* to PEImageLayout* and uses GetDirectoryEntryData.
src/coreclr/vm/datadescriptor/datadescriptor.incAdds Format field to PEImageLayout’s cDAC data descriptor.
src/coreclr/vm/ceeload.cppUpdates IJW lookup to use PEImageLayout* (post-inheritance refactor).
src/coreclr/utilcode/webcildecoder.cppAdds CoreCLR Webcil decoding/validation implementation and DAC enumeration support.
src/coreclr/utilcode/CMakeLists.txtAdds webcildecoder.cpp to utilcode build.
src/coreclr/inc/webcildecoder.hAdds Webcil structures and WebcilDecoder API.
src/coreclr/inc/pedecoder.hMakes PEImageLayout a friend and restricts PE-internal APIs to PEImageLayout usage.
src/coreclr/clrfeatures.cmakeEnables FEATURE_WEBCIL for browser builds.
src/coreclr/clrdefinitions.cmakeAdds FEATURE_WEBCIL compile definition when enabled.
src/coreclr/binder/assemblybindercommon.cppTreats IMAGE_FILE_MACHINE_UNKNOWN as processor-agnostic MSIL in binder logic.
eng/testing/tests.browser.targetsRemoves CoreCLR WasmEnableWebcil=false override for browser tests.
docs/design/mono/webcil.mdUpdates spec text for alignment and PascalCase field names + naming consistency.

Comment threadsrc/coreclr/utilcode/webcildecoder.cpp Outdated
Comment threadsrc/coreclr/vm/peimagelayout.inl
Comment threadsrc/coreclr/utilcode/webcildecoder.cpp Outdated
Comment threadsrc/coreclr/utilcode/webcildecoder.cpp
CopilotAI review requested due to automatic review settings February 26, 2026 15:12

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 35 out of 35 changed files in this pull request and generated 4 comments.

Comments suppressed due to low confidence (1)

src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilReader.cs:354

  • New exceptions in TranslateRVA use nameof(_stream) as the parameter name. Since _stream is a private field (not a parameter), this produces a less helpful ParamName than nameof(stream) (constructor parameter) or omitting the param name entirely. Consider aligning with the earlier constructor exceptions which use nameof(stream).

Comment threadsrc/coreclr/vm/peimagelayout.inl Outdated
CopilotAI review requested due to automatic review settings February 26, 2026 15:24

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 35 out of 35 changed files in this pull request and generated 2 comments.

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 33 out of 33 changed files in this pull request and generated 6 comments.

Comments suppressed due to low confidence (1)

src/coreclr/utilcode/CMakeLists.txt:1

  • webcildecoder.cpp is added unconditionally to UTILCODE_COMMON_SOURCES. When FEATURE_WEBCIL is off this compiles an effectively empty translation unit, which is small but avoidable build work. Consider conditionally appending webcildecoder.cpp only when FEATURE_WEBCIL is enabled (or CLR_CMAKE_TARGET_BROWSER), to keep non-browser builds slightly leaner.
set(CMAKE_INCLUDE_CURRENT_DIR ON)

Comment threadsrc/coreclr/utilcode/webcildecoder.cpp
Comment threadsrc/coreclr/vm/peimagelayout.cpp
Comment threadsrc/coreclr/vm/peimagelayout.cpp
Comment threadsrc/coreclr/inc/cordecoderhelpers.h
CopilotAI review requested due to automatic review settings March 12, 2026 23:29

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 33 out of 33 changed files in this pull request and generated 3 comments.

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings March 13, 2026 00:35

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 33 out of 33 changed files in this pull request and generated 2 comments.

CopilotAI review requested due to automatic review settings March 13, 2026 01:39

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 34 out of 34 changed files in this pull request and generated 6 comments.

Comment threadsrc/native/managed/cdac/tests/LoaderTests.cs
Comment threadsrc/native/managed/cdac/tests/LoaderTests.cs
Comment threadsrc/coreclr/utilcode/webcildecoder.cpp Outdated
Comment threaddocs/design/datacontracts/Loader.md Outdated
Comment threadsrc/coreclr/utilcode/webcildecoder.cpp
@max-charlamb

Copy link
Copy Markdown
Member

Looks good to me from a cDAC perspective. Thanks for keeping the cDAC up to date 👍

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g unrelated CI failures

@pavelsavara
pavelsavara merged commit 41ac7d5 into dotnet:mainMar 13, 2026
158 of 166 checks passed
@pavelsavara
pavelsavara deleted the loading_webcil2 branch March 13, 2026 15:40
CopilotAI pushed a commit that referenced this pull request Mar 13, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 13, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-AssemblyLoader-coreclronly use for closed issuesos-browserBrowser variant of arch-wasm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@pavelsavara@max-charlamb@jkotas@adamperlin@AaronRobinsonMSFT@radekdoulik
, '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

[browser][coreCLR] Loading WebCIL - 2nd attempt - #124904

Merged
pavelsavara merged 26 commits into
dotnet:mainfrom
pavelsavara:loading_webcil2
Mar 13, 2026
Merged

[browser][coreCLR] Loading WebCIL - 2nd attempt#124904
pavelsavara merged 26 commits into
dotnet:mainfrom
pavelsavara:loading_webcil2

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Feb 26, 2026

Copy link
Copy Markdown
Member

Enable Webcil loading in CoreCLR for Browser/WASM

Summary

Adds native Webcil container format support to the CoreCLR runtime, enabling CoreCLR-on-WASM to load .wasm-wrapped assemblies directly — previously only supported by the Mono runtime. Removes the WasmEnableWebcil=false override that was forcing CoreCLR browser builds to use raw .dll files.

Changes

CoreCLR Webcil decoder (src/coreclr/)

  • New WebcilDecoder class (webcildecoder.h, webcildecoder.cpp) — standalone reader for the Webcil container format with full RVA/offset translation, COR header resolution, metadata access, section validation, IL method checking, debug directory support, and DAC enumeration.
  • FEATURE_WEBCIL cmake gate enabled for CLR_CMAKE_TARGET_BROWSER (clrfeatures.cmake, clrdefinitions.cmake).

PEImageLayout composition refactor (src/coreclr/vm/)

  • PEImageLayout no longer inherits from PEDecoder; instead holds m_peDecoder (and conditionally m_webcilDecoder) as members with an ImageFormat discriminator (FORMAT_PE/FORMAT_WEBCIL).
  • ~160 inline forwarding methods in peimagelayout.inl dispatch to the active decoder via DECODER_DISPATCH/DECODER_CHECK/PE_OR_WEBCIL macros.
  • PEDecoder public API split: methods needed by PEImageLayout forwarding stay public; PE-internal helpers (GetHeaders, GetDirectoryEntry, CheckDirectoryEntry, relocation/TLS/strong-name internals, etc.) moved to a private section accessible only via friend class PEImageLayout.
  • FlatImageLayout constructor detects Webcil magic and initializes both decoders (Webcil for format operations, PE decoder for base/size/flags used by cDAC).
  • New HasHeaders() abstraction on PEImageLayout and PEImage — returns HasWebcilHeaders() or HasNTHeaders() depending on format. Callers in peassembly.cpp, peimage.cpp, eventtrace.cpp updated from HasNTHeaders() to HasHeaders().
  • debugdebugger.cpp: switched from PEDecoder* to PEImageLayout* and uses format-agnostic GetDirectoryEntryData instead of raw GetDirectoryEntry+GetDirectoryData.
  • ceeload.cpp: same PEDecoder*PEImageLayout* fix for IJW host lookup.
  • peassembly.cpp: accept IMAGE_FILE_MACHINE_UNKNOWN (Webcil machine type) for IL-only validation; guard 32-bit NT header check with HasNTHeaders().
  • assemblybindercommon.cpp: treat IMAGE_FILE_MACHINE_UNKNOWN as processor-agnostic MSIL.

cDAC diagnostics (src/native/managed/cdac/)

  • PEImageLayout data descriptor gains Format field (datadescriptor.inc, PEImageLayout.cs).
  • Loader_1.cs: Webcil-aware RvaToOffset path that reads the Webcil section table directly from the target memory when IsWebcilFormat is set.

Build/infrastructure

  • Removed WasmEnableWebcil=false from CoreCLR browser build properties (WasmApp.InTree.props, tests.browser.targets).
  • MSBuild task renames: WebCilCandidatesWebcilCandidates, IsWebCilEnabledIsWebcilEnabled, _WasmBuildWebCilPath_WasmBuildWebcilPath and related properties.
  • Test infrastructure: BuildEnvironment.cs removes CoreCLR Webcil exclusion; env var WasmEnableWebCilWasmEnableWebcil.

@pavelsavarapavelsavara added this to the 11.0.0 milestone Feb 26, 2026
@pavelsavarapavelsavara self-assigned this Feb 26, 2026
CopilotAI review requested due to automatic review settings February 26, 2026 14:56
@pavelsavarapavelsavara added arch-wasm WebAssembly architecture area-AssemblyLoader-coreclr only use for closed issues os-browser Browser variant of arch-wasm labels Feb 26, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @elinor-fung
See info in area-owners.md if you want to be subscribed.

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

Enables CoreCLR-on-Browser/WASM to load assemblies packaged in the Webcil container format (i.e., .wasm-wrapped assemblies), aligning CoreCLR behavior with existing Mono Webcil support and removing prior build/test overrides that forced raw .dll usage.

Changes:

  • Adds CoreCLR-side Webcil decoding and wires it into PEImageLayout via format-dispatched forwarding to either PEDecoder (PE) or WebcilDecoder (Webcil).
  • Updates the Webcil tooling pipeline (converter/reader/wrapper + MSBuild tasks/targets) including 16-byte section alignment and property renames (WebCil*Webcil*).
  • Extends cDAC contracts/readers and WASM test infrastructure to understand and exercise Webcil images.

Reviewed changes

Copilot reviewed 35 out of 35 changed files in this pull request and generated 6 comments.

Show a summary per file
FileDescription
src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilWasmWrapper.csImproves wrapper error message for payload offset validation.
src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilReader.csUpdates to PascalCase header fields and adds bounds checking in RVA translation.
src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilHeader.csRenames Webcil header fields to PascalCase for consistency.
src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilConverter.csImplements 16-byte section alignment, debug directory translation, and related validations.
src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ConvertDllsToWebCil.csRenames output item list to WebcilCandidates.
src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ComputeWasmPublishAssets.csRenames task property to IsWebcilEnabled and updates usage.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/PEImageLayout.csAdds Format field to contract + helper to detect Webcil format.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Loader_1.csAdds Webcil-aware RVA-to-offset logic by reading Webcil section table from target memory.
src/mono/wasm/features.mdDocumentation update: “WebCIL” → “Webcil”.
src/mono/wasm/Wasm.Build.Tests/Common/BuildEnvironment.csRemoves CoreCLR Webcil exclusion; renames env var WasmEnableWebcil.
src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targetsRenames MSBuild properties/items/parameters from WebCilWebcil.
src/mono/cmake/options.cmakeDocumentation string update for ENABLE_WEBCIL.
src/mono/cmake/config.h.inComment update for ENABLE_WEBCIL.
src/mono/browser/debugger/BrowserDebugProxy/DebugStore.csDocumentation wording update for Webcil handling.
src/mono/browser/build/WasmApp.InTree.propsRemoves CoreCLR WasmEnableWebcil=false override.
src/coreclr/vm/peimagelayout.inlAdds decoder-dispatch forwarding methods; introduces format-agnostic header checks.
src/coreclr/vm/peimagelayout.hRefactors PEImageLayout to composition with PEDecoder/WebcilDecoder and ImageFormat discriminator.
src/coreclr/vm/peimagelayout.cppInitializes Webcil decoder on detection; updates PEDecoder init/reset call sites; DAC enumeration dispatch.
src/coreclr/vm/peimage.inlAdds PEImage::HasHeaders() helper.
src/coreclr/vm/peimage.hDeclares HasHeaders() in PEImage.
src/coreclr/vm/peimage.cppUses HasHeaders() instead of HasNTHeaders() in metadata/debug-directory paths.
src/coreclr/vm/peassembly.cppAccepts IMAGE_FILE_MACHINE_UNKNOWN for IL-only validation; guards 32-bit header check.
src/coreclr/vm/eventtrace.cppSwitches checks from NT headers to format-agnostic headers.
src/coreclr/vm/debugdebugger.cppSwitches from PEDecoder* to PEImageLayout* and uses GetDirectoryEntryData.
src/coreclr/vm/datadescriptor/datadescriptor.incAdds Format field to PEImageLayout’s cDAC data descriptor.
src/coreclr/vm/ceeload.cppUpdates IJW lookup to use PEImageLayout* (post-inheritance refactor).
src/coreclr/utilcode/webcildecoder.cppAdds CoreCLR Webcil decoding/validation implementation and DAC enumeration support.
src/coreclr/utilcode/CMakeLists.txtAdds webcildecoder.cpp to utilcode build.
src/coreclr/inc/webcildecoder.hAdds Webcil structures and WebcilDecoder API.
src/coreclr/inc/pedecoder.hMakes PEImageLayout a friend and restricts PE-internal APIs to PEImageLayout usage.
src/coreclr/clrfeatures.cmakeEnables FEATURE_WEBCIL for browser builds.
src/coreclr/clrdefinitions.cmakeAdds FEATURE_WEBCIL compile definition when enabled.
src/coreclr/binder/assemblybindercommon.cppTreats IMAGE_FILE_MACHINE_UNKNOWN as processor-agnostic MSIL in binder logic.
eng/testing/tests.browser.targetsRemoves CoreCLR WasmEnableWebcil=false override for browser tests.
docs/design/mono/webcil.mdUpdates spec text for alignment and PascalCase field names + naming consistency.

Comment threadsrc/coreclr/utilcode/webcildecoder.cpp Outdated
Comment threadsrc/coreclr/vm/peimagelayout.inl
Comment threadsrc/coreclr/utilcode/webcildecoder.cpp Outdated
Comment threadsrc/coreclr/utilcode/webcildecoder.cpp
CopilotAI review requested due to automatic review settings February 26, 2026 15:12

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 35 out of 35 changed files in this pull request and generated 4 comments.

Comments suppressed due to low confidence (1)

src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilReader.cs:354

  • New exceptions in TranslateRVA use nameof(_stream) as the parameter name. Since _stream is a private field (not a parameter), this produces a less helpful ParamName than nameof(stream) (constructor parameter) or omitting the param name entirely. Consider aligning with the earlier constructor exceptions which use nameof(stream).

Comment threadsrc/coreclr/vm/peimagelayout.inl Outdated
CopilotAI review requested due to automatic review settings February 26, 2026 15:24

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 35 out of 35 changed files in this pull request and generated 2 comments.

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 33 out of 33 changed files in this pull request and generated 6 comments.

Comments suppressed due to low confidence (1)

src/coreclr/utilcode/CMakeLists.txt:1

  • webcildecoder.cpp is added unconditionally to UTILCODE_COMMON_SOURCES. When FEATURE_WEBCIL is off this compiles an effectively empty translation unit, which is small but avoidable build work. Consider conditionally appending webcildecoder.cpp only when FEATURE_WEBCIL is enabled (or CLR_CMAKE_TARGET_BROWSER), to keep non-browser builds slightly leaner.
set(CMAKE_INCLUDE_CURRENT_DIR ON)

Comment threadsrc/coreclr/utilcode/webcildecoder.cpp
Comment threadsrc/coreclr/vm/peimagelayout.cpp
Comment threadsrc/coreclr/vm/peimagelayout.cpp
Comment threadsrc/coreclr/inc/cordecoderhelpers.h
CopilotAI review requested due to automatic review settings March 12, 2026 23:29

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 33 out of 33 changed files in this pull request and generated 3 comments.

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings March 13, 2026 00:35

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 33 out of 33 changed files in this pull request and generated 2 comments.

CopilotAI review requested due to automatic review settings March 13, 2026 01:39

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 34 out of 34 changed files in this pull request and generated 6 comments.

Comment threadsrc/native/managed/cdac/tests/LoaderTests.cs
Comment threadsrc/native/managed/cdac/tests/LoaderTests.cs
Comment threadsrc/coreclr/utilcode/webcildecoder.cpp Outdated
Comment threaddocs/design/datacontracts/Loader.md Outdated
Comment threadsrc/coreclr/utilcode/webcildecoder.cpp
@max-charlamb

Copy link
Copy Markdown
Member

Looks good to me from a cDAC perspective. Thanks for keeping the cDAC up to date 👍

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g unrelated CI failures

@pavelsavara
pavelsavara merged commit 41ac7d5 into dotnet:mainMar 13, 2026
158 of 166 checks passed
@pavelsavara
pavelsavara deleted the loading_webcil2 branch March 13, 2026 15:40
CopilotAI pushed a commit that referenced this pull request Mar 13, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 13, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-AssemblyLoader-coreclronly use for closed issuesos-browserBrowser variant of arch-wasm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@pavelsavara@max-charlamb@jkotas@adamperlin@AaronRobinsonMSFT@radekdoulik
, '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

[browser][coreCLR] Loading WebCIL - 2nd attempt - #124904

Merged
pavelsavara merged 26 commits into
dotnet:mainfrom
pavelsavara:loading_webcil2
Mar 13, 2026
Merged

[browser][coreCLR] Loading WebCIL - 2nd attempt#124904
pavelsavara merged 26 commits into
dotnet:mainfrom
pavelsavara:loading_webcil2

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Feb 26, 2026

Copy link
Copy Markdown
Member

Enable Webcil loading in CoreCLR for Browser/WASM

Summary

Adds native Webcil container format support to the CoreCLR runtime, enabling CoreCLR-on-WASM to load .wasm-wrapped assemblies directly — previously only supported by the Mono runtime. Removes the WasmEnableWebcil=false override that was forcing CoreCLR browser builds to use raw .dll files.

Changes

CoreCLR Webcil decoder (src/coreclr/)

  • New WebcilDecoder class (webcildecoder.h, webcildecoder.cpp) — standalone reader for the Webcil container format with full RVA/offset translation, COR header resolution, metadata access, section validation, IL method checking, debug directory support, and DAC enumeration.
  • FEATURE_WEBCIL cmake gate enabled for CLR_CMAKE_TARGET_BROWSER (clrfeatures.cmake, clrdefinitions.cmake).

PEImageLayout composition refactor (src/coreclr/vm/)

  • PEImageLayout no longer inherits from PEDecoder; instead holds m_peDecoder (and conditionally m_webcilDecoder) as members with an ImageFormat discriminator (FORMAT_PE/FORMAT_WEBCIL).
  • ~160 inline forwarding methods in peimagelayout.inl dispatch to the active decoder via DECODER_DISPATCH/DECODER_CHECK/PE_OR_WEBCIL macros.
  • PEDecoder public API split: methods needed by PEImageLayout forwarding stay public; PE-internal helpers (GetHeaders, GetDirectoryEntry, CheckDirectoryEntry, relocation/TLS/strong-name internals, etc.) moved to a private section accessible only via friend class PEImageLayout.
  • FlatImageLayout constructor detects Webcil magic and initializes both decoders (Webcil for format operations, PE decoder for base/size/flags used by cDAC).
  • New HasHeaders() abstraction on PEImageLayout and PEImage — returns HasWebcilHeaders() or HasNTHeaders() depending on format. Callers in peassembly.cpp, peimage.cpp, eventtrace.cpp updated from HasNTHeaders() to HasHeaders().
  • debugdebugger.cpp: switched from PEDecoder* to PEImageLayout* and uses format-agnostic GetDirectoryEntryData instead of raw GetDirectoryEntry+GetDirectoryData.
  • ceeload.cpp: same PEDecoder*PEImageLayout* fix for IJW host lookup.
  • peassembly.cpp: accept IMAGE_FILE_MACHINE_UNKNOWN (Webcil machine type) for IL-only validation; guard 32-bit NT header check with HasNTHeaders().
  • assemblybindercommon.cpp: treat IMAGE_FILE_MACHINE_UNKNOWN as processor-agnostic MSIL.

cDAC diagnostics (src/native/managed/cdac/)

  • PEImageLayout data descriptor gains Format field (datadescriptor.inc, PEImageLayout.cs).
  • Loader_1.cs: Webcil-aware RvaToOffset path that reads the Webcil section table directly from the target memory when IsWebcilFormat is set.

Build/infrastructure

  • Removed WasmEnableWebcil=false from CoreCLR browser build properties (WasmApp.InTree.props, tests.browser.targets).
  • MSBuild task renames: WebCilCandidatesWebcilCandidates, IsWebCilEnabledIsWebcilEnabled, _WasmBuildWebCilPath_WasmBuildWebcilPath and related properties.
  • Test infrastructure: BuildEnvironment.cs removes CoreCLR Webcil exclusion; env var WasmEnableWebCilWasmEnableWebcil.

@pavelsavarapavelsavara added this to the 11.0.0 milestone Feb 26, 2026
@pavelsavarapavelsavara self-assigned this Feb 26, 2026
CopilotAI review requested due to automatic review settings February 26, 2026 14:56
@pavelsavarapavelsavara added arch-wasm WebAssembly architecture area-AssemblyLoader-coreclr only use for closed issues os-browser Browser variant of arch-wasm labels Feb 26, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @elinor-fung
See info in area-owners.md if you want to be subscribed.

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

Enables CoreCLR-on-Browser/WASM to load assemblies packaged in the Webcil container format (i.e., .wasm-wrapped assemblies), aligning CoreCLR behavior with existing Mono Webcil support and removing prior build/test overrides that forced raw .dll usage.

Changes:

  • Adds CoreCLR-side Webcil decoding and wires it into PEImageLayout via format-dispatched forwarding to either PEDecoder (PE) or WebcilDecoder (Webcil).
  • Updates the Webcil tooling pipeline (converter/reader/wrapper + MSBuild tasks/targets) including 16-byte section alignment and property renames (WebCil*Webcil*).
  • Extends cDAC contracts/readers and WASM test infrastructure to understand and exercise Webcil images.

Reviewed changes

Copilot reviewed 35 out of 35 changed files in this pull request and generated 6 comments.

Show a summary per file
FileDescription
src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilWasmWrapper.csImproves wrapper error message for payload offset validation.
src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilReader.csUpdates to PascalCase header fields and adds bounds checking in RVA translation.
src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilHeader.csRenames Webcil header fields to PascalCase for consistency.
src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilConverter.csImplements 16-byte section alignment, debug directory translation, and related validations.
src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ConvertDllsToWebCil.csRenames output item list to WebcilCandidates.
src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ComputeWasmPublishAssets.csRenames task property to IsWebcilEnabled and updates usage.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/PEImageLayout.csAdds Format field to contract + helper to detect Webcil format.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Loader_1.csAdds Webcil-aware RVA-to-offset logic by reading Webcil section table from target memory.
src/mono/wasm/features.mdDocumentation update: “WebCIL” → “Webcil”.
src/mono/wasm/Wasm.Build.Tests/Common/BuildEnvironment.csRemoves CoreCLR Webcil exclusion; renames env var WasmEnableWebcil.
src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targetsRenames MSBuild properties/items/parameters from WebCilWebcil.
src/mono/cmake/options.cmakeDocumentation string update for ENABLE_WEBCIL.
src/mono/cmake/config.h.inComment update for ENABLE_WEBCIL.
src/mono/browser/debugger/BrowserDebugProxy/DebugStore.csDocumentation wording update for Webcil handling.
src/mono/browser/build/WasmApp.InTree.propsRemoves CoreCLR WasmEnableWebcil=false override.
src/coreclr/vm/peimagelayout.inlAdds decoder-dispatch forwarding methods; introduces format-agnostic header checks.
src/coreclr/vm/peimagelayout.hRefactors PEImageLayout to composition with PEDecoder/WebcilDecoder and ImageFormat discriminator.
src/coreclr/vm/peimagelayout.cppInitializes Webcil decoder on detection; updates PEDecoder init/reset call sites; DAC enumeration dispatch.
src/coreclr/vm/peimage.inlAdds PEImage::HasHeaders() helper.
src/coreclr/vm/peimage.hDeclares HasHeaders() in PEImage.
src/coreclr/vm/peimage.cppUses HasHeaders() instead of HasNTHeaders() in metadata/debug-directory paths.
src/coreclr/vm/peassembly.cppAccepts IMAGE_FILE_MACHINE_UNKNOWN for IL-only validation; guards 32-bit header check.
src/coreclr/vm/eventtrace.cppSwitches checks from NT headers to format-agnostic headers.
src/coreclr/vm/debugdebugger.cppSwitches from PEDecoder* to PEImageLayout* and uses GetDirectoryEntryData.
src/coreclr/vm/datadescriptor/datadescriptor.incAdds Format field to PEImageLayout’s cDAC data descriptor.
src/coreclr/vm/ceeload.cppUpdates IJW lookup to use PEImageLayout* (post-inheritance refactor).
src/coreclr/utilcode/webcildecoder.cppAdds CoreCLR Webcil decoding/validation implementation and DAC enumeration support.
src/coreclr/utilcode/CMakeLists.txtAdds webcildecoder.cpp to utilcode build.
src/coreclr/inc/webcildecoder.hAdds Webcil structures and WebcilDecoder API.
src/coreclr/inc/pedecoder.hMakes PEImageLayout a friend and restricts PE-internal APIs to PEImageLayout usage.
src/coreclr/clrfeatures.cmakeEnables FEATURE_WEBCIL for browser builds.
src/coreclr/clrdefinitions.cmakeAdds FEATURE_WEBCIL compile definition when enabled.
src/coreclr/binder/assemblybindercommon.cppTreats IMAGE_FILE_MACHINE_UNKNOWN as processor-agnostic MSIL in binder logic.
eng/testing/tests.browser.targetsRemoves CoreCLR WasmEnableWebcil=false override for browser tests.
docs/design/mono/webcil.mdUpdates spec text for alignment and PascalCase field names + naming consistency.

Comment threadsrc/coreclr/utilcode/webcildecoder.cpp Outdated
Comment threadsrc/coreclr/vm/peimagelayout.inl
Comment threadsrc/coreclr/utilcode/webcildecoder.cpp Outdated
Comment threadsrc/coreclr/utilcode/webcildecoder.cpp
CopilotAI review requested due to automatic review settings February 26, 2026 15:12

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 35 out of 35 changed files in this pull request and generated 4 comments.

Comments suppressed due to low confidence (1)

src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilReader.cs:354

  • New exceptions in TranslateRVA use nameof(_stream) as the parameter name. Since _stream is a private field (not a parameter), this produces a less helpful ParamName than nameof(stream) (constructor parameter) or omitting the param name entirely. Consider aligning with the earlier constructor exceptions which use nameof(stream).

Comment threadsrc/coreclr/vm/peimagelayout.inl Outdated
CopilotAI review requested due to automatic review settings February 26, 2026 15:24

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 35 out of 35 changed files in this pull request and generated 2 comments.

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 33 out of 33 changed files in this pull request and generated 6 comments.

Comments suppressed due to low confidence (1)

src/coreclr/utilcode/CMakeLists.txt:1

  • webcildecoder.cpp is added unconditionally to UTILCODE_COMMON_SOURCES. When FEATURE_WEBCIL is off this compiles an effectively empty translation unit, which is small but avoidable build work. Consider conditionally appending webcildecoder.cpp only when FEATURE_WEBCIL is enabled (or CLR_CMAKE_TARGET_BROWSER), to keep non-browser builds slightly leaner.
set(CMAKE_INCLUDE_CURRENT_DIR ON)

Comment threadsrc/coreclr/utilcode/webcildecoder.cpp
Comment threadsrc/coreclr/vm/peimagelayout.cpp
Comment threadsrc/coreclr/vm/peimagelayout.cpp
Comment threadsrc/coreclr/inc/cordecoderhelpers.h
CopilotAI review requested due to automatic review settings March 12, 2026 23:29

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 33 out of 33 changed files in this pull request and generated 3 comments.

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings March 13, 2026 00:35

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 33 out of 33 changed files in this pull request and generated 2 comments.

CopilotAI review requested due to automatic review settings March 13, 2026 01:39

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 34 out of 34 changed files in this pull request and generated 6 comments.

Comment threadsrc/native/managed/cdac/tests/LoaderTests.cs
Comment threadsrc/native/managed/cdac/tests/LoaderTests.cs
Comment threadsrc/coreclr/utilcode/webcildecoder.cpp Outdated
Comment threaddocs/design/datacontracts/Loader.md Outdated
Comment threadsrc/coreclr/utilcode/webcildecoder.cpp
@max-charlamb

Copy link
Copy Markdown
Member

Looks good to me from a cDAC perspective. Thanks for keeping the cDAC up to date 👍

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g unrelated CI failures

@pavelsavara
pavelsavara merged commit 41ac7d5 into dotnet:mainMar 13, 2026
158 of 166 checks passed
@pavelsavara
pavelsavara deleted the loading_webcil2 branch March 13, 2026 15:40
CopilotAI pushed a commit that referenced this pull request Mar 13, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 13, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-AssemblyLoader-coreclronly use for closed issuesos-browserBrowser variant of arch-wasm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@pavelsavara@max-charlamb@jkotas@adamperlin@AaronRobinsonMSFT@radekdoulik
, '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

[browser][coreCLR] Loading WebCIL - 2nd attempt - #124904

Merged
pavelsavara merged 26 commits into
dotnet:mainfrom
pavelsavara:loading_webcil2
Mar 13, 2026
Merged

[browser][coreCLR] Loading WebCIL - 2nd attempt#124904
pavelsavara merged 26 commits into
dotnet:mainfrom
pavelsavara:loading_webcil2

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Feb 26, 2026

Copy link
Copy Markdown
Member

Enable Webcil loading in CoreCLR for Browser/WASM

Summary

Adds native Webcil container format support to the CoreCLR runtime, enabling CoreCLR-on-WASM to load .wasm-wrapped assemblies directly — previously only supported by the Mono runtime. Removes the WasmEnableWebcil=false override that was forcing CoreCLR browser builds to use raw .dll files.

Changes

CoreCLR Webcil decoder (src/coreclr/)

  • New WebcilDecoder class (webcildecoder.h, webcildecoder.cpp) — standalone reader for the Webcil container format with full RVA/offset translation, COR header resolution, metadata access, section validation, IL method checking, debug directory support, and DAC enumeration.
  • FEATURE_WEBCIL cmake gate enabled for CLR_CMAKE_TARGET_BROWSER (clrfeatures.cmake, clrdefinitions.cmake).

PEImageLayout composition refactor (src/coreclr/vm/)

  • PEImageLayout no longer inherits from PEDecoder; instead holds m_peDecoder (and conditionally m_webcilDecoder) as members with an ImageFormat discriminator (FORMAT_PE/FORMAT_WEBCIL).
  • ~160 inline forwarding methods in peimagelayout.inl dispatch to the active decoder via DECODER_DISPATCH/DECODER_CHECK/PE_OR_WEBCIL macros.
  • PEDecoder public API split: methods needed by PEImageLayout forwarding stay public; PE-internal helpers (GetHeaders, GetDirectoryEntry, CheckDirectoryEntry, relocation/TLS/strong-name internals, etc.) moved to a private section accessible only via friend class PEImageLayout.
  • FlatImageLayout constructor detects Webcil magic and initializes both decoders (Webcil for format operations, PE decoder for base/size/flags used by cDAC).
  • New HasHeaders() abstraction on PEImageLayout and PEImage — returns HasWebcilHeaders() or HasNTHeaders() depending on format. Callers in peassembly.cpp, peimage.cpp, eventtrace.cpp updated from HasNTHeaders() to HasHeaders().
  • debugdebugger.cpp: switched from PEDecoder* to PEImageLayout* and uses format-agnostic GetDirectoryEntryData instead of raw GetDirectoryEntry+GetDirectoryData.
  • ceeload.cpp: same PEDecoder*PEImageLayout* fix for IJW host lookup.
  • peassembly.cpp: accept IMAGE_FILE_MACHINE_UNKNOWN (Webcil machine type) for IL-only validation; guard 32-bit NT header check with HasNTHeaders().
  • assemblybindercommon.cpp: treat IMAGE_FILE_MACHINE_UNKNOWN as processor-agnostic MSIL.

cDAC diagnostics (src/native/managed/cdac/)

  • PEImageLayout data descriptor gains Format field (datadescriptor.inc, PEImageLayout.cs).
  • Loader_1.cs: Webcil-aware RvaToOffset path that reads the Webcil section table directly from the target memory when IsWebcilFormat is set.

Build/infrastructure

  • Removed WasmEnableWebcil=false from CoreCLR browser build properties (WasmApp.InTree.props, tests.browser.targets).
  • MSBuild task renames: WebCilCandidatesWebcilCandidates, IsWebCilEnabledIsWebcilEnabled, _WasmBuildWebCilPath_WasmBuildWebcilPath and related properties.
  • Test infrastructure: BuildEnvironment.cs removes CoreCLR Webcil exclusion; env var WasmEnableWebCilWasmEnableWebcil.

@pavelsavarapavelsavara added this to the 11.0.0 milestone Feb 26, 2026
@pavelsavarapavelsavara self-assigned this Feb 26, 2026
CopilotAI review requested due to automatic review settings February 26, 2026 14:56
@pavelsavarapavelsavara added arch-wasm WebAssembly architecture area-AssemblyLoader-coreclr only use for closed issues os-browser Browser variant of arch-wasm labels Feb 26, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @elinor-fung
See info in area-owners.md if you want to be subscribed.

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

Enables CoreCLR-on-Browser/WASM to load assemblies packaged in the Webcil container format (i.e., .wasm-wrapped assemblies), aligning CoreCLR behavior with existing Mono Webcil support and removing prior build/test overrides that forced raw .dll usage.

Changes:

  • Adds CoreCLR-side Webcil decoding and wires it into PEImageLayout via format-dispatched forwarding to either PEDecoder (PE) or WebcilDecoder (Webcil).
  • Updates the Webcil tooling pipeline (converter/reader/wrapper + MSBuild tasks/targets) including 16-byte section alignment and property renames (WebCil*Webcil*).
  • Extends cDAC contracts/readers and WASM test infrastructure to understand and exercise Webcil images.

Reviewed changes

Copilot reviewed 35 out of 35 changed files in this pull request and generated 6 comments.

Show a summary per file
FileDescription
src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilWasmWrapper.csImproves wrapper error message for payload offset validation.
src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilReader.csUpdates to PascalCase header fields and adds bounds checking in RVA translation.
src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilHeader.csRenames Webcil header fields to PascalCase for consistency.
src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilConverter.csImplements 16-byte section alignment, debug directory translation, and related validations.
src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ConvertDllsToWebCil.csRenames output item list to WebcilCandidates.
src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ComputeWasmPublishAssets.csRenames task property to IsWebcilEnabled and updates usage.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/PEImageLayout.csAdds Format field to contract + helper to detect Webcil format.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Loader_1.csAdds Webcil-aware RVA-to-offset logic by reading Webcil section table from target memory.
src/mono/wasm/features.mdDocumentation update: “WebCIL” → “Webcil”.
src/mono/wasm/Wasm.Build.Tests/Common/BuildEnvironment.csRemoves CoreCLR Webcil exclusion; renames env var WasmEnableWebcil.
src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targetsRenames MSBuild properties/items/parameters from WebCilWebcil.
src/mono/cmake/options.cmakeDocumentation string update for ENABLE_WEBCIL.
src/mono/cmake/config.h.inComment update for ENABLE_WEBCIL.
src/mono/browser/debugger/BrowserDebugProxy/DebugStore.csDocumentation wording update for Webcil handling.
src/mono/browser/build/WasmApp.InTree.propsRemoves CoreCLR WasmEnableWebcil=false override.
src/coreclr/vm/peimagelayout.inlAdds decoder-dispatch forwarding methods; introduces format-agnostic header checks.
src/coreclr/vm/peimagelayout.hRefactors PEImageLayout to composition with PEDecoder/WebcilDecoder and ImageFormat discriminator.
src/coreclr/vm/peimagelayout.cppInitializes Webcil decoder on detection; updates PEDecoder init/reset call sites; DAC enumeration dispatch.
src/coreclr/vm/peimage.inlAdds PEImage::HasHeaders() helper.
src/coreclr/vm/peimage.hDeclares HasHeaders() in PEImage.
src/coreclr/vm/peimage.cppUses HasHeaders() instead of HasNTHeaders() in metadata/debug-directory paths.
src/coreclr/vm/peassembly.cppAccepts IMAGE_FILE_MACHINE_UNKNOWN for IL-only validation; guards 32-bit header check.
src/coreclr/vm/eventtrace.cppSwitches checks from NT headers to format-agnostic headers.
src/coreclr/vm/debugdebugger.cppSwitches from PEDecoder* to PEImageLayout* and uses GetDirectoryEntryData.
src/coreclr/vm/datadescriptor/datadescriptor.incAdds Format field to PEImageLayout’s cDAC data descriptor.
src/coreclr/vm/ceeload.cppUpdates IJW lookup to use PEImageLayout* (post-inheritance refactor).
src/coreclr/utilcode/webcildecoder.cppAdds CoreCLR Webcil decoding/validation implementation and DAC enumeration support.
src/coreclr/utilcode/CMakeLists.txtAdds webcildecoder.cpp to utilcode build.
src/coreclr/inc/webcildecoder.hAdds Webcil structures and WebcilDecoder API.
src/coreclr/inc/pedecoder.hMakes PEImageLayout a friend and restricts PE-internal APIs to PEImageLayout usage.
src/coreclr/clrfeatures.cmakeEnables FEATURE_WEBCIL for browser builds.
src/coreclr/clrdefinitions.cmakeAdds FEATURE_WEBCIL compile definition when enabled.
src/coreclr/binder/assemblybindercommon.cppTreats IMAGE_FILE_MACHINE_UNKNOWN as processor-agnostic MSIL in binder logic.
eng/testing/tests.browser.targetsRemoves CoreCLR WasmEnableWebcil=false override for browser tests.
docs/design/mono/webcil.mdUpdates spec text for alignment and PascalCase field names + naming consistency.

Comment threadsrc/coreclr/utilcode/webcildecoder.cpp Outdated
Comment threadsrc/coreclr/vm/peimagelayout.inl
Comment threadsrc/coreclr/utilcode/webcildecoder.cpp Outdated
Comment threadsrc/coreclr/utilcode/webcildecoder.cpp
CopilotAI review requested due to automatic review settings February 26, 2026 15:12

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 35 out of 35 changed files in this pull request and generated 4 comments.

Comments suppressed due to low confidence (1)

src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilReader.cs:354

  • New exceptions in TranslateRVA use nameof(_stream) as the parameter name. Since _stream is a private field (not a parameter), this produces a less helpful ParamName than nameof(stream) (constructor parameter) or omitting the param name entirely. Consider aligning with the earlier constructor exceptions which use nameof(stream).

Comment threadsrc/coreclr/vm/peimagelayout.inl Outdated
CopilotAI review requested due to automatic review settings February 26, 2026 15:24

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 35 out of 35 changed files in this pull request and generated 2 comments.

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 33 out of 33 changed files in this pull request and generated 6 comments.

Comments suppressed due to low confidence (1)

src/coreclr/utilcode/CMakeLists.txt:1

  • webcildecoder.cpp is added unconditionally to UTILCODE_COMMON_SOURCES. When FEATURE_WEBCIL is off this compiles an effectively empty translation unit, which is small but avoidable build work. Consider conditionally appending webcildecoder.cpp only when FEATURE_WEBCIL is enabled (or CLR_CMAKE_TARGET_BROWSER), to keep non-browser builds slightly leaner.
set(CMAKE_INCLUDE_CURRENT_DIR ON)

Comment threadsrc/coreclr/utilcode/webcildecoder.cpp
Comment threadsrc/coreclr/vm/peimagelayout.cpp
Comment threadsrc/coreclr/vm/peimagelayout.cpp
Comment threadsrc/coreclr/inc/cordecoderhelpers.h
CopilotAI review requested due to automatic review settings March 12, 2026 23:29

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 33 out of 33 changed files in this pull request and generated 3 comments.

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings March 13, 2026 00:35

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 33 out of 33 changed files in this pull request and generated 2 comments.

CopilotAI review requested due to automatic review settings March 13, 2026 01:39

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 34 out of 34 changed files in this pull request and generated 6 comments.

Comment threadsrc/native/managed/cdac/tests/LoaderTests.cs
Comment threadsrc/native/managed/cdac/tests/LoaderTests.cs
Comment threadsrc/coreclr/utilcode/webcildecoder.cpp Outdated
Comment threaddocs/design/datacontracts/Loader.md Outdated
Comment threadsrc/coreclr/utilcode/webcildecoder.cpp
@max-charlamb

Copy link
Copy Markdown
Member

Looks good to me from a cDAC perspective. Thanks for keeping the cDAC up to date 👍

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g unrelated CI failures

@pavelsavara
pavelsavara merged commit 41ac7d5 into dotnet:mainMar 13, 2026
158 of 166 checks passed
@pavelsavara
pavelsavara deleted the loading_webcil2 branch March 13, 2026 15:40
CopilotAI pushed a commit that referenced this pull request Mar 13, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 13, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-AssemblyLoader-coreclronly use for closed issuesos-browserBrowser variant of arch-wasm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@pavelsavara@max-charlamb@jkotas@adamperlin@AaronRobinsonMSFT@radekdoulik
, '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

[browser][coreCLR] Loading WebCIL - 2nd attempt - #124904

Merged
pavelsavara merged 26 commits into
dotnet:mainfrom
pavelsavara:loading_webcil2
Mar 13, 2026
Merged

[browser][coreCLR] Loading WebCIL - 2nd attempt#124904
pavelsavara merged 26 commits into
dotnet:mainfrom
pavelsavara:loading_webcil2

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Feb 26, 2026

Copy link
Copy Markdown
Member

Enable Webcil loading in CoreCLR for Browser/WASM

Summary

Adds native Webcil container format support to the CoreCLR runtime, enabling CoreCLR-on-WASM to load .wasm-wrapped assemblies directly — previously only supported by the Mono runtime. Removes the WasmEnableWebcil=false override that was forcing CoreCLR browser builds to use raw .dll files.

Changes

CoreCLR Webcil decoder (src/coreclr/)

  • New WebcilDecoder class (webcildecoder.h, webcildecoder.cpp) — standalone reader for the Webcil container format with full RVA/offset translation, COR header resolution, metadata access, section validation, IL method checking, debug directory support, and DAC enumeration.
  • FEATURE_WEBCIL cmake gate enabled for CLR_CMAKE_TARGET_BROWSER (clrfeatures.cmake, clrdefinitions.cmake).

PEImageLayout composition refactor (src/coreclr/vm/)

  • PEImageLayout no longer inherits from PEDecoder; instead holds m_peDecoder (and conditionally m_webcilDecoder) as members with an ImageFormat discriminator (FORMAT_PE/FORMAT_WEBCIL).
  • ~160 inline forwarding methods in peimagelayout.inl dispatch to the active decoder via DECODER_DISPATCH/DECODER_CHECK/PE_OR_WEBCIL macros.
  • PEDecoder public API split: methods needed by PEImageLayout forwarding stay public; PE-internal helpers (GetHeaders, GetDirectoryEntry, CheckDirectoryEntry, relocation/TLS/strong-name internals, etc.) moved to a private section accessible only via friend class PEImageLayout.
  • FlatImageLayout constructor detects Webcil magic and initializes both decoders (Webcil for format operations, PE decoder for base/size/flags used by cDAC).
  • New HasHeaders() abstraction on PEImageLayout and PEImage — returns HasWebcilHeaders() or HasNTHeaders() depending on format. Callers in peassembly.cpp, peimage.cpp, eventtrace.cpp updated from HasNTHeaders() to HasHeaders().
  • debugdebugger.cpp: switched from PEDecoder* to PEImageLayout* and uses format-agnostic GetDirectoryEntryData instead of raw GetDirectoryEntry+GetDirectoryData.
  • ceeload.cpp: same PEDecoder*PEImageLayout* fix for IJW host lookup.
  • peassembly.cpp: accept IMAGE_FILE_MACHINE_UNKNOWN (Webcil machine type) for IL-only validation; guard 32-bit NT header check with HasNTHeaders().
  • assemblybindercommon.cpp: treat IMAGE_FILE_MACHINE_UNKNOWN as processor-agnostic MSIL.

cDAC diagnostics (src/native/managed/cdac/)

  • PEImageLayout data descriptor gains Format field (datadescriptor.inc, PEImageLayout.cs).
  • Loader_1.cs: Webcil-aware RvaToOffset path that reads the Webcil section table directly from the target memory when IsWebcilFormat is set.

Build/infrastructure

  • Removed WasmEnableWebcil=false from CoreCLR browser build properties (WasmApp.InTree.props, tests.browser.targets).
  • MSBuild task renames: WebCilCandidatesWebcilCandidates, IsWebCilEnabledIsWebcilEnabled, _WasmBuildWebCilPath_WasmBuildWebcilPath and related properties.
  • Test infrastructure: BuildEnvironment.cs removes CoreCLR Webcil exclusion; env var WasmEnableWebCilWasmEnableWebcil.

@pavelsavarapavelsavara added this to the 11.0.0 milestone Feb 26, 2026
@pavelsavarapavelsavara self-assigned this Feb 26, 2026
CopilotAI review requested due to automatic review settings February 26, 2026 14:56
@pavelsavarapavelsavara added arch-wasm WebAssembly architecture area-AssemblyLoader-coreclr only use for closed issues os-browser Browser variant of arch-wasm labels Feb 26, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @elinor-fung
See info in area-owners.md if you want to be subscribed.

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

Enables CoreCLR-on-Browser/WASM to load assemblies packaged in the Webcil container format (i.e., .wasm-wrapped assemblies), aligning CoreCLR behavior with existing Mono Webcil support and removing prior build/test overrides that forced raw .dll usage.

Changes:

  • Adds CoreCLR-side Webcil decoding and wires it into PEImageLayout via format-dispatched forwarding to either PEDecoder (PE) or WebcilDecoder (Webcil).
  • Updates the Webcil tooling pipeline (converter/reader/wrapper + MSBuild tasks/targets) including 16-byte section alignment and property renames (WebCil*Webcil*).
  • Extends cDAC contracts/readers and WASM test infrastructure to understand and exercise Webcil images.

Reviewed changes

Copilot reviewed 35 out of 35 changed files in this pull request and generated 6 comments.

Show a summary per file
FileDescription
src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilWasmWrapper.csImproves wrapper error message for payload offset validation.
src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilReader.csUpdates to PascalCase header fields and adds bounds checking in RVA translation.
src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilHeader.csRenames Webcil header fields to PascalCase for consistency.
src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilConverter.csImplements 16-byte section alignment, debug directory translation, and related validations.
src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ConvertDllsToWebCil.csRenames output item list to WebcilCandidates.
src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ComputeWasmPublishAssets.csRenames task property to IsWebcilEnabled and updates usage.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/PEImageLayout.csAdds Format field to contract + helper to detect Webcil format.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Loader_1.csAdds Webcil-aware RVA-to-offset logic by reading Webcil section table from target memory.
src/mono/wasm/features.mdDocumentation update: “WebCIL” → “Webcil”.
src/mono/wasm/Wasm.Build.Tests/Common/BuildEnvironment.csRemoves CoreCLR Webcil exclusion; renames env var WasmEnableWebcil.
src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targetsRenames MSBuild properties/items/parameters from WebCilWebcil.
src/mono/cmake/options.cmakeDocumentation string update for ENABLE_WEBCIL.
src/mono/cmake/config.h.inComment update for ENABLE_WEBCIL.
src/mono/browser/debugger/BrowserDebugProxy/DebugStore.csDocumentation wording update for Webcil handling.
src/mono/browser/build/WasmApp.InTree.propsRemoves CoreCLR WasmEnableWebcil=false override.
src/coreclr/vm/peimagelayout.inlAdds decoder-dispatch forwarding methods; introduces format-agnostic header checks.
src/coreclr/vm/peimagelayout.hRefactors PEImageLayout to composition with PEDecoder/WebcilDecoder and ImageFormat discriminator.
src/coreclr/vm/peimagelayout.cppInitializes Webcil decoder on detection; updates PEDecoder init/reset call sites; DAC enumeration dispatch.
src/coreclr/vm/peimage.inlAdds PEImage::HasHeaders() helper.
src/coreclr/vm/peimage.hDeclares HasHeaders() in PEImage.
src/coreclr/vm/peimage.cppUses HasHeaders() instead of HasNTHeaders() in metadata/debug-directory paths.
src/coreclr/vm/peassembly.cppAccepts IMAGE_FILE_MACHINE_UNKNOWN for IL-only validation; guards 32-bit header check.
src/coreclr/vm/eventtrace.cppSwitches checks from NT headers to format-agnostic headers.
src/coreclr/vm/debugdebugger.cppSwitches from PEDecoder* to PEImageLayout* and uses GetDirectoryEntryData.
src/coreclr/vm/datadescriptor/datadescriptor.incAdds Format field to PEImageLayout’s cDAC data descriptor.
src/coreclr/vm/ceeload.cppUpdates IJW lookup to use PEImageLayout* (post-inheritance refactor).
src/coreclr/utilcode/webcildecoder.cppAdds CoreCLR Webcil decoding/validation implementation and DAC enumeration support.
src/coreclr/utilcode/CMakeLists.txtAdds webcildecoder.cpp to utilcode build.
src/coreclr/inc/webcildecoder.hAdds Webcil structures and WebcilDecoder API.
src/coreclr/inc/pedecoder.hMakes PEImageLayout a friend and restricts PE-internal APIs to PEImageLayout usage.
src/coreclr/clrfeatures.cmakeEnables FEATURE_WEBCIL for browser builds.
src/coreclr/clrdefinitions.cmakeAdds FEATURE_WEBCIL compile definition when enabled.
src/coreclr/binder/assemblybindercommon.cppTreats IMAGE_FILE_MACHINE_UNKNOWN as processor-agnostic MSIL in binder logic.
eng/testing/tests.browser.targetsRemoves CoreCLR WasmEnableWebcil=false override for browser tests.
docs/design/mono/webcil.mdUpdates spec text for alignment and PascalCase field names + naming consistency.

Comment threadsrc/coreclr/utilcode/webcildecoder.cpp Outdated
Comment threadsrc/coreclr/vm/peimagelayout.inl
Comment threadsrc/coreclr/utilcode/webcildecoder.cpp Outdated
Comment threadsrc/coreclr/utilcode/webcildecoder.cpp
CopilotAI review requested due to automatic review settings February 26, 2026 15:12

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 35 out of 35 changed files in this pull request and generated 4 comments.

Comments suppressed due to low confidence (1)

src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilReader.cs:354

  • New exceptions in TranslateRVA use nameof(_stream) as the parameter name. Since _stream is a private field (not a parameter), this produces a less helpful ParamName than nameof(stream) (constructor parameter) or omitting the param name entirely. Consider aligning with the earlier constructor exceptions which use nameof(stream).

Comment threadsrc/coreclr/vm/peimagelayout.inl Outdated
CopilotAI review requested due to automatic review settings February 26, 2026 15:24

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 35 out of 35 changed files in this pull request and generated 2 comments.

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 33 out of 33 changed files in this pull request and generated 6 comments.

Comments suppressed due to low confidence (1)

src/coreclr/utilcode/CMakeLists.txt:1

  • webcildecoder.cpp is added unconditionally to UTILCODE_COMMON_SOURCES. When FEATURE_WEBCIL is off this compiles an effectively empty translation unit, which is small but avoidable build work. Consider conditionally appending webcildecoder.cpp only when FEATURE_WEBCIL is enabled (or CLR_CMAKE_TARGET_BROWSER), to keep non-browser builds slightly leaner.
set(CMAKE_INCLUDE_CURRENT_DIR ON)

Comment threadsrc/coreclr/utilcode/webcildecoder.cpp
Comment threadsrc/coreclr/vm/peimagelayout.cpp
Comment threadsrc/coreclr/vm/peimagelayout.cpp
Comment threadsrc/coreclr/inc/cordecoderhelpers.h
CopilotAI review requested due to automatic review settings March 12, 2026 23:29

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 33 out of 33 changed files in this pull request and generated 3 comments.

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings March 13, 2026 00:35

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 33 out of 33 changed files in this pull request and generated 2 comments.

CopilotAI review requested due to automatic review settings March 13, 2026 01:39

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 34 out of 34 changed files in this pull request and generated 6 comments.

Comment threadsrc/native/managed/cdac/tests/LoaderTests.cs
Comment threadsrc/native/managed/cdac/tests/LoaderTests.cs
Comment threadsrc/coreclr/utilcode/webcildecoder.cpp Outdated
Comment threaddocs/design/datacontracts/Loader.md Outdated
Comment threadsrc/coreclr/utilcode/webcildecoder.cpp
@max-charlamb

Copy link
Copy Markdown
Member

Looks good to me from a cDAC perspective. Thanks for keeping the cDAC up to date 👍

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g unrelated CI failures

@pavelsavara
pavelsavara merged commit 41ac7d5 into dotnet:mainMar 13, 2026
158 of 166 checks passed
@pavelsavara
pavelsavara deleted the loading_webcil2 branch March 13, 2026 15:40
CopilotAI pushed a commit that referenced this pull request Mar 13, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 13, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-AssemblyLoader-coreclronly use for closed issuesos-browserBrowser variant of arch-wasm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@pavelsavara@max-charlamb@jkotas@adamperlin@AaronRobinsonMSFT@radekdoulik
, '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

[browser][coreCLR] Loading WebCIL - 2nd attempt - #124904

Merged
pavelsavara merged 26 commits into
dotnet:mainfrom
pavelsavara:loading_webcil2
Mar 13, 2026
Merged

[browser][coreCLR] Loading WebCIL - 2nd attempt#124904
pavelsavara merged 26 commits into
dotnet:mainfrom
pavelsavara:loading_webcil2

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Feb 26, 2026

Copy link
Copy Markdown
Member

Enable Webcil loading in CoreCLR for Browser/WASM

Summary

Adds native Webcil container format support to the CoreCLR runtime, enabling CoreCLR-on-WASM to load .wasm-wrapped assemblies directly — previously only supported by the Mono runtime. Removes the WasmEnableWebcil=false override that was forcing CoreCLR browser builds to use raw .dll files.

Changes

CoreCLR Webcil decoder (src/coreclr/)

  • New WebcilDecoder class (webcildecoder.h, webcildecoder.cpp) — standalone reader for the Webcil container format with full RVA/offset translation, COR header resolution, metadata access, section validation, IL method checking, debug directory support, and DAC enumeration.
  • FEATURE_WEBCIL cmake gate enabled for CLR_CMAKE_TARGET_BROWSER (clrfeatures.cmake, clrdefinitions.cmake).

PEImageLayout composition refactor (src/coreclr/vm/)

  • PEImageLayout no longer inherits from PEDecoder; instead holds m_peDecoder (and conditionally m_webcilDecoder) as members with an ImageFormat discriminator (FORMAT_PE/FORMAT_WEBCIL).
  • ~160 inline forwarding methods in peimagelayout.inl dispatch to the active decoder via DECODER_DISPATCH/DECODER_CHECK/PE_OR_WEBCIL macros.
  • PEDecoder public API split: methods needed by PEImageLayout forwarding stay public; PE-internal helpers (GetHeaders, GetDirectoryEntry, CheckDirectoryEntry, relocation/TLS/strong-name internals, etc.) moved to a private section accessible only via friend class PEImageLayout.
  • FlatImageLayout constructor detects Webcil magic and initializes both decoders (Webcil for format operations, PE decoder for base/size/flags used by cDAC).
  • New HasHeaders() abstraction on PEImageLayout and PEImage — returns HasWebcilHeaders() or HasNTHeaders() depending on format. Callers in peassembly.cpp, peimage.cpp, eventtrace.cpp updated from HasNTHeaders() to HasHeaders().
  • debugdebugger.cpp: switched from PEDecoder* to PEImageLayout* and uses format-agnostic GetDirectoryEntryData instead of raw GetDirectoryEntry+GetDirectoryData.
  • ceeload.cpp: same PEDecoder*PEImageLayout* fix for IJW host lookup.
  • peassembly.cpp: accept IMAGE_FILE_MACHINE_UNKNOWN (Webcil machine type) for IL-only validation; guard 32-bit NT header check with HasNTHeaders().
  • assemblybindercommon.cpp: treat IMAGE_FILE_MACHINE_UNKNOWN as processor-agnostic MSIL.

cDAC diagnostics (src/native/managed/cdac/)

  • PEImageLayout data descriptor gains Format field (datadescriptor.inc, PEImageLayout.cs).
  • Loader_1.cs: Webcil-aware RvaToOffset path that reads the Webcil section table directly from the target memory when IsWebcilFormat is set.

Build/infrastructure

  • Removed WasmEnableWebcil=false from CoreCLR browser build properties (WasmApp.InTree.props, tests.browser.targets).
  • MSBuild task renames: WebCilCandidatesWebcilCandidates, IsWebCilEnabledIsWebcilEnabled, _WasmBuildWebCilPath_WasmBuildWebcilPath and related properties.
  • Test infrastructure: BuildEnvironment.cs removes CoreCLR Webcil exclusion; env var WasmEnableWebCilWasmEnableWebcil.

@pavelsavarapavelsavara added this to the 11.0.0 milestone Feb 26, 2026
@pavelsavarapavelsavara self-assigned this Feb 26, 2026
CopilotAI review requested due to automatic review settings February 26, 2026 14:56
@pavelsavarapavelsavara added arch-wasm WebAssembly architecture area-AssemblyLoader-coreclr only use for closed issues os-browser Browser variant of arch-wasm labels Feb 26, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @elinor-fung
See info in area-owners.md if you want to be subscribed.

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

Enables CoreCLR-on-Browser/WASM to load assemblies packaged in the Webcil container format (i.e., .wasm-wrapped assemblies), aligning CoreCLR behavior with existing Mono Webcil support and removing prior build/test overrides that forced raw .dll usage.

Changes:

  • Adds CoreCLR-side Webcil decoding and wires it into PEImageLayout via format-dispatched forwarding to either PEDecoder (PE) or WebcilDecoder (Webcil).
  • Updates the Webcil tooling pipeline (converter/reader/wrapper + MSBuild tasks/targets) including 16-byte section alignment and property renames (WebCil*Webcil*).
  • Extends cDAC contracts/readers and WASM test infrastructure to understand and exercise Webcil images.

Reviewed changes

Copilot reviewed 35 out of 35 changed files in this pull request and generated 6 comments.

Show a summary per file
FileDescription
src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilWasmWrapper.csImproves wrapper error message for payload offset validation.
src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilReader.csUpdates to PascalCase header fields and adds bounds checking in RVA translation.
src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilHeader.csRenames Webcil header fields to PascalCase for consistency.
src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilConverter.csImplements 16-byte section alignment, debug directory translation, and related validations.
src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ConvertDllsToWebCil.csRenames output item list to WebcilCandidates.
src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ComputeWasmPublishAssets.csRenames task property to IsWebcilEnabled and updates usage.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/PEImageLayout.csAdds Format field to contract + helper to detect Webcil format.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Loader_1.csAdds Webcil-aware RVA-to-offset logic by reading Webcil section table from target memory.
src/mono/wasm/features.mdDocumentation update: “WebCIL” → “Webcil”.
src/mono/wasm/Wasm.Build.Tests/Common/BuildEnvironment.csRemoves CoreCLR Webcil exclusion; renames env var WasmEnableWebcil.
src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targetsRenames MSBuild properties/items/parameters from WebCilWebcil.
src/mono/cmake/options.cmakeDocumentation string update for ENABLE_WEBCIL.
src/mono/cmake/config.h.inComment update for ENABLE_WEBCIL.
src/mono/browser/debugger/BrowserDebugProxy/DebugStore.csDocumentation wording update for Webcil handling.
src/mono/browser/build/WasmApp.InTree.propsRemoves CoreCLR WasmEnableWebcil=false override.
src/coreclr/vm/peimagelayout.inlAdds decoder-dispatch forwarding methods; introduces format-agnostic header checks.
src/coreclr/vm/peimagelayout.hRefactors PEImageLayout to composition with PEDecoder/WebcilDecoder and ImageFormat discriminator.
src/coreclr/vm/peimagelayout.cppInitializes Webcil decoder on detection; updates PEDecoder init/reset call sites; DAC enumeration dispatch.
src/coreclr/vm/peimage.inlAdds PEImage::HasHeaders() helper.
src/coreclr/vm/peimage.hDeclares HasHeaders() in PEImage.
src/coreclr/vm/peimage.cppUses HasHeaders() instead of HasNTHeaders() in metadata/debug-directory paths.
src/coreclr/vm/peassembly.cppAccepts IMAGE_FILE_MACHINE_UNKNOWN for IL-only validation; guards 32-bit header check.
src/coreclr/vm/eventtrace.cppSwitches checks from NT headers to format-agnostic headers.
src/coreclr/vm/debugdebugger.cppSwitches from PEDecoder* to PEImageLayout* and uses GetDirectoryEntryData.
src/coreclr/vm/datadescriptor/datadescriptor.incAdds Format field to PEImageLayout’s cDAC data descriptor.
src/coreclr/vm/ceeload.cppUpdates IJW lookup to use PEImageLayout* (post-inheritance refactor).
src/coreclr/utilcode/webcildecoder.cppAdds CoreCLR Webcil decoding/validation implementation and DAC enumeration support.
src/coreclr/utilcode/CMakeLists.txtAdds webcildecoder.cpp to utilcode build.
src/coreclr/inc/webcildecoder.hAdds Webcil structures and WebcilDecoder API.
src/coreclr/inc/pedecoder.hMakes PEImageLayout a friend and restricts PE-internal APIs to PEImageLayout usage.
src/coreclr/clrfeatures.cmakeEnables FEATURE_WEBCIL for browser builds.
src/coreclr/clrdefinitions.cmakeAdds FEATURE_WEBCIL compile definition when enabled.
src/coreclr/binder/assemblybindercommon.cppTreats IMAGE_FILE_MACHINE_UNKNOWN as processor-agnostic MSIL in binder logic.
eng/testing/tests.browser.targetsRemoves CoreCLR WasmEnableWebcil=false override for browser tests.
docs/design/mono/webcil.mdUpdates spec text for alignment and PascalCase field names + naming consistency.

Comment threadsrc/coreclr/utilcode/webcildecoder.cpp Outdated
Comment threadsrc/coreclr/vm/peimagelayout.inl
Comment threadsrc/coreclr/utilcode/webcildecoder.cpp Outdated
Comment threadsrc/coreclr/utilcode/webcildecoder.cpp
CopilotAI review requested due to automatic review settings February 26, 2026 15:12

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 35 out of 35 changed files in this pull request and generated 4 comments.

Comments suppressed due to low confidence (1)

src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilReader.cs:354

  • New exceptions in TranslateRVA use nameof(_stream) as the parameter name. Since _stream is a private field (not a parameter), this produces a less helpful ParamName than nameof(stream) (constructor parameter) or omitting the param name entirely. Consider aligning with the earlier constructor exceptions which use nameof(stream).

Comment threadsrc/coreclr/vm/peimagelayout.inl Outdated
CopilotAI review requested due to automatic review settings February 26, 2026 15:24

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 35 out of 35 changed files in this pull request and generated 2 comments.

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 33 out of 33 changed files in this pull request and generated 6 comments.

Comments suppressed due to low confidence (1)

src/coreclr/utilcode/CMakeLists.txt:1

  • webcildecoder.cpp is added unconditionally to UTILCODE_COMMON_SOURCES. When FEATURE_WEBCIL is off this compiles an effectively empty translation unit, which is small but avoidable build work. Consider conditionally appending webcildecoder.cpp only when FEATURE_WEBCIL is enabled (or CLR_CMAKE_TARGET_BROWSER), to keep non-browser builds slightly leaner.
set(CMAKE_INCLUDE_CURRENT_DIR ON)

Comment threadsrc/coreclr/utilcode/webcildecoder.cpp
Comment threadsrc/coreclr/vm/peimagelayout.cpp
Comment threadsrc/coreclr/vm/peimagelayout.cpp
Comment threadsrc/coreclr/inc/cordecoderhelpers.h
CopilotAI review requested due to automatic review settings March 12, 2026 23:29

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 33 out of 33 changed files in this pull request and generated 3 comments.

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings March 13, 2026 00:35

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 33 out of 33 changed files in this pull request and generated 2 comments.

CopilotAI review requested due to automatic review settings March 13, 2026 01:39

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 34 out of 34 changed files in this pull request and generated 6 comments.

Comment threadsrc/native/managed/cdac/tests/LoaderTests.cs
Comment threadsrc/native/managed/cdac/tests/LoaderTests.cs
Comment threadsrc/coreclr/utilcode/webcildecoder.cpp Outdated
Comment threaddocs/design/datacontracts/Loader.md Outdated
Comment threadsrc/coreclr/utilcode/webcildecoder.cpp
@max-charlamb

Copy link
Copy Markdown
Member

Looks good to me from a cDAC perspective. Thanks for keeping the cDAC up to date 👍

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g unrelated CI failures

@pavelsavara
pavelsavara merged commit 41ac7d5 into dotnet:mainMar 13, 2026
158 of 166 checks passed
@pavelsavara
pavelsavara deleted the loading_webcil2 branch March 13, 2026 15:40
CopilotAI pushed a commit that referenced this pull request Mar 13, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 13, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-AssemblyLoader-coreclronly use for closed issuesos-browserBrowser variant of arch-wasm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@pavelsavara@max-charlamb@jkotas@adamperlin@AaronRobinsonMSFT@radekdoulik
, '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

[browser][coreCLR] Loading WebCIL - 2nd attempt - #124904

Merged
pavelsavara merged 26 commits into
dotnet:mainfrom
pavelsavara:loading_webcil2
Mar 13, 2026
Merged

[browser][coreCLR] Loading WebCIL - 2nd attempt#124904
pavelsavara merged 26 commits into
dotnet:mainfrom
pavelsavara:loading_webcil2

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Feb 26, 2026

Copy link
Copy Markdown
Member

Enable Webcil loading in CoreCLR for Browser/WASM

Summary

Adds native Webcil container format support to the CoreCLR runtime, enabling CoreCLR-on-WASM to load .wasm-wrapped assemblies directly — previously only supported by the Mono runtime. Removes the WasmEnableWebcil=false override that was forcing CoreCLR browser builds to use raw .dll files.

Changes

CoreCLR Webcil decoder (src/coreclr/)

  • New WebcilDecoder class (webcildecoder.h, webcildecoder.cpp) — standalone reader for the Webcil container format with full RVA/offset translation, COR header resolution, metadata access, section validation, IL method checking, debug directory support, and DAC enumeration.
  • FEATURE_WEBCIL cmake gate enabled for CLR_CMAKE_TARGET_BROWSER (clrfeatures.cmake, clrdefinitions.cmake).

PEImageLayout composition refactor (src/coreclr/vm/)

  • PEImageLayout no longer inherits from PEDecoder; instead holds m_peDecoder (and conditionally m_webcilDecoder) as members with an ImageFormat discriminator (FORMAT_PE/FORMAT_WEBCIL).
  • ~160 inline forwarding methods in peimagelayout.inl dispatch to the active decoder via DECODER_DISPATCH/DECODER_CHECK/PE_OR_WEBCIL macros.
  • PEDecoder public API split: methods needed by PEImageLayout forwarding stay public; PE-internal helpers (GetHeaders, GetDirectoryEntry, CheckDirectoryEntry, relocation/TLS/strong-name internals, etc.) moved to a private section accessible only via friend class PEImageLayout.
  • FlatImageLayout constructor detects Webcil magic and initializes both decoders (Webcil for format operations, PE decoder for base/size/flags used by cDAC).
  • New HasHeaders() abstraction on PEImageLayout and PEImage — returns HasWebcilHeaders() or HasNTHeaders() depending on format. Callers in peassembly.cpp, peimage.cpp, eventtrace.cpp updated from HasNTHeaders() to HasHeaders().
  • debugdebugger.cpp: switched from PEDecoder* to PEImageLayout* and uses format-agnostic GetDirectoryEntryData instead of raw GetDirectoryEntry+GetDirectoryData.
  • ceeload.cpp: same PEDecoder*PEImageLayout* fix for IJW host lookup.
  • peassembly.cpp: accept IMAGE_FILE_MACHINE_UNKNOWN (Webcil machine type) for IL-only validation; guard 32-bit NT header check with HasNTHeaders().
  • assemblybindercommon.cpp: treat IMAGE_FILE_MACHINE_UNKNOWN as processor-agnostic MSIL.

cDAC diagnostics (src/native/managed/cdac/)

  • PEImageLayout data descriptor gains Format field (datadescriptor.inc, PEImageLayout.cs).
  • Loader_1.cs: Webcil-aware RvaToOffset path that reads the Webcil section table directly from the target memory when IsWebcilFormat is set.

Build/infrastructure

  • Removed WasmEnableWebcil=false from CoreCLR browser build properties (WasmApp.InTree.props, tests.browser.targets).
  • MSBuild task renames: WebCilCandidatesWebcilCandidates, IsWebCilEnabledIsWebcilEnabled, _WasmBuildWebCilPath_WasmBuildWebcilPath and related properties.
  • Test infrastructure: BuildEnvironment.cs removes CoreCLR Webcil exclusion; env var WasmEnableWebCilWasmEnableWebcil.

@pavelsavarapavelsavara added this to the 11.0.0 milestone Feb 26, 2026
@pavelsavarapavelsavara self-assigned this Feb 26, 2026
CopilotAI review requested due to automatic review settings February 26, 2026 14:56
@pavelsavarapavelsavara added arch-wasm WebAssembly architecture area-AssemblyLoader-coreclr only use for closed issues os-browser Browser variant of arch-wasm labels Feb 26, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @elinor-fung
See info in area-owners.md if you want to be subscribed.

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

Enables CoreCLR-on-Browser/WASM to load assemblies packaged in the Webcil container format (i.e., .wasm-wrapped assemblies), aligning CoreCLR behavior with existing Mono Webcil support and removing prior build/test overrides that forced raw .dll usage.

Changes:

  • Adds CoreCLR-side Webcil decoding and wires it into PEImageLayout via format-dispatched forwarding to either PEDecoder (PE) or WebcilDecoder (Webcil).
  • Updates the Webcil tooling pipeline (converter/reader/wrapper + MSBuild tasks/targets) including 16-byte section alignment and property renames (WebCil*Webcil*).
  • Extends cDAC contracts/readers and WASM test infrastructure to understand and exercise Webcil images.

Reviewed changes

Copilot reviewed 35 out of 35 changed files in this pull request and generated 6 comments.

Show a summary per file
FileDescription
src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilWasmWrapper.csImproves wrapper error message for payload offset validation.
src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilReader.csUpdates to PascalCase header fields and adds bounds checking in RVA translation.
src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilHeader.csRenames Webcil header fields to PascalCase for consistency.
src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilConverter.csImplements 16-byte section alignment, debug directory translation, and related validations.
src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ConvertDllsToWebCil.csRenames output item list to WebcilCandidates.
src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ComputeWasmPublishAssets.csRenames task property to IsWebcilEnabled and updates usage.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/PEImageLayout.csAdds Format field to contract + helper to detect Webcil format.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Loader_1.csAdds Webcil-aware RVA-to-offset logic by reading Webcil section table from target memory.
src/mono/wasm/features.mdDocumentation update: “WebCIL” → “Webcil”.
src/mono/wasm/Wasm.Build.Tests/Common/BuildEnvironment.csRemoves CoreCLR Webcil exclusion; renames env var WasmEnableWebcil.
src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targetsRenames MSBuild properties/items/parameters from WebCilWebcil.
src/mono/cmake/options.cmakeDocumentation string update for ENABLE_WEBCIL.
src/mono/cmake/config.h.inComment update for ENABLE_WEBCIL.
src/mono/browser/debugger/BrowserDebugProxy/DebugStore.csDocumentation wording update for Webcil handling.
src/mono/browser/build/WasmApp.InTree.propsRemoves CoreCLR WasmEnableWebcil=false override.
src/coreclr/vm/peimagelayout.inlAdds decoder-dispatch forwarding methods; introduces format-agnostic header checks.
src/coreclr/vm/peimagelayout.hRefactors PEImageLayout to composition with PEDecoder/WebcilDecoder and ImageFormat discriminator.
src/coreclr/vm/peimagelayout.cppInitializes Webcil decoder on detection; updates PEDecoder init/reset call sites; DAC enumeration dispatch.
src/coreclr/vm/peimage.inlAdds PEImage::HasHeaders() helper.
src/coreclr/vm/peimage.hDeclares HasHeaders() in PEImage.
src/coreclr/vm/peimage.cppUses HasHeaders() instead of HasNTHeaders() in metadata/debug-directory paths.
src/coreclr/vm/peassembly.cppAccepts IMAGE_FILE_MACHINE_UNKNOWN for IL-only validation; guards 32-bit header check.
src/coreclr/vm/eventtrace.cppSwitches checks from NT headers to format-agnostic headers.
src/coreclr/vm/debugdebugger.cppSwitches from PEDecoder* to PEImageLayout* and uses GetDirectoryEntryData.
src/coreclr/vm/datadescriptor/datadescriptor.incAdds Format field to PEImageLayout’s cDAC data descriptor.
src/coreclr/vm/ceeload.cppUpdates IJW lookup to use PEImageLayout* (post-inheritance refactor).
src/coreclr/utilcode/webcildecoder.cppAdds CoreCLR Webcil decoding/validation implementation and DAC enumeration support.
src/coreclr/utilcode/CMakeLists.txtAdds webcildecoder.cpp to utilcode build.
src/coreclr/inc/webcildecoder.hAdds Webcil structures and WebcilDecoder API.
src/coreclr/inc/pedecoder.hMakes PEImageLayout a friend and restricts PE-internal APIs to PEImageLayout usage.
src/coreclr/clrfeatures.cmakeEnables FEATURE_WEBCIL for browser builds.
src/coreclr/clrdefinitions.cmakeAdds FEATURE_WEBCIL compile definition when enabled.
src/coreclr/binder/assemblybindercommon.cppTreats IMAGE_FILE_MACHINE_UNKNOWN as processor-agnostic MSIL in binder logic.
eng/testing/tests.browser.targetsRemoves CoreCLR WasmEnableWebcil=false override for browser tests.
docs/design/mono/webcil.mdUpdates spec text for alignment and PascalCase field names + naming consistency.

Comment threadsrc/coreclr/utilcode/webcildecoder.cpp Outdated
Comment threadsrc/coreclr/vm/peimagelayout.inl
Comment threadsrc/coreclr/utilcode/webcildecoder.cpp Outdated
Comment threadsrc/coreclr/utilcode/webcildecoder.cpp
CopilotAI review requested due to automatic review settings February 26, 2026 15:12

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 35 out of 35 changed files in this pull request and generated 4 comments.

Comments suppressed due to low confidence (1)

src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilReader.cs:354

  • New exceptions in TranslateRVA use nameof(_stream) as the parameter name. Since _stream is a private field (not a parameter), this produces a less helpful ParamName than nameof(stream) (constructor parameter) or omitting the param name entirely. Consider aligning with the earlier constructor exceptions which use nameof(stream).

Comment threadsrc/coreclr/vm/peimagelayout.inl Outdated
CopilotAI review requested due to automatic review settings February 26, 2026 15:24

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 35 out of 35 changed files in this pull request and generated 2 comments.

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 33 out of 33 changed files in this pull request and generated 6 comments.

Comments suppressed due to low confidence (1)

src/coreclr/utilcode/CMakeLists.txt:1

  • webcildecoder.cpp is added unconditionally to UTILCODE_COMMON_SOURCES. When FEATURE_WEBCIL is off this compiles an effectively empty translation unit, which is small but avoidable build work. Consider conditionally appending webcildecoder.cpp only when FEATURE_WEBCIL is enabled (or CLR_CMAKE_TARGET_BROWSER), to keep non-browser builds slightly leaner.
set(CMAKE_INCLUDE_CURRENT_DIR ON)

Comment threadsrc/coreclr/utilcode/webcildecoder.cpp
Comment threadsrc/coreclr/vm/peimagelayout.cpp
Comment threadsrc/coreclr/vm/peimagelayout.cpp
Comment threadsrc/coreclr/inc/cordecoderhelpers.h
CopilotAI review requested due to automatic review settings March 12, 2026 23:29

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 33 out of 33 changed files in this pull request and generated 3 comments.

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings March 13, 2026 00:35

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 33 out of 33 changed files in this pull request and generated 2 comments.

CopilotAI review requested due to automatic review settings March 13, 2026 01:39

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 34 out of 34 changed files in this pull request and generated 6 comments.

Comment threadsrc/native/managed/cdac/tests/LoaderTests.cs
Comment threadsrc/native/managed/cdac/tests/LoaderTests.cs
Comment threadsrc/coreclr/utilcode/webcildecoder.cpp Outdated
Comment threaddocs/design/datacontracts/Loader.md Outdated
Comment threadsrc/coreclr/utilcode/webcildecoder.cpp
@max-charlamb

Copy link
Copy Markdown
Member

Looks good to me from a cDAC perspective. Thanks for keeping the cDAC up to date 👍

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g unrelated CI failures

@pavelsavara
pavelsavara merged commit 41ac7d5 into dotnet:mainMar 13, 2026
158 of 166 checks passed
@pavelsavara
pavelsavara deleted the loading_webcil2 branch March 13, 2026 15:40
CopilotAI pushed a commit that referenced this pull request Mar 13, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 13, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-AssemblyLoader-coreclronly use for closed issuesos-browserBrowser variant of arch-wasm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@pavelsavara@max-charlamb@jkotas@adamperlin@AaronRobinsonMSFT@radekdoulik
, '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

[browser][coreCLR] Loading WebCIL - 2nd attempt - #124904

Merged
pavelsavara merged 26 commits into
dotnet:mainfrom
pavelsavara:loading_webcil2
Mar 13, 2026
Merged

[browser][coreCLR] Loading WebCIL - 2nd attempt#124904
pavelsavara merged 26 commits into
dotnet:mainfrom
pavelsavara:loading_webcil2

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Feb 26, 2026

Copy link
Copy Markdown
Member

Enable Webcil loading in CoreCLR for Browser/WASM

Summary

Adds native Webcil container format support to the CoreCLR runtime, enabling CoreCLR-on-WASM to load .wasm-wrapped assemblies directly — previously only supported by the Mono runtime. Removes the WasmEnableWebcil=false override that was forcing CoreCLR browser builds to use raw .dll files.

Changes

CoreCLR Webcil decoder (src/coreclr/)

  • New WebcilDecoder class (webcildecoder.h, webcildecoder.cpp) — standalone reader for the Webcil container format with full RVA/offset translation, COR header resolution, metadata access, section validation, IL method checking, debug directory support, and DAC enumeration.
  • FEATURE_WEBCIL cmake gate enabled for CLR_CMAKE_TARGET_BROWSER (clrfeatures.cmake, clrdefinitions.cmake).

PEImageLayout composition refactor (src/coreclr/vm/)

  • PEImageLayout no longer inherits from PEDecoder; instead holds m_peDecoder (and conditionally m_webcilDecoder) as members with an ImageFormat discriminator (FORMAT_PE/FORMAT_WEBCIL).
  • ~160 inline forwarding methods in peimagelayout.inl dispatch to the active decoder via DECODER_DISPATCH/DECODER_CHECK/PE_OR_WEBCIL macros.
  • PEDecoder public API split: methods needed by PEImageLayout forwarding stay public; PE-internal helpers (GetHeaders, GetDirectoryEntry, CheckDirectoryEntry, relocation/TLS/strong-name internals, etc.) moved to a private section accessible only via friend class PEImageLayout.
  • FlatImageLayout constructor detects Webcil magic and initializes both decoders (Webcil for format operations, PE decoder for base/size/flags used by cDAC).
  • New HasHeaders() abstraction on PEImageLayout and PEImage — returns HasWebcilHeaders() or HasNTHeaders() depending on format. Callers in peassembly.cpp, peimage.cpp, eventtrace.cpp updated from HasNTHeaders() to HasHeaders().
  • debugdebugger.cpp: switched from PEDecoder* to PEImageLayout* and uses format-agnostic GetDirectoryEntryData instead of raw GetDirectoryEntry+GetDirectoryData.
  • ceeload.cpp: same PEDecoder*PEImageLayout* fix for IJW host lookup.
  • peassembly.cpp: accept IMAGE_FILE_MACHINE_UNKNOWN (Webcil machine type) for IL-only validation; guard 32-bit NT header check with HasNTHeaders().
  • assemblybindercommon.cpp: treat IMAGE_FILE_MACHINE_UNKNOWN as processor-agnostic MSIL.

cDAC diagnostics (src/native/managed/cdac/)

  • PEImageLayout data descriptor gains Format field (datadescriptor.inc, PEImageLayout.cs).
  • Loader_1.cs: Webcil-aware RvaToOffset path that reads the Webcil section table directly from the target memory when IsWebcilFormat is set.

Build/infrastructure

  • Removed WasmEnableWebcil=false from CoreCLR browser build properties (WasmApp.InTree.props, tests.browser.targets).
  • MSBuild task renames: WebCilCandidatesWebcilCandidates, IsWebCilEnabledIsWebcilEnabled, _WasmBuildWebCilPath_WasmBuildWebcilPath and related properties.
  • Test infrastructure: BuildEnvironment.cs removes CoreCLR Webcil exclusion; env var WasmEnableWebCilWasmEnableWebcil.

@pavelsavarapavelsavara added this to the 11.0.0 milestone Feb 26, 2026
@pavelsavarapavelsavara self-assigned this Feb 26, 2026
CopilotAI review requested due to automatic review settings February 26, 2026 14:56
@pavelsavarapavelsavara added arch-wasm WebAssembly architecture area-AssemblyLoader-coreclr only use for closed issues os-browser Browser variant of arch-wasm labels Feb 26, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @elinor-fung
See info in area-owners.md if you want to be subscribed.

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

Enables CoreCLR-on-Browser/WASM to load assemblies packaged in the Webcil container format (i.e., .wasm-wrapped assemblies), aligning CoreCLR behavior with existing Mono Webcil support and removing prior build/test overrides that forced raw .dll usage.

Changes:

  • Adds CoreCLR-side Webcil decoding and wires it into PEImageLayout via format-dispatched forwarding to either PEDecoder (PE) or WebcilDecoder (Webcil).
  • Updates the Webcil tooling pipeline (converter/reader/wrapper + MSBuild tasks/targets) including 16-byte section alignment and property renames (WebCil*Webcil*).
  • Extends cDAC contracts/readers and WASM test infrastructure to understand and exercise Webcil images.

Reviewed changes

Copilot reviewed 35 out of 35 changed files in this pull request and generated 6 comments.

Show a summary per file
FileDescription
src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilWasmWrapper.csImproves wrapper error message for payload offset validation.
src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilReader.csUpdates to PascalCase header fields and adds bounds checking in RVA translation.
src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilHeader.csRenames Webcil header fields to PascalCase for consistency.
src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilConverter.csImplements 16-byte section alignment, debug directory translation, and related validations.
src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ConvertDllsToWebCil.csRenames output item list to WebcilCandidates.
src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ComputeWasmPublishAssets.csRenames task property to IsWebcilEnabled and updates usage.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/PEImageLayout.csAdds Format field to contract + helper to detect Webcil format.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Loader_1.csAdds Webcil-aware RVA-to-offset logic by reading Webcil section table from target memory.
src/mono/wasm/features.mdDocumentation update: “WebCIL” → “Webcil”.
src/mono/wasm/Wasm.Build.Tests/Common/BuildEnvironment.csRemoves CoreCLR Webcil exclusion; renames env var WasmEnableWebcil.
src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targetsRenames MSBuild properties/items/parameters from WebCilWebcil.
src/mono/cmake/options.cmakeDocumentation string update for ENABLE_WEBCIL.
src/mono/cmake/config.h.inComment update for ENABLE_WEBCIL.
src/mono/browser/debugger/BrowserDebugProxy/DebugStore.csDocumentation wording update for Webcil handling.
src/mono/browser/build/WasmApp.InTree.propsRemoves CoreCLR WasmEnableWebcil=false override.
src/coreclr/vm/peimagelayout.inlAdds decoder-dispatch forwarding methods; introduces format-agnostic header checks.
src/coreclr/vm/peimagelayout.hRefactors PEImageLayout to composition with PEDecoder/WebcilDecoder and ImageFormat discriminator.
src/coreclr/vm/peimagelayout.cppInitializes Webcil decoder on detection; updates PEDecoder init/reset call sites; DAC enumeration dispatch.
src/coreclr/vm/peimage.inlAdds PEImage::HasHeaders() helper.
src/coreclr/vm/peimage.hDeclares HasHeaders() in PEImage.
src/coreclr/vm/peimage.cppUses HasHeaders() instead of HasNTHeaders() in metadata/debug-directory paths.
src/coreclr/vm/peassembly.cppAccepts IMAGE_FILE_MACHINE_UNKNOWN for IL-only validation; guards 32-bit header check.
src/coreclr/vm/eventtrace.cppSwitches checks from NT headers to format-agnostic headers.
src/coreclr/vm/debugdebugger.cppSwitches from PEDecoder* to PEImageLayout* and uses GetDirectoryEntryData.
src/coreclr/vm/datadescriptor/datadescriptor.incAdds Format field to PEImageLayout’s cDAC data descriptor.
src/coreclr/vm/ceeload.cppUpdates IJW lookup to use PEImageLayout* (post-inheritance refactor).
src/coreclr/utilcode/webcildecoder.cppAdds CoreCLR Webcil decoding/validation implementation and DAC enumeration support.
src/coreclr/utilcode/CMakeLists.txtAdds webcildecoder.cpp to utilcode build.
src/coreclr/inc/webcildecoder.hAdds Webcil structures and WebcilDecoder API.
src/coreclr/inc/pedecoder.hMakes PEImageLayout a friend and restricts PE-internal APIs to PEImageLayout usage.
src/coreclr/clrfeatures.cmakeEnables FEATURE_WEBCIL for browser builds.
src/coreclr/clrdefinitions.cmakeAdds FEATURE_WEBCIL compile definition when enabled.
src/coreclr/binder/assemblybindercommon.cppTreats IMAGE_FILE_MACHINE_UNKNOWN as processor-agnostic MSIL in binder logic.
eng/testing/tests.browser.targetsRemoves CoreCLR WasmEnableWebcil=false override for browser tests.
docs/design/mono/webcil.mdUpdates spec text for alignment and PascalCase field names + naming consistency.

Comment threadsrc/coreclr/utilcode/webcildecoder.cpp Outdated
Comment threadsrc/coreclr/vm/peimagelayout.inl
Comment threadsrc/coreclr/utilcode/webcildecoder.cpp Outdated
Comment threadsrc/coreclr/utilcode/webcildecoder.cpp
CopilotAI review requested due to automatic review settings February 26, 2026 15:12

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 35 out of 35 changed files in this pull request and generated 4 comments.

Comments suppressed due to low confidence (1)

src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilReader.cs:354

  • New exceptions in TranslateRVA use nameof(_stream) as the parameter name. Since _stream is a private field (not a parameter), this produces a less helpful ParamName than nameof(stream) (constructor parameter) or omitting the param name entirely. Consider aligning with the earlier constructor exceptions which use nameof(stream).

Comment threadsrc/coreclr/vm/peimagelayout.inl Outdated
CopilotAI review requested due to automatic review settings February 26, 2026 15:24

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 35 out of 35 changed files in this pull request and generated 2 comments.

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 33 out of 33 changed files in this pull request and generated 6 comments.

Comments suppressed due to low confidence (1)

src/coreclr/utilcode/CMakeLists.txt:1

  • webcildecoder.cpp is added unconditionally to UTILCODE_COMMON_SOURCES. When FEATURE_WEBCIL is off this compiles an effectively empty translation unit, which is small but avoidable build work. Consider conditionally appending webcildecoder.cpp only when FEATURE_WEBCIL is enabled (or CLR_CMAKE_TARGET_BROWSER), to keep non-browser builds slightly leaner.
set(CMAKE_INCLUDE_CURRENT_DIR ON)

Comment threadsrc/coreclr/utilcode/webcildecoder.cpp
Comment threadsrc/coreclr/vm/peimagelayout.cpp
Comment threadsrc/coreclr/vm/peimagelayout.cpp
Comment threadsrc/coreclr/inc/cordecoderhelpers.h
CopilotAI review requested due to automatic review settings March 12, 2026 23:29

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 33 out of 33 changed files in this pull request and generated 3 comments.

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings March 13, 2026 00:35

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 33 out of 33 changed files in this pull request and generated 2 comments.

CopilotAI review requested due to automatic review settings March 13, 2026 01:39

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 34 out of 34 changed files in this pull request and generated 6 comments.

Comment threadsrc/native/managed/cdac/tests/LoaderTests.cs
Comment threadsrc/native/managed/cdac/tests/LoaderTests.cs
Comment threadsrc/coreclr/utilcode/webcildecoder.cpp Outdated
Comment threaddocs/design/datacontracts/Loader.md Outdated
Comment threadsrc/coreclr/utilcode/webcildecoder.cpp
@max-charlamb

Copy link
Copy Markdown
Member

Looks good to me from a cDAC perspective. Thanks for keeping the cDAC up to date 👍

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g unrelated CI failures

@pavelsavara
pavelsavara merged commit 41ac7d5 into dotnet:mainMar 13, 2026
158 of 166 checks passed
@pavelsavara
pavelsavara deleted the loading_webcil2 branch March 13, 2026 15:40
CopilotAI pushed a commit that referenced this pull request Mar 13, 2026
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 13, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-AssemblyLoader-coreclronly use for closed issuesos-browserBrowser variant of arch-wasm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@pavelsavara@max-charlamb@jkotas@adamperlin@AaronRobinsonMSFT@radekdoulik