Crossgen Wasm Object Writer V0 - #122111

Merged
adamperlin merged 27 commits into
dotnet:mainfrom
adamperlin:adamperlin/wasm-r2r-object-writer
Dec 8, 2025
Merged

Crossgen Wasm Object Writer V0#122111
adamperlin merged 27 commits into
dotnet:mainfrom
adamperlin:adamperlin/wasm-r2r-object-writer

Conversation

@adamperlin

Copy link
Copy Markdown
Contributor

This is the first prototype of a Wasm object writer for crossgen that only writes out method bodies. It builds the minimum module structure which is needed to declare and export the module bodies so that the resulting module can be loaded and method bodies can be called by an external loader. I have tested the output with a simple JavaScript loader that instantiates the module and calls one of the exports.

What IS handled

Emitting simple method bodies from an assembly that have no relocations or external dependencies of any kind.

What is NOT handled

Relocations and any metadata attached to compiled methods.

R2R format envelope (the plan is to embed this in the data section in a future PR)

R2R metadata is currently unused.

Signature generation to meet ABI requirements

Right now, there is a single i32 -> i32 signature which is used as a placeholder for any method. Later work will need to build support for generating and storing wasm-level type signatures for JIT compiled methods.

JIT Integration

Currently, the JIT is not called (I believe it will hit asserts on the Wasm target until #121973 is in). Instead, a simple (i32.const 0) (return) stub is emitted for any JIT calls.

…x wasm arch+os target validation, add obj-format option for Wasm
It currently only handles writing method body nodes to the code section,
in addition to building the type, function, and exports section.
It will export all written methods so that they can be called when the
module is loaded.
Comment threadsrc/coreclr/tools/aot/ILCompiler.ReadyToRun/ClassDiagram1.cd Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR introduces the first prototype of a WebAssembly object writer for crossgen2, enabling the compilation toolchain to output Wasm modules. The implementation focuses on emitting method bodies with minimal module structure required for loading and calling exported functions, while deferring relocations, R2R metadata, and proper ABI signature handling to future work.

Key Changes

  • Added support for Wasm as a valid target architecture and container format in crossgen2
  • Implemented core Wasm module writing infrastructure including section builders for Type, Function, Export, and Code sections
  • Created a temporary stub mechanism to bypass JIT compilation for Wasm32 architecture until proper codegen support is available

Reviewed changes

Copilot reviewed 10 out of 10 changed files in this pull request and generated 15 comments.

Show a summary per file
FileDescription
src/coreclr/tools/aot/crossgen2/Program.csAdded Wasm to allowed non-composite container formats
src/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.csAdded "wasm" architecture and "wasi" OS to valid options, plus "wasm" output format
src/coreclr/tools/aot/ILCompiler.ReadyToRun/ILCompiler.ReadyToRun.csprojIncluded new Wasm object writer files (contains developer-specific path that should be removed)
src/coreclr/tools/aot/ILCompiler.ReadyToRun/CodeGen/ReadyToRunObjectWriter.csAdded factory method to create WasmObjectWriter with ABI context
src/coreclr/tools/aot/ILCompiler.ReadyToRun/CodeGen/ReadyToRunContainerFormat.csAdded Wasm enum value to container format options
src/coreclr/tools/aot/ILCompiler.ReadyToRun/ClassDiagram1.cdAdded class diagram file (appears unrelated to Wasm implementation)
src/coreclr/tools/Common/JitInterface/CorInfoImpl.csImplemented CompileWasmStub to emit placeholder bytecode for Wasm methods
src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.csCore Wasm module writer implementation handling section generation and export
src/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.csWasm type system definitions and encoding utilities
src/coreclr/tools/Common/Compiler/ObjectWriter/SectionWriter.csAdded WriteUtf8StringNoNull helper method for Wasm string encoding
src/coreclr/tools/Common/Compiler/ObjectWriter/ObjectWriter.csChanged visibility modifiers to enable WasmObjectWriter inheritance

Comment threadsrc/coreclr/tools/Common/JitInterface/CorInfoImpl.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/JitInterface/CorInfoImpl.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs Outdated
adamperlinand others added 10 commits December 2, 2025 11:22
…WasmNative.cs
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
…WasmObjectWriter.cs
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
…r.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…r.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…r.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…Run.csproj
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…r.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
@am11am11 added the arch-wasm WebAssembly architecture label Dec 2, 2025
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-wasm': @lewing, @pavelsavara
See info in area-owners.md if you want to be subscribed.

Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs Outdated
@adamperlin

Copy link
Copy Markdown
ContributorAuthor

@SingleAccretion thank you for your comments! I think I've addressed them, please feel free to take another look!

Comment threadsrc/coreclr/tools/aot/crossgen2/Program.cs
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated

@jkoritzinskyjkoritzinsky left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM for a v0

@SingleAccretionSingleAccretion 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.

LGTM with some comments.

Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/ObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
@adamperlin
adamperlin merged commit 2316313 into dotnet:mainDec 8, 2025
94 of 96 checks passed
adamperlin added a commit that referenced this pull request Dec 9, 2025
This PR reverts the behavior from #122111 which stubs out a method
instead of calling the JIT for the crossgen Wasm target. Now, the JIT
will be invoked as normal so that the output of method codegen can be
placed in a simple object file.
Output code currently won't run (I tried this) because we aren't yet
emitting a correct local count at the beginning of compiled methods.
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jan 8, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-ReadyToRun

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@adamperlin@am11@kg@pavelsavara@jkoritzinsky@MichalStrehovsky@SingleAccretion
, '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

Crossgen Wasm Object Writer V0 - #122111

Merged
adamperlin merged 27 commits into
dotnet:mainfrom
adamperlin:adamperlin/wasm-r2r-object-writer
Dec 8, 2025
Merged

Crossgen Wasm Object Writer V0#122111
adamperlin merged 27 commits into
dotnet:mainfrom
adamperlin:adamperlin/wasm-r2r-object-writer

Conversation

@adamperlin

Copy link
Copy Markdown
Contributor

This is the first prototype of a Wasm object writer for crossgen that only writes out method bodies. It builds the minimum module structure which is needed to declare and export the module bodies so that the resulting module can be loaded and method bodies can be called by an external loader. I have tested the output with a simple JavaScript loader that instantiates the module and calls one of the exports.

What IS handled

Emitting simple method bodies from an assembly that have no relocations or external dependencies of any kind.

What is NOT handled

Relocations and any metadata attached to compiled methods.

R2R format envelope (the plan is to embed this in the data section in a future PR)

R2R metadata is currently unused.

Signature generation to meet ABI requirements

Right now, there is a single i32 -> i32 signature which is used as a placeholder for any method. Later work will need to build support for generating and storing wasm-level type signatures for JIT compiled methods.

JIT Integration

Currently, the JIT is not called (I believe it will hit asserts on the Wasm target until #121973 is in). Instead, a simple (i32.const 0) (return) stub is emitted for any JIT calls.

…x wasm arch+os target validation, add obj-format option for Wasm
It currently only handles writing method body nodes to the code section,
in addition to building the type, function, and exports section.
It will export all written methods so that they can be called when the
module is loaded.
Comment threadsrc/coreclr/tools/aot/ILCompiler.ReadyToRun/ClassDiagram1.cd Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR introduces the first prototype of a WebAssembly object writer for crossgen2, enabling the compilation toolchain to output Wasm modules. The implementation focuses on emitting method bodies with minimal module structure required for loading and calling exported functions, while deferring relocations, R2R metadata, and proper ABI signature handling to future work.

Key Changes

  • Added support for Wasm as a valid target architecture and container format in crossgen2
  • Implemented core Wasm module writing infrastructure including section builders for Type, Function, Export, and Code sections
  • Created a temporary stub mechanism to bypass JIT compilation for Wasm32 architecture until proper codegen support is available

Reviewed changes

Copilot reviewed 10 out of 10 changed files in this pull request and generated 15 comments.

Show a summary per file
FileDescription
src/coreclr/tools/aot/crossgen2/Program.csAdded Wasm to allowed non-composite container formats
src/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.csAdded "wasm" architecture and "wasi" OS to valid options, plus "wasm" output format
src/coreclr/tools/aot/ILCompiler.ReadyToRun/ILCompiler.ReadyToRun.csprojIncluded new Wasm object writer files (contains developer-specific path that should be removed)
src/coreclr/tools/aot/ILCompiler.ReadyToRun/CodeGen/ReadyToRunObjectWriter.csAdded factory method to create WasmObjectWriter with ABI context
src/coreclr/tools/aot/ILCompiler.ReadyToRun/CodeGen/ReadyToRunContainerFormat.csAdded Wasm enum value to container format options
src/coreclr/tools/aot/ILCompiler.ReadyToRun/ClassDiagram1.cdAdded class diagram file (appears unrelated to Wasm implementation)
src/coreclr/tools/Common/JitInterface/CorInfoImpl.csImplemented CompileWasmStub to emit placeholder bytecode for Wasm methods
src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.csCore Wasm module writer implementation handling section generation and export
src/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.csWasm type system definitions and encoding utilities
src/coreclr/tools/Common/Compiler/ObjectWriter/SectionWriter.csAdded WriteUtf8StringNoNull helper method for Wasm string encoding
src/coreclr/tools/Common/Compiler/ObjectWriter/ObjectWriter.csChanged visibility modifiers to enable WasmObjectWriter inheritance

Comment threadsrc/coreclr/tools/Common/JitInterface/CorInfoImpl.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/JitInterface/CorInfoImpl.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs Outdated
adamperlinand others added 10 commits December 2, 2025 11:22
…WasmNative.cs
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
…WasmObjectWriter.cs
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
…r.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…r.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…r.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…Run.csproj
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…r.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
@am11am11 added the arch-wasm WebAssembly architecture label Dec 2, 2025
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-wasm': @lewing, @pavelsavara
See info in area-owners.md if you want to be subscribed.

Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs Outdated
@adamperlin

Copy link
Copy Markdown
ContributorAuthor

@SingleAccretion thank you for your comments! I think I've addressed them, please feel free to take another look!

Comment threadsrc/coreclr/tools/aot/crossgen2/Program.cs
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated

@jkoritzinskyjkoritzinsky left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM for a v0

@SingleAccretionSingleAccretion 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.

LGTM with some comments.

Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/ObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
@adamperlin
adamperlin merged commit 2316313 into dotnet:mainDec 8, 2025
94 of 96 checks passed
adamperlin added a commit that referenced this pull request Dec 9, 2025
This PR reverts the behavior from #122111 which stubs out a method
instead of calling the JIT for the crossgen Wasm target. Now, the JIT
will be invoked as normal so that the output of method codegen can be
placed in a simple object file.
Output code currently won't run (I tried this) because we aren't yet
emitting a correct local count at the beginning of compiled methods.
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jan 8, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-ReadyToRun

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@adamperlin@am11@kg@pavelsavara@jkoritzinsky@MichalStrehovsky@SingleAccretion
, '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

Crossgen Wasm Object Writer V0 - #122111

Merged
adamperlin merged 27 commits into
dotnet:mainfrom
adamperlin:adamperlin/wasm-r2r-object-writer
Dec 8, 2025
Merged

Crossgen Wasm Object Writer V0#122111
adamperlin merged 27 commits into
dotnet:mainfrom
adamperlin:adamperlin/wasm-r2r-object-writer

Conversation

@adamperlin

Copy link
Copy Markdown
Contributor

This is the first prototype of a Wasm object writer for crossgen that only writes out method bodies. It builds the minimum module structure which is needed to declare and export the module bodies so that the resulting module can be loaded and method bodies can be called by an external loader. I have tested the output with a simple JavaScript loader that instantiates the module and calls one of the exports.

What IS handled

Emitting simple method bodies from an assembly that have no relocations or external dependencies of any kind.

What is NOT handled

Relocations and any metadata attached to compiled methods.

R2R format envelope (the plan is to embed this in the data section in a future PR)

R2R metadata is currently unused.

Signature generation to meet ABI requirements

Right now, there is a single i32 -> i32 signature which is used as a placeholder for any method. Later work will need to build support for generating and storing wasm-level type signatures for JIT compiled methods.

JIT Integration

Currently, the JIT is not called (I believe it will hit asserts on the Wasm target until #121973 is in). Instead, a simple (i32.const 0) (return) stub is emitted for any JIT calls.

…x wasm arch+os target validation, add obj-format option for Wasm
It currently only handles writing method body nodes to the code section,
in addition to building the type, function, and exports section.
It will export all written methods so that they can be called when the
module is loaded.
Comment threadsrc/coreclr/tools/aot/ILCompiler.ReadyToRun/ClassDiagram1.cd Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR introduces the first prototype of a WebAssembly object writer for crossgen2, enabling the compilation toolchain to output Wasm modules. The implementation focuses on emitting method bodies with minimal module structure required for loading and calling exported functions, while deferring relocations, R2R metadata, and proper ABI signature handling to future work.

Key Changes

  • Added support for Wasm as a valid target architecture and container format in crossgen2
  • Implemented core Wasm module writing infrastructure including section builders for Type, Function, Export, and Code sections
  • Created a temporary stub mechanism to bypass JIT compilation for Wasm32 architecture until proper codegen support is available

Reviewed changes

Copilot reviewed 10 out of 10 changed files in this pull request and generated 15 comments.

Show a summary per file
FileDescription
src/coreclr/tools/aot/crossgen2/Program.csAdded Wasm to allowed non-composite container formats
src/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.csAdded "wasm" architecture and "wasi" OS to valid options, plus "wasm" output format
src/coreclr/tools/aot/ILCompiler.ReadyToRun/ILCompiler.ReadyToRun.csprojIncluded new Wasm object writer files (contains developer-specific path that should be removed)
src/coreclr/tools/aot/ILCompiler.ReadyToRun/CodeGen/ReadyToRunObjectWriter.csAdded factory method to create WasmObjectWriter with ABI context
src/coreclr/tools/aot/ILCompiler.ReadyToRun/CodeGen/ReadyToRunContainerFormat.csAdded Wasm enum value to container format options
src/coreclr/tools/aot/ILCompiler.ReadyToRun/ClassDiagram1.cdAdded class diagram file (appears unrelated to Wasm implementation)
src/coreclr/tools/Common/JitInterface/CorInfoImpl.csImplemented CompileWasmStub to emit placeholder bytecode for Wasm methods
src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.csCore Wasm module writer implementation handling section generation and export
src/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.csWasm type system definitions and encoding utilities
src/coreclr/tools/Common/Compiler/ObjectWriter/SectionWriter.csAdded WriteUtf8StringNoNull helper method for Wasm string encoding
src/coreclr/tools/Common/Compiler/ObjectWriter/ObjectWriter.csChanged visibility modifiers to enable WasmObjectWriter inheritance

Comment threadsrc/coreclr/tools/Common/JitInterface/CorInfoImpl.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/JitInterface/CorInfoImpl.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs Outdated
adamperlinand others added 10 commits December 2, 2025 11:22
…WasmNative.cs
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
…WasmObjectWriter.cs
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
…r.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…r.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…r.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…Run.csproj
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…r.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
@am11am11 added the arch-wasm WebAssembly architecture label Dec 2, 2025
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-wasm': @lewing, @pavelsavara
See info in area-owners.md if you want to be subscribed.

Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs Outdated
@adamperlin

Copy link
Copy Markdown
ContributorAuthor

@SingleAccretion thank you for your comments! I think I've addressed them, please feel free to take another look!

Comment threadsrc/coreclr/tools/aot/crossgen2/Program.cs
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated

@jkoritzinskyjkoritzinsky left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM for a v0

@SingleAccretionSingleAccretion 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.

LGTM with some comments.

Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/ObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
@adamperlin
adamperlin merged commit 2316313 into dotnet:mainDec 8, 2025
94 of 96 checks passed
adamperlin added a commit that referenced this pull request Dec 9, 2025
This PR reverts the behavior from #122111 which stubs out a method
instead of calling the JIT for the crossgen Wasm target. Now, the JIT
will be invoked as normal so that the output of method codegen can be
placed in a simple object file.
Output code currently won't run (I tried this) because we aren't yet
emitting a correct local count at the beginning of compiled methods.
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jan 8, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-ReadyToRun

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@adamperlin@am11@kg@pavelsavara@jkoritzinsky@MichalStrehovsky@SingleAccretion
, '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

Crossgen Wasm Object Writer V0 - #122111

Merged
adamperlin merged 27 commits into
dotnet:mainfrom
adamperlin:adamperlin/wasm-r2r-object-writer
Dec 8, 2025
Merged

Crossgen Wasm Object Writer V0#122111
adamperlin merged 27 commits into
dotnet:mainfrom
adamperlin:adamperlin/wasm-r2r-object-writer

Conversation

@adamperlin

Copy link
Copy Markdown
Contributor

This is the first prototype of a Wasm object writer for crossgen that only writes out method bodies. It builds the minimum module structure which is needed to declare and export the module bodies so that the resulting module can be loaded and method bodies can be called by an external loader. I have tested the output with a simple JavaScript loader that instantiates the module and calls one of the exports.

What IS handled

Emitting simple method bodies from an assembly that have no relocations or external dependencies of any kind.

What is NOT handled

Relocations and any metadata attached to compiled methods.

R2R format envelope (the plan is to embed this in the data section in a future PR)

R2R metadata is currently unused.

Signature generation to meet ABI requirements

Right now, there is a single i32 -> i32 signature which is used as a placeholder for any method. Later work will need to build support for generating and storing wasm-level type signatures for JIT compiled methods.

JIT Integration

Currently, the JIT is not called (I believe it will hit asserts on the Wasm target until #121973 is in). Instead, a simple (i32.const 0) (return) stub is emitted for any JIT calls.

…x wasm arch+os target validation, add obj-format option for Wasm
It currently only handles writing method body nodes to the code section,
in addition to building the type, function, and exports section.
It will export all written methods so that they can be called when the
module is loaded.
Comment threadsrc/coreclr/tools/aot/ILCompiler.ReadyToRun/ClassDiagram1.cd Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR introduces the first prototype of a WebAssembly object writer for crossgen2, enabling the compilation toolchain to output Wasm modules. The implementation focuses on emitting method bodies with minimal module structure required for loading and calling exported functions, while deferring relocations, R2R metadata, and proper ABI signature handling to future work.

Key Changes

  • Added support for Wasm as a valid target architecture and container format in crossgen2
  • Implemented core Wasm module writing infrastructure including section builders for Type, Function, Export, and Code sections
  • Created a temporary stub mechanism to bypass JIT compilation for Wasm32 architecture until proper codegen support is available

Reviewed changes

Copilot reviewed 10 out of 10 changed files in this pull request and generated 15 comments.

Show a summary per file
FileDescription
src/coreclr/tools/aot/crossgen2/Program.csAdded Wasm to allowed non-composite container formats
src/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.csAdded "wasm" architecture and "wasi" OS to valid options, plus "wasm" output format
src/coreclr/tools/aot/ILCompiler.ReadyToRun/ILCompiler.ReadyToRun.csprojIncluded new Wasm object writer files (contains developer-specific path that should be removed)
src/coreclr/tools/aot/ILCompiler.ReadyToRun/CodeGen/ReadyToRunObjectWriter.csAdded factory method to create WasmObjectWriter with ABI context
src/coreclr/tools/aot/ILCompiler.ReadyToRun/CodeGen/ReadyToRunContainerFormat.csAdded Wasm enum value to container format options
src/coreclr/tools/aot/ILCompiler.ReadyToRun/ClassDiagram1.cdAdded class diagram file (appears unrelated to Wasm implementation)
src/coreclr/tools/Common/JitInterface/CorInfoImpl.csImplemented CompileWasmStub to emit placeholder bytecode for Wasm methods
src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.csCore Wasm module writer implementation handling section generation and export
src/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.csWasm type system definitions and encoding utilities
src/coreclr/tools/Common/Compiler/ObjectWriter/SectionWriter.csAdded WriteUtf8StringNoNull helper method for Wasm string encoding
src/coreclr/tools/Common/Compiler/ObjectWriter/ObjectWriter.csChanged visibility modifiers to enable WasmObjectWriter inheritance

Comment threadsrc/coreclr/tools/Common/JitInterface/CorInfoImpl.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/JitInterface/CorInfoImpl.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs Outdated
adamperlinand others added 10 commits December 2, 2025 11:22
…WasmNative.cs
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
…WasmObjectWriter.cs
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
…r.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…r.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…r.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…Run.csproj
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…r.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
@am11am11 added the arch-wasm WebAssembly architecture label Dec 2, 2025
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-wasm': @lewing, @pavelsavara
See info in area-owners.md if you want to be subscribed.

Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs Outdated
@adamperlin

Copy link
Copy Markdown
ContributorAuthor

@SingleAccretion thank you for your comments! I think I've addressed them, please feel free to take another look!

Comment threadsrc/coreclr/tools/aot/crossgen2/Program.cs
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated

@jkoritzinskyjkoritzinsky left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM for a v0

@SingleAccretionSingleAccretion 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.

LGTM with some comments.

Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/ObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
@adamperlin
adamperlin merged commit 2316313 into dotnet:mainDec 8, 2025
94 of 96 checks passed
adamperlin added a commit that referenced this pull request Dec 9, 2025
This PR reverts the behavior from #122111 which stubs out a method
instead of calling the JIT for the crossgen Wasm target. Now, the JIT
will be invoked as normal so that the output of method codegen can be
placed in a simple object file.
Output code currently won't run (I tried this) because we aren't yet
emitting a correct local count at the beginning of compiled methods.
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jan 8, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-ReadyToRun

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@adamperlin@am11@kg@pavelsavara@jkoritzinsky@MichalStrehovsky@SingleAccretion
, '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

Crossgen Wasm Object Writer V0 - #122111

Merged
adamperlin merged 27 commits into
dotnet:mainfrom
adamperlin:adamperlin/wasm-r2r-object-writer
Dec 8, 2025
Merged

Crossgen Wasm Object Writer V0#122111
adamperlin merged 27 commits into
dotnet:mainfrom
adamperlin:adamperlin/wasm-r2r-object-writer

Conversation

@adamperlin

Copy link
Copy Markdown
Contributor

This is the first prototype of a Wasm object writer for crossgen that only writes out method bodies. It builds the minimum module structure which is needed to declare and export the module bodies so that the resulting module can be loaded and method bodies can be called by an external loader. I have tested the output with a simple JavaScript loader that instantiates the module and calls one of the exports.

What IS handled

Emitting simple method bodies from an assembly that have no relocations or external dependencies of any kind.

What is NOT handled

Relocations and any metadata attached to compiled methods.

R2R format envelope (the plan is to embed this in the data section in a future PR)

R2R metadata is currently unused.

Signature generation to meet ABI requirements

Right now, there is a single i32 -> i32 signature which is used as a placeholder for any method. Later work will need to build support for generating and storing wasm-level type signatures for JIT compiled methods.

JIT Integration

Currently, the JIT is not called (I believe it will hit asserts on the Wasm target until #121973 is in). Instead, a simple (i32.const 0) (return) stub is emitted for any JIT calls.

…x wasm arch+os target validation, add obj-format option for Wasm
It currently only handles writing method body nodes to the code section,
in addition to building the type, function, and exports section.
It will export all written methods so that they can be called when the
module is loaded.
Comment threadsrc/coreclr/tools/aot/ILCompiler.ReadyToRun/ClassDiagram1.cd Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR introduces the first prototype of a WebAssembly object writer for crossgen2, enabling the compilation toolchain to output Wasm modules. The implementation focuses on emitting method bodies with minimal module structure required for loading and calling exported functions, while deferring relocations, R2R metadata, and proper ABI signature handling to future work.

Key Changes

  • Added support for Wasm as a valid target architecture and container format in crossgen2
  • Implemented core Wasm module writing infrastructure including section builders for Type, Function, Export, and Code sections
  • Created a temporary stub mechanism to bypass JIT compilation for Wasm32 architecture until proper codegen support is available

Reviewed changes

Copilot reviewed 10 out of 10 changed files in this pull request and generated 15 comments.

Show a summary per file
FileDescription
src/coreclr/tools/aot/crossgen2/Program.csAdded Wasm to allowed non-composite container formats
src/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.csAdded "wasm" architecture and "wasi" OS to valid options, plus "wasm" output format
src/coreclr/tools/aot/ILCompiler.ReadyToRun/ILCompiler.ReadyToRun.csprojIncluded new Wasm object writer files (contains developer-specific path that should be removed)
src/coreclr/tools/aot/ILCompiler.ReadyToRun/CodeGen/ReadyToRunObjectWriter.csAdded factory method to create WasmObjectWriter with ABI context
src/coreclr/tools/aot/ILCompiler.ReadyToRun/CodeGen/ReadyToRunContainerFormat.csAdded Wasm enum value to container format options
src/coreclr/tools/aot/ILCompiler.ReadyToRun/ClassDiagram1.cdAdded class diagram file (appears unrelated to Wasm implementation)
src/coreclr/tools/Common/JitInterface/CorInfoImpl.csImplemented CompileWasmStub to emit placeholder bytecode for Wasm methods
src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.csCore Wasm module writer implementation handling section generation and export
src/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.csWasm type system definitions and encoding utilities
src/coreclr/tools/Common/Compiler/ObjectWriter/SectionWriter.csAdded WriteUtf8StringNoNull helper method for Wasm string encoding
src/coreclr/tools/Common/Compiler/ObjectWriter/ObjectWriter.csChanged visibility modifiers to enable WasmObjectWriter inheritance

Comment threadsrc/coreclr/tools/Common/JitInterface/CorInfoImpl.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/JitInterface/CorInfoImpl.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs Outdated
adamperlinand others added 10 commits December 2, 2025 11:22
…WasmNative.cs
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
…WasmObjectWriter.cs
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
…r.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…r.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…r.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…Run.csproj
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…r.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
@am11am11 added the arch-wasm WebAssembly architecture label Dec 2, 2025
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-wasm': @lewing, @pavelsavara
See info in area-owners.md if you want to be subscribed.

Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs Outdated
@adamperlin

Copy link
Copy Markdown
ContributorAuthor

@SingleAccretion thank you for your comments! I think I've addressed them, please feel free to take another look!

Comment threadsrc/coreclr/tools/aot/crossgen2/Program.cs
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated

@jkoritzinskyjkoritzinsky left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM for a v0

@SingleAccretionSingleAccretion 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.

LGTM with some comments.

Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/ObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
@adamperlin
adamperlin merged commit 2316313 into dotnet:mainDec 8, 2025
94 of 96 checks passed
adamperlin added a commit that referenced this pull request Dec 9, 2025
This PR reverts the behavior from #122111 which stubs out a method
instead of calling the JIT for the crossgen Wasm target. Now, the JIT
will be invoked as normal so that the output of method codegen can be
placed in a simple object file.
Output code currently won't run (I tried this) because we aren't yet
emitting a correct local count at the beginning of compiled methods.
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jan 8, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-ReadyToRun

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@adamperlin@am11@kg@pavelsavara@jkoritzinsky@MichalStrehovsky@SingleAccretion
, '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

Crossgen Wasm Object Writer V0 - #122111

Merged
adamperlin merged 27 commits into
dotnet:mainfrom
adamperlin:adamperlin/wasm-r2r-object-writer
Dec 8, 2025
Merged

Crossgen Wasm Object Writer V0#122111
adamperlin merged 27 commits into
dotnet:mainfrom
adamperlin:adamperlin/wasm-r2r-object-writer

Conversation

@adamperlin

Copy link
Copy Markdown
Contributor

This is the first prototype of a Wasm object writer for crossgen that only writes out method bodies. It builds the minimum module structure which is needed to declare and export the module bodies so that the resulting module can be loaded and method bodies can be called by an external loader. I have tested the output with a simple JavaScript loader that instantiates the module and calls one of the exports.

What IS handled

Emitting simple method bodies from an assembly that have no relocations or external dependencies of any kind.

What is NOT handled

Relocations and any metadata attached to compiled methods.

R2R format envelope (the plan is to embed this in the data section in a future PR)

R2R metadata is currently unused.

Signature generation to meet ABI requirements

Right now, there is a single i32 -> i32 signature which is used as a placeholder for any method. Later work will need to build support for generating and storing wasm-level type signatures for JIT compiled methods.

JIT Integration

Currently, the JIT is not called (I believe it will hit asserts on the Wasm target until #121973 is in). Instead, a simple (i32.const 0) (return) stub is emitted for any JIT calls.

…x wasm arch+os target validation, add obj-format option for Wasm
It currently only handles writing method body nodes to the code section,
in addition to building the type, function, and exports section.
It will export all written methods so that they can be called when the
module is loaded.
Comment threadsrc/coreclr/tools/aot/ILCompiler.ReadyToRun/ClassDiagram1.cd Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR introduces the first prototype of a WebAssembly object writer for crossgen2, enabling the compilation toolchain to output Wasm modules. The implementation focuses on emitting method bodies with minimal module structure required for loading and calling exported functions, while deferring relocations, R2R metadata, and proper ABI signature handling to future work.

Key Changes

  • Added support for Wasm as a valid target architecture and container format in crossgen2
  • Implemented core Wasm module writing infrastructure including section builders for Type, Function, Export, and Code sections
  • Created a temporary stub mechanism to bypass JIT compilation for Wasm32 architecture until proper codegen support is available

Reviewed changes

Copilot reviewed 10 out of 10 changed files in this pull request and generated 15 comments.

Show a summary per file
FileDescription
src/coreclr/tools/aot/crossgen2/Program.csAdded Wasm to allowed non-composite container formats
src/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.csAdded "wasm" architecture and "wasi" OS to valid options, plus "wasm" output format
src/coreclr/tools/aot/ILCompiler.ReadyToRun/ILCompiler.ReadyToRun.csprojIncluded new Wasm object writer files (contains developer-specific path that should be removed)
src/coreclr/tools/aot/ILCompiler.ReadyToRun/CodeGen/ReadyToRunObjectWriter.csAdded factory method to create WasmObjectWriter with ABI context
src/coreclr/tools/aot/ILCompiler.ReadyToRun/CodeGen/ReadyToRunContainerFormat.csAdded Wasm enum value to container format options
src/coreclr/tools/aot/ILCompiler.ReadyToRun/ClassDiagram1.cdAdded class diagram file (appears unrelated to Wasm implementation)
src/coreclr/tools/Common/JitInterface/CorInfoImpl.csImplemented CompileWasmStub to emit placeholder bytecode for Wasm methods
src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.csCore Wasm module writer implementation handling section generation and export
src/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.csWasm type system definitions and encoding utilities
src/coreclr/tools/Common/Compiler/ObjectWriter/SectionWriter.csAdded WriteUtf8StringNoNull helper method for Wasm string encoding
src/coreclr/tools/Common/Compiler/ObjectWriter/ObjectWriter.csChanged visibility modifiers to enable WasmObjectWriter inheritance

Comment threadsrc/coreclr/tools/Common/JitInterface/CorInfoImpl.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/JitInterface/CorInfoImpl.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs Outdated
adamperlinand others added 10 commits December 2, 2025 11:22
…WasmNative.cs
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
…WasmObjectWriter.cs
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
…r.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…r.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…r.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…Run.csproj
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…r.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
@am11am11 added the arch-wasm WebAssembly architecture label Dec 2, 2025
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-wasm': @lewing, @pavelsavara
See info in area-owners.md if you want to be subscribed.

Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs Outdated
@adamperlin

Copy link
Copy Markdown
ContributorAuthor

@SingleAccretion thank you for your comments! I think I've addressed them, please feel free to take another look!

Comment threadsrc/coreclr/tools/aot/crossgen2/Program.cs
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated

@jkoritzinskyjkoritzinsky left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM for a v0

@SingleAccretionSingleAccretion 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.

LGTM with some comments.

Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/ObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
@adamperlin
adamperlin merged commit 2316313 into dotnet:mainDec 8, 2025
94 of 96 checks passed
adamperlin added a commit that referenced this pull request Dec 9, 2025
This PR reverts the behavior from #122111 which stubs out a method
instead of calling the JIT for the crossgen Wasm target. Now, the JIT
will be invoked as normal so that the output of method codegen can be
placed in a simple object file.
Output code currently won't run (I tried this) because we aren't yet
emitting a correct local count at the beginning of compiled methods.
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jan 8, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-ReadyToRun

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@adamperlin@am11@kg@pavelsavara@jkoritzinsky@MichalStrehovsky@SingleAccretion
, '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

Crossgen Wasm Object Writer V0 - #122111

Merged
adamperlin merged 27 commits into
dotnet:mainfrom
adamperlin:adamperlin/wasm-r2r-object-writer
Dec 8, 2025
Merged

Crossgen Wasm Object Writer V0#122111
adamperlin merged 27 commits into
dotnet:mainfrom
adamperlin:adamperlin/wasm-r2r-object-writer

Conversation

@adamperlin

Copy link
Copy Markdown
Contributor

This is the first prototype of a Wasm object writer for crossgen that only writes out method bodies. It builds the minimum module structure which is needed to declare and export the module bodies so that the resulting module can be loaded and method bodies can be called by an external loader. I have tested the output with a simple JavaScript loader that instantiates the module and calls one of the exports.

What IS handled

Emitting simple method bodies from an assembly that have no relocations or external dependencies of any kind.

What is NOT handled

Relocations and any metadata attached to compiled methods.

R2R format envelope (the plan is to embed this in the data section in a future PR)

R2R metadata is currently unused.

Signature generation to meet ABI requirements

Right now, there is a single i32 -> i32 signature which is used as a placeholder for any method. Later work will need to build support for generating and storing wasm-level type signatures for JIT compiled methods.

JIT Integration

Currently, the JIT is not called (I believe it will hit asserts on the Wasm target until #121973 is in). Instead, a simple (i32.const 0) (return) stub is emitted for any JIT calls.

…x wasm arch+os target validation, add obj-format option for Wasm
It currently only handles writing method body nodes to the code section,
in addition to building the type, function, and exports section.
It will export all written methods so that they can be called when the
module is loaded.
Comment threadsrc/coreclr/tools/aot/ILCompiler.ReadyToRun/ClassDiagram1.cd Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR introduces the first prototype of a WebAssembly object writer for crossgen2, enabling the compilation toolchain to output Wasm modules. The implementation focuses on emitting method bodies with minimal module structure required for loading and calling exported functions, while deferring relocations, R2R metadata, and proper ABI signature handling to future work.

Key Changes

  • Added support for Wasm as a valid target architecture and container format in crossgen2
  • Implemented core Wasm module writing infrastructure including section builders for Type, Function, Export, and Code sections
  • Created a temporary stub mechanism to bypass JIT compilation for Wasm32 architecture until proper codegen support is available

Reviewed changes

Copilot reviewed 10 out of 10 changed files in this pull request and generated 15 comments.

Show a summary per file
FileDescription
src/coreclr/tools/aot/crossgen2/Program.csAdded Wasm to allowed non-composite container formats
src/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.csAdded "wasm" architecture and "wasi" OS to valid options, plus "wasm" output format
src/coreclr/tools/aot/ILCompiler.ReadyToRun/ILCompiler.ReadyToRun.csprojIncluded new Wasm object writer files (contains developer-specific path that should be removed)
src/coreclr/tools/aot/ILCompiler.ReadyToRun/CodeGen/ReadyToRunObjectWriter.csAdded factory method to create WasmObjectWriter with ABI context
src/coreclr/tools/aot/ILCompiler.ReadyToRun/CodeGen/ReadyToRunContainerFormat.csAdded Wasm enum value to container format options
src/coreclr/tools/aot/ILCompiler.ReadyToRun/ClassDiagram1.cdAdded class diagram file (appears unrelated to Wasm implementation)
src/coreclr/tools/Common/JitInterface/CorInfoImpl.csImplemented CompileWasmStub to emit placeholder bytecode for Wasm methods
src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.csCore Wasm module writer implementation handling section generation and export
src/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.csWasm type system definitions and encoding utilities
src/coreclr/tools/Common/Compiler/ObjectWriter/SectionWriter.csAdded WriteUtf8StringNoNull helper method for Wasm string encoding
src/coreclr/tools/Common/Compiler/ObjectWriter/ObjectWriter.csChanged visibility modifiers to enable WasmObjectWriter inheritance

Comment threadsrc/coreclr/tools/Common/JitInterface/CorInfoImpl.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/JitInterface/CorInfoImpl.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs Outdated
adamperlinand others added 10 commits December 2, 2025 11:22
…WasmNative.cs
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
…WasmObjectWriter.cs
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
…r.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…r.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…r.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…Run.csproj
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…r.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
@am11am11 added the arch-wasm WebAssembly architecture label Dec 2, 2025
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-wasm': @lewing, @pavelsavara
See info in area-owners.md if you want to be subscribed.

Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs Outdated
@adamperlin

Copy link
Copy Markdown
ContributorAuthor

@SingleAccretion thank you for your comments! I think I've addressed them, please feel free to take another look!

Comment threadsrc/coreclr/tools/aot/crossgen2/Program.cs
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated

@jkoritzinskyjkoritzinsky left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM for a v0

@SingleAccretionSingleAccretion 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.

LGTM with some comments.

Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/ObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
@adamperlin
adamperlin merged commit 2316313 into dotnet:mainDec 8, 2025
94 of 96 checks passed
adamperlin added a commit that referenced this pull request Dec 9, 2025
This PR reverts the behavior from #122111 which stubs out a method
instead of calling the JIT for the crossgen Wasm target. Now, the JIT
will be invoked as normal so that the output of method codegen can be
placed in a simple object file.
Output code currently won't run (I tried this) because we aren't yet
emitting a correct local count at the beginning of compiled methods.
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jan 8, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-ReadyToRun

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@adamperlin@am11@kg@pavelsavara@jkoritzinsky@MichalStrehovsky@SingleAccretion
, '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

Crossgen Wasm Object Writer V0 - #122111

Merged
adamperlin merged 27 commits into
dotnet:mainfrom
adamperlin:adamperlin/wasm-r2r-object-writer
Dec 8, 2025
Merged

Crossgen Wasm Object Writer V0#122111
adamperlin merged 27 commits into
dotnet:mainfrom
adamperlin:adamperlin/wasm-r2r-object-writer

Conversation

@adamperlin

Copy link
Copy Markdown
Contributor

This is the first prototype of a Wasm object writer for crossgen that only writes out method bodies. It builds the minimum module structure which is needed to declare and export the module bodies so that the resulting module can be loaded and method bodies can be called by an external loader. I have tested the output with a simple JavaScript loader that instantiates the module and calls one of the exports.

What IS handled

Emitting simple method bodies from an assembly that have no relocations or external dependencies of any kind.

What is NOT handled

Relocations and any metadata attached to compiled methods.

R2R format envelope (the plan is to embed this in the data section in a future PR)

R2R metadata is currently unused.

Signature generation to meet ABI requirements

Right now, there is a single i32 -> i32 signature which is used as a placeholder for any method. Later work will need to build support for generating and storing wasm-level type signatures for JIT compiled methods.

JIT Integration

Currently, the JIT is not called (I believe it will hit asserts on the Wasm target until #121973 is in). Instead, a simple (i32.const 0) (return) stub is emitted for any JIT calls.

…x wasm arch+os target validation, add obj-format option for Wasm
It currently only handles writing method body nodes to the code section,
in addition to building the type, function, and exports section.
It will export all written methods so that they can be called when the
module is loaded.
Comment threadsrc/coreclr/tools/aot/ILCompiler.ReadyToRun/ClassDiagram1.cd Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR introduces the first prototype of a WebAssembly object writer for crossgen2, enabling the compilation toolchain to output Wasm modules. The implementation focuses on emitting method bodies with minimal module structure required for loading and calling exported functions, while deferring relocations, R2R metadata, and proper ABI signature handling to future work.

Key Changes

  • Added support for Wasm as a valid target architecture and container format in crossgen2
  • Implemented core Wasm module writing infrastructure including section builders for Type, Function, Export, and Code sections
  • Created a temporary stub mechanism to bypass JIT compilation for Wasm32 architecture until proper codegen support is available

Reviewed changes

Copilot reviewed 10 out of 10 changed files in this pull request and generated 15 comments.

Show a summary per file
FileDescription
src/coreclr/tools/aot/crossgen2/Program.csAdded Wasm to allowed non-composite container formats
src/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.csAdded "wasm" architecture and "wasi" OS to valid options, plus "wasm" output format
src/coreclr/tools/aot/ILCompiler.ReadyToRun/ILCompiler.ReadyToRun.csprojIncluded new Wasm object writer files (contains developer-specific path that should be removed)
src/coreclr/tools/aot/ILCompiler.ReadyToRun/CodeGen/ReadyToRunObjectWriter.csAdded factory method to create WasmObjectWriter with ABI context
src/coreclr/tools/aot/ILCompiler.ReadyToRun/CodeGen/ReadyToRunContainerFormat.csAdded Wasm enum value to container format options
src/coreclr/tools/aot/ILCompiler.ReadyToRun/ClassDiagram1.cdAdded class diagram file (appears unrelated to Wasm implementation)
src/coreclr/tools/Common/JitInterface/CorInfoImpl.csImplemented CompileWasmStub to emit placeholder bytecode for Wasm methods
src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.csCore Wasm module writer implementation handling section generation and export
src/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.csWasm type system definitions and encoding utilities
src/coreclr/tools/Common/Compiler/ObjectWriter/SectionWriter.csAdded WriteUtf8StringNoNull helper method for Wasm string encoding
src/coreclr/tools/Common/Compiler/ObjectWriter/ObjectWriter.csChanged visibility modifiers to enable WasmObjectWriter inheritance

Comment threadsrc/coreclr/tools/Common/JitInterface/CorInfoImpl.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/JitInterface/CorInfoImpl.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs Outdated
adamperlinand others added 10 commits December 2, 2025 11:22
…WasmNative.cs
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
…WasmObjectWriter.cs
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
…r.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…r.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…r.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…Run.csproj
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…r.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
@am11am11 added the arch-wasm WebAssembly architecture label Dec 2, 2025
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-wasm': @lewing, @pavelsavara
See info in area-owners.md if you want to be subscribed.

Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
Comment threadsrc/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.cs Outdated
@adamperlin

Copy link
Copy Markdown
ContributorAuthor

@SingleAccretion thank you for your comments! I think I've addressed them, please feel free to take another look!

Comment threadsrc/coreclr/tools/aot/crossgen2/Program.cs
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated

@jkoritzinskyjkoritzinsky left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM for a v0

@SingleAccretionSingleAccretion 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.

LGTM with some comments.

Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/ObjectWriter.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
@adamperlin
adamperlin merged commit 2316313 into dotnet:mainDec 8, 2025
94 of 96 checks passed
adamperlin added a commit that referenced this pull request Dec 9, 2025
This PR reverts the behavior from #122111 which stubs out a method
instead of calling the JIT for the crossgen Wasm target. Now, the JIT
will be invoked as normal so that the output of method codegen can be
placed in a simple object file.
Output code currently won't run (I tried this) because we aren't yet
emitting a correct local count at the beginning of compiled methods.
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jan 8, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-ReadyToRun

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants

@adamperlin@am11@kg@pavelsavara@jkoritzinsky@MichalStrehovsky@SingleAccretion