[browser][coreCLR] no COM, no swift - #125083

Merged
pavelsavara merged 32 commits into
dotnet:mainfrom
pavelsavara:browser_trim_COM
Mar 27, 2026
Merged

[browser][coreCLR] no COM, no swift#125083
pavelsavara merged 32 commits into
dotnet:mainfrom
pavelsavara:browser_trim_COM

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Mar 2, 2026

Copy link
Copy Markdown
Member

Trim COM/SEH-related code for non-Windows targets (Browser WASM)

Summary

This PR conditionally compiles out COM interop, SEH exception, and Windows-only code paths from the CoreCLR runtime when targeting non-Windows platforms (primarily Browser/WASM). It also removes reverse P/Invoke thunks for ComActivator methods that are not applicable on Browser, and teaches the WASM PInvokeCollector to skip callbacks on types marked as unsupported on Browser.

Changes

SEH exception trimming (#ifdef TARGET_WINDOWS)

  • ex.h / ex.cpp: Wrap the SEHException class definition, constructors, and GetHR()/GetMessage() implementations in #ifdef TARGET_WINDOWS.
  • clrex.cpp: Wrap the SEHException handling path in GetThrowableFromException so non-Windows falls through to the generic HRException/COMException/DelegatingException handler.
  • dacfn.cpp: Wrap the SEHException rethrow logic in DacExceptionFilter in #ifdef TARGET_WINDOWS.
  • rexcep.h: Wrap the DEFINE_EXCEPTION for SEHException in #ifdef TARGET_WINDOWS.
  • excep.cpp:
    • MapWin32FaultToCOMPlusException default case: returns kSEHException on Windows, kException with _ASSERTE(!"Expected to be unreachable") on non-Windows.
    • Wrap SEHException references in DebugIsEECxxExceptionPointer in #ifdef TARGET_WINDOWS.

Move CallOutFilter / FilterAccessViolation from generic code

  • excep.cpp / excep.h: Remove CallOutFilter, CallOutFilterParam, and FilterAccessViolation — these are SEH-specific helpers only used from COM interop code.
  • interoputil.cpp: Move CallOutFilter and CallOutFilterParam here, where they are actually used (already inside #ifdef FEATURE_COMINTEROP compilation unit).

COM-specific type trimming (#ifdef FEATURE_COMINTEROP)

  • rexcep.h: Move InvalidOleVariantTypeException inside the existing #ifdef FEATURE_COMINTEROP block.
  • corelib.h: Wrap COMVARIANT class definition in #if defined(FEATURE_COMINTEROP).
  • metasig.h: Wrap ComVariant-related metasig definitions in #ifdef FEATURE_COMINTEROP.
  • olevariant.cpp: Wrap VT_VARIANTCLASS__COMVARIANT mapping in #ifdef FEATURE_COMINTEROP.
  • Marshal.cs (shared CoreLib): Wrap COR_E_INVALIDOLEVARIANTTYPEInvalidOleVariantTypeException mapping in #if FEATURE_COMINTEROP.

Swift types Apple-only (#ifdef TARGET_APPLE)

  • corelib.h: Wrap SwiftSelf, SwiftSelf<T>, SwiftError, SwiftIndirectResult class definitions in #ifdef TARGET_APPLE.

Platform annotation

  • ComActivator.PlatformNotSupported.cs: Add [SupportedOSPlatform("windows")] attribute so the WASM toolchain can detect it as unsupported.

WASM reverse call helpers

  • callhelpers-reverse.cpp: Remove three ComActivator reverse P/Invoke thunks (GetClassFactoryForTypeInternal, RegisterClassForTypeInternal, UnregisterClassForTypeInternal) and their entries in g_ReverseThunks. Rename OnThreadExitingOnThreadExited to match the upstream API rename.

WASM PInvoke collector - skip browser-unsupported types

  • PInvokeCollector.cs: Add IsUnsupportedOnBrowser method that checks for [UnsupportedOSPlatform("browser")] or [SupportedOSPlatform(...)] without "browser" on the declaring type. Callbacks on unsupported types are skipped during WASM app build, avoiding link errors for COM-related methods.

WASM call helper additions (unrelated fixups merged from main)

  • callhelpers-interp-to-managed.cpp: Add CallFunc_I32_I32_I32_RetI64 thunk and liii signature entry.
  • callhelpers-pinvoke.cpp: Add SystemNative_ReadV and SystemNative_WriteV P/Invoke declarations and table entries (count 92 → 94).

@pavelsavarapavelsavara added this to the 11.0.0 milestone Mar 2, 2026
@pavelsavarapavelsavara self-assigned this Mar 2, 2026
CopilotAI review requested due to automatic review settings March 2, 2026 23:23
@pavelsavarapavelsavara added arch-wasm WebAssembly architecture area-VM-coreclr size-reduction Issues impacting final app size primary for size sensitive workloads os-browser Browser variant of arch-wasm labels Mar 2, 2026
@dotnet-policy-servicedotnet-policy-serviceBot added the linkable-framework Issues associated with delivering a linker friendly framework label Mar 2, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR aims to reduce trimmed size for browser-WASM CoreCLR builds by removing/gating roots and native support code for features that aren’t supported in the browser (COM/interop-related pieces, DynamicInterfaceCastable, Swift interop, and intrinsics metadata rooting).

Changes:

  • Filters reverse P/Invoke stub generation for types marked [UnsupportedOSPlatform("browser")] and annotates ComActivator accordingly.
  • Gates ILLink rooting for ComponentActivator.GetFunctionPointer behind the existing native-hosting feature switch.
  • Adds TARGET_WASM guards to exclude DynamicInterfaceCastable native support on WASM and trims related ILLink roots / metadata retention paths.

Reviewed changes

Copilot reviewed 14 out of 14 changed files in this pull request and generated 7 comments.

Show a summary per file
FileDescription
src/tasks/WasmAppBuilder/generate-coreclr-helpers.cmdUpdates helper generation script used for CoreCLR WASM callhelper regeneration.
src/tasks/WasmAppBuilder/coreclr/PInvokeCollector.csSkips generating reverse P/Invoke callback stubs for types unsupported on browser.
src/libraries/System.Private.CoreLib/src/System/Runtime/CompilerServices/CompExactlyDependsOnAttribute.csRemoves CompExactlyDependsOnAttribute metadata for browser/WASI builds to improve trimming.
src/libraries/System.Private.CoreLib/src/ILLink/ILLink.Descriptors.Shared.xmlGates ComponentActivator.GetFunctionPointer rooting behind the native-hosting feature switch.
src/coreclr/vm/wasm/callhelpers-reverse.cppRegenerated reverse thunk table reflecting removed callbacks.
src/coreclr/vm/wasm/callhelpers-pinvoke.cppRegenerated P/Invoke table reflecting upstream removals.
src/coreclr/vm/virtualcallstub.cppRemoves DynamicInterfaceCastable resolver path from WASM builds.
src/coreclr/vm/rexcep.hAttempts to exclude interop exception types from WASM ILLink descriptor generation.
src/coreclr/vm/methodtable.cppRemoves IDynamicInterfaceCastable special method resolution on WASM.
src/coreclr/vm/jithelpers.cppRemoves IDynamicInterfaceCastable cast path on WASM.
src/coreclr/vm/dynamicinterfacecastable.hWraps DynamicInterfaceCastable API surface out of WASM builds.
src/coreclr/vm/dynamicinterfacecastable.cppWraps DynamicInterfaceCastable implementation out of WASM builds.
src/coreclr/vm/corelib.hAttempts to exclude Swift interop and ComVariant from WASM ILLink descriptor generation; removes DynamicInterfaceCastableHelpers from WASM.
src/coreclr/System.Private.CoreLib/src/Internal/Runtime/InteropServices/ComActivator.PlatformNotSupported.csMarks ComActivator as unsupported on browser to suppress reverse stub generation.

Comment threadsrc/tasks/WasmAppBuilder/generate-coreclr-helpers.cmd Outdated
Comment threadsrc/coreclr/vm/corelib.h Outdated
Comment threadsrc/coreclr/vm/corelib.h Outdated
Comment threadsrc/coreclr/vm/rexcep.h Outdated
Comment threadsrc/coreclr/vm/rexcep.h Outdated
Comment threadsrc/coreclr/vm/rexcep.h Outdated
Comment threadsrc/tasks/WasmAppBuilder/coreclr/PInvokeCollector.cs
Comment threadsrc/coreclr/vm/corelib.h Outdated
CopilotAI review requested due to automatic review settings March 13, 2026 15:29

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 8 out of 8 changed files in this pull request and generated 2 comments.

Comment threadsrc/coreclr/vm/rexcep.h Outdated
Comment threadsrc/coreclr/vm/corelib.h Outdated
Comment threadsrc/coreclr/vm/excep.h
CopilotAI review requested due to automatic review settings March 23, 2026 17:49

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

Comment threadsrc/coreclr/vm/interoputil.cpp
Comment threadsrc/coreclr/vm/olevariant.cpp Outdated
Comment threadsrc/coreclr/vm/olevariant.cpp Outdated
@jkotas

Copy link
Copy Markdown
Member

Any numbers for how much this saves? I like to have numbers for anything that claims to be a perf improvement.

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

Any numbers for how much this saves? I like to have numbers for anything that claims to be a perf improvement.

This is not about perf at all.
It started as much bigger IL trimming PR, but I was not able to reproduce Intrinsics at some point.
So, what we have right now is just cleanup. I can measure size difference, but it would not be big deal.

CopilotAI review requested due to automatic review settings March 25, 2026 16:53

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 16 out of 16 changed files in this pull request and generated 1 comment.

Comment threadsrc/tasks/WasmAppBuilder/coreclr/PInvokeCollector.cs
CopilotAI review requested due to automatic review settings March 26, 2026 08:18

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

Comment threadsrc/coreclr/vm/wasm/callhelpers-pinvoke.cpp
Comment threadsrc/coreclr/vm/excep.cpp
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g all CI issues are unrelated (as far as I can tell)

@pavelsavara
pavelsavara merged commit c401a8e into dotnet:mainMar 27, 2026
150 of 168 checks passed
@pavelsavara
pavelsavara deleted the browser_trim_COM branch March 27, 2026 08:51
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 26, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-VM-coreclrlinkable-frameworkIssues associated with delivering a linker friendly frameworkos-browserBrowser variant of arch-wasmsize-reductionIssues impacting final app size primary for size sensitive workloads

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

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

[browser][coreCLR] no COM, no swift - #125083

Merged
pavelsavara merged 32 commits into
dotnet:mainfrom
pavelsavara:browser_trim_COM
Mar 27, 2026
Merged

[browser][coreCLR] no COM, no swift#125083
pavelsavara merged 32 commits into
dotnet:mainfrom
pavelsavara:browser_trim_COM

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Mar 2, 2026

Copy link
Copy Markdown
Member

Trim COM/SEH-related code for non-Windows targets (Browser WASM)

Summary

This PR conditionally compiles out COM interop, SEH exception, and Windows-only code paths from the CoreCLR runtime when targeting non-Windows platforms (primarily Browser/WASM). It also removes reverse P/Invoke thunks for ComActivator methods that are not applicable on Browser, and teaches the WASM PInvokeCollector to skip callbacks on types marked as unsupported on Browser.

Changes

SEH exception trimming (#ifdef TARGET_WINDOWS)

  • ex.h / ex.cpp: Wrap the SEHException class definition, constructors, and GetHR()/GetMessage() implementations in #ifdef TARGET_WINDOWS.
  • clrex.cpp: Wrap the SEHException handling path in GetThrowableFromException so non-Windows falls through to the generic HRException/COMException/DelegatingException handler.
  • dacfn.cpp: Wrap the SEHException rethrow logic in DacExceptionFilter in #ifdef TARGET_WINDOWS.
  • rexcep.h: Wrap the DEFINE_EXCEPTION for SEHException in #ifdef TARGET_WINDOWS.
  • excep.cpp:
    • MapWin32FaultToCOMPlusException default case: returns kSEHException on Windows, kException with _ASSERTE(!"Expected to be unreachable") on non-Windows.
    • Wrap SEHException references in DebugIsEECxxExceptionPointer in #ifdef TARGET_WINDOWS.

Move CallOutFilter / FilterAccessViolation from generic code

  • excep.cpp / excep.h: Remove CallOutFilter, CallOutFilterParam, and FilterAccessViolation — these are SEH-specific helpers only used from COM interop code.
  • interoputil.cpp: Move CallOutFilter and CallOutFilterParam here, where they are actually used (already inside #ifdef FEATURE_COMINTEROP compilation unit).

COM-specific type trimming (#ifdef FEATURE_COMINTEROP)

  • rexcep.h: Move InvalidOleVariantTypeException inside the existing #ifdef FEATURE_COMINTEROP block.
  • corelib.h: Wrap COMVARIANT class definition in #if defined(FEATURE_COMINTEROP).
  • metasig.h: Wrap ComVariant-related metasig definitions in #ifdef FEATURE_COMINTEROP.
  • olevariant.cpp: Wrap VT_VARIANTCLASS__COMVARIANT mapping in #ifdef FEATURE_COMINTEROP.
  • Marshal.cs (shared CoreLib): Wrap COR_E_INVALIDOLEVARIANTTYPEInvalidOleVariantTypeException mapping in #if FEATURE_COMINTEROP.

Swift types Apple-only (#ifdef TARGET_APPLE)

  • corelib.h: Wrap SwiftSelf, SwiftSelf<T>, SwiftError, SwiftIndirectResult class definitions in #ifdef TARGET_APPLE.

Platform annotation

  • ComActivator.PlatformNotSupported.cs: Add [SupportedOSPlatform("windows")] attribute so the WASM toolchain can detect it as unsupported.

WASM reverse call helpers

  • callhelpers-reverse.cpp: Remove three ComActivator reverse P/Invoke thunks (GetClassFactoryForTypeInternal, RegisterClassForTypeInternal, UnregisterClassForTypeInternal) and their entries in g_ReverseThunks. Rename OnThreadExitingOnThreadExited to match the upstream API rename.

WASM PInvoke collector - skip browser-unsupported types

  • PInvokeCollector.cs: Add IsUnsupportedOnBrowser method that checks for [UnsupportedOSPlatform("browser")] or [SupportedOSPlatform(...)] without "browser" on the declaring type. Callbacks on unsupported types are skipped during WASM app build, avoiding link errors for COM-related methods.

WASM call helper additions (unrelated fixups merged from main)

  • callhelpers-interp-to-managed.cpp: Add CallFunc_I32_I32_I32_RetI64 thunk and liii signature entry.
  • callhelpers-pinvoke.cpp: Add SystemNative_ReadV and SystemNative_WriteV P/Invoke declarations and table entries (count 92 → 94).

@pavelsavarapavelsavara added this to the 11.0.0 milestone Mar 2, 2026
@pavelsavarapavelsavara self-assigned this Mar 2, 2026
CopilotAI review requested due to automatic review settings March 2, 2026 23:23
@pavelsavarapavelsavara added arch-wasm WebAssembly architecture area-VM-coreclr size-reduction Issues impacting final app size primary for size sensitive workloads os-browser Browser variant of arch-wasm labels Mar 2, 2026
@dotnet-policy-servicedotnet-policy-serviceBot added the linkable-framework Issues associated with delivering a linker friendly framework label Mar 2, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR aims to reduce trimmed size for browser-WASM CoreCLR builds by removing/gating roots and native support code for features that aren’t supported in the browser (COM/interop-related pieces, DynamicInterfaceCastable, Swift interop, and intrinsics metadata rooting).

Changes:

  • Filters reverse P/Invoke stub generation for types marked [UnsupportedOSPlatform("browser")] and annotates ComActivator accordingly.
  • Gates ILLink rooting for ComponentActivator.GetFunctionPointer behind the existing native-hosting feature switch.
  • Adds TARGET_WASM guards to exclude DynamicInterfaceCastable native support on WASM and trims related ILLink roots / metadata retention paths.

Reviewed changes

Copilot reviewed 14 out of 14 changed files in this pull request and generated 7 comments.

Show a summary per file
FileDescription
src/tasks/WasmAppBuilder/generate-coreclr-helpers.cmdUpdates helper generation script used for CoreCLR WASM callhelper regeneration.
src/tasks/WasmAppBuilder/coreclr/PInvokeCollector.csSkips generating reverse P/Invoke callback stubs for types unsupported on browser.
src/libraries/System.Private.CoreLib/src/System/Runtime/CompilerServices/CompExactlyDependsOnAttribute.csRemoves CompExactlyDependsOnAttribute metadata for browser/WASI builds to improve trimming.
src/libraries/System.Private.CoreLib/src/ILLink/ILLink.Descriptors.Shared.xmlGates ComponentActivator.GetFunctionPointer rooting behind the native-hosting feature switch.
src/coreclr/vm/wasm/callhelpers-reverse.cppRegenerated reverse thunk table reflecting removed callbacks.
src/coreclr/vm/wasm/callhelpers-pinvoke.cppRegenerated P/Invoke table reflecting upstream removals.
src/coreclr/vm/virtualcallstub.cppRemoves DynamicInterfaceCastable resolver path from WASM builds.
src/coreclr/vm/rexcep.hAttempts to exclude interop exception types from WASM ILLink descriptor generation.
src/coreclr/vm/methodtable.cppRemoves IDynamicInterfaceCastable special method resolution on WASM.
src/coreclr/vm/jithelpers.cppRemoves IDynamicInterfaceCastable cast path on WASM.
src/coreclr/vm/dynamicinterfacecastable.hWraps DynamicInterfaceCastable API surface out of WASM builds.
src/coreclr/vm/dynamicinterfacecastable.cppWraps DynamicInterfaceCastable implementation out of WASM builds.
src/coreclr/vm/corelib.hAttempts to exclude Swift interop and ComVariant from WASM ILLink descriptor generation; removes DynamicInterfaceCastableHelpers from WASM.
src/coreclr/System.Private.CoreLib/src/Internal/Runtime/InteropServices/ComActivator.PlatformNotSupported.csMarks ComActivator as unsupported on browser to suppress reverse stub generation.

Comment threadsrc/tasks/WasmAppBuilder/generate-coreclr-helpers.cmd Outdated
Comment threadsrc/coreclr/vm/corelib.h Outdated
Comment threadsrc/coreclr/vm/corelib.h Outdated
Comment threadsrc/coreclr/vm/rexcep.h Outdated
Comment threadsrc/coreclr/vm/rexcep.h Outdated
Comment threadsrc/coreclr/vm/rexcep.h Outdated
Comment threadsrc/tasks/WasmAppBuilder/coreclr/PInvokeCollector.cs
Comment threadsrc/coreclr/vm/corelib.h Outdated
CopilotAI review requested due to automatic review settings March 13, 2026 15:29

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 8 out of 8 changed files in this pull request and generated 2 comments.

Comment threadsrc/coreclr/vm/rexcep.h Outdated
Comment threadsrc/coreclr/vm/corelib.h Outdated
Comment threadsrc/coreclr/vm/excep.h
CopilotAI review requested due to automatic review settings March 23, 2026 17:49

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

Comment threadsrc/coreclr/vm/interoputil.cpp
Comment threadsrc/coreclr/vm/olevariant.cpp Outdated
Comment threadsrc/coreclr/vm/olevariant.cpp Outdated
@jkotas

Copy link
Copy Markdown
Member

Any numbers for how much this saves? I like to have numbers for anything that claims to be a perf improvement.

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

Any numbers for how much this saves? I like to have numbers for anything that claims to be a perf improvement.

This is not about perf at all.
It started as much bigger IL trimming PR, but I was not able to reproduce Intrinsics at some point.
So, what we have right now is just cleanup. I can measure size difference, but it would not be big deal.

CopilotAI review requested due to automatic review settings March 25, 2026 16:53

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 16 out of 16 changed files in this pull request and generated 1 comment.

Comment threadsrc/tasks/WasmAppBuilder/coreclr/PInvokeCollector.cs
CopilotAI review requested due to automatic review settings March 26, 2026 08:18

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

Comment threadsrc/coreclr/vm/wasm/callhelpers-pinvoke.cpp
Comment threadsrc/coreclr/vm/excep.cpp
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g all CI issues are unrelated (as far as I can tell)

@pavelsavara
pavelsavara merged commit c401a8e into dotnet:mainMar 27, 2026
150 of 168 checks passed
@pavelsavara
pavelsavara deleted the browser_trim_COM branch March 27, 2026 08:51
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 26, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-VM-coreclrlinkable-frameworkIssues associated with delivering a linker friendly frameworkos-browserBrowser variant of arch-wasmsize-reductionIssues impacting final app size primary for size sensitive workloads

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

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

[browser][coreCLR] no COM, no swift - #125083

Merged
pavelsavara merged 32 commits into
dotnet:mainfrom
pavelsavara:browser_trim_COM
Mar 27, 2026
Merged

[browser][coreCLR] no COM, no swift#125083
pavelsavara merged 32 commits into
dotnet:mainfrom
pavelsavara:browser_trim_COM

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Mar 2, 2026

Copy link
Copy Markdown
Member

Trim COM/SEH-related code for non-Windows targets (Browser WASM)

Summary

This PR conditionally compiles out COM interop, SEH exception, and Windows-only code paths from the CoreCLR runtime when targeting non-Windows platforms (primarily Browser/WASM). It also removes reverse P/Invoke thunks for ComActivator methods that are not applicable on Browser, and teaches the WASM PInvokeCollector to skip callbacks on types marked as unsupported on Browser.

Changes

SEH exception trimming (#ifdef TARGET_WINDOWS)

  • ex.h / ex.cpp: Wrap the SEHException class definition, constructors, and GetHR()/GetMessage() implementations in #ifdef TARGET_WINDOWS.
  • clrex.cpp: Wrap the SEHException handling path in GetThrowableFromException so non-Windows falls through to the generic HRException/COMException/DelegatingException handler.
  • dacfn.cpp: Wrap the SEHException rethrow logic in DacExceptionFilter in #ifdef TARGET_WINDOWS.
  • rexcep.h: Wrap the DEFINE_EXCEPTION for SEHException in #ifdef TARGET_WINDOWS.
  • excep.cpp:
    • MapWin32FaultToCOMPlusException default case: returns kSEHException on Windows, kException with _ASSERTE(!"Expected to be unreachable") on non-Windows.
    • Wrap SEHException references in DebugIsEECxxExceptionPointer in #ifdef TARGET_WINDOWS.

Move CallOutFilter / FilterAccessViolation from generic code

  • excep.cpp / excep.h: Remove CallOutFilter, CallOutFilterParam, and FilterAccessViolation — these are SEH-specific helpers only used from COM interop code.
  • interoputil.cpp: Move CallOutFilter and CallOutFilterParam here, where they are actually used (already inside #ifdef FEATURE_COMINTEROP compilation unit).

COM-specific type trimming (#ifdef FEATURE_COMINTEROP)

  • rexcep.h: Move InvalidOleVariantTypeException inside the existing #ifdef FEATURE_COMINTEROP block.
  • corelib.h: Wrap COMVARIANT class definition in #if defined(FEATURE_COMINTEROP).
  • metasig.h: Wrap ComVariant-related metasig definitions in #ifdef FEATURE_COMINTEROP.
  • olevariant.cpp: Wrap VT_VARIANTCLASS__COMVARIANT mapping in #ifdef FEATURE_COMINTEROP.
  • Marshal.cs (shared CoreLib): Wrap COR_E_INVALIDOLEVARIANTTYPEInvalidOleVariantTypeException mapping in #if FEATURE_COMINTEROP.

Swift types Apple-only (#ifdef TARGET_APPLE)

  • corelib.h: Wrap SwiftSelf, SwiftSelf<T>, SwiftError, SwiftIndirectResult class definitions in #ifdef TARGET_APPLE.

Platform annotation

  • ComActivator.PlatformNotSupported.cs: Add [SupportedOSPlatform("windows")] attribute so the WASM toolchain can detect it as unsupported.

WASM reverse call helpers

  • callhelpers-reverse.cpp: Remove three ComActivator reverse P/Invoke thunks (GetClassFactoryForTypeInternal, RegisterClassForTypeInternal, UnregisterClassForTypeInternal) and their entries in g_ReverseThunks. Rename OnThreadExitingOnThreadExited to match the upstream API rename.

WASM PInvoke collector - skip browser-unsupported types

  • PInvokeCollector.cs: Add IsUnsupportedOnBrowser method that checks for [UnsupportedOSPlatform("browser")] or [SupportedOSPlatform(...)] without "browser" on the declaring type. Callbacks on unsupported types are skipped during WASM app build, avoiding link errors for COM-related methods.

WASM call helper additions (unrelated fixups merged from main)

  • callhelpers-interp-to-managed.cpp: Add CallFunc_I32_I32_I32_RetI64 thunk and liii signature entry.
  • callhelpers-pinvoke.cpp: Add SystemNative_ReadV and SystemNative_WriteV P/Invoke declarations and table entries (count 92 → 94).

@pavelsavarapavelsavara added this to the 11.0.0 milestone Mar 2, 2026
@pavelsavarapavelsavara self-assigned this Mar 2, 2026
CopilotAI review requested due to automatic review settings March 2, 2026 23:23
@pavelsavarapavelsavara added arch-wasm WebAssembly architecture area-VM-coreclr size-reduction Issues impacting final app size primary for size sensitive workloads os-browser Browser variant of arch-wasm labels Mar 2, 2026
@dotnet-policy-servicedotnet-policy-serviceBot added the linkable-framework Issues associated with delivering a linker friendly framework label Mar 2, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR aims to reduce trimmed size for browser-WASM CoreCLR builds by removing/gating roots and native support code for features that aren’t supported in the browser (COM/interop-related pieces, DynamicInterfaceCastable, Swift interop, and intrinsics metadata rooting).

Changes:

  • Filters reverse P/Invoke stub generation for types marked [UnsupportedOSPlatform("browser")] and annotates ComActivator accordingly.
  • Gates ILLink rooting for ComponentActivator.GetFunctionPointer behind the existing native-hosting feature switch.
  • Adds TARGET_WASM guards to exclude DynamicInterfaceCastable native support on WASM and trims related ILLink roots / metadata retention paths.

Reviewed changes

Copilot reviewed 14 out of 14 changed files in this pull request and generated 7 comments.

Show a summary per file
FileDescription
src/tasks/WasmAppBuilder/generate-coreclr-helpers.cmdUpdates helper generation script used for CoreCLR WASM callhelper regeneration.
src/tasks/WasmAppBuilder/coreclr/PInvokeCollector.csSkips generating reverse P/Invoke callback stubs for types unsupported on browser.
src/libraries/System.Private.CoreLib/src/System/Runtime/CompilerServices/CompExactlyDependsOnAttribute.csRemoves CompExactlyDependsOnAttribute metadata for browser/WASI builds to improve trimming.
src/libraries/System.Private.CoreLib/src/ILLink/ILLink.Descriptors.Shared.xmlGates ComponentActivator.GetFunctionPointer rooting behind the native-hosting feature switch.
src/coreclr/vm/wasm/callhelpers-reverse.cppRegenerated reverse thunk table reflecting removed callbacks.
src/coreclr/vm/wasm/callhelpers-pinvoke.cppRegenerated P/Invoke table reflecting upstream removals.
src/coreclr/vm/virtualcallstub.cppRemoves DynamicInterfaceCastable resolver path from WASM builds.
src/coreclr/vm/rexcep.hAttempts to exclude interop exception types from WASM ILLink descriptor generation.
src/coreclr/vm/methodtable.cppRemoves IDynamicInterfaceCastable special method resolution on WASM.
src/coreclr/vm/jithelpers.cppRemoves IDynamicInterfaceCastable cast path on WASM.
src/coreclr/vm/dynamicinterfacecastable.hWraps DynamicInterfaceCastable API surface out of WASM builds.
src/coreclr/vm/dynamicinterfacecastable.cppWraps DynamicInterfaceCastable implementation out of WASM builds.
src/coreclr/vm/corelib.hAttempts to exclude Swift interop and ComVariant from WASM ILLink descriptor generation; removes DynamicInterfaceCastableHelpers from WASM.
src/coreclr/System.Private.CoreLib/src/Internal/Runtime/InteropServices/ComActivator.PlatformNotSupported.csMarks ComActivator as unsupported on browser to suppress reverse stub generation.

Comment threadsrc/tasks/WasmAppBuilder/generate-coreclr-helpers.cmd Outdated
Comment threadsrc/coreclr/vm/corelib.h Outdated
Comment threadsrc/coreclr/vm/corelib.h Outdated
Comment threadsrc/coreclr/vm/rexcep.h Outdated
Comment threadsrc/coreclr/vm/rexcep.h Outdated
Comment threadsrc/coreclr/vm/rexcep.h Outdated
Comment threadsrc/tasks/WasmAppBuilder/coreclr/PInvokeCollector.cs
Comment threadsrc/coreclr/vm/corelib.h Outdated
CopilotAI review requested due to automatic review settings March 13, 2026 15:29

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 8 out of 8 changed files in this pull request and generated 2 comments.

Comment threadsrc/coreclr/vm/rexcep.h Outdated
Comment threadsrc/coreclr/vm/corelib.h Outdated
Comment threadsrc/coreclr/vm/excep.h
CopilotAI review requested due to automatic review settings March 23, 2026 17:49

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

Comment threadsrc/coreclr/vm/interoputil.cpp
Comment threadsrc/coreclr/vm/olevariant.cpp Outdated
Comment threadsrc/coreclr/vm/olevariant.cpp Outdated
@jkotas

Copy link
Copy Markdown
Member

Any numbers for how much this saves? I like to have numbers for anything that claims to be a perf improvement.

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

Any numbers for how much this saves? I like to have numbers for anything that claims to be a perf improvement.

This is not about perf at all.
It started as much bigger IL trimming PR, but I was not able to reproduce Intrinsics at some point.
So, what we have right now is just cleanup. I can measure size difference, but it would not be big deal.

CopilotAI review requested due to automatic review settings March 25, 2026 16:53

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 16 out of 16 changed files in this pull request and generated 1 comment.

Comment threadsrc/tasks/WasmAppBuilder/coreclr/PInvokeCollector.cs
CopilotAI review requested due to automatic review settings March 26, 2026 08:18

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

Comment threadsrc/coreclr/vm/wasm/callhelpers-pinvoke.cpp
Comment threadsrc/coreclr/vm/excep.cpp
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g all CI issues are unrelated (as far as I can tell)

@pavelsavara
pavelsavara merged commit c401a8e into dotnet:mainMar 27, 2026
150 of 168 checks passed
@pavelsavara
pavelsavara deleted the browser_trim_COM branch March 27, 2026 08:51
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 26, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-VM-coreclrlinkable-frameworkIssues associated with delivering a linker friendly frameworkos-browserBrowser variant of arch-wasmsize-reductionIssues impacting final app size primary for size sensitive workloads

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

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

[browser][coreCLR] no COM, no swift - #125083

Merged
pavelsavara merged 32 commits into
dotnet:mainfrom
pavelsavara:browser_trim_COM
Mar 27, 2026
Merged

[browser][coreCLR] no COM, no swift#125083
pavelsavara merged 32 commits into
dotnet:mainfrom
pavelsavara:browser_trim_COM

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Mar 2, 2026

Copy link
Copy Markdown
Member

Trim COM/SEH-related code for non-Windows targets (Browser WASM)

Summary

This PR conditionally compiles out COM interop, SEH exception, and Windows-only code paths from the CoreCLR runtime when targeting non-Windows platforms (primarily Browser/WASM). It also removes reverse P/Invoke thunks for ComActivator methods that are not applicable on Browser, and teaches the WASM PInvokeCollector to skip callbacks on types marked as unsupported on Browser.

Changes

SEH exception trimming (#ifdef TARGET_WINDOWS)

  • ex.h / ex.cpp: Wrap the SEHException class definition, constructors, and GetHR()/GetMessage() implementations in #ifdef TARGET_WINDOWS.
  • clrex.cpp: Wrap the SEHException handling path in GetThrowableFromException so non-Windows falls through to the generic HRException/COMException/DelegatingException handler.
  • dacfn.cpp: Wrap the SEHException rethrow logic in DacExceptionFilter in #ifdef TARGET_WINDOWS.
  • rexcep.h: Wrap the DEFINE_EXCEPTION for SEHException in #ifdef TARGET_WINDOWS.
  • excep.cpp:
    • MapWin32FaultToCOMPlusException default case: returns kSEHException on Windows, kException with _ASSERTE(!"Expected to be unreachable") on non-Windows.
    • Wrap SEHException references in DebugIsEECxxExceptionPointer in #ifdef TARGET_WINDOWS.

Move CallOutFilter / FilterAccessViolation from generic code

  • excep.cpp / excep.h: Remove CallOutFilter, CallOutFilterParam, and FilterAccessViolation — these are SEH-specific helpers only used from COM interop code.
  • interoputil.cpp: Move CallOutFilter and CallOutFilterParam here, where they are actually used (already inside #ifdef FEATURE_COMINTEROP compilation unit).

COM-specific type trimming (#ifdef FEATURE_COMINTEROP)

  • rexcep.h: Move InvalidOleVariantTypeException inside the existing #ifdef FEATURE_COMINTEROP block.
  • corelib.h: Wrap COMVARIANT class definition in #if defined(FEATURE_COMINTEROP).
  • metasig.h: Wrap ComVariant-related metasig definitions in #ifdef FEATURE_COMINTEROP.
  • olevariant.cpp: Wrap VT_VARIANTCLASS__COMVARIANT mapping in #ifdef FEATURE_COMINTEROP.
  • Marshal.cs (shared CoreLib): Wrap COR_E_INVALIDOLEVARIANTTYPEInvalidOleVariantTypeException mapping in #if FEATURE_COMINTEROP.

Swift types Apple-only (#ifdef TARGET_APPLE)

  • corelib.h: Wrap SwiftSelf, SwiftSelf<T>, SwiftError, SwiftIndirectResult class definitions in #ifdef TARGET_APPLE.

Platform annotation

  • ComActivator.PlatformNotSupported.cs: Add [SupportedOSPlatform("windows")] attribute so the WASM toolchain can detect it as unsupported.

WASM reverse call helpers

  • callhelpers-reverse.cpp: Remove three ComActivator reverse P/Invoke thunks (GetClassFactoryForTypeInternal, RegisterClassForTypeInternal, UnregisterClassForTypeInternal) and their entries in g_ReverseThunks. Rename OnThreadExitingOnThreadExited to match the upstream API rename.

WASM PInvoke collector - skip browser-unsupported types

  • PInvokeCollector.cs: Add IsUnsupportedOnBrowser method that checks for [UnsupportedOSPlatform("browser")] or [SupportedOSPlatform(...)] without "browser" on the declaring type. Callbacks on unsupported types are skipped during WASM app build, avoiding link errors for COM-related methods.

WASM call helper additions (unrelated fixups merged from main)

  • callhelpers-interp-to-managed.cpp: Add CallFunc_I32_I32_I32_RetI64 thunk and liii signature entry.
  • callhelpers-pinvoke.cpp: Add SystemNative_ReadV and SystemNative_WriteV P/Invoke declarations and table entries (count 92 → 94).

@pavelsavarapavelsavara added this to the 11.0.0 milestone Mar 2, 2026
@pavelsavarapavelsavara self-assigned this Mar 2, 2026
CopilotAI review requested due to automatic review settings March 2, 2026 23:23
@pavelsavarapavelsavara added arch-wasm WebAssembly architecture area-VM-coreclr size-reduction Issues impacting final app size primary for size sensitive workloads os-browser Browser variant of arch-wasm labels Mar 2, 2026
@dotnet-policy-servicedotnet-policy-serviceBot added the linkable-framework Issues associated with delivering a linker friendly framework label Mar 2, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR aims to reduce trimmed size for browser-WASM CoreCLR builds by removing/gating roots and native support code for features that aren’t supported in the browser (COM/interop-related pieces, DynamicInterfaceCastable, Swift interop, and intrinsics metadata rooting).

Changes:

  • Filters reverse P/Invoke stub generation for types marked [UnsupportedOSPlatform("browser")] and annotates ComActivator accordingly.
  • Gates ILLink rooting for ComponentActivator.GetFunctionPointer behind the existing native-hosting feature switch.
  • Adds TARGET_WASM guards to exclude DynamicInterfaceCastable native support on WASM and trims related ILLink roots / metadata retention paths.

Reviewed changes

Copilot reviewed 14 out of 14 changed files in this pull request and generated 7 comments.

Show a summary per file
FileDescription
src/tasks/WasmAppBuilder/generate-coreclr-helpers.cmdUpdates helper generation script used for CoreCLR WASM callhelper regeneration.
src/tasks/WasmAppBuilder/coreclr/PInvokeCollector.csSkips generating reverse P/Invoke callback stubs for types unsupported on browser.
src/libraries/System.Private.CoreLib/src/System/Runtime/CompilerServices/CompExactlyDependsOnAttribute.csRemoves CompExactlyDependsOnAttribute metadata for browser/WASI builds to improve trimming.
src/libraries/System.Private.CoreLib/src/ILLink/ILLink.Descriptors.Shared.xmlGates ComponentActivator.GetFunctionPointer rooting behind the native-hosting feature switch.
src/coreclr/vm/wasm/callhelpers-reverse.cppRegenerated reverse thunk table reflecting removed callbacks.
src/coreclr/vm/wasm/callhelpers-pinvoke.cppRegenerated P/Invoke table reflecting upstream removals.
src/coreclr/vm/virtualcallstub.cppRemoves DynamicInterfaceCastable resolver path from WASM builds.
src/coreclr/vm/rexcep.hAttempts to exclude interop exception types from WASM ILLink descriptor generation.
src/coreclr/vm/methodtable.cppRemoves IDynamicInterfaceCastable special method resolution on WASM.
src/coreclr/vm/jithelpers.cppRemoves IDynamicInterfaceCastable cast path on WASM.
src/coreclr/vm/dynamicinterfacecastable.hWraps DynamicInterfaceCastable API surface out of WASM builds.
src/coreclr/vm/dynamicinterfacecastable.cppWraps DynamicInterfaceCastable implementation out of WASM builds.
src/coreclr/vm/corelib.hAttempts to exclude Swift interop and ComVariant from WASM ILLink descriptor generation; removes DynamicInterfaceCastableHelpers from WASM.
src/coreclr/System.Private.CoreLib/src/Internal/Runtime/InteropServices/ComActivator.PlatformNotSupported.csMarks ComActivator as unsupported on browser to suppress reverse stub generation.

Comment threadsrc/tasks/WasmAppBuilder/generate-coreclr-helpers.cmd Outdated
Comment threadsrc/coreclr/vm/corelib.h Outdated
Comment threadsrc/coreclr/vm/corelib.h Outdated
Comment threadsrc/coreclr/vm/rexcep.h Outdated
Comment threadsrc/coreclr/vm/rexcep.h Outdated
Comment threadsrc/coreclr/vm/rexcep.h Outdated
Comment threadsrc/tasks/WasmAppBuilder/coreclr/PInvokeCollector.cs
Comment threadsrc/coreclr/vm/corelib.h Outdated
CopilotAI review requested due to automatic review settings March 13, 2026 15:29

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 8 out of 8 changed files in this pull request and generated 2 comments.

Comment threadsrc/coreclr/vm/rexcep.h Outdated
Comment threadsrc/coreclr/vm/corelib.h Outdated
Comment threadsrc/coreclr/vm/excep.h
CopilotAI review requested due to automatic review settings March 23, 2026 17:49

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

Comment threadsrc/coreclr/vm/interoputil.cpp
Comment threadsrc/coreclr/vm/olevariant.cpp Outdated
Comment threadsrc/coreclr/vm/olevariant.cpp Outdated
@jkotas

Copy link
Copy Markdown
Member

Any numbers for how much this saves? I like to have numbers for anything that claims to be a perf improvement.

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

Any numbers for how much this saves? I like to have numbers for anything that claims to be a perf improvement.

This is not about perf at all.
It started as much bigger IL trimming PR, but I was not able to reproduce Intrinsics at some point.
So, what we have right now is just cleanup. I can measure size difference, but it would not be big deal.

CopilotAI review requested due to automatic review settings March 25, 2026 16:53

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 16 out of 16 changed files in this pull request and generated 1 comment.

Comment threadsrc/tasks/WasmAppBuilder/coreclr/PInvokeCollector.cs
CopilotAI review requested due to automatic review settings March 26, 2026 08:18

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

Comment threadsrc/coreclr/vm/wasm/callhelpers-pinvoke.cpp
Comment threadsrc/coreclr/vm/excep.cpp
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g all CI issues are unrelated (as far as I can tell)

@pavelsavara
pavelsavara merged commit c401a8e into dotnet:mainMar 27, 2026
150 of 168 checks passed
@pavelsavara
pavelsavara deleted the browser_trim_COM branch March 27, 2026 08:51
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 26, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-VM-coreclrlinkable-frameworkIssues associated with delivering a linker friendly frameworkos-browserBrowser variant of arch-wasmsize-reductionIssues impacting final app size primary for size sensitive workloads

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

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

[browser][coreCLR] no COM, no swift - #125083

Merged
pavelsavara merged 32 commits into
dotnet:mainfrom
pavelsavara:browser_trim_COM
Mar 27, 2026
Merged

[browser][coreCLR] no COM, no swift#125083
pavelsavara merged 32 commits into
dotnet:mainfrom
pavelsavara:browser_trim_COM

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Mar 2, 2026

Copy link
Copy Markdown
Member

Trim COM/SEH-related code for non-Windows targets (Browser WASM)

Summary

This PR conditionally compiles out COM interop, SEH exception, and Windows-only code paths from the CoreCLR runtime when targeting non-Windows platforms (primarily Browser/WASM). It also removes reverse P/Invoke thunks for ComActivator methods that are not applicable on Browser, and teaches the WASM PInvokeCollector to skip callbacks on types marked as unsupported on Browser.

Changes

SEH exception trimming (#ifdef TARGET_WINDOWS)

  • ex.h / ex.cpp: Wrap the SEHException class definition, constructors, and GetHR()/GetMessage() implementations in #ifdef TARGET_WINDOWS.
  • clrex.cpp: Wrap the SEHException handling path in GetThrowableFromException so non-Windows falls through to the generic HRException/COMException/DelegatingException handler.
  • dacfn.cpp: Wrap the SEHException rethrow logic in DacExceptionFilter in #ifdef TARGET_WINDOWS.
  • rexcep.h: Wrap the DEFINE_EXCEPTION for SEHException in #ifdef TARGET_WINDOWS.
  • excep.cpp:
    • MapWin32FaultToCOMPlusException default case: returns kSEHException on Windows, kException with _ASSERTE(!"Expected to be unreachable") on non-Windows.
    • Wrap SEHException references in DebugIsEECxxExceptionPointer in #ifdef TARGET_WINDOWS.

Move CallOutFilter / FilterAccessViolation from generic code

  • excep.cpp / excep.h: Remove CallOutFilter, CallOutFilterParam, and FilterAccessViolation — these are SEH-specific helpers only used from COM interop code.
  • interoputil.cpp: Move CallOutFilter and CallOutFilterParam here, where they are actually used (already inside #ifdef FEATURE_COMINTEROP compilation unit).

COM-specific type trimming (#ifdef FEATURE_COMINTEROP)

  • rexcep.h: Move InvalidOleVariantTypeException inside the existing #ifdef FEATURE_COMINTEROP block.
  • corelib.h: Wrap COMVARIANT class definition in #if defined(FEATURE_COMINTEROP).
  • metasig.h: Wrap ComVariant-related metasig definitions in #ifdef FEATURE_COMINTEROP.
  • olevariant.cpp: Wrap VT_VARIANTCLASS__COMVARIANT mapping in #ifdef FEATURE_COMINTEROP.
  • Marshal.cs (shared CoreLib): Wrap COR_E_INVALIDOLEVARIANTTYPEInvalidOleVariantTypeException mapping in #if FEATURE_COMINTEROP.

Swift types Apple-only (#ifdef TARGET_APPLE)

  • corelib.h: Wrap SwiftSelf, SwiftSelf<T>, SwiftError, SwiftIndirectResult class definitions in #ifdef TARGET_APPLE.

Platform annotation

  • ComActivator.PlatformNotSupported.cs: Add [SupportedOSPlatform("windows")] attribute so the WASM toolchain can detect it as unsupported.

WASM reverse call helpers

  • callhelpers-reverse.cpp: Remove three ComActivator reverse P/Invoke thunks (GetClassFactoryForTypeInternal, RegisterClassForTypeInternal, UnregisterClassForTypeInternal) and their entries in g_ReverseThunks. Rename OnThreadExitingOnThreadExited to match the upstream API rename.

WASM PInvoke collector - skip browser-unsupported types

  • PInvokeCollector.cs: Add IsUnsupportedOnBrowser method that checks for [UnsupportedOSPlatform("browser")] or [SupportedOSPlatform(...)] without "browser" on the declaring type. Callbacks on unsupported types are skipped during WASM app build, avoiding link errors for COM-related methods.

WASM call helper additions (unrelated fixups merged from main)

  • callhelpers-interp-to-managed.cpp: Add CallFunc_I32_I32_I32_RetI64 thunk and liii signature entry.
  • callhelpers-pinvoke.cpp: Add SystemNative_ReadV and SystemNative_WriteV P/Invoke declarations and table entries (count 92 → 94).

@pavelsavarapavelsavara added this to the 11.0.0 milestone Mar 2, 2026
@pavelsavarapavelsavara self-assigned this Mar 2, 2026
CopilotAI review requested due to automatic review settings March 2, 2026 23:23
@pavelsavarapavelsavara added arch-wasm WebAssembly architecture area-VM-coreclr size-reduction Issues impacting final app size primary for size sensitive workloads os-browser Browser variant of arch-wasm labels Mar 2, 2026
@dotnet-policy-servicedotnet-policy-serviceBot added the linkable-framework Issues associated with delivering a linker friendly framework label Mar 2, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR aims to reduce trimmed size for browser-WASM CoreCLR builds by removing/gating roots and native support code for features that aren’t supported in the browser (COM/interop-related pieces, DynamicInterfaceCastable, Swift interop, and intrinsics metadata rooting).

Changes:

  • Filters reverse P/Invoke stub generation for types marked [UnsupportedOSPlatform("browser")] and annotates ComActivator accordingly.
  • Gates ILLink rooting for ComponentActivator.GetFunctionPointer behind the existing native-hosting feature switch.
  • Adds TARGET_WASM guards to exclude DynamicInterfaceCastable native support on WASM and trims related ILLink roots / metadata retention paths.

Reviewed changes

Copilot reviewed 14 out of 14 changed files in this pull request and generated 7 comments.

Show a summary per file
FileDescription
src/tasks/WasmAppBuilder/generate-coreclr-helpers.cmdUpdates helper generation script used for CoreCLR WASM callhelper regeneration.
src/tasks/WasmAppBuilder/coreclr/PInvokeCollector.csSkips generating reverse P/Invoke callback stubs for types unsupported on browser.
src/libraries/System.Private.CoreLib/src/System/Runtime/CompilerServices/CompExactlyDependsOnAttribute.csRemoves CompExactlyDependsOnAttribute metadata for browser/WASI builds to improve trimming.
src/libraries/System.Private.CoreLib/src/ILLink/ILLink.Descriptors.Shared.xmlGates ComponentActivator.GetFunctionPointer rooting behind the native-hosting feature switch.
src/coreclr/vm/wasm/callhelpers-reverse.cppRegenerated reverse thunk table reflecting removed callbacks.
src/coreclr/vm/wasm/callhelpers-pinvoke.cppRegenerated P/Invoke table reflecting upstream removals.
src/coreclr/vm/virtualcallstub.cppRemoves DynamicInterfaceCastable resolver path from WASM builds.
src/coreclr/vm/rexcep.hAttempts to exclude interop exception types from WASM ILLink descriptor generation.
src/coreclr/vm/methodtable.cppRemoves IDynamicInterfaceCastable special method resolution on WASM.
src/coreclr/vm/jithelpers.cppRemoves IDynamicInterfaceCastable cast path on WASM.
src/coreclr/vm/dynamicinterfacecastable.hWraps DynamicInterfaceCastable API surface out of WASM builds.
src/coreclr/vm/dynamicinterfacecastable.cppWraps DynamicInterfaceCastable implementation out of WASM builds.
src/coreclr/vm/corelib.hAttempts to exclude Swift interop and ComVariant from WASM ILLink descriptor generation; removes DynamicInterfaceCastableHelpers from WASM.
src/coreclr/System.Private.CoreLib/src/Internal/Runtime/InteropServices/ComActivator.PlatformNotSupported.csMarks ComActivator as unsupported on browser to suppress reverse stub generation.

Comment threadsrc/tasks/WasmAppBuilder/generate-coreclr-helpers.cmd Outdated
Comment threadsrc/coreclr/vm/corelib.h Outdated
Comment threadsrc/coreclr/vm/corelib.h Outdated
Comment threadsrc/coreclr/vm/rexcep.h Outdated
Comment threadsrc/coreclr/vm/rexcep.h Outdated
Comment threadsrc/coreclr/vm/rexcep.h Outdated
Comment threadsrc/tasks/WasmAppBuilder/coreclr/PInvokeCollector.cs
Comment threadsrc/coreclr/vm/corelib.h Outdated
CopilotAI review requested due to automatic review settings March 13, 2026 15:29

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 8 out of 8 changed files in this pull request and generated 2 comments.

Comment threadsrc/coreclr/vm/rexcep.h Outdated
Comment threadsrc/coreclr/vm/corelib.h Outdated
Comment threadsrc/coreclr/vm/excep.h
CopilotAI review requested due to automatic review settings March 23, 2026 17:49

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

Comment threadsrc/coreclr/vm/interoputil.cpp
Comment threadsrc/coreclr/vm/olevariant.cpp Outdated
Comment threadsrc/coreclr/vm/olevariant.cpp Outdated
@jkotas

Copy link
Copy Markdown
Member

Any numbers for how much this saves? I like to have numbers for anything that claims to be a perf improvement.

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

Any numbers for how much this saves? I like to have numbers for anything that claims to be a perf improvement.

This is not about perf at all.
It started as much bigger IL trimming PR, but I was not able to reproduce Intrinsics at some point.
So, what we have right now is just cleanup. I can measure size difference, but it would not be big deal.

CopilotAI review requested due to automatic review settings March 25, 2026 16:53

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 16 out of 16 changed files in this pull request and generated 1 comment.

Comment threadsrc/tasks/WasmAppBuilder/coreclr/PInvokeCollector.cs
CopilotAI review requested due to automatic review settings March 26, 2026 08:18

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

Comment threadsrc/coreclr/vm/wasm/callhelpers-pinvoke.cpp
Comment threadsrc/coreclr/vm/excep.cpp
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g all CI issues are unrelated (as far as I can tell)

@pavelsavara
pavelsavara merged commit c401a8e into dotnet:mainMar 27, 2026
150 of 168 checks passed
@pavelsavara
pavelsavara deleted the browser_trim_COM branch March 27, 2026 08:51
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 26, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-VM-coreclrlinkable-frameworkIssues associated with delivering a linker friendly frameworkos-browserBrowser variant of arch-wasmsize-reductionIssues impacting final app size primary for size sensitive workloads

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

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

[browser][coreCLR] no COM, no swift - #125083

Merged
pavelsavara merged 32 commits into
dotnet:mainfrom
pavelsavara:browser_trim_COM
Mar 27, 2026
Merged

[browser][coreCLR] no COM, no swift#125083
pavelsavara merged 32 commits into
dotnet:mainfrom
pavelsavara:browser_trim_COM

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Mar 2, 2026

Copy link
Copy Markdown
Member

Trim COM/SEH-related code for non-Windows targets (Browser WASM)

Summary

This PR conditionally compiles out COM interop, SEH exception, and Windows-only code paths from the CoreCLR runtime when targeting non-Windows platforms (primarily Browser/WASM). It also removes reverse P/Invoke thunks for ComActivator methods that are not applicable on Browser, and teaches the WASM PInvokeCollector to skip callbacks on types marked as unsupported on Browser.

Changes

SEH exception trimming (#ifdef TARGET_WINDOWS)

  • ex.h / ex.cpp: Wrap the SEHException class definition, constructors, and GetHR()/GetMessage() implementations in #ifdef TARGET_WINDOWS.
  • clrex.cpp: Wrap the SEHException handling path in GetThrowableFromException so non-Windows falls through to the generic HRException/COMException/DelegatingException handler.
  • dacfn.cpp: Wrap the SEHException rethrow logic in DacExceptionFilter in #ifdef TARGET_WINDOWS.
  • rexcep.h: Wrap the DEFINE_EXCEPTION for SEHException in #ifdef TARGET_WINDOWS.
  • excep.cpp:
    • MapWin32FaultToCOMPlusException default case: returns kSEHException on Windows, kException with _ASSERTE(!"Expected to be unreachable") on non-Windows.
    • Wrap SEHException references in DebugIsEECxxExceptionPointer in #ifdef TARGET_WINDOWS.

Move CallOutFilter / FilterAccessViolation from generic code

  • excep.cpp / excep.h: Remove CallOutFilter, CallOutFilterParam, and FilterAccessViolation — these are SEH-specific helpers only used from COM interop code.
  • interoputil.cpp: Move CallOutFilter and CallOutFilterParam here, where they are actually used (already inside #ifdef FEATURE_COMINTEROP compilation unit).

COM-specific type trimming (#ifdef FEATURE_COMINTEROP)

  • rexcep.h: Move InvalidOleVariantTypeException inside the existing #ifdef FEATURE_COMINTEROP block.
  • corelib.h: Wrap COMVARIANT class definition in #if defined(FEATURE_COMINTEROP).
  • metasig.h: Wrap ComVariant-related metasig definitions in #ifdef FEATURE_COMINTEROP.
  • olevariant.cpp: Wrap VT_VARIANTCLASS__COMVARIANT mapping in #ifdef FEATURE_COMINTEROP.
  • Marshal.cs (shared CoreLib): Wrap COR_E_INVALIDOLEVARIANTTYPEInvalidOleVariantTypeException mapping in #if FEATURE_COMINTEROP.

Swift types Apple-only (#ifdef TARGET_APPLE)

  • corelib.h: Wrap SwiftSelf, SwiftSelf<T>, SwiftError, SwiftIndirectResult class definitions in #ifdef TARGET_APPLE.

Platform annotation

  • ComActivator.PlatformNotSupported.cs: Add [SupportedOSPlatform("windows")] attribute so the WASM toolchain can detect it as unsupported.

WASM reverse call helpers

  • callhelpers-reverse.cpp: Remove three ComActivator reverse P/Invoke thunks (GetClassFactoryForTypeInternal, RegisterClassForTypeInternal, UnregisterClassForTypeInternal) and their entries in g_ReverseThunks. Rename OnThreadExitingOnThreadExited to match the upstream API rename.

WASM PInvoke collector - skip browser-unsupported types

  • PInvokeCollector.cs: Add IsUnsupportedOnBrowser method that checks for [UnsupportedOSPlatform("browser")] or [SupportedOSPlatform(...)] without "browser" on the declaring type. Callbacks on unsupported types are skipped during WASM app build, avoiding link errors for COM-related methods.

WASM call helper additions (unrelated fixups merged from main)

  • callhelpers-interp-to-managed.cpp: Add CallFunc_I32_I32_I32_RetI64 thunk and liii signature entry.
  • callhelpers-pinvoke.cpp: Add SystemNative_ReadV and SystemNative_WriteV P/Invoke declarations and table entries (count 92 → 94).

@pavelsavarapavelsavara added this to the 11.0.0 milestone Mar 2, 2026
@pavelsavarapavelsavara self-assigned this Mar 2, 2026
CopilotAI review requested due to automatic review settings March 2, 2026 23:23
@pavelsavarapavelsavara added arch-wasm WebAssembly architecture area-VM-coreclr size-reduction Issues impacting final app size primary for size sensitive workloads os-browser Browser variant of arch-wasm labels Mar 2, 2026
@dotnet-policy-servicedotnet-policy-serviceBot added the linkable-framework Issues associated with delivering a linker friendly framework label Mar 2, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR aims to reduce trimmed size for browser-WASM CoreCLR builds by removing/gating roots and native support code for features that aren’t supported in the browser (COM/interop-related pieces, DynamicInterfaceCastable, Swift interop, and intrinsics metadata rooting).

Changes:

  • Filters reverse P/Invoke stub generation for types marked [UnsupportedOSPlatform("browser")] and annotates ComActivator accordingly.
  • Gates ILLink rooting for ComponentActivator.GetFunctionPointer behind the existing native-hosting feature switch.
  • Adds TARGET_WASM guards to exclude DynamicInterfaceCastable native support on WASM and trims related ILLink roots / metadata retention paths.

Reviewed changes

Copilot reviewed 14 out of 14 changed files in this pull request and generated 7 comments.

Show a summary per file
FileDescription
src/tasks/WasmAppBuilder/generate-coreclr-helpers.cmdUpdates helper generation script used for CoreCLR WASM callhelper regeneration.
src/tasks/WasmAppBuilder/coreclr/PInvokeCollector.csSkips generating reverse P/Invoke callback stubs for types unsupported on browser.
src/libraries/System.Private.CoreLib/src/System/Runtime/CompilerServices/CompExactlyDependsOnAttribute.csRemoves CompExactlyDependsOnAttribute metadata for browser/WASI builds to improve trimming.
src/libraries/System.Private.CoreLib/src/ILLink/ILLink.Descriptors.Shared.xmlGates ComponentActivator.GetFunctionPointer rooting behind the native-hosting feature switch.
src/coreclr/vm/wasm/callhelpers-reverse.cppRegenerated reverse thunk table reflecting removed callbacks.
src/coreclr/vm/wasm/callhelpers-pinvoke.cppRegenerated P/Invoke table reflecting upstream removals.
src/coreclr/vm/virtualcallstub.cppRemoves DynamicInterfaceCastable resolver path from WASM builds.
src/coreclr/vm/rexcep.hAttempts to exclude interop exception types from WASM ILLink descriptor generation.
src/coreclr/vm/methodtable.cppRemoves IDynamicInterfaceCastable special method resolution on WASM.
src/coreclr/vm/jithelpers.cppRemoves IDynamicInterfaceCastable cast path on WASM.
src/coreclr/vm/dynamicinterfacecastable.hWraps DynamicInterfaceCastable API surface out of WASM builds.
src/coreclr/vm/dynamicinterfacecastable.cppWraps DynamicInterfaceCastable implementation out of WASM builds.
src/coreclr/vm/corelib.hAttempts to exclude Swift interop and ComVariant from WASM ILLink descriptor generation; removes DynamicInterfaceCastableHelpers from WASM.
src/coreclr/System.Private.CoreLib/src/Internal/Runtime/InteropServices/ComActivator.PlatformNotSupported.csMarks ComActivator as unsupported on browser to suppress reverse stub generation.

Comment threadsrc/tasks/WasmAppBuilder/generate-coreclr-helpers.cmd Outdated
Comment threadsrc/coreclr/vm/corelib.h Outdated
Comment threadsrc/coreclr/vm/corelib.h Outdated
Comment threadsrc/coreclr/vm/rexcep.h Outdated
Comment threadsrc/coreclr/vm/rexcep.h Outdated
Comment threadsrc/coreclr/vm/rexcep.h Outdated
Comment threadsrc/tasks/WasmAppBuilder/coreclr/PInvokeCollector.cs
Comment threadsrc/coreclr/vm/corelib.h Outdated
CopilotAI review requested due to automatic review settings March 13, 2026 15:29

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 8 out of 8 changed files in this pull request and generated 2 comments.

Comment threadsrc/coreclr/vm/rexcep.h Outdated
Comment threadsrc/coreclr/vm/corelib.h Outdated
Comment threadsrc/coreclr/vm/excep.h
CopilotAI review requested due to automatic review settings March 23, 2026 17:49

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

Comment threadsrc/coreclr/vm/interoputil.cpp
Comment threadsrc/coreclr/vm/olevariant.cpp Outdated
Comment threadsrc/coreclr/vm/olevariant.cpp Outdated
@jkotas

Copy link
Copy Markdown
Member

Any numbers for how much this saves? I like to have numbers for anything that claims to be a perf improvement.

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

Any numbers for how much this saves? I like to have numbers for anything that claims to be a perf improvement.

This is not about perf at all.
It started as much bigger IL trimming PR, but I was not able to reproduce Intrinsics at some point.
So, what we have right now is just cleanup. I can measure size difference, but it would not be big deal.

CopilotAI review requested due to automatic review settings March 25, 2026 16:53

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 16 out of 16 changed files in this pull request and generated 1 comment.

Comment threadsrc/tasks/WasmAppBuilder/coreclr/PInvokeCollector.cs
CopilotAI review requested due to automatic review settings March 26, 2026 08:18

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

Comment threadsrc/coreclr/vm/wasm/callhelpers-pinvoke.cpp
Comment threadsrc/coreclr/vm/excep.cpp
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g all CI issues are unrelated (as far as I can tell)

@pavelsavara
pavelsavara merged commit c401a8e into dotnet:mainMar 27, 2026
150 of 168 checks passed
@pavelsavara
pavelsavara deleted the browser_trim_COM branch March 27, 2026 08:51
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 26, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-VM-coreclrlinkable-frameworkIssues associated with delivering a linker friendly frameworkos-browserBrowser variant of arch-wasmsize-reductionIssues impacting final app size primary for size sensitive workloads

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

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

[browser][coreCLR] no COM, no swift - #125083

Merged
pavelsavara merged 32 commits into
dotnet:mainfrom
pavelsavara:browser_trim_COM
Mar 27, 2026
Merged

[browser][coreCLR] no COM, no swift#125083
pavelsavara merged 32 commits into
dotnet:mainfrom
pavelsavara:browser_trim_COM

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Mar 2, 2026

Copy link
Copy Markdown
Member

Trim COM/SEH-related code for non-Windows targets (Browser WASM)

Summary

This PR conditionally compiles out COM interop, SEH exception, and Windows-only code paths from the CoreCLR runtime when targeting non-Windows platforms (primarily Browser/WASM). It also removes reverse P/Invoke thunks for ComActivator methods that are not applicable on Browser, and teaches the WASM PInvokeCollector to skip callbacks on types marked as unsupported on Browser.

Changes

SEH exception trimming (#ifdef TARGET_WINDOWS)

  • ex.h / ex.cpp: Wrap the SEHException class definition, constructors, and GetHR()/GetMessage() implementations in #ifdef TARGET_WINDOWS.
  • clrex.cpp: Wrap the SEHException handling path in GetThrowableFromException so non-Windows falls through to the generic HRException/COMException/DelegatingException handler.
  • dacfn.cpp: Wrap the SEHException rethrow logic in DacExceptionFilter in #ifdef TARGET_WINDOWS.
  • rexcep.h: Wrap the DEFINE_EXCEPTION for SEHException in #ifdef TARGET_WINDOWS.
  • excep.cpp:
    • MapWin32FaultToCOMPlusException default case: returns kSEHException on Windows, kException with _ASSERTE(!"Expected to be unreachable") on non-Windows.
    • Wrap SEHException references in DebugIsEECxxExceptionPointer in #ifdef TARGET_WINDOWS.

Move CallOutFilter / FilterAccessViolation from generic code

  • excep.cpp / excep.h: Remove CallOutFilter, CallOutFilterParam, and FilterAccessViolation — these are SEH-specific helpers only used from COM interop code.
  • interoputil.cpp: Move CallOutFilter and CallOutFilterParam here, where they are actually used (already inside #ifdef FEATURE_COMINTEROP compilation unit).

COM-specific type trimming (#ifdef FEATURE_COMINTEROP)

  • rexcep.h: Move InvalidOleVariantTypeException inside the existing #ifdef FEATURE_COMINTEROP block.
  • corelib.h: Wrap COMVARIANT class definition in #if defined(FEATURE_COMINTEROP).
  • metasig.h: Wrap ComVariant-related metasig definitions in #ifdef FEATURE_COMINTEROP.
  • olevariant.cpp: Wrap VT_VARIANTCLASS__COMVARIANT mapping in #ifdef FEATURE_COMINTEROP.
  • Marshal.cs (shared CoreLib): Wrap COR_E_INVALIDOLEVARIANTTYPEInvalidOleVariantTypeException mapping in #if FEATURE_COMINTEROP.

Swift types Apple-only (#ifdef TARGET_APPLE)

  • corelib.h: Wrap SwiftSelf, SwiftSelf<T>, SwiftError, SwiftIndirectResult class definitions in #ifdef TARGET_APPLE.

Platform annotation

  • ComActivator.PlatformNotSupported.cs: Add [SupportedOSPlatform("windows")] attribute so the WASM toolchain can detect it as unsupported.

WASM reverse call helpers

  • callhelpers-reverse.cpp: Remove three ComActivator reverse P/Invoke thunks (GetClassFactoryForTypeInternal, RegisterClassForTypeInternal, UnregisterClassForTypeInternal) and their entries in g_ReverseThunks. Rename OnThreadExitingOnThreadExited to match the upstream API rename.

WASM PInvoke collector - skip browser-unsupported types

  • PInvokeCollector.cs: Add IsUnsupportedOnBrowser method that checks for [UnsupportedOSPlatform("browser")] or [SupportedOSPlatform(...)] without "browser" on the declaring type. Callbacks on unsupported types are skipped during WASM app build, avoiding link errors for COM-related methods.

WASM call helper additions (unrelated fixups merged from main)

  • callhelpers-interp-to-managed.cpp: Add CallFunc_I32_I32_I32_RetI64 thunk and liii signature entry.
  • callhelpers-pinvoke.cpp: Add SystemNative_ReadV and SystemNative_WriteV P/Invoke declarations and table entries (count 92 → 94).

@pavelsavarapavelsavara added this to the 11.0.0 milestone Mar 2, 2026
@pavelsavarapavelsavara self-assigned this Mar 2, 2026
CopilotAI review requested due to automatic review settings March 2, 2026 23:23
@pavelsavarapavelsavara added arch-wasm WebAssembly architecture area-VM-coreclr size-reduction Issues impacting final app size primary for size sensitive workloads os-browser Browser variant of arch-wasm labels Mar 2, 2026
@dotnet-policy-servicedotnet-policy-serviceBot added the linkable-framework Issues associated with delivering a linker friendly framework label Mar 2, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR aims to reduce trimmed size for browser-WASM CoreCLR builds by removing/gating roots and native support code for features that aren’t supported in the browser (COM/interop-related pieces, DynamicInterfaceCastable, Swift interop, and intrinsics metadata rooting).

Changes:

  • Filters reverse P/Invoke stub generation for types marked [UnsupportedOSPlatform("browser")] and annotates ComActivator accordingly.
  • Gates ILLink rooting for ComponentActivator.GetFunctionPointer behind the existing native-hosting feature switch.
  • Adds TARGET_WASM guards to exclude DynamicInterfaceCastable native support on WASM and trims related ILLink roots / metadata retention paths.

Reviewed changes

Copilot reviewed 14 out of 14 changed files in this pull request and generated 7 comments.

Show a summary per file
FileDescription
src/tasks/WasmAppBuilder/generate-coreclr-helpers.cmdUpdates helper generation script used for CoreCLR WASM callhelper regeneration.
src/tasks/WasmAppBuilder/coreclr/PInvokeCollector.csSkips generating reverse P/Invoke callback stubs for types unsupported on browser.
src/libraries/System.Private.CoreLib/src/System/Runtime/CompilerServices/CompExactlyDependsOnAttribute.csRemoves CompExactlyDependsOnAttribute metadata for browser/WASI builds to improve trimming.
src/libraries/System.Private.CoreLib/src/ILLink/ILLink.Descriptors.Shared.xmlGates ComponentActivator.GetFunctionPointer rooting behind the native-hosting feature switch.
src/coreclr/vm/wasm/callhelpers-reverse.cppRegenerated reverse thunk table reflecting removed callbacks.
src/coreclr/vm/wasm/callhelpers-pinvoke.cppRegenerated P/Invoke table reflecting upstream removals.
src/coreclr/vm/virtualcallstub.cppRemoves DynamicInterfaceCastable resolver path from WASM builds.
src/coreclr/vm/rexcep.hAttempts to exclude interop exception types from WASM ILLink descriptor generation.
src/coreclr/vm/methodtable.cppRemoves IDynamicInterfaceCastable special method resolution on WASM.
src/coreclr/vm/jithelpers.cppRemoves IDynamicInterfaceCastable cast path on WASM.
src/coreclr/vm/dynamicinterfacecastable.hWraps DynamicInterfaceCastable API surface out of WASM builds.
src/coreclr/vm/dynamicinterfacecastable.cppWraps DynamicInterfaceCastable implementation out of WASM builds.
src/coreclr/vm/corelib.hAttempts to exclude Swift interop and ComVariant from WASM ILLink descriptor generation; removes DynamicInterfaceCastableHelpers from WASM.
src/coreclr/System.Private.CoreLib/src/Internal/Runtime/InteropServices/ComActivator.PlatformNotSupported.csMarks ComActivator as unsupported on browser to suppress reverse stub generation.

Comment threadsrc/tasks/WasmAppBuilder/generate-coreclr-helpers.cmd Outdated
Comment threadsrc/coreclr/vm/corelib.h Outdated
Comment threadsrc/coreclr/vm/corelib.h Outdated
Comment threadsrc/coreclr/vm/rexcep.h Outdated
Comment threadsrc/coreclr/vm/rexcep.h Outdated
Comment threadsrc/coreclr/vm/rexcep.h Outdated
Comment threadsrc/tasks/WasmAppBuilder/coreclr/PInvokeCollector.cs
Comment threadsrc/coreclr/vm/corelib.h Outdated
CopilotAI review requested due to automatic review settings March 13, 2026 15:29

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 8 out of 8 changed files in this pull request and generated 2 comments.

Comment threadsrc/coreclr/vm/rexcep.h Outdated
Comment threadsrc/coreclr/vm/corelib.h Outdated
Comment threadsrc/coreclr/vm/excep.h
CopilotAI review requested due to automatic review settings March 23, 2026 17:49

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

Comment threadsrc/coreclr/vm/interoputil.cpp
Comment threadsrc/coreclr/vm/olevariant.cpp Outdated
Comment threadsrc/coreclr/vm/olevariant.cpp Outdated
@jkotas

Copy link
Copy Markdown
Member

Any numbers for how much this saves? I like to have numbers for anything that claims to be a perf improvement.

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

Any numbers for how much this saves? I like to have numbers for anything that claims to be a perf improvement.

This is not about perf at all.
It started as much bigger IL trimming PR, but I was not able to reproduce Intrinsics at some point.
So, what we have right now is just cleanup. I can measure size difference, but it would not be big deal.

CopilotAI review requested due to automatic review settings March 25, 2026 16:53

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 16 out of 16 changed files in this pull request and generated 1 comment.

Comment threadsrc/tasks/WasmAppBuilder/coreclr/PInvokeCollector.cs
CopilotAI review requested due to automatic review settings March 26, 2026 08:18

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

Comment threadsrc/coreclr/vm/wasm/callhelpers-pinvoke.cpp
Comment threadsrc/coreclr/vm/excep.cpp
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g all CI issues are unrelated (as far as I can tell)

@pavelsavara
pavelsavara merged commit c401a8e into dotnet:mainMar 27, 2026
150 of 168 checks passed
@pavelsavara
pavelsavara deleted the browser_trim_COM branch March 27, 2026 08:51
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 26, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-VM-coreclrlinkable-frameworkIssues associated with delivering a linker friendly frameworkos-browserBrowser variant of arch-wasmsize-reductionIssues impacting final app size primary for size sensitive workloads

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

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

[browser][coreCLR] no COM, no swift - #125083

Merged
pavelsavara merged 32 commits into
dotnet:mainfrom
pavelsavara:browser_trim_COM
Mar 27, 2026
Merged

[browser][coreCLR] no COM, no swift#125083
pavelsavara merged 32 commits into
dotnet:mainfrom
pavelsavara:browser_trim_COM

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Mar 2, 2026

Copy link
Copy Markdown
Member

Trim COM/SEH-related code for non-Windows targets (Browser WASM)

Summary

This PR conditionally compiles out COM interop, SEH exception, and Windows-only code paths from the CoreCLR runtime when targeting non-Windows platforms (primarily Browser/WASM). It also removes reverse P/Invoke thunks for ComActivator methods that are not applicable on Browser, and teaches the WASM PInvokeCollector to skip callbacks on types marked as unsupported on Browser.

Changes

SEH exception trimming (#ifdef TARGET_WINDOWS)

  • ex.h / ex.cpp: Wrap the SEHException class definition, constructors, and GetHR()/GetMessage() implementations in #ifdef TARGET_WINDOWS.
  • clrex.cpp: Wrap the SEHException handling path in GetThrowableFromException so non-Windows falls through to the generic HRException/COMException/DelegatingException handler.
  • dacfn.cpp: Wrap the SEHException rethrow logic in DacExceptionFilter in #ifdef TARGET_WINDOWS.
  • rexcep.h: Wrap the DEFINE_EXCEPTION for SEHException in #ifdef TARGET_WINDOWS.
  • excep.cpp:
    • MapWin32FaultToCOMPlusException default case: returns kSEHException on Windows, kException with _ASSERTE(!"Expected to be unreachable") on non-Windows.
    • Wrap SEHException references in DebugIsEECxxExceptionPointer in #ifdef TARGET_WINDOWS.

Move CallOutFilter / FilterAccessViolation from generic code

  • excep.cpp / excep.h: Remove CallOutFilter, CallOutFilterParam, and FilterAccessViolation — these are SEH-specific helpers only used from COM interop code.
  • interoputil.cpp: Move CallOutFilter and CallOutFilterParam here, where they are actually used (already inside #ifdef FEATURE_COMINTEROP compilation unit).

COM-specific type trimming (#ifdef FEATURE_COMINTEROP)

  • rexcep.h: Move InvalidOleVariantTypeException inside the existing #ifdef FEATURE_COMINTEROP block.
  • corelib.h: Wrap COMVARIANT class definition in #if defined(FEATURE_COMINTEROP).
  • metasig.h: Wrap ComVariant-related metasig definitions in #ifdef FEATURE_COMINTEROP.
  • olevariant.cpp: Wrap VT_VARIANTCLASS__COMVARIANT mapping in #ifdef FEATURE_COMINTEROP.
  • Marshal.cs (shared CoreLib): Wrap COR_E_INVALIDOLEVARIANTTYPEInvalidOleVariantTypeException mapping in #if FEATURE_COMINTEROP.

Swift types Apple-only (#ifdef TARGET_APPLE)

  • corelib.h: Wrap SwiftSelf, SwiftSelf<T>, SwiftError, SwiftIndirectResult class definitions in #ifdef TARGET_APPLE.

Platform annotation

  • ComActivator.PlatformNotSupported.cs: Add [SupportedOSPlatform("windows")] attribute so the WASM toolchain can detect it as unsupported.

WASM reverse call helpers

  • callhelpers-reverse.cpp: Remove three ComActivator reverse P/Invoke thunks (GetClassFactoryForTypeInternal, RegisterClassForTypeInternal, UnregisterClassForTypeInternal) and their entries in g_ReverseThunks. Rename OnThreadExitingOnThreadExited to match the upstream API rename.

WASM PInvoke collector - skip browser-unsupported types

  • PInvokeCollector.cs: Add IsUnsupportedOnBrowser method that checks for [UnsupportedOSPlatform("browser")] or [SupportedOSPlatform(...)] without "browser" on the declaring type. Callbacks on unsupported types are skipped during WASM app build, avoiding link errors for COM-related methods.

WASM call helper additions (unrelated fixups merged from main)

  • callhelpers-interp-to-managed.cpp: Add CallFunc_I32_I32_I32_RetI64 thunk and liii signature entry.
  • callhelpers-pinvoke.cpp: Add SystemNative_ReadV and SystemNative_WriteV P/Invoke declarations and table entries (count 92 → 94).

@pavelsavarapavelsavara added this to the 11.0.0 milestone Mar 2, 2026
@pavelsavarapavelsavara self-assigned this Mar 2, 2026
CopilotAI review requested due to automatic review settings March 2, 2026 23:23
@pavelsavarapavelsavara added arch-wasm WebAssembly architecture area-VM-coreclr size-reduction Issues impacting final app size primary for size sensitive workloads os-browser Browser variant of arch-wasm labels Mar 2, 2026
@dotnet-policy-servicedotnet-policy-serviceBot added the linkable-framework Issues associated with delivering a linker friendly framework label Mar 2, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

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

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR aims to reduce trimmed size for browser-WASM CoreCLR builds by removing/gating roots and native support code for features that aren’t supported in the browser (COM/interop-related pieces, DynamicInterfaceCastable, Swift interop, and intrinsics metadata rooting).

Changes:

  • Filters reverse P/Invoke stub generation for types marked [UnsupportedOSPlatform("browser")] and annotates ComActivator accordingly.
  • Gates ILLink rooting for ComponentActivator.GetFunctionPointer behind the existing native-hosting feature switch.
  • Adds TARGET_WASM guards to exclude DynamicInterfaceCastable native support on WASM and trims related ILLink roots / metadata retention paths.

Reviewed changes

Copilot reviewed 14 out of 14 changed files in this pull request and generated 7 comments.

Show a summary per file
FileDescription
src/tasks/WasmAppBuilder/generate-coreclr-helpers.cmdUpdates helper generation script used for CoreCLR WASM callhelper regeneration.
src/tasks/WasmAppBuilder/coreclr/PInvokeCollector.csSkips generating reverse P/Invoke callback stubs for types unsupported on browser.
src/libraries/System.Private.CoreLib/src/System/Runtime/CompilerServices/CompExactlyDependsOnAttribute.csRemoves CompExactlyDependsOnAttribute metadata for browser/WASI builds to improve trimming.
src/libraries/System.Private.CoreLib/src/ILLink/ILLink.Descriptors.Shared.xmlGates ComponentActivator.GetFunctionPointer rooting behind the native-hosting feature switch.
src/coreclr/vm/wasm/callhelpers-reverse.cppRegenerated reverse thunk table reflecting removed callbacks.
src/coreclr/vm/wasm/callhelpers-pinvoke.cppRegenerated P/Invoke table reflecting upstream removals.
src/coreclr/vm/virtualcallstub.cppRemoves DynamicInterfaceCastable resolver path from WASM builds.
src/coreclr/vm/rexcep.hAttempts to exclude interop exception types from WASM ILLink descriptor generation.
src/coreclr/vm/methodtable.cppRemoves IDynamicInterfaceCastable special method resolution on WASM.
src/coreclr/vm/jithelpers.cppRemoves IDynamicInterfaceCastable cast path on WASM.
src/coreclr/vm/dynamicinterfacecastable.hWraps DynamicInterfaceCastable API surface out of WASM builds.
src/coreclr/vm/dynamicinterfacecastable.cppWraps DynamicInterfaceCastable implementation out of WASM builds.
src/coreclr/vm/corelib.hAttempts to exclude Swift interop and ComVariant from WASM ILLink descriptor generation; removes DynamicInterfaceCastableHelpers from WASM.
src/coreclr/System.Private.CoreLib/src/Internal/Runtime/InteropServices/ComActivator.PlatformNotSupported.csMarks ComActivator as unsupported on browser to suppress reverse stub generation.

Comment threadsrc/tasks/WasmAppBuilder/generate-coreclr-helpers.cmd Outdated
Comment threadsrc/coreclr/vm/corelib.h Outdated
Comment threadsrc/coreclr/vm/corelib.h Outdated
Comment threadsrc/coreclr/vm/rexcep.h Outdated
Comment threadsrc/coreclr/vm/rexcep.h Outdated
Comment threadsrc/coreclr/vm/rexcep.h Outdated
Comment threadsrc/tasks/WasmAppBuilder/coreclr/PInvokeCollector.cs
Comment threadsrc/coreclr/vm/corelib.h Outdated
CopilotAI review requested due to automatic review settings March 13, 2026 15:29

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 8 out of 8 changed files in this pull request and generated 2 comments.

Comment threadsrc/coreclr/vm/rexcep.h Outdated
Comment threadsrc/coreclr/vm/corelib.h Outdated
Comment threadsrc/coreclr/vm/excep.h
CopilotAI review requested due to automatic review settings March 23, 2026 17:49

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

Comment threadsrc/coreclr/vm/interoputil.cpp
Comment threadsrc/coreclr/vm/olevariant.cpp Outdated
Comment threadsrc/coreclr/vm/olevariant.cpp Outdated
@jkotas

Copy link
Copy Markdown
Member

Any numbers for how much this saves? I like to have numbers for anything that claims to be a perf improvement.

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

Any numbers for how much this saves? I like to have numbers for anything that claims to be a perf improvement.

This is not about perf at all.
It started as much bigger IL trimming PR, but I was not able to reproduce Intrinsics at some point.
So, what we have right now is just cleanup. I can measure size difference, but it would not be big deal.

CopilotAI review requested due to automatic review settings March 25, 2026 16:53

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 16 out of 16 changed files in this pull request and generated 1 comment.

Comment threadsrc/tasks/WasmAppBuilder/coreclr/PInvokeCollector.cs
CopilotAI review requested due to automatic review settings March 26, 2026 08:18

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

Comment threadsrc/coreclr/vm/wasm/callhelpers-pinvoke.cpp
Comment threadsrc/coreclr/vm/excep.cpp
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g all CI issues are unrelated (as far as I can tell)

@pavelsavara
pavelsavara merged commit c401a8e into dotnet:mainMar 27, 2026
150 of 168 checks passed
@pavelsavara
pavelsavara deleted the browser_trim_COM branch March 27, 2026 08:51
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 26, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-VM-coreclrlinkable-frameworkIssues associated with delivering a linker friendly frameworkos-browserBrowser variant of arch-wasmsize-reductionIssues impacting final app size primary for size sensitive workloads

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants

@pavelsavara@jkotas@jkoritzinsky@radekdoulik@maraf@AaronRobinsonMSFT