Add typed self-counting WASM sections - #131771

Merged
jtschuster merged 16 commits into
mainfrom
wasm-writer-typed-sections
Aug 17, 2026
Merged

Add typed self-counting WASM sections#131771
jtschuster merged 16 commits into
mainfrom
wasm-writer-typed-sections

Conversation

@jtschuster

@jtschusterjtschuster commented Aug 3, 2026

Copy link
Copy Markdown
Member

Summary

This is the second PR in the WASM object-writer stack and builds on #131770.

  • Replaces shared functionality in WasmSection and WebCilSection for emitting a SectionWriter's data to SectionDataEmitter.
  • Change WebCilSection's base class from WasmSection to SectionDataEmitter to clarify that it's not an actual custom Wasm section.
  • Add typed vector sections for imports, functions, globals, exports, and elements. Adding entries / data to these sections should be done through their respective methods that take an entry object and the corresponding SectionWriter. This allows them to accurately track the count of entries in the section.
  • Type and Code are externally counted since entries can be added to from the base ObjectWriter.
  • Remove the corresponding manual counters and count-prefix rewriting from the writer.

The emitted module structure and existing writer behavior are preserved while making section counts follow directly from successfully written rows.

Stack

  1. Extract WASM section model #131770 — Extract WASM section model
  2. Add typed self-counting WASM sections #131771 — Add typed self-counting WASM sections (this PR)
  3. Rename WasmObjectWriter to WebCilObjectWriter #131772 — Introduce WebCIL object writer type
  4. Move shared WASM logic to base writer #131778 — Move shared WASM logic to base writer

Note

This PR description was generated with GitHub Copilot assistance.

jtschusterand others added 2 commits August 3, 2026 10:46
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@jtschuster
jtschuster marked this pull request as ready for review August 3, 2026 21:03
CopilotAI lite review requested due to automatic review settings August 3, 2026 21:03
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

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 refactors WASM section emission in the CoreCLR object writer to use typed, self-counting “vector” sections (imports/functions/globals/exports/elements), moving per-row encoding into section-specific WriteEntry implementations and eliminating manual counters / count-prefix patching in the writer.

Changes:

  • Introduces WasmVectorSection / WasmSection<TEntry> abstractions that prepend the vector length automatically and increment entry counts only after successful entry encoding.
  • Updates WasmObjectWriter to use Add* APIs that delegate row encoding/counting to typed section implementations, and finalizes Type/Code counts via an externally-counted section type.
  • Moves WasmExportKind to a shared location (WasmNative.cs) for reuse by section code.

Reviewed changes

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

FileDescription
src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.csSwitches writer logic to typed sections (Add* methods) and removes manual count handling; finalizes external counts for Type/Code.
src/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.csAdds shared WasmExportKind enum for export section encoding.
src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSections.csAdds typed GetSection<T> helpers to retrieve sections safely by name/index.
src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.csReplaces PrependCount with a generalized content-prefix mechanism and adds self-counting vector section implementations for key WASM sections.

CopilotAI review requested due to automatic review settings August 6, 2026 18:07
CopilotAI reviewed Aug 6, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Note

This error may be related to your runner configuration. You can now configure runners for Copilot code review separately from Copilot cloud agent by creating a copilot-code-review.yml file with your setup steps. Read the docs for details.

Base automatically changed from wasm-writer-section-model to mainAugust 6, 2026 19:08
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSections.cs Outdated

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

I just had two nits, but otherwise this looks good to me!

CopilotAI review requested due to automatic review settings August 11, 2026 13:42

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 7 out of 8 changed files in this pull request and generated 1 comment.

Suppressed comments (2)

src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs:529

  • The local section is never used; this produces an unused-local warning. You can keep the side effect (ensuring the section exists) without storing the return value.
 SectionDataEmitter section = GetOrCreateSection(WasmObjectNodeSection.DataCountSection, out SectionWriter writer);

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.cs:154

  • WasmExternallyCountedSection.EmitToStream only asserts that the entry count was set. In non-Debug builds this can silently emit a zero count if SetEntryCount is missed, producing an invalid/incorrect module without a clear failure. Consider throwing in release builds as well.
 public override int EmitToStream(Stream outputFileStream)
{
Debug.Assert(_entryCountSet);
return base.EmitToStream(outputFileStream);
}

Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings August 12, 2026 13:23

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Suppressed comments (4)

src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs:530

  • SectionDataEmitter section is assigned but never used, which can trigger CS0219 (and may fail the build if warnings are treated as errors). The call is only needed to obtain the writer / ensure the section exists.
 {
SectionDataEmitter section = GetOrCreateSection(WasmObjectNodeSection.DataCountSection, out SectionWriter writer);
writer.WriteULEB128(NumDataSegments); // number of data segments

src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs:234

  • Avoid var here: the type is not apparent from the right-hand side (base.GetOrCreateSection(...)). This may violate the repo's C# style settings and is less readable than using the explicit SectionWriter type.
 private TSection GetOrCreateSection<TSection>(ObjectNodeSection section)
where TSection : SectionDataEmitter
{
var writer = base.GetOrCreateSection(section);
return _sections.GetSection<TSection>(writer.SectionIndex);
}

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.cs:40

  • SectionDataEmitter assumes stream is non-null (it is dereferenced via Length/Position later). Adding a guard here produces a clearer exception and avoids null silently flowing into later emission logic.
 public SectionDataEmitter(Stream stream, Utf8String name, int sectionIndex)
{
ContentReadStream = stream;
SectionName = name;
SectionIndex = sectionIndex;

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSections.cs:27

  • GetSection<TSection> relies on an unchecked cast. If the section mapping is ever wrong, this will throw an InvalidCastException with little context. A Debug.Assert keeps release perf the same while making the failure much easier to diagnose in Debug builds.
 public TSection GetSection<TSection>(int sectionIndex)
where TSection : SectionDataEmitter
{
SectionDataEmitter section = _sections[sectionIndex];
return (TSection)section;
}

CopilotAI review requested due to automatic review settings August 12, 2026 14:02

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Suppressed comments (5)

src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs:529

  • The local variable section is assigned but never used. This can trigger analyzer warnings and makes the intent less clear; the return value can be ignored.
 SectionDataEmitter section = GetOrCreateSection(WasmObjectNodeSection.DataCountSection, out SectionWriter writer);

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSections.cs:6

  • using System; is unused in this file and can trigger IDE0005 (remove unnecessary usings).
using System;
using System.Collections.Generic;
using System.Diagnostics;

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.cs:6

  • using System.Collections.Generic; is unused in this file and can trigger IDE0005 (remove unnecessary usings).
using System;
using System.Collections.Generic;
using System.Diagnostics;

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmDataSegment.cs:7

  • using System.Collections.Generic; is unused in this file and can trigger IDE0005 (remove unnecessary usings).
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmDataSection.cs:23

  • The name parameter on WasmDataSection's constructor is no longer used after removing the WasmSection base class. This can trigger unused-parameter analyzers and is misleading for callers.
 public WasmDataSection(List<WasmDataSegment> segments, Utf8String name, int contentAlign = 1)
{
_segments = segments;
_contentAlign = contentAlign;
}

@jtschuster

Copy link
Copy Markdown
MemberAuthor

Could I get a review/re-review if anyone gets a chance?

@jtschuster

Copy link
Copy Markdown
MemberAuthor

/ba-g Failures are unrelated, WASM failure is #131924

@jtschuster
jtschuster merged commit 878cb65 into mainAug 17, 2026
99 of 103 checks passed
@jtschuster
jtschuster deleted the wasm-writer-typed-sections branch August 17, 2026 17:33
@dotnet-milestone-botdotnet-milestone-botBot added this to the 12.0-preview1 milestone Aug 18, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants

@jtschuster@adamperlin
, '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

Add typed self-counting WASM sections - #131771

Merged
jtschuster merged 16 commits into
mainfrom
wasm-writer-typed-sections
Aug 17, 2026
Merged

Add typed self-counting WASM sections#131771
jtschuster merged 16 commits into
mainfrom
wasm-writer-typed-sections

Conversation

@jtschuster

@jtschusterjtschuster commented Aug 3, 2026

Copy link
Copy Markdown
Member

Summary

This is the second PR in the WASM object-writer stack and builds on #131770.

  • Replaces shared functionality in WasmSection and WebCilSection for emitting a SectionWriter's data to SectionDataEmitter.
  • Change WebCilSection's base class from WasmSection to SectionDataEmitter to clarify that it's not an actual custom Wasm section.
  • Add typed vector sections for imports, functions, globals, exports, and elements. Adding entries / data to these sections should be done through their respective methods that take an entry object and the corresponding SectionWriter. This allows them to accurately track the count of entries in the section.
  • Type and Code are externally counted since entries can be added to from the base ObjectWriter.
  • Remove the corresponding manual counters and count-prefix rewriting from the writer.

The emitted module structure and existing writer behavior are preserved while making section counts follow directly from successfully written rows.

Stack

  1. Extract WASM section model #131770 — Extract WASM section model
  2. Add typed self-counting WASM sections #131771 — Add typed self-counting WASM sections (this PR)
  3. Rename WasmObjectWriter to WebCilObjectWriter #131772 — Introduce WebCIL object writer type
  4. Move shared WASM logic to base writer #131778 — Move shared WASM logic to base writer

Note

This PR description was generated with GitHub Copilot assistance.

jtschusterand others added 2 commits August 3, 2026 10:46
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@jtschuster
jtschuster marked this pull request as ready for review August 3, 2026 21:03
CopilotAI lite review requested due to automatic review settings August 3, 2026 21:03
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

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 refactors WASM section emission in the CoreCLR object writer to use typed, self-counting “vector” sections (imports/functions/globals/exports/elements), moving per-row encoding into section-specific WriteEntry implementations and eliminating manual counters / count-prefix patching in the writer.

Changes:

  • Introduces WasmVectorSection / WasmSection<TEntry> abstractions that prepend the vector length automatically and increment entry counts only after successful entry encoding.
  • Updates WasmObjectWriter to use Add* APIs that delegate row encoding/counting to typed section implementations, and finalizes Type/Code counts via an externally-counted section type.
  • Moves WasmExportKind to a shared location (WasmNative.cs) for reuse by section code.

Reviewed changes

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

FileDescription
src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.csSwitches writer logic to typed sections (Add* methods) and removes manual count handling; finalizes external counts for Type/Code.
src/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.csAdds shared WasmExportKind enum for export section encoding.
src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSections.csAdds typed GetSection<T> helpers to retrieve sections safely by name/index.
src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.csReplaces PrependCount with a generalized content-prefix mechanism and adds self-counting vector section implementations for key WASM sections.

CopilotAI review requested due to automatic review settings August 6, 2026 18:07
CopilotAI reviewed Aug 6, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Note

This error may be related to your runner configuration. You can now configure runners for Copilot code review separately from Copilot cloud agent by creating a copilot-code-review.yml file with your setup steps. Read the docs for details.

Base automatically changed from wasm-writer-section-model to mainAugust 6, 2026 19:08
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSections.cs Outdated

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

I just had two nits, but otherwise this looks good to me!

CopilotAI review requested due to automatic review settings August 11, 2026 13:42

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 7 out of 8 changed files in this pull request and generated 1 comment.

Suppressed comments (2)

src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs:529

  • The local section is never used; this produces an unused-local warning. You can keep the side effect (ensuring the section exists) without storing the return value.
 SectionDataEmitter section = GetOrCreateSection(WasmObjectNodeSection.DataCountSection, out SectionWriter writer);

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.cs:154

  • WasmExternallyCountedSection.EmitToStream only asserts that the entry count was set. In non-Debug builds this can silently emit a zero count if SetEntryCount is missed, producing an invalid/incorrect module without a clear failure. Consider throwing in release builds as well.
 public override int EmitToStream(Stream outputFileStream)
{
Debug.Assert(_entryCountSet);
return base.EmitToStream(outputFileStream);
}

Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings August 12, 2026 13:23

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Suppressed comments (4)

src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs:530

  • SectionDataEmitter section is assigned but never used, which can trigger CS0219 (and may fail the build if warnings are treated as errors). The call is only needed to obtain the writer / ensure the section exists.
 {
SectionDataEmitter section = GetOrCreateSection(WasmObjectNodeSection.DataCountSection, out SectionWriter writer);
writer.WriteULEB128(NumDataSegments); // number of data segments

src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs:234

  • Avoid var here: the type is not apparent from the right-hand side (base.GetOrCreateSection(...)). This may violate the repo's C# style settings and is less readable than using the explicit SectionWriter type.
 private TSection GetOrCreateSection<TSection>(ObjectNodeSection section)
where TSection : SectionDataEmitter
{
var writer = base.GetOrCreateSection(section);
return _sections.GetSection<TSection>(writer.SectionIndex);
}

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.cs:40

  • SectionDataEmitter assumes stream is non-null (it is dereferenced via Length/Position later). Adding a guard here produces a clearer exception and avoids null silently flowing into later emission logic.
 public SectionDataEmitter(Stream stream, Utf8String name, int sectionIndex)
{
ContentReadStream = stream;
SectionName = name;
SectionIndex = sectionIndex;

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSections.cs:27

  • GetSection<TSection> relies on an unchecked cast. If the section mapping is ever wrong, this will throw an InvalidCastException with little context. A Debug.Assert keeps release perf the same while making the failure much easier to diagnose in Debug builds.
 public TSection GetSection<TSection>(int sectionIndex)
where TSection : SectionDataEmitter
{
SectionDataEmitter section = _sections[sectionIndex];
return (TSection)section;
}

CopilotAI review requested due to automatic review settings August 12, 2026 14:02

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Suppressed comments (5)

src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs:529

  • The local variable section is assigned but never used. This can trigger analyzer warnings and makes the intent less clear; the return value can be ignored.
 SectionDataEmitter section = GetOrCreateSection(WasmObjectNodeSection.DataCountSection, out SectionWriter writer);

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSections.cs:6

  • using System; is unused in this file and can trigger IDE0005 (remove unnecessary usings).
using System;
using System.Collections.Generic;
using System.Diagnostics;

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.cs:6

  • using System.Collections.Generic; is unused in this file and can trigger IDE0005 (remove unnecessary usings).
using System;
using System.Collections.Generic;
using System.Diagnostics;

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmDataSegment.cs:7

  • using System.Collections.Generic; is unused in this file and can trigger IDE0005 (remove unnecessary usings).
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmDataSection.cs:23

  • The name parameter on WasmDataSection's constructor is no longer used after removing the WasmSection base class. This can trigger unused-parameter analyzers and is misleading for callers.
 public WasmDataSection(List<WasmDataSegment> segments, Utf8String name, int contentAlign = 1)
{
_segments = segments;
_contentAlign = contentAlign;
}

@jtschuster

Copy link
Copy Markdown
MemberAuthor

Could I get a review/re-review if anyone gets a chance?

@jtschuster

Copy link
Copy Markdown
MemberAuthor

/ba-g Failures are unrelated, WASM failure is #131924

@jtschuster
jtschuster merged commit 878cb65 into mainAug 17, 2026
99 of 103 checks passed
@jtschuster
jtschuster deleted the wasm-writer-typed-sections branch August 17, 2026 17:33
@dotnet-milestone-botdotnet-milestone-botBot added this to the 12.0-preview1 milestone Aug 18, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants

@jtschuster@adamperlin
, '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

Add typed self-counting WASM sections - #131771

Merged
jtschuster merged 16 commits into
mainfrom
wasm-writer-typed-sections
Aug 17, 2026
Merged

Add typed self-counting WASM sections#131771
jtschuster merged 16 commits into
mainfrom
wasm-writer-typed-sections

Conversation

@jtschuster

@jtschusterjtschuster commented Aug 3, 2026

Copy link
Copy Markdown
Member

Summary

This is the second PR in the WASM object-writer stack and builds on #131770.

  • Replaces shared functionality in WasmSection and WebCilSection for emitting a SectionWriter's data to SectionDataEmitter.
  • Change WebCilSection's base class from WasmSection to SectionDataEmitter to clarify that it's not an actual custom Wasm section.
  • Add typed vector sections for imports, functions, globals, exports, and elements. Adding entries / data to these sections should be done through their respective methods that take an entry object and the corresponding SectionWriter. This allows them to accurately track the count of entries in the section.
  • Type and Code are externally counted since entries can be added to from the base ObjectWriter.
  • Remove the corresponding manual counters and count-prefix rewriting from the writer.

The emitted module structure and existing writer behavior are preserved while making section counts follow directly from successfully written rows.

Stack

  1. Extract WASM section model #131770 — Extract WASM section model
  2. Add typed self-counting WASM sections #131771 — Add typed self-counting WASM sections (this PR)
  3. Rename WasmObjectWriter to WebCilObjectWriter #131772 — Introduce WebCIL object writer type
  4. Move shared WASM logic to base writer #131778 — Move shared WASM logic to base writer

Note

This PR description was generated with GitHub Copilot assistance.

jtschusterand others added 2 commits August 3, 2026 10:46
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@jtschuster
jtschuster marked this pull request as ready for review August 3, 2026 21:03
CopilotAI lite review requested due to automatic review settings August 3, 2026 21:03
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

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 refactors WASM section emission in the CoreCLR object writer to use typed, self-counting “vector” sections (imports/functions/globals/exports/elements), moving per-row encoding into section-specific WriteEntry implementations and eliminating manual counters / count-prefix patching in the writer.

Changes:

  • Introduces WasmVectorSection / WasmSection<TEntry> abstractions that prepend the vector length automatically and increment entry counts only after successful entry encoding.
  • Updates WasmObjectWriter to use Add* APIs that delegate row encoding/counting to typed section implementations, and finalizes Type/Code counts via an externally-counted section type.
  • Moves WasmExportKind to a shared location (WasmNative.cs) for reuse by section code.

Reviewed changes

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

FileDescription
src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.csSwitches writer logic to typed sections (Add* methods) and removes manual count handling; finalizes external counts for Type/Code.
src/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.csAdds shared WasmExportKind enum for export section encoding.
src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSections.csAdds typed GetSection<T> helpers to retrieve sections safely by name/index.
src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.csReplaces PrependCount with a generalized content-prefix mechanism and adds self-counting vector section implementations for key WASM sections.

CopilotAI review requested due to automatic review settings August 6, 2026 18:07
CopilotAI reviewed Aug 6, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Note

This error may be related to your runner configuration. You can now configure runners for Copilot code review separately from Copilot cloud agent by creating a copilot-code-review.yml file with your setup steps. Read the docs for details.

Base automatically changed from wasm-writer-section-model to mainAugust 6, 2026 19:08
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSections.cs Outdated

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

I just had two nits, but otherwise this looks good to me!

CopilotAI review requested due to automatic review settings August 11, 2026 13:42

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 7 out of 8 changed files in this pull request and generated 1 comment.

Suppressed comments (2)

src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs:529

  • The local section is never used; this produces an unused-local warning. You can keep the side effect (ensuring the section exists) without storing the return value.
 SectionDataEmitter section = GetOrCreateSection(WasmObjectNodeSection.DataCountSection, out SectionWriter writer);

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.cs:154

  • WasmExternallyCountedSection.EmitToStream only asserts that the entry count was set. In non-Debug builds this can silently emit a zero count if SetEntryCount is missed, producing an invalid/incorrect module without a clear failure. Consider throwing in release builds as well.
 public override int EmitToStream(Stream outputFileStream)
{
Debug.Assert(_entryCountSet);
return base.EmitToStream(outputFileStream);
}

Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings August 12, 2026 13:23

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Suppressed comments (4)

src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs:530

  • SectionDataEmitter section is assigned but never used, which can trigger CS0219 (and may fail the build if warnings are treated as errors). The call is only needed to obtain the writer / ensure the section exists.
 {
SectionDataEmitter section = GetOrCreateSection(WasmObjectNodeSection.DataCountSection, out SectionWriter writer);
writer.WriteULEB128(NumDataSegments); // number of data segments

src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs:234

  • Avoid var here: the type is not apparent from the right-hand side (base.GetOrCreateSection(...)). This may violate the repo's C# style settings and is less readable than using the explicit SectionWriter type.
 private TSection GetOrCreateSection<TSection>(ObjectNodeSection section)
where TSection : SectionDataEmitter
{
var writer = base.GetOrCreateSection(section);
return _sections.GetSection<TSection>(writer.SectionIndex);
}

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.cs:40

  • SectionDataEmitter assumes stream is non-null (it is dereferenced via Length/Position later). Adding a guard here produces a clearer exception and avoids null silently flowing into later emission logic.
 public SectionDataEmitter(Stream stream, Utf8String name, int sectionIndex)
{
ContentReadStream = stream;
SectionName = name;
SectionIndex = sectionIndex;

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSections.cs:27

  • GetSection<TSection> relies on an unchecked cast. If the section mapping is ever wrong, this will throw an InvalidCastException with little context. A Debug.Assert keeps release perf the same while making the failure much easier to diagnose in Debug builds.
 public TSection GetSection<TSection>(int sectionIndex)
where TSection : SectionDataEmitter
{
SectionDataEmitter section = _sections[sectionIndex];
return (TSection)section;
}

CopilotAI review requested due to automatic review settings August 12, 2026 14:02

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Suppressed comments (5)

src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs:529

  • The local variable section is assigned but never used. This can trigger analyzer warnings and makes the intent less clear; the return value can be ignored.
 SectionDataEmitter section = GetOrCreateSection(WasmObjectNodeSection.DataCountSection, out SectionWriter writer);

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSections.cs:6

  • using System; is unused in this file and can trigger IDE0005 (remove unnecessary usings).
using System;
using System.Collections.Generic;
using System.Diagnostics;

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.cs:6

  • using System.Collections.Generic; is unused in this file and can trigger IDE0005 (remove unnecessary usings).
using System;
using System.Collections.Generic;
using System.Diagnostics;

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmDataSegment.cs:7

  • using System.Collections.Generic; is unused in this file and can trigger IDE0005 (remove unnecessary usings).
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmDataSection.cs:23

  • The name parameter on WasmDataSection's constructor is no longer used after removing the WasmSection base class. This can trigger unused-parameter analyzers and is misleading for callers.
 public WasmDataSection(List<WasmDataSegment> segments, Utf8String name, int contentAlign = 1)
{
_segments = segments;
_contentAlign = contentAlign;
}

@jtschuster

Copy link
Copy Markdown
MemberAuthor

Could I get a review/re-review if anyone gets a chance?

@jtschuster

Copy link
Copy Markdown
MemberAuthor

/ba-g Failures are unrelated, WASM failure is #131924

@jtschuster
jtschuster merged commit 878cb65 into mainAug 17, 2026
99 of 103 checks passed
@jtschuster
jtschuster deleted the wasm-writer-typed-sections branch August 17, 2026 17:33
@dotnet-milestone-botdotnet-milestone-botBot added this to the 12.0-preview1 milestone Aug 18, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants

@jtschuster@adamperlin
, '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

Add typed self-counting WASM sections - #131771

Merged
jtschuster merged 16 commits into
mainfrom
wasm-writer-typed-sections
Aug 17, 2026
Merged

Add typed self-counting WASM sections#131771
jtschuster merged 16 commits into
mainfrom
wasm-writer-typed-sections

Conversation

@jtschuster

@jtschusterjtschuster commented Aug 3, 2026

Copy link
Copy Markdown
Member

Summary

This is the second PR in the WASM object-writer stack and builds on #131770.

  • Replaces shared functionality in WasmSection and WebCilSection for emitting a SectionWriter's data to SectionDataEmitter.
  • Change WebCilSection's base class from WasmSection to SectionDataEmitter to clarify that it's not an actual custom Wasm section.
  • Add typed vector sections for imports, functions, globals, exports, and elements. Adding entries / data to these sections should be done through their respective methods that take an entry object and the corresponding SectionWriter. This allows them to accurately track the count of entries in the section.
  • Type and Code are externally counted since entries can be added to from the base ObjectWriter.
  • Remove the corresponding manual counters and count-prefix rewriting from the writer.

The emitted module structure and existing writer behavior are preserved while making section counts follow directly from successfully written rows.

Stack

  1. Extract WASM section model #131770 — Extract WASM section model
  2. Add typed self-counting WASM sections #131771 — Add typed self-counting WASM sections (this PR)
  3. Rename WasmObjectWriter to WebCilObjectWriter #131772 — Introduce WebCIL object writer type
  4. Move shared WASM logic to base writer #131778 — Move shared WASM logic to base writer

Note

This PR description was generated with GitHub Copilot assistance.

jtschusterand others added 2 commits August 3, 2026 10:46
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@jtschuster
jtschuster marked this pull request as ready for review August 3, 2026 21:03
CopilotAI lite review requested due to automatic review settings August 3, 2026 21:03
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

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 refactors WASM section emission in the CoreCLR object writer to use typed, self-counting “vector” sections (imports/functions/globals/exports/elements), moving per-row encoding into section-specific WriteEntry implementations and eliminating manual counters / count-prefix patching in the writer.

Changes:

  • Introduces WasmVectorSection / WasmSection<TEntry> abstractions that prepend the vector length automatically and increment entry counts only after successful entry encoding.
  • Updates WasmObjectWriter to use Add* APIs that delegate row encoding/counting to typed section implementations, and finalizes Type/Code counts via an externally-counted section type.
  • Moves WasmExportKind to a shared location (WasmNative.cs) for reuse by section code.

Reviewed changes

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

FileDescription
src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.csSwitches writer logic to typed sections (Add* methods) and removes manual count handling; finalizes external counts for Type/Code.
src/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.csAdds shared WasmExportKind enum for export section encoding.
src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSections.csAdds typed GetSection<T> helpers to retrieve sections safely by name/index.
src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.csReplaces PrependCount with a generalized content-prefix mechanism and adds self-counting vector section implementations for key WASM sections.

CopilotAI review requested due to automatic review settings August 6, 2026 18:07
CopilotAI reviewed Aug 6, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Note

This error may be related to your runner configuration. You can now configure runners for Copilot code review separately from Copilot cloud agent by creating a copilot-code-review.yml file with your setup steps. Read the docs for details.

Base automatically changed from wasm-writer-section-model to mainAugust 6, 2026 19:08
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSections.cs Outdated

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

I just had two nits, but otherwise this looks good to me!

CopilotAI review requested due to automatic review settings August 11, 2026 13:42

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 7 out of 8 changed files in this pull request and generated 1 comment.

Suppressed comments (2)

src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs:529

  • The local section is never used; this produces an unused-local warning. You can keep the side effect (ensuring the section exists) without storing the return value.
 SectionDataEmitter section = GetOrCreateSection(WasmObjectNodeSection.DataCountSection, out SectionWriter writer);

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.cs:154

  • WasmExternallyCountedSection.EmitToStream only asserts that the entry count was set. In non-Debug builds this can silently emit a zero count if SetEntryCount is missed, producing an invalid/incorrect module without a clear failure. Consider throwing in release builds as well.
 public override int EmitToStream(Stream outputFileStream)
{
Debug.Assert(_entryCountSet);
return base.EmitToStream(outputFileStream);
}

Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings August 12, 2026 13:23

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Suppressed comments (4)

src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs:530

  • SectionDataEmitter section is assigned but never used, which can trigger CS0219 (and may fail the build if warnings are treated as errors). The call is only needed to obtain the writer / ensure the section exists.
 {
SectionDataEmitter section = GetOrCreateSection(WasmObjectNodeSection.DataCountSection, out SectionWriter writer);
writer.WriteULEB128(NumDataSegments); // number of data segments

src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs:234

  • Avoid var here: the type is not apparent from the right-hand side (base.GetOrCreateSection(...)). This may violate the repo's C# style settings and is less readable than using the explicit SectionWriter type.
 private TSection GetOrCreateSection<TSection>(ObjectNodeSection section)
where TSection : SectionDataEmitter
{
var writer = base.GetOrCreateSection(section);
return _sections.GetSection<TSection>(writer.SectionIndex);
}

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.cs:40

  • SectionDataEmitter assumes stream is non-null (it is dereferenced via Length/Position later). Adding a guard here produces a clearer exception and avoids null silently flowing into later emission logic.
 public SectionDataEmitter(Stream stream, Utf8String name, int sectionIndex)
{
ContentReadStream = stream;
SectionName = name;
SectionIndex = sectionIndex;

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSections.cs:27

  • GetSection<TSection> relies on an unchecked cast. If the section mapping is ever wrong, this will throw an InvalidCastException with little context. A Debug.Assert keeps release perf the same while making the failure much easier to diagnose in Debug builds.
 public TSection GetSection<TSection>(int sectionIndex)
where TSection : SectionDataEmitter
{
SectionDataEmitter section = _sections[sectionIndex];
return (TSection)section;
}

CopilotAI review requested due to automatic review settings August 12, 2026 14:02

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Suppressed comments (5)

src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs:529

  • The local variable section is assigned but never used. This can trigger analyzer warnings and makes the intent less clear; the return value can be ignored.
 SectionDataEmitter section = GetOrCreateSection(WasmObjectNodeSection.DataCountSection, out SectionWriter writer);

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSections.cs:6

  • using System; is unused in this file and can trigger IDE0005 (remove unnecessary usings).
using System;
using System.Collections.Generic;
using System.Diagnostics;

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.cs:6

  • using System.Collections.Generic; is unused in this file and can trigger IDE0005 (remove unnecessary usings).
using System;
using System.Collections.Generic;
using System.Diagnostics;

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmDataSegment.cs:7

  • using System.Collections.Generic; is unused in this file and can trigger IDE0005 (remove unnecessary usings).
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmDataSection.cs:23

  • The name parameter on WasmDataSection's constructor is no longer used after removing the WasmSection base class. This can trigger unused-parameter analyzers and is misleading for callers.
 public WasmDataSection(List<WasmDataSegment> segments, Utf8String name, int contentAlign = 1)
{
_segments = segments;
_contentAlign = contentAlign;
}

@jtschuster

Copy link
Copy Markdown
MemberAuthor

Could I get a review/re-review if anyone gets a chance?

@jtschuster

Copy link
Copy Markdown
MemberAuthor

/ba-g Failures are unrelated, WASM failure is #131924

@jtschuster
jtschuster merged commit 878cb65 into mainAug 17, 2026
99 of 103 checks passed
@jtschuster
jtschuster deleted the wasm-writer-typed-sections branch August 17, 2026 17:33
@dotnet-milestone-botdotnet-milestone-botBot added this to the 12.0-preview1 milestone Aug 18, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants

@jtschuster@adamperlin
, '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

Add typed self-counting WASM sections - #131771

Merged
jtschuster merged 16 commits into
mainfrom
wasm-writer-typed-sections
Aug 17, 2026
Merged

Add typed self-counting WASM sections#131771
jtschuster merged 16 commits into
mainfrom
wasm-writer-typed-sections

Conversation

@jtschuster

@jtschusterjtschuster commented Aug 3, 2026

Copy link
Copy Markdown
Member

Summary

This is the second PR in the WASM object-writer stack and builds on #131770.

  • Replaces shared functionality in WasmSection and WebCilSection for emitting a SectionWriter's data to SectionDataEmitter.
  • Change WebCilSection's base class from WasmSection to SectionDataEmitter to clarify that it's not an actual custom Wasm section.
  • Add typed vector sections for imports, functions, globals, exports, and elements. Adding entries / data to these sections should be done through their respective methods that take an entry object and the corresponding SectionWriter. This allows them to accurately track the count of entries in the section.
  • Type and Code are externally counted since entries can be added to from the base ObjectWriter.
  • Remove the corresponding manual counters and count-prefix rewriting from the writer.

The emitted module structure and existing writer behavior are preserved while making section counts follow directly from successfully written rows.

Stack

  1. Extract WASM section model #131770 — Extract WASM section model
  2. Add typed self-counting WASM sections #131771 — Add typed self-counting WASM sections (this PR)
  3. Rename WasmObjectWriter to WebCilObjectWriter #131772 — Introduce WebCIL object writer type
  4. Move shared WASM logic to base writer #131778 — Move shared WASM logic to base writer

Note

This PR description was generated with GitHub Copilot assistance.

jtschusterand others added 2 commits August 3, 2026 10:46
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@jtschuster
jtschuster marked this pull request as ready for review August 3, 2026 21:03
CopilotAI lite review requested due to automatic review settings August 3, 2026 21:03
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

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 refactors WASM section emission in the CoreCLR object writer to use typed, self-counting “vector” sections (imports/functions/globals/exports/elements), moving per-row encoding into section-specific WriteEntry implementations and eliminating manual counters / count-prefix patching in the writer.

Changes:

  • Introduces WasmVectorSection / WasmSection<TEntry> abstractions that prepend the vector length automatically and increment entry counts only after successful entry encoding.
  • Updates WasmObjectWriter to use Add* APIs that delegate row encoding/counting to typed section implementations, and finalizes Type/Code counts via an externally-counted section type.
  • Moves WasmExportKind to a shared location (WasmNative.cs) for reuse by section code.

Reviewed changes

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

FileDescription
src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.csSwitches writer logic to typed sections (Add* methods) and removes manual count handling; finalizes external counts for Type/Code.
src/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.csAdds shared WasmExportKind enum for export section encoding.
src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSections.csAdds typed GetSection<T> helpers to retrieve sections safely by name/index.
src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.csReplaces PrependCount with a generalized content-prefix mechanism and adds self-counting vector section implementations for key WASM sections.

CopilotAI review requested due to automatic review settings August 6, 2026 18:07
CopilotAI reviewed Aug 6, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Note

This error may be related to your runner configuration. You can now configure runners for Copilot code review separately from Copilot cloud agent by creating a copilot-code-review.yml file with your setup steps. Read the docs for details.

Base automatically changed from wasm-writer-section-model to mainAugust 6, 2026 19:08
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSections.cs Outdated

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

I just had two nits, but otherwise this looks good to me!

CopilotAI review requested due to automatic review settings August 11, 2026 13:42

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 7 out of 8 changed files in this pull request and generated 1 comment.

Suppressed comments (2)

src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs:529

  • The local section is never used; this produces an unused-local warning. You can keep the side effect (ensuring the section exists) without storing the return value.
 SectionDataEmitter section = GetOrCreateSection(WasmObjectNodeSection.DataCountSection, out SectionWriter writer);

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.cs:154

  • WasmExternallyCountedSection.EmitToStream only asserts that the entry count was set. In non-Debug builds this can silently emit a zero count if SetEntryCount is missed, producing an invalid/incorrect module without a clear failure. Consider throwing in release builds as well.
 public override int EmitToStream(Stream outputFileStream)
{
Debug.Assert(_entryCountSet);
return base.EmitToStream(outputFileStream);
}

Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings August 12, 2026 13:23

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Suppressed comments (4)

src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs:530

  • SectionDataEmitter section is assigned but never used, which can trigger CS0219 (and may fail the build if warnings are treated as errors). The call is only needed to obtain the writer / ensure the section exists.
 {
SectionDataEmitter section = GetOrCreateSection(WasmObjectNodeSection.DataCountSection, out SectionWriter writer);
writer.WriteULEB128(NumDataSegments); // number of data segments

src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs:234

  • Avoid var here: the type is not apparent from the right-hand side (base.GetOrCreateSection(...)). This may violate the repo's C# style settings and is less readable than using the explicit SectionWriter type.
 private TSection GetOrCreateSection<TSection>(ObjectNodeSection section)
where TSection : SectionDataEmitter
{
var writer = base.GetOrCreateSection(section);
return _sections.GetSection<TSection>(writer.SectionIndex);
}

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.cs:40

  • SectionDataEmitter assumes stream is non-null (it is dereferenced via Length/Position later). Adding a guard here produces a clearer exception and avoids null silently flowing into later emission logic.
 public SectionDataEmitter(Stream stream, Utf8String name, int sectionIndex)
{
ContentReadStream = stream;
SectionName = name;
SectionIndex = sectionIndex;

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSections.cs:27

  • GetSection<TSection> relies on an unchecked cast. If the section mapping is ever wrong, this will throw an InvalidCastException with little context. A Debug.Assert keeps release perf the same while making the failure much easier to diagnose in Debug builds.
 public TSection GetSection<TSection>(int sectionIndex)
where TSection : SectionDataEmitter
{
SectionDataEmitter section = _sections[sectionIndex];
return (TSection)section;
}

CopilotAI review requested due to automatic review settings August 12, 2026 14:02

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Suppressed comments (5)

src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs:529

  • The local variable section is assigned but never used. This can trigger analyzer warnings and makes the intent less clear; the return value can be ignored.
 SectionDataEmitter section = GetOrCreateSection(WasmObjectNodeSection.DataCountSection, out SectionWriter writer);

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSections.cs:6

  • using System; is unused in this file and can trigger IDE0005 (remove unnecessary usings).
using System;
using System.Collections.Generic;
using System.Diagnostics;

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.cs:6

  • using System.Collections.Generic; is unused in this file and can trigger IDE0005 (remove unnecessary usings).
using System;
using System.Collections.Generic;
using System.Diagnostics;

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmDataSegment.cs:7

  • using System.Collections.Generic; is unused in this file and can trigger IDE0005 (remove unnecessary usings).
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmDataSection.cs:23

  • The name parameter on WasmDataSection's constructor is no longer used after removing the WasmSection base class. This can trigger unused-parameter analyzers and is misleading for callers.
 public WasmDataSection(List<WasmDataSegment> segments, Utf8String name, int contentAlign = 1)
{
_segments = segments;
_contentAlign = contentAlign;
}

@jtschuster

Copy link
Copy Markdown
MemberAuthor

Could I get a review/re-review if anyone gets a chance?

@jtschuster

Copy link
Copy Markdown
MemberAuthor

/ba-g Failures are unrelated, WASM failure is #131924

@jtschuster
jtschuster merged commit 878cb65 into mainAug 17, 2026
99 of 103 checks passed
@jtschuster
jtschuster deleted the wasm-writer-typed-sections branch August 17, 2026 17:33
@dotnet-milestone-botdotnet-milestone-botBot added this to the 12.0-preview1 milestone Aug 18, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants

@jtschuster@adamperlin
, '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

Add typed self-counting WASM sections - #131771

Merged
jtschuster merged 16 commits into
mainfrom
wasm-writer-typed-sections
Aug 17, 2026
Merged

Add typed self-counting WASM sections#131771
jtschuster merged 16 commits into
mainfrom
wasm-writer-typed-sections

Conversation

@jtschuster

@jtschusterjtschuster commented Aug 3, 2026

Copy link
Copy Markdown
Member

Summary

This is the second PR in the WASM object-writer stack and builds on #131770.

  • Replaces shared functionality in WasmSection and WebCilSection for emitting a SectionWriter's data to SectionDataEmitter.
  • Change WebCilSection's base class from WasmSection to SectionDataEmitter to clarify that it's not an actual custom Wasm section.
  • Add typed vector sections for imports, functions, globals, exports, and elements. Adding entries / data to these sections should be done through their respective methods that take an entry object and the corresponding SectionWriter. This allows them to accurately track the count of entries in the section.
  • Type and Code are externally counted since entries can be added to from the base ObjectWriter.
  • Remove the corresponding manual counters and count-prefix rewriting from the writer.

The emitted module structure and existing writer behavior are preserved while making section counts follow directly from successfully written rows.

Stack

  1. Extract WASM section model #131770 — Extract WASM section model
  2. Add typed self-counting WASM sections #131771 — Add typed self-counting WASM sections (this PR)
  3. Rename WasmObjectWriter to WebCilObjectWriter #131772 — Introduce WebCIL object writer type
  4. Move shared WASM logic to base writer #131778 — Move shared WASM logic to base writer

Note

This PR description was generated with GitHub Copilot assistance.

jtschusterand others added 2 commits August 3, 2026 10:46
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@jtschuster
jtschuster marked this pull request as ready for review August 3, 2026 21:03
CopilotAI lite review requested due to automatic review settings August 3, 2026 21:03
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

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 refactors WASM section emission in the CoreCLR object writer to use typed, self-counting “vector” sections (imports/functions/globals/exports/elements), moving per-row encoding into section-specific WriteEntry implementations and eliminating manual counters / count-prefix patching in the writer.

Changes:

  • Introduces WasmVectorSection / WasmSection<TEntry> abstractions that prepend the vector length automatically and increment entry counts only after successful entry encoding.
  • Updates WasmObjectWriter to use Add* APIs that delegate row encoding/counting to typed section implementations, and finalizes Type/Code counts via an externally-counted section type.
  • Moves WasmExportKind to a shared location (WasmNative.cs) for reuse by section code.

Reviewed changes

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

FileDescription
src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.csSwitches writer logic to typed sections (Add* methods) and removes manual count handling; finalizes external counts for Type/Code.
src/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.csAdds shared WasmExportKind enum for export section encoding.
src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSections.csAdds typed GetSection<T> helpers to retrieve sections safely by name/index.
src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.csReplaces PrependCount with a generalized content-prefix mechanism and adds self-counting vector section implementations for key WASM sections.

CopilotAI review requested due to automatic review settings August 6, 2026 18:07
CopilotAI reviewed Aug 6, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Note

This error may be related to your runner configuration. You can now configure runners for Copilot code review separately from Copilot cloud agent by creating a copilot-code-review.yml file with your setup steps. Read the docs for details.

Base automatically changed from wasm-writer-section-model to mainAugust 6, 2026 19:08
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSections.cs Outdated

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

I just had two nits, but otherwise this looks good to me!

CopilotAI review requested due to automatic review settings August 11, 2026 13:42

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 7 out of 8 changed files in this pull request and generated 1 comment.

Suppressed comments (2)

src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs:529

  • The local section is never used; this produces an unused-local warning. You can keep the side effect (ensuring the section exists) without storing the return value.
 SectionDataEmitter section = GetOrCreateSection(WasmObjectNodeSection.DataCountSection, out SectionWriter writer);

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.cs:154

  • WasmExternallyCountedSection.EmitToStream only asserts that the entry count was set. In non-Debug builds this can silently emit a zero count if SetEntryCount is missed, producing an invalid/incorrect module without a clear failure. Consider throwing in release builds as well.
 public override int EmitToStream(Stream outputFileStream)
{
Debug.Assert(_entryCountSet);
return base.EmitToStream(outputFileStream);
}

Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings August 12, 2026 13:23

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Suppressed comments (4)

src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs:530

  • SectionDataEmitter section is assigned but never used, which can trigger CS0219 (and may fail the build if warnings are treated as errors). The call is only needed to obtain the writer / ensure the section exists.
 {
SectionDataEmitter section = GetOrCreateSection(WasmObjectNodeSection.DataCountSection, out SectionWriter writer);
writer.WriteULEB128(NumDataSegments); // number of data segments

src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs:234

  • Avoid var here: the type is not apparent from the right-hand side (base.GetOrCreateSection(...)). This may violate the repo's C# style settings and is less readable than using the explicit SectionWriter type.
 private TSection GetOrCreateSection<TSection>(ObjectNodeSection section)
where TSection : SectionDataEmitter
{
var writer = base.GetOrCreateSection(section);
return _sections.GetSection<TSection>(writer.SectionIndex);
}

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.cs:40

  • SectionDataEmitter assumes stream is non-null (it is dereferenced via Length/Position later). Adding a guard here produces a clearer exception and avoids null silently flowing into later emission logic.
 public SectionDataEmitter(Stream stream, Utf8String name, int sectionIndex)
{
ContentReadStream = stream;
SectionName = name;
SectionIndex = sectionIndex;

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSections.cs:27

  • GetSection<TSection> relies on an unchecked cast. If the section mapping is ever wrong, this will throw an InvalidCastException with little context. A Debug.Assert keeps release perf the same while making the failure much easier to diagnose in Debug builds.
 public TSection GetSection<TSection>(int sectionIndex)
where TSection : SectionDataEmitter
{
SectionDataEmitter section = _sections[sectionIndex];
return (TSection)section;
}

CopilotAI review requested due to automatic review settings August 12, 2026 14:02

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Suppressed comments (5)

src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs:529

  • The local variable section is assigned but never used. This can trigger analyzer warnings and makes the intent less clear; the return value can be ignored.
 SectionDataEmitter section = GetOrCreateSection(WasmObjectNodeSection.DataCountSection, out SectionWriter writer);

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSections.cs:6

  • using System; is unused in this file and can trigger IDE0005 (remove unnecessary usings).
using System;
using System.Collections.Generic;
using System.Diagnostics;

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.cs:6

  • using System.Collections.Generic; is unused in this file and can trigger IDE0005 (remove unnecessary usings).
using System;
using System.Collections.Generic;
using System.Diagnostics;

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmDataSegment.cs:7

  • using System.Collections.Generic; is unused in this file and can trigger IDE0005 (remove unnecessary usings).
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmDataSection.cs:23

  • The name parameter on WasmDataSection's constructor is no longer used after removing the WasmSection base class. This can trigger unused-parameter analyzers and is misleading for callers.
 public WasmDataSection(List<WasmDataSegment> segments, Utf8String name, int contentAlign = 1)
{
_segments = segments;
_contentAlign = contentAlign;
}

@jtschuster

Copy link
Copy Markdown
MemberAuthor

Could I get a review/re-review if anyone gets a chance?

@jtschuster

Copy link
Copy Markdown
MemberAuthor

/ba-g Failures are unrelated, WASM failure is #131924

@jtschuster
jtschuster merged commit 878cb65 into mainAug 17, 2026
99 of 103 checks passed
@jtschuster
jtschuster deleted the wasm-writer-typed-sections branch August 17, 2026 17:33
@dotnet-milestone-botdotnet-milestone-botBot added this to the 12.0-preview1 milestone Aug 18, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants

@jtschuster@adamperlin
, '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

Add typed self-counting WASM sections - #131771

Merged
jtschuster merged 16 commits into
mainfrom
wasm-writer-typed-sections
Aug 17, 2026
Merged

Add typed self-counting WASM sections#131771
jtschuster merged 16 commits into
mainfrom
wasm-writer-typed-sections

Conversation

@jtschuster

@jtschusterjtschuster commented Aug 3, 2026

Copy link
Copy Markdown
Member

Summary

This is the second PR in the WASM object-writer stack and builds on #131770.

  • Replaces shared functionality in WasmSection and WebCilSection for emitting a SectionWriter's data to SectionDataEmitter.
  • Change WebCilSection's base class from WasmSection to SectionDataEmitter to clarify that it's not an actual custom Wasm section.
  • Add typed vector sections for imports, functions, globals, exports, and elements. Adding entries / data to these sections should be done through their respective methods that take an entry object and the corresponding SectionWriter. This allows them to accurately track the count of entries in the section.
  • Type and Code are externally counted since entries can be added to from the base ObjectWriter.
  • Remove the corresponding manual counters and count-prefix rewriting from the writer.

The emitted module structure and existing writer behavior are preserved while making section counts follow directly from successfully written rows.

Stack

  1. Extract WASM section model #131770 — Extract WASM section model
  2. Add typed self-counting WASM sections #131771 — Add typed self-counting WASM sections (this PR)
  3. Rename WasmObjectWriter to WebCilObjectWriter #131772 — Introduce WebCIL object writer type
  4. Move shared WASM logic to base writer #131778 — Move shared WASM logic to base writer

Note

This PR description was generated with GitHub Copilot assistance.

jtschusterand others added 2 commits August 3, 2026 10:46
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@jtschuster
jtschuster marked this pull request as ready for review August 3, 2026 21:03
CopilotAI lite review requested due to automatic review settings August 3, 2026 21:03
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

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 refactors WASM section emission in the CoreCLR object writer to use typed, self-counting “vector” sections (imports/functions/globals/exports/elements), moving per-row encoding into section-specific WriteEntry implementations and eliminating manual counters / count-prefix patching in the writer.

Changes:

  • Introduces WasmVectorSection / WasmSection<TEntry> abstractions that prepend the vector length automatically and increment entry counts only after successful entry encoding.
  • Updates WasmObjectWriter to use Add* APIs that delegate row encoding/counting to typed section implementations, and finalizes Type/Code counts via an externally-counted section type.
  • Moves WasmExportKind to a shared location (WasmNative.cs) for reuse by section code.

Reviewed changes

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

FileDescription
src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.csSwitches writer logic to typed sections (Add* methods) and removes manual count handling; finalizes external counts for Type/Code.
src/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.csAdds shared WasmExportKind enum for export section encoding.
src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSections.csAdds typed GetSection<T> helpers to retrieve sections safely by name/index.
src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.csReplaces PrependCount with a generalized content-prefix mechanism and adds self-counting vector section implementations for key WASM sections.

CopilotAI review requested due to automatic review settings August 6, 2026 18:07
CopilotAI reviewed Aug 6, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Note

This error may be related to your runner configuration. You can now configure runners for Copilot code review separately from Copilot cloud agent by creating a copilot-code-review.yml file with your setup steps. Read the docs for details.

Base automatically changed from wasm-writer-section-model to mainAugust 6, 2026 19:08
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSections.cs Outdated

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

I just had two nits, but otherwise this looks good to me!

CopilotAI review requested due to automatic review settings August 11, 2026 13:42

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 7 out of 8 changed files in this pull request and generated 1 comment.

Suppressed comments (2)

src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs:529

  • The local section is never used; this produces an unused-local warning. You can keep the side effect (ensuring the section exists) without storing the return value.
 SectionDataEmitter section = GetOrCreateSection(WasmObjectNodeSection.DataCountSection, out SectionWriter writer);

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.cs:154

  • WasmExternallyCountedSection.EmitToStream only asserts that the entry count was set. In non-Debug builds this can silently emit a zero count if SetEntryCount is missed, producing an invalid/incorrect module without a clear failure. Consider throwing in release builds as well.
 public override int EmitToStream(Stream outputFileStream)
{
Debug.Assert(_entryCountSet);
return base.EmitToStream(outputFileStream);
}

Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings August 12, 2026 13:23

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Suppressed comments (4)

src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs:530

  • SectionDataEmitter section is assigned but never used, which can trigger CS0219 (and may fail the build if warnings are treated as errors). The call is only needed to obtain the writer / ensure the section exists.
 {
SectionDataEmitter section = GetOrCreateSection(WasmObjectNodeSection.DataCountSection, out SectionWriter writer);
writer.WriteULEB128(NumDataSegments); // number of data segments

src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs:234

  • Avoid var here: the type is not apparent from the right-hand side (base.GetOrCreateSection(...)). This may violate the repo's C# style settings and is less readable than using the explicit SectionWriter type.
 private TSection GetOrCreateSection<TSection>(ObjectNodeSection section)
where TSection : SectionDataEmitter
{
var writer = base.GetOrCreateSection(section);
return _sections.GetSection<TSection>(writer.SectionIndex);
}

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.cs:40

  • SectionDataEmitter assumes stream is non-null (it is dereferenced via Length/Position later). Adding a guard here produces a clearer exception and avoids null silently flowing into later emission logic.
 public SectionDataEmitter(Stream stream, Utf8String name, int sectionIndex)
{
ContentReadStream = stream;
SectionName = name;
SectionIndex = sectionIndex;

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSections.cs:27

  • GetSection<TSection> relies on an unchecked cast. If the section mapping is ever wrong, this will throw an InvalidCastException with little context. A Debug.Assert keeps release perf the same while making the failure much easier to diagnose in Debug builds.
 public TSection GetSection<TSection>(int sectionIndex)
where TSection : SectionDataEmitter
{
SectionDataEmitter section = _sections[sectionIndex];
return (TSection)section;
}

CopilotAI review requested due to automatic review settings August 12, 2026 14:02

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Suppressed comments (5)

src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs:529

  • The local variable section is assigned but never used. This can trigger analyzer warnings and makes the intent less clear; the return value can be ignored.
 SectionDataEmitter section = GetOrCreateSection(WasmObjectNodeSection.DataCountSection, out SectionWriter writer);

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSections.cs:6

  • using System; is unused in this file and can trigger IDE0005 (remove unnecessary usings).
using System;
using System.Collections.Generic;
using System.Diagnostics;

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.cs:6

  • using System.Collections.Generic; is unused in this file and can trigger IDE0005 (remove unnecessary usings).
using System;
using System.Collections.Generic;
using System.Diagnostics;

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmDataSegment.cs:7

  • using System.Collections.Generic; is unused in this file and can trigger IDE0005 (remove unnecessary usings).
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmDataSection.cs:23

  • The name parameter on WasmDataSection's constructor is no longer used after removing the WasmSection base class. This can trigger unused-parameter analyzers and is misleading for callers.
 public WasmDataSection(List<WasmDataSegment> segments, Utf8String name, int contentAlign = 1)
{
_segments = segments;
_contentAlign = contentAlign;
}

@jtschuster

Copy link
Copy Markdown
MemberAuthor

Could I get a review/re-review if anyone gets a chance?

@jtschuster

Copy link
Copy Markdown
MemberAuthor

/ba-g Failures are unrelated, WASM failure is #131924

@jtschuster
jtschuster merged commit 878cb65 into mainAug 17, 2026
99 of 103 checks passed
@jtschuster
jtschuster deleted the wasm-writer-typed-sections branch August 17, 2026 17:33
@dotnet-milestone-botdotnet-milestone-botBot added this to the 12.0-preview1 milestone Aug 18, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants

@jtschuster@adamperlin
, '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

Add typed self-counting WASM sections - #131771

Merged
jtschuster merged 16 commits into
mainfrom
wasm-writer-typed-sections
Aug 17, 2026
Merged

Add typed self-counting WASM sections#131771
jtschuster merged 16 commits into
mainfrom
wasm-writer-typed-sections

Conversation

@jtschuster

@jtschusterjtschuster commented Aug 3, 2026

Copy link
Copy Markdown
Member

Summary

This is the second PR in the WASM object-writer stack and builds on #131770.

  • Replaces shared functionality in WasmSection and WebCilSection for emitting a SectionWriter's data to SectionDataEmitter.
  • Change WebCilSection's base class from WasmSection to SectionDataEmitter to clarify that it's not an actual custom Wasm section.
  • Add typed vector sections for imports, functions, globals, exports, and elements. Adding entries / data to these sections should be done through their respective methods that take an entry object and the corresponding SectionWriter. This allows them to accurately track the count of entries in the section.
  • Type and Code are externally counted since entries can be added to from the base ObjectWriter.
  • Remove the corresponding manual counters and count-prefix rewriting from the writer.

The emitted module structure and existing writer behavior are preserved while making section counts follow directly from successfully written rows.

Stack

  1. Extract WASM section model #131770 — Extract WASM section model
  2. Add typed self-counting WASM sections #131771 — Add typed self-counting WASM sections (this PR)
  3. Rename WasmObjectWriter to WebCilObjectWriter #131772 — Introduce WebCIL object writer type
  4. Move shared WASM logic to base writer #131778 — Move shared WASM logic to base writer

Note

This PR description was generated with GitHub Copilot assistance.

jtschusterand others added 2 commits August 3, 2026 10:46
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@jtschuster
jtschuster marked this pull request as ready for review August 3, 2026 21:03
CopilotAI lite review requested due to automatic review settings August 3, 2026 21:03
@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 3 pipeline(s).
13 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

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 refactors WASM section emission in the CoreCLR object writer to use typed, self-counting “vector” sections (imports/functions/globals/exports/elements), moving per-row encoding into section-specific WriteEntry implementations and eliminating manual counters / count-prefix patching in the writer.

Changes:

  • Introduces WasmVectorSection / WasmSection<TEntry> abstractions that prepend the vector length automatically and increment entry counts only after successful entry encoding.
  • Updates WasmObjectWriter to use Add* APIs that delegate row encoding/counting to typed section implementations, and finalizes Type/Code counts via an externally-counted section type.
  • Moves WasmExportKind to a shared location (WasmNative.cs) for reuse by section code.

Reviewed changes

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

FileDescription
src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.csSwitches writer logic to typed sections (Add* methods) and removes manual count handling; finalizes external counts for Type/Code.
src/coreclr/tools/Common/Compiler/ObjectWriter/WasmNative.csAdds shared WasmExportKind enum for export section encoding.
src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSections.csAdds typed GetSection<T> helpers to retrieve sections safely by name/index.
src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.csReplaces PrependCount with a generalized content-prefix mechanism and adds self-counting vector section implementations for key WASM sections.

CopilotAI review requested due to automatic review settings August 6, 2026 18:07
CopilotAI reviewed Aug 6, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Note

This error may be related to your runner configuration. You can now configure runners for Copilot code review separately from Copilot cloud agent by creating a copilot-code-review.yml file with your setup steps. Read the docs for details.

Base automatically changed from wasm-writer-section-model to mainAugust 6, 2026 19:08
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSections.cs Outdated

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

I just had two nits, but otherwise this looks good to me!

CopilotAI review requested due to automatic review settings August 11, 2026 13:42

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 7 out of 8 changed files in this pull request and generated 1 comment.

Suppressed comments (2)

src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs:529

  • The local section is never used; this produces an unused-local warning. You can keep the side effect (ensuring the section exists) without storing the return value.
 SectionDataEmitter section = GetOrCreateSection(WasmObjectNodeSection.DataCountSection, out SectionWriter writer);

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.cs:154

  • WasmExternallyCountedSection.EmitToStream only asserts that the entry count was set. In non-Debug builds this can silently emit a zero count if SetEntryCount is missed, producing an invalid/incorrect module without a clear failure. Consider throwing in release builds as well.
 public override int EmitToStream(Stream outputFileStream)
{
Debug.Assert(_entryCountSet);
return base.EmitToStream(outputFileStream);
}

Comment threadsrc/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs Outdated
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings August 12, 2026 13:23

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Suppressed comments (4)

src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs:530

  • SectionDataEmitter section is assigned but never used, which can trigger CS0219 (and may fail the build if warnings are treated as errors). The call is only needed to obtain the writer / ensure the section exists.
 {
SectionDataEmitter section = GetOrCreateSection(WasmObjectNodeSection.DataCountSection, out SectionWriter writer);
writer.WriteULEB128(NumDataSegments); // number of data segments

src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs:234

  • Avoid var here: the type is not apparent from the right-hand side (base.GetOrCreateSection(...)). This may violate the repo's C# style settings and is less readable than using the explicit SectionWriter type.
 private TSection GetOrCreateSection<TSection>(ObjectNodeSection section)
where TSection : SectionDataEmitter
{
var writer = base.GetOrCreateSection(section);
return _sections.GetSection<TSection>(writer.SectionIndex);
}

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.cs:40

  • SectionDataEmitter assumes stream is non-null (it is dereferenced via Length/Position later). Adding a guard here produces a clearer exception and avoids null silently flowing into later emission logic.
 public SectionDataEmitter(Stream stream, Utf8String name, int sectionIndex)
{
ContentReadStream = stream;
SectionName = name;
SectionIndex = sectionIndex;

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSections.cs:27

  • GetSection<TSection> relies on an unchecked cast. If the section mapping is ever wrong, this will throw an InvalidCastException with little context. A Debug.Assert keeps release perf the same while making the failure much easier to diagnose in Debug builds.
 public TSection GetSection<TSection>(int sectionIndex)
where TSection : SectionDataEmitter
{
SectionDataEmitter section = _sections[sectionIndex];
return (TSection)section;
}

CopilotAI review requested due to automatic review settings August 12, 2026 14:02

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Suppressed comments (5)

src/coreclr/tools/Common/Compiler/ObjectWriter/WasmObjectWriter.cs:529

  • The local variable section is assigned but never used. This can trigger analyzer warnings and makes the intent less clear; the return value can be ignored.
 SectionDataEmitter section = GetOrCreateSection(WasmObjectNodeSection.DataCountSection, out SectionWriter writer);

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSections.cs:6

  • using System; is unused in this file and can trigger IDE0005 (remove unnecessary usings).
using System;
using System.Collections.Generic;
using System.Diagnostics;

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmSection.cs:6

  • using System.Collections.Generic; is unused in this file and can trigger IDE0005 (remove unnecessary usings).
using System;
using System.Collections.Generic;
using System.Diagnostics;

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmDataSegment.cs:7

  • using System.Collections.Generic; is unused in this file and can trigger IDE0005 (remove unnecessary usings).
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;

src/coreclr/tools/Common/Compiler/ObjectWriter/Wasm/WasmDataSection.cs:23

  • The name parameter on WasmDataSection's constructor is no longer used after removing the WasmSection base class. This can trigger unused-parameter analyzers and is misleading for callers.
 public WasmDataSection(List<WasmDataSegment> segments, Utf8String name, int contentAlign = 1)
{
_segments = segments;
_contentAlign = contentAlign;
}

@jtschuster

Copy link
Copy Markdown
MemberAuthor

Could I get a review/re-review if anyone gets a chance?

@jtschuster

Copy link
Copy Markdown
MemberAuthor

/ba-g Failures are unrelated, WASM failure is #131924

@jtschuster
jtschuster merged commit 878cb65 into mainAug 17, 2026
99 of 103 checks passed
@jtschuster
jtschuster deleted the wasm-writer-typed-sections branch August 17, 2026 17:33
@dotnet-milestone-botdotnet-milestone-botBot added this to the 12.0-preview1 milestone Aug 18, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants

@jtschuster@adamperlin