Repository navigation
[wasm] Emit producers and build_id custom sections (native, webcil, R2R) - #130768
Open
pavelsavara with Copilot wants to merge 11 commits into
Open
pavelsavara with Copilot wants to merge 11 commits into
pavelsavara with Copilot wants to merge 11 commits into
Conversation
Co-authored-by: pavelsavara <271576+pavelsavara@users.noreply.github.com>
Co-authored-by: pavelsavara <271576+pavelsavara@users.noreply.github.com>
|
Azure Pipelines: Successfully started running 4 pipeline(s). 11 pipeline(s) were filtered out due to trigger conditions. There may be pipelines that require an authorized user to comment /azp run to run. |
Open
3 tasks
pavelsavara
temporarily deployed
to
copilot-pat-pool
July 15, 2026 20:35 — with
GitHub Actions
Inactive
pavelsavara
temporarily deployed
to
copilot-pat-pool
July 15, 2026 20:36 — with
GitHub Actions
Inactive
Contributor
There was a problem hiding this comment.
Pull request overview
This PR prototypes emitting WebAssembly tool-conventions custom sections (producers, build_id) and surfacing a buildId value through the browser-wasm JavaScript API, wiring it through the Mono/CoreCLR relink pipelines and stamping WebCIL/R2R wasm outputs.
Changes:
- Add a reusable managed
WasmCustomSectionWriterand an MSBuild task to generate a linkable wasm object contributing.NETentries to theproducerssection during relink. - Plumb
WasmNativeBuildIdthrough build targets/tasks and exposeruntimeBuildInfo.buildIdin the JS public API surface. - Add WBT coverage for relink/webcil metadata sections and a design doc describing the approach.
Reviewed changes
Copilot reviewed 38 out of 42 changed files in this pull request and generated 8 comments.
Show a summary per file
| File | Description |
|---|---|
| src/tasks/WasmAppBuilder/WebcilConverter.cs | Exposes build-id/version passthrough to Webcil converter. |
| src/tasks/WasmAppBuilder/WasmEmitProducersObject.cs | New task writing producers wasm object for linker merge. |
| src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilWasmWrapper.cs | Appends producers/build_id to wrapped WebCIL wasm. |
| src/tasks/Microsoft.NET.WebAssembly.Webcil/WebcilConverter.cs | Wires metadata options into wrapper output. |
| src/tasks/Microsoft.NET.WebAssembly.Webcil/Microsoft.NET.WebAssembly.Webcil.csproj | Links shared custom-section writer into task assembly. |
| src/tasks/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks/ConvertDllsToWebCil.cs | Passes build-id/product version into WebCIL conversion. |
| src/native/rollup.config.defines.js | Adds buildId rollup constant from env. |
| src/native/libs/System.Native.Browser/native/index.ts | Overrides runtimeBuildInfo.buildId from relinked native module. |
| src/native/libs/System.Native.Browser/libSystem.Native.Browser.footer.js | Exposes WASM_BUILD_ID via $DOTNET during emcc link. |
| src/native/libs/Common/JavaScript/types/public-api.ts | Extends public RuntimeAPI typing with buildId. |
| src/native/libs/Common/JavaScript/types/ems-ambient.ts | Adds buildId to emscripten ambient DOTNET shape. |
| src/native/libs/Common/JavaScript/loader/index.ts | Seeds runtimeBuildInfo.buildId from rollup constant. |
| src/native/libs/Common/JavaScript/loader/dotnet.d.ts | Updates generated public typings for buildId. |
| src/mono/wasm/Wasm.Build.Tests/NativeRebuildTests/WasmMetadataSectionsTests.cs | New tests validating producers/build_id emission. |
| src/mono/wasm/build/WasmApp.Common.targets | Forces native relink when WasmNativeBuildId is set. |
| src/mono/sample/wasm/Directory.Build.targets | Propagates WasmNativeBuildId through nested builds. |
| src/mono/sample/wasm/browser-advanced/Wasm.Advanced.Sample.csproj | Sample configuration updates (currently problematic). |
| src/mono/nuget/Microsoft.NET.Workload.Mono.Toolchain.Current.Manifest/WorkloadManifest.targets.in | Treats WasmNativeBuildId as relink-triggering. |
| src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targets | Passes build-id/version into ConvertDllsToWebCIL task. |
| src/mono/browser/runtime/types/internal.ts | Adds buildId to emscriptenBuildOptions typing. |
| src/mono/browser/runtime/types/index.ts | Extends runtime API typing with buildId. |
| src/mono/browser/runtime/rollup.config.js | Adds buildId constant in mono runtime rollup config. |
| src/mono/browser/runtime/loader/globals.ts | Formatting-only changes. |
| src/mono/browser/runtime/loader/assets.ts | Formatting-only changes. |
| src/mono/browser/runtime/globals.ts | Copies buildId from relinked module into runtimeBuildInfo. |
| src/mono/browser/runtime/exports.ts | Seeds runtimeBuildInfo.buildId from rollup constant. |
| src/mono/browser/runtime/es6/dotnet.es6.lib.js | Plumbs WASM_BUILD_ID into emcc-evaluated options blob. |
| src/mono/browser/runtime/dotnet.d.ts | Updates generated public typings for buildId. |
| src/mono/browser/build/BrowserWasmApp.targets | Mono relink: emits producers object + build-id linker/env wiring. |
| src/mono/browser/build/BrowserWasmApp.CoreCLR.targets | CoreCLR relink: emits producers object + build-id linker/env wiring. |
| src/mono/browser/browser.proj | Treats WasmNativeBuildId as runtime-pack defaultable property. |
| src/coreclr/tools/Common/Wasm/WasmCustomSectionWriter.cs | New encoder/merger for producers/build_id custom sections. |
| src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs | Stamps producers/build_id into R2R webcil wasm output. |
| src/coreclr/tools/aot/ILCompiler.ReadyToRun/ILCompiler.ReadyToRun.csproj | Links shared custom-section writer into ILC tool. |
| src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/ReadyToRunCodegenCompilationBuilder.cs | Plumbs wasm build-id option through compilation pipeline. |
| src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/ReadyToRunCodegenCompilation.cs | Carries wasm build-id into object emission. |
| src/coreclr/tools/aot/ILCompiler.ReadyToRun/CodeGen/ReadyToRunObjectWriter.cs | Passes wasm build-id through to WasmObjectWriter. |
| src/coreclr/tools/aot/crossgen2/Properties/Resources.resx | Adds help text for new crossgen2 option. |
| src/coreclr/tools/aot/crossgen2/Program.cs | Wires new option into ReadyToRun builder. |
| src/coreclr/tools/aot/crossgen2/Crossgen2RootCommand.cs | Adds --wasm-native-build-id option. |
| src/coreclr/hosts/corerun/wasm/libCorerun.extpost.js | Adds buildId field to corerun runtimeBuildInfo. |
| docs/design/mono/wasm-custom-sections.md | Design doc describing custom section strategy and properties. |
11 of 44 tasks
Resolve Browser WASM custom-section conflicts with the current WebCIL writer and app-relink infrastructure. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This was referenced Oct 1, 2026
Open
Resolve ReadyToRun WebCIL conflicts while preserving build IDs, debug information, and symbol maps. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Enable Emscripten's producers-section setting for Mono and CoreCLR links so the metadata merged by wasm-ld survives post-link processing. Cover both enabled and disabled emission. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Use endian-safe WASM parsing, escape generated build IDs, fail invalid Webcil IDs early, retain task exception details, and restore the Browser runtime's linted formatting. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This was referenced Oct 26, 2026
Patch a project-local copy of dotnet.native.wasm before static asset fingerprinting instead of forcing a native relink. Flow the normalized ID through boot configuration and keep relinked producers support unchanged. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Stamp relinked project-local modules in place and keep copied runtime-pack modules on the standard build and publish asset paths. This preserves framework materialization and avoids duplicate publish candidates. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Route the build-stamped runtime module only through Wasm build candidates so standard publish copying cannot place it at the publish root. Update the clean regression to verify the stamped framework materialization directly. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Contributor
|
Tagging subscribers to 'arch-wasm': @lewing, @pavelsavara |
pavelsavara
marked this pull request as ready for review
November 3, 2026 16:43
pavelsavara
requested review from
MichalStrehovsky,
akoeplinger,
ilonatommy,
lewing and
maraf
as code owners
November 3, 2026 16:43
|
Azure Pipelines: Successfully started running 4 pipeline(s). 11 pipeline(s) were filtered out due to trigger conditions. There may be pipelines that require an authorized user to comment /azp run to run. |
This branch was previously deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Emits the two WebAssembly tool-conventions custom sections —
producersandbuild_id— into WebAssembly artifacts produced by the .NET toolchain for both Mono and CoreCLR.Where the sections are emitted
producersbuild_iddotnet.native.wasmwasm-ldduring native relink and preserved through EmscriptenWebcilWasmWrapper$(WasmNativeBuildId)or per-file SHA-256 content hashWebCilObjectWriter--wasm-native-build-idor a content hashAll paths reuse
WasmCustomSectionWriterfor custom-section encoding.Workload-free
build_id$(WasmNativeBuildId)accepts a hexadecimal value and no longer forces a native relink or requireswasm-tools.WasmStampBuildId:fx/.../_frameworkmaterialization without enrolling it in normal publish copying;@(FileWrites)for clean and incrementality.The shared runtime-pack/NuGet file is never modified. The normalized ID is also emitted into the boot configuration so
runtimeBuildInfo.buildIdagrees with the stamped Wasm module without a native relink.Invalid IDs fail in the managed task before asset processing.
producersThe .NET entries are:
language=C#processed-by=<Mono|CoreCLR|WebCIL>sdk=.NETFor native relinks,
WasmEmitProducersObjectcontributes a small relocatable object.wasm-ldmerges it with compiler-provided metadata, and-sEMIT_PRODUCERS_SECTION=1prevents Emscripten from stripping the merged section. Set$(WasmEmitProducersSection)=falseto disable it.JavaScript exposure
runtimeBuildInfo.buildIdreceives the application ID through generated boot configuration. Relinked native modules may also provide the same value through their Emscripten footer; the native value takes precedence.MSBuild properties
WasmNativeBuildIdWasmEmitProducersSectionproducersmetadata. Defaults totrue.Tests
WasmMetadataSectionsTestscovers:CleanTestsverifies:fx/.../_framework;dotnet-producers.oare removed by clean.Local validation
Passed — Browser/CoreCLR baseline:
0 warnings, 0 errors.
Passed — WebAssembly pack and runtime WebAssembly SDK rebuilds.
Passed — workload-free metadata tests:
4 passed, 0 failed, 0 skipped.
Passed — stamped build/clean regression:
1 passed, 0 failed, 0 skipped.
Passed — explicit CoreCLR native relink with the current targets/tasks:
.wasmfiles at the publish root;build_idis1a2b3c4d5e6f7788;--build-id.Passed — build and publish with
WasmBuildNative=falseand a pinned ID:Passed — runtime startup under Node:
runtimeBuildInfo.buildIdandgetConfig().buildIdreport the normalized ID.Passed — incrementality:
Passed — CoreCLR Browser TypeScript rollup and Mono Browser lint.
The plain full build remains independently blocked in
WasmAppHost.csprojby the installed SDK reporting:The same error reproduced after an MSBuild clean and while building the SDK pack directly. Disabling static-web-assets processing only for the local baseline avoids that unrelated SDK issue. The affected task assemblies, loader assets, workload-free tests, build/publish paths, clean path, and explicit relink path were validated separately as listed above.
The Mono targets parse successfully and Mono Browser lint passes. A Mono runtime build was not run locally because this worktree contains CoreCLR artifacts.
Not included / deferred
Design notes:
docs/design/mono/wasm-custom-sections.md.Merged current
mainat5114fa5cd78d9da73b195c2cd3b0924e5495687ein merge commita94b7d84a6bf5bf8649181c040dedadf65e9c978. This includes the serial Helix dependency-staging fix from #136764.Resolves #96334
Resolves #91049
Note
This PR description was updated with the assistance of GitHub Copilot.