Use dispatch cells for generic virtual method dispatch - #129609

Merged
MichalStrehovsky merged 10 commits into
dotnet:mainfrom
MichalStrehovsky:gvmdispatch
Jul 15, 2026
Merged

Use dispatch cells for generic virtual method dispatch#129609
MichalStrehovsky merged 10 commits into
dotnet:mainfrom
MichalStrehovsky:gvmdispatch

Conversation

@MichalStrehovsky

Copy link
Copy Markdown
Member

This puts generic virtual method dispatch on the same plan as interface method dispatch.

Benefits:

  • The cost of generic virtual methods went down (still not quite same as interface calls due to fat pointers, but closer)
    • Monomorpic GVM callsite: Before: ~2.45 ns/call. After: 1.74 ns/call
    • Polymorphic GVM callsite: Before: ~2.45 ns/call. After: 2.10 ns/call.
  • GVM methods no longer implicitly considered targets of reflection due to LDTOKEN used as implementation detail.
  • The weird RuntimeMethodHandle for async method variants that reflection should never see is gone

This is three commits:

  • First just deletes some dead code I noticed.
  • Second moves some of the dispatch resolution to CoreLib. We've been breaking the "interface dispatch lives in Runtime.Base" boundary for a while. This puts us closer to it living in CoreLib. We can move rest of the interface resolution later, didn't want to perturb this too much. The cache itself stays in Runtime.Base because the assembly helper can only handle one. (We can decide the assembly helper is also owned by CoreLib I guess, but we don't currently have such layer.) I think copilot could easily undo this if this is not the split we want.
  • Third commit switches the GVM calls to use the dispatch cell. We need a resolve helper variant because GVM dispatch is a resolver due to fat calls, not a dispatcher.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @dotnet/ilc-contrib
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 reworks NativeAOT generic virtual method (GVM) dispatch to use dispatch cells (aligning it more closely with interface dispatch), adds new ReadyToRun sections/nodes to emit GVM dispatch-cell metadata, and updates the JIT/AOT toolchain to consume the new helper + lookup shapes.

Changes:

  • Introduces GVM dispatch-cell sections/metadata in the compiler output and routes GVM lookups through a dispatch-cell-based helper.
  • Refactors “interface dispatch cell” infrastructure into a generalized “dispatch cell” concept used for both interface dispatch and GVM dispatch.
  • Moves parts of dispatch resolution into CoreLib (classlib function table) and adds new per-architecture “resolve” helper entrypoints.

Reviewed changes

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

Show a summary per file
FileDescription
src/coreclr/tools/Common/Internal/Runtime/RuntimeConstants.csIntroduces GvmDispatchCellFlags for encoding async-variant bit in GVM dispatch-cell metadata.
src/coreclr/tools/Common/Internal/Runtime/ModuleHeaders.csAdds new ReadyToRun section types for GVM dispatch-cell regions.
src/coreclr/tools/Common/Internal/Runtime/InterfaceDispatchCellCachePointerFlags.csRemoves unused interface-dispatch cache-pointer flags enum.
src/coreclr/tools/Common/Internal/Runtime/DispatchCell.csAdds shared dispatch-cell structs (including dynamic dispatch-cell layouts).
src/coreclr/tools/Common/Internal/NativeFormat/NativeFormat.csAllocates FixupSignatureKind.GvmDispatchCell.
src/coreclr/tools/Common/Compiler/DependencyAnalysis/SortableDependencyNode.csAdds ordered node kinds for GVM dispatch-cell sections.
src/coreclr/tools/Common/Compiler/DependencyAnalysis/GVMDependenciesNode.csMarks compilation with an analysis characteristic when GVMs are present.
src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.csSwitches call-info emission to use dispatch-cell helpers/const lookups for interface+GVM cases.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.csUses dispatch-cell symbol node instead of interface-only dispatch cell.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRunSymbolNodeFactory.csConsolidates cell cache from interface-only to general dispatch cells.
src/coreclr/tools/aot/ILCompiler.Compiler/ILCompiler.Compiler.csprojAdds new dispatch-cell nodes/sections; removes old interface-dispatch-cell node source.
src/coreclr/tools/aot/ILCompiler.Compiler/IL/ILImporter.Scanner.csUpdates dependency scanning for dispatch-cell-based GVM/interface lookups.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/MetadataManager.csTracks generalized dispatch cells; emits new GVM dispatch-cell sections into the R2R header.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/JitHelper.csMaps GVMLookupForSlot to the new RhpDispatchResolve entrypoint.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_X86/X86ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_X86/X86ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_X64/X64ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_X64/X64ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_RiscV64/RiscV64ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_RiscV64/RiscV64ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_LoongArch64/LoongArch64ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_LoongArch64/LoongArch64ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_ARM64/ARM64ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_ARM64/ARM64ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_ARM/ARMReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_ARM/ARMReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/RuntimeMethodHandleNode.csRemoves async-variant encoding from runtime method handle node emission.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/ReadyToRunHelperNode.csRenames helper ID VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/ReadyToRunGenericHelperNode.csUpdates generic-lookup signatures/comparisons to use dispatch-cell lookup kind.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.NativeLayout.csAdds native-layout dictionary slot node for GVM dispatch-cell fixup signatures.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.GenericLookups.csGeneralizes “virtual dispatch cell” generic lookup result into “dispatch cell”.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.csGeneralizes dispatch-cell node cache/factory API.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NativeLayoutVertexNode.csAdds NativeLayoutGvmDispatchGenericDictionarySlotNode implementation.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/InterfaceDispatchCellInfoSectionNode.csUpdates section emission to operate on generalized dispatch cells (filters out GVM instantiations).
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GvmDispatchCellInfoSectionNode.csAdds new section emitting GVM dispatch-cell info (token+flags+instantiation).
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GenericLookupResult.csRenames/expands dispatch-cell lookup result to support interface and GVM.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/DispatchCellSectionNode.csSplits dispatch-cell BSS into interface vs GVM sections via filtering.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/DispatchCellNode.csGeneralizes interface dispatch cell node into a dispatch cell node.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DelegateCreationInfo.csSwitches delegate creation for GVM/interface targets to dispatch-cell-based lookup.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/Compilation.csUpdates runtime-lookup decision for the new dispatch-cell helper ID.
src/coreclr/nativeaot/Test.CoreLib/src/Test.CoreLib.csprojLinks in shared dispatch-cell type(s) and adds a ResolveDispatch export stub.
src/coreclr/nativeaot/Test.CoreLib/src/Internal/Runtime/Dispatch.csAdds Test.CoreLib ResolveDispatch export (currently stubbed).
src/coreclr/nativeaot/System.Private.TypeLoader/src/System.Private.TypeLoader.csprojAdds AnalysisCharacteristicAttribute compilation input.
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.Metadata.csUpdates GVM token handle construction call signature.
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.LdTokenResultLookup.csRemoves async-variant handling from runtime-method-handle ldtoken cache machinery.
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.GVMResolution.csReworks GVM resolution input shape (declaring type + handle + instantiation list + async flag).
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.csAdds GenericVirtualMethodsPresent analysis characteristic gate and new callback signature.
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/GenericDictionaryCell.csAllocates dynamic dispatch-cell layouts for interface cells and new GVM dispatch cells.
src/coreclr/nativeaot/System.Private.CoreLib/src/System/RuntimeMethodHandle.csRemoves async-variant flag from handle layout; adds helper to resolve GVM targets via callbacks.
src/coreclr/nativeaot/System.Private.CoreLib/src/System/Runtime/TypeLoaderExports.csRemoves old GVMLookupForSlot cache-based implementation.
src/coreclr/nativeaot/System.Private.CoreLib/src/System/Delegate.csUpdates GVM delegate initialization to go through dispatch-cell-based resolution.
src/coreclr/nativeaot/System.Private.CoreLib/src/System.Private.CoreLib.csprojLinks dispatch-cell types and adds CoreLib ResolveDispatch implementation source.
src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/Dispatch.csImplements ResolveDispatch and static/dynamic dispatch-cell resolution.
src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/CompilerServices/OpenMethodResolver.csUpdates open-method resolver to resolve GVM targets via the new handle helper.
src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/Augments/TypeLoaderCallbacks.csChanges callback signature for resolving GVM targets (more explicit components).
src/coreclr/nativeaot/System.Private.CoreLib/src/CompatibilitySuppressions.xmlAdds compat suppressions for new public dispatch-cell types.
src/coreclr/nativeaot/Runtime/riscv64/DispatchResolve.SAdds RhpDispatchResolve entrypoint (returns target rather than dispatching).
src/coreclr/nativeaot/Runtime/loongarch64/DispatchResolve.SAdds RhpDispatchResolve entrypoint (returns target rather than dispatching).
src/coreclr/nativeaot/Runtime/i386/DispatchResolve.asmAdds x86 RhpDispatchResolve (cache probe + fallback to worker).
src/coreclr/nativeaot/Runtime/EHHelpers.cppTeaches EH helper classification about RhpDispatchResolve AV locations/addresses.
src/coreclr/nativeaot/Runtime/arm64/DispatchResolve.SFactors common macro + adds RhpDispatchResolve variant (returning target).
src/coreclr/nativeaot/Runtime/arm64/DispatchResolve.asmAdds RhpDispatchResolve variant and calls RhpCidResolve_Worker for return-only slow path.
src/coreclr/nativeaot/Runtime/arm/DispatchResolve.SAdds ARM32 RhpDispatchResolve with a barrier before reading cached code.
src/coreclr/nativeaot/Runtime/amd64/DispatchResolve.SAdds RhpDispatchResolve macro variant (returning target).
src/coreclr/nativeaot/Runtime/amd64/DispatchResolve.asmAdds RhpDispatchResolve macro variant and optimized slow path.
src/coreclr/nativeaot/Runtime.Base/src/System/Runtime/InternalCalls.csAdds ClassLibFunctionId.ResolveDispatch entry.
src/coreclr/nativeaot/Runtime.Base/src/System/Runtime/CachedInterfaceDispatch.csRoutes cache misses to classlib ResolveDispatch and exports RhpCidResolve_Worker.
src/coreclr/nativeaot/Bootstrap/main.cppExposes ResolveDispatch in the classlib function table.
src/coreclr/jit/importer.cppSwitches NativeAOT GVM ldvirtftn import to pass dispatch cell instead of runtime method handle.
src/coreclr/inc/corinfo.hUpdates helper comment to document dispatch-cell argument for GVM lookup helper.

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
Comment threadsrc/coreclr/nativeaot/Runtime/riscv64/DispatchResolve.S Outdated
Comment threadsrc/coreclr/nativeaot/Runtime/loongarch64/DispatchResolve.S Outdated
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@github-actionsgithub-actionsBot mentioned this pull request Jun 19, 2026
CopilotAI review requested due to automatic review settings June 24, 2026 04: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 70 out of 70 changed files in this pull request and generated 4 comments.

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

CopilotAI review requested due to automatic review settings July 2, 2026 03:30
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

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

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings July 8, 2026 03:14
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

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

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
Comment threadsrc/coreclr/nativeaot/Runtime/EHHelpers.cpp
CopilotAI review requested due to automatic review settings July 10, 2026 05:00

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

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@jakobbotschjakobbotsch left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

The JIT change LGTM

Comment threadsrc/coreclr/nativeaot/Runtime/arm64/DispatchResolve.S
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

Thank you! I'll address the cleanups in a followup since it would reset the signoff and it would be preferable this makes it into Preview 7.

@MichalStrehovsky
MichalStrehovsky enabled auto-merge (squash) July 15, 2026 04:48
@MichalStrehovsky
MichalStrehovsky merged commit f417473 into dotnet:mainJul 15, 2026
159 of 161 checks passed
@MichalStrehovsky
MichalStrehovsky deleted the gvmdispatch branch July 15, 2026 04:49
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview7 milestone Jul 15, 2026
MichalStrehovsky added a commit that referenced this pull request Jul 21, 2026
`Delegate.Method` needs to work since it's not a trim-unsafe API.
I thought I maybe broke this in #129609, but the added test doesn't work
in .NET 10 either, so I only broke a small aspect of this (GVMs were
implicitly considered targets of reflection because of the
`RuntimeMethodHandle` used as implementation detail).
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 15, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@MichalStrehovsky@sbomer@jakobbotsch
, '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

Use dispatch cells for generic virtual method dispatch - #129609

Merged
MichalStrehovsky merged 10 commits into
dotnet:mainfrom
MichalStrehovsky:gvmdispatch
Jul 15, 2026
Merged

Use dispatch cells for generic virtual method dispatch#129609
MichalStrehovsky merged 10 commits into
dotnet:mainfrom
MichalStrehovsky:gvmdispatch

Conversation

@MichalStrehovsky

Copy link
Copy Markdown
Member

This puts generic virtual method dispatch on the same plan as interface method dispatch.

Benefits:

  • The cost of generic virtual methods went down (still not quite same as interface calls due to fat pointers, but closer)
    • Monomorpic GVM callsite: Before: ~2.45 ns/call. After: 1.74 ns/call
    • Polymorphic GVM callsite: Before: ~2.45 ns/call. After: 2.10 ns/call.
  • GVM methods no longer implicitly considered targets of reflection due to LDTOKEN used as implementation detail.
  • The weird RuntimeMethodHandle for async method variants that reflection should never see is gone

This is three commits:

  • First just deletes some dead code I noticed.
  • Second moves some of the dispatch resolution to CoreLib. We've been breaking the "interface dispatch lives in Runtime.Base" boundary for a while. This puts us closer to it living in CoreLib. We can move rest of the interface resolution later, didn't want to perturb this too much. The cache itself stays in Runtime.Base because the assembly helper can only handle one. (We can decide the assembly helper is also owned by CoreLib I guess, but we don't currently have such layer.) I think copilot could easily undo this if this is not the split we want.
  • Third commit switches the GVM calls to use the dispatch cell. We need a resolve helper variant because GVM dispatch is a resolver due to fat calls, not a dispatcher.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @dotnet/ilc-contrib
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 reworks NativeAOT generic virtual method (GVM) dispatch to use dispatch cells (aligning it more closely with interface dispatch), adds new ReadyToRun sections/nodes to emit GVM dispatch-cell metadata, and updates the JIT/AOT toolchain to consume the new helper + lookup shapes.

Changes:

  • Introduces GVM dispatch-cell sections/metadata in the compiler output and routes GVM lookups through a dispatch-cell-based helper.
  • Refactors “interface dispatch cell” infrastructure into a generalized “dispatch cell” concept used for both interface dispatch and GVM dispatch.
  • Moves parts of dispatch resolution into CoreLib (classlib function table) and adds new per-architecture “resolve” helper entrypoints.

Reviewed changes

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

Show a summary per file
FileDescription
src/coreclr/tools/Common/Internal/Runtime/RuntimeConstants.csIntroduces GvmDispatchCellFlags for encoding async-variant bit in GVM dispatch-cell metadata.
src/coreclr/tools/Common/Internal/Runtime/ModuleHeaders.csAdds new ReadyToRun section types for GVM dispatch-cell regions.
src/coreclr/tools/Common/Internal/Runtime/InterfaceDispatchCellCachePointerFlags.csRemoves unused interface-dispatch cache-pointer flags enum.
src/coreclr/tools/Common/Internal/Runtime/DispatchCell.csAdds shared dispatch-cell structs (including dynamic dispatch-cell layouts).
src/coreclr/tools/Common/Internal/NativeFormat/NativeFormat.csAllocates FixupSignatureKind.GvmDispatchCell.
src/coreclr/tools/Common/Compiler/DependencyAnalysis/SortableDependencyNode.csAdds ordered node kinds for GVM dispatch-cell sections.
src/coreclr/tools/Common/Compiler/DependencyAnalysis/GVMDependenciesNode.csMarks compilation with an analysis characteristic when GVMs are present.
src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.csSwitches call-info emission to use dispatch-cell helpers/const lookups for interface+GVM cases.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.csUses dispatch-cell symbol node instead of interface-only dispatch cell.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRunSymbolNodeFactory.csConsolidates cell cache from interface-only to general dispatch cells.
src/coreclr/tools/aot/ILCompiler.Compiler/ILCompiler.Compiler.csprojAdds new dispatch-cell nodes/sections; removes old interface-dispatch-cell node source.
src/coreclr/tools/aot/ILCompiler.Compiler/IL/ILImporter.Scanner.csUpdates dependency scanning for dispatch-cell-based GVM/interface lookups.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/MetadataManager.csTracks generalized dispatch cells; emits new GVM dispatch-cell sections into the R2R header.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/JitHelper.csMaps GVMLookupForSlot to the new RhpDispatchResolve entrypoint.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_X86/X86ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_X86/X86ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_X64/X64ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_X64/X64ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_RiscV64/RiscV64ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_RiscV64/RiscV64ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_LoongArch64/LoongArch64ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_LoongArch64/LoongArch64ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_ARM64/ARM64ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_ARM64/ARM64ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_ARM/ARMReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_ARM/ARMReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/RuntimeMethodHandleNode.csRemoves async-variant encoding from runtime method handle node emission.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/ReadyToRunHelperNode.csRenames helper ID VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/ReadyToRunGenericHelperNode.csUpdates generic-lookup signatures/comparisons to use dispatch-cell lookup kind.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.NativeLayout.csAdds native-layout dictionary slot node for GVM dispatch-cell fixup signatures.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.GenericLookups.csGeneralizes “virtual dispatch cell” generic lookup result into “dispatch cell”.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.csGeneralizes dispatch-cell node cache/factory API.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NativeLayoutVertexNode.csAdds NativeLayoutGvmDispatchGenericDictionarySlotNode implementation.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/InterfaceDispatchCellInfoSectionNode.csUpdates section emission to operate on generalized dispatch cells (filters out GVM instantiations).
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GvmDispatchCellInfoSectionNode.csAdds new section emitting GVM dispatch-cell info (token+flags+instantiation).
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GenericLookupResult.csRenames/expands dispatch-cell lookup result to support interface and GVM.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/DispatchCellSectionNode.csSplits dispatch-cell BSS into interface vs GVM sections via filtering.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/DispatchCellNode.csGeneralizes interface dispatch cell node into a dispatch cell node.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DelegateCreationInfo.csSwitches delegate creation for GVM/interface targets to dispatch-cell-based lookup.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/Compilation.csUpdates runtime-lookup decision for the new dispatch-cell helper ID.
src/coreclr/nativeaot/Test.CoreLib/src/Test.CoreLib.csprojLinks in shared dispatch-cell type(s) and adds a ResolveDispatch export stub.
src/coreclr/nativeaot/Test.CoreLib/src/Internal/Runtime/Dispatch.csAdds Test.CoreLib ResolveDispatch export (currently stubbed).
src/coreclr/nativeaot/System.Private.TypeLoader/src/System.Private.TypeLoader.csprojAdds AnalysisCharacteristicAttribute compilation input.
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.Metadata.csUpdates GVM token handle construction call signature.
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.LdTokenResultLookup.csRemoves async-variant handling from runtime-method-handle ldtoken cache machinery.
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.GVMResolution.csReworks GVM resolution input shape (declaring type + handle + instantiation list + async flag).
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.csAdds GenericVirtualMethodsPresent analysis characteristic gate and new callback signature.
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/GenericDictionaryCell.csAllocates dynamic dispatch-cell layouts for interface cells and new GVM dispatch cells.
src/coreclr/nativeaot/System.Private.CoreLib/src/System/RuntimeMethodHandle.csRemoves async-variant flag from handle layout; adds helper to resolve GVM targets via callbacks.
src/coreclr/nativeaot/System.Private.CoreLib/src/System/Runtime/TypeLoaderExports.csRemoves old GVMLookupForSlot cache-based implementation.
src/coreclr/nativeaot/System.Private.CoreLib/src/System/Delegate.csUpdates GVM delegate initialization to go through dispatch-cell-based resolution.
src/coreclr/nativeaot/System.Private.CoreLib/src/System.Private.CoreLib.csprojLinks dispatch-cell types and adds CoreLib ResolveDispatch implementation source.
src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/Dispatch.csImplements ResolveDispatch and static/dynamic dispatch-cell resolution.
src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/CompilerServices/OpenMethodResolver.csUpdates open-method resolver to resolve GVM targets via the new handle helper.
src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/Augments/TypeLoaderCallbacks.csChanges callback signature for resolving GVM targets (more explicit components).
src/coreclr/nativeaot/System.Private.CoreLib/src/CompatibilitySuppressions.xmlAdds compat suppressions for new public dispatch-cell types.
src/coreclr/nativeaot/Runtime/riscv64/DispatchResolve.SAdds RhpDispatchResolve entrypoint (returns target rather than dispatching).
src/coreclr/nativeaot/Runtime/loongarch64/DispatchResolve.SAdds RhpDispatchResolve entrypoint (returns target rather than dispatching).
src/coreclr/nativeaot/Runtime/i386/DispatchResolve.asmAdds x86 RhpDispatchResolve (cache probe + fallback to worker).
src/coreclr/nativeaot/Runtime/EHHelpers.cppTeaches EH helper classification about RhpDispatchResolve AV locations/addresses.
src/coreclr/nativeaot/Runtime/arm64/DispatchResolve.SFactors common macro + adds RhpDispatchResolve variant (returning target).
src/coreclr/nativeaot/Runtime/arm64/DispatchResolve.asmAdds RhpDispatchResolve variant and calls RhpCidResolve_Worker for return-only slow path.
src/coreclr/nativeaot/Runtime/arm/DispatchResolve.SAdds ARM32 RhpDispatchResolve with a barrier before reading cached code.
src/coreclr/nativeaot/Runtime/amd64/DispatchResolve.SAdds RhpDispatchResolve macro variant (returning target).
src/coreclr/nativeaot/Runtime/amd64/DispatchResolve.asmAdds RhpDispatchResolve macro variant and optimized slow path.
src/coreclr/nativeaot/Runtime.Base/src/System/Runtime/InternalCalls.csAdds ClassLibFunctionId.ResolveDispatch entry.
src/coreclr/nativeaot/Runtime.Base/src/System/Runtime/CachedInterfaceDispatch.csRoutes cache misses to classlib ResolveDispatch and exports RhpCidResolve_Worker.
src/coreclr/nativeaot/Bootstrap/main.cppExposes ResolveDispatch in the classlib function table.
src/coreclr/jit/importer.cppSwitches NativeAOT GVM ldvirtftn import to pass dispatch cell instead of runtime method handle.
src/coreclr/inc/corinfo.hUpdates helper comment to document dispatch-cell argument for GVM lookup helper.

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
Comment threadsrc/coreclr/nativeaot/Runtime/riscv64/DispatchResolve.S Outdated
Comment threadsrc/coreclr/nativeaot/Runtime/loongarch64/DispatchResolve.S Outdated
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@github-actionsgithub-actionsBot mentioned this pull request Jun 19, 2026
CopilotAI review requested due to automatic review settings June 24, 2026 04: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 70 out of 70 changed files in this pull request and generated 4 comments.

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

CopilotAI review requested due to automatic review settings July 2, 2026 03:30
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

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

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings July 8, 2026 03:14
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

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

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
Comment threadsrc/coreclr/nativeaot/Runtime/EHHelpers.cpp
CopilotAI review requested due to automatic review settings July 10, 2026 05:00

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

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@jakobbotschjakobbotsch left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

The JIT change LGTM

Comment threadsrc/coreclr/nativeaot/Runtime/arm64/DispatchResolve.S
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

Thank you! I'll address the cleanups in a followup since it would reset the signoff and it would be preferable this makes it into Preview 7.

@MichalStrehovsky
MichalStrehovsky enabled auto-merge (squash) July 15, 2026 04:48
@MichalStrehovsky
MichalStrehovsky merged commit f417473 into dotnet:mainJul 15, 2026
159 of 161 checks passed
@MichalStrehovsky
MichalStrehovsky deleted the gvmdispatch branch July 15, 2026 04:49
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview7 milestone Jul 15, 2026
MichalStrehovsky added a commit that referenced this pull request Jul 21, 2026
`Delegate.Method` needs to work since it's not a trim-unsafe API.
I thought I maybe broke this in #129609, but the added test doesn't work
in .NET 10 either, so I only broke a small aspect of this (GVMs were
implicitly considered targets of reflection because of the
`RuntimeMethodHandle` used as implementation detail).
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 15, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@MichalStrehovsky@sbomer@jakobbotsch
, '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

Use dispatch cells for generic virtual method dispatch - #129609

Merged
MichalStrehovsky merged 10 commits into
dotnet:mainfrom
MichalStrehovsky:gvmdispatch
Jul 15, 2026
Merged

Use dispatch cells for generic virtual method dispatch#129609
MichalStrehovsky merged 10 commits into
dotnet:mainfrom
MichalStrehovsky:gvmdispatch

Conversation

@MichalStrehovsky

Copy link
Copy Markdown
Member

This puts generic virtual method dispatch on the same plan as interface method dispatch.

Benefits:

  • The cost of generic virtual methods went down (still not quite same as interface calls due to fat pointers, but closer)
    • Monomorpic GVM callsite: Before: ~2.45 ns/call. After: 1.74 ns/call
    • Polymorphic GVM callsite: Before: ~2.45 ns/call. After: 2.10 ns/call.
  • GVM methods no longer implicitly considered targets of reflection due to LDTOKEN used as implementation detail.
  • The weird RuntimeMethodHandle for async method variants that reflection should never see is gone

This is three commits:

  • First just deletes some dead code I noticed.
  • Second moves some of the dispatch resolution to CoreLib. We've been breaking the "interface dispatch lives in Runtime.Base" boundary for a while. This puts us closer to it living in CoreLib. We can move rest of the interface resolution later, didn't want to perturb this too much. The cache itself stays in Runtime.Base because the assembly helper can only handle one. (We can decide the assembly helper is also owned by CoreLib I guess, but we don't currently have such layer.) I think copilot could easily undo this if this is not the split we want.
  • Third commit switches the GVM calls to use the dispatch cell. We need a resolve helper variant because GVM dispatch is a resolver due to fat calls, not a dispatcher.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @dotnet/ilc-contrib
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 reworks NativeAOT generic virtual method (GVM) dispatch to use dispatch cells (aligning it more closely with interface dispatch), adds new ReadyToRun sections/nodes to emit GVM dispatch-cell metadata, and updates the JIT/AOT toolchain to consume the new helper + lookup shapes.

Changes:

  • Introduces GVM dispatch-cell sections/metadata in the compiler output and routes GVM lookups through a dispatch-cell-based helper.
  • Refactors “interface dispatch cell” infrastructure into a generalized “dispatch cell” concept used for both interface dispatch and GVM dispatch.
  • Moves parts of dispatch resolution into CoreLib (classlib function table) and adds new per-architecture “resolve” helper entrypoints.

Reviewed changes

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

Show a summary per file
FileDescription
src/coreclr/tools/Common/Internal/Runtime/RuntimeConstants.csIntroduces GvmDispatchCellFlags for encoding async-variant bit in GVM dispatch-cell metadata.
src/coreclr/tools/Common/Internal/Runtime/ModuleHeaders.csAdds new ReadyToRun section types for GVM dispatch-cell regions.
src/coreclr/tools/Common/Internal/Runtime/InterfaceDispatchCellCachePointerFlags.csRemoves unused interface-dispatch cache-pointer flags enum.
src/coreclr/tools/Common/Internal/Runtime/DispatchCell.csAdds shared dispatch-cell structs (including dynamic dispatch-cell layouts).
src/coreclr/tools/Common/Internal/NativeFormat/NativeFormat.csAllocates FixupSignatureKind.GvmDispatchCell.
src/coreclr/tools/Common/Compiler/DependencyAnalysis/SortableDependencyNode.csAdds ordered node kinds for GVM dispatch-cell sections.
src/coreclr/tools/Common/Compiler/DependencyAnalysis/GVMDependenciesNode.csMarks compilation with an analysis characteristic when GVMs are present.
src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.csSwitches call-info emission to use dispatch-cell helpers/const lookups for interface+GVM cases.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.csUses dispatch-cell symbol node instead of interface-only dispatch cell.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRunSymbolNodeFactory.csConsolidates cell cache from interface-only to general dispatch cells.
src/coreclr/tools/aot/ILCompiler.Compiler/ILCompiler.Compiler.csprojAdds new dispatch-cell nodes/sections; removes old interface-dispatch-cell node source.
src/coreclr/tools/aot/ILCompiler.Compiler/IL/ILImporter.Scanner.csUpdates dependency scanning for dispatch-cell-based GVM/interface lookups.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/MetadataManager.csTracks generalized dispatch cells; emits new GVM dispatch-cell sections into the R2R header.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/JitHelper.csMaps GVMLookupForSlot to the new RhpDispatchResolve entrypoint.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_X86/X86ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_X86/X86ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_X64/X64ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_X64/X64ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_RiscV64/RiscV64ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_RiscV64/RiscV64ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_LoongArch64/LoongArch64ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_LoongArch64/LoongArch64ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_ARM64/ARM64ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_ARM64/ARM64ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_ARM/ARMReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_ARM/ARMReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/RuntimeMethodHandleNode.csRemoves async-variant encoding from runtime method handle node emission.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/ReadyToRunHelperNode.csRenames helper ID VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/ReadyToRunGenericHelperNode.csUpdates generic-lookup signatures/comparisons to use dispatch-cell lookup kind.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.NativeLayout.csAdds native-layout dictionary slot node for GVM dispatch-cell fixup signatures.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.GenericLookups.csGeneralizes “virtual dispatch cell” generic lookup result into “dispatch cell”.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.csGeneralizes dispatch-cell node cache/factory API.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NativeLayoutVertexNode.csAdds NativeLayoutGvmDispatchGenericDictionarySlotNode implementation.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/InterfaceDispatchCellInfoSectionNode.csUpdates section emission to operate on generalized dispatch cells (filters out GVM instantiations).
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GvmDispatchCellInfoSectionNode.csAdds new section emitting GVM dispatch-cell info (token+flags+instantiation).
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GenericLookupResult.csRenames/expands dispatch-cell lookup result to support interface and GVM.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/DispatchCellSectionNode.csSplits dispatch-cell BSS into interface vs GVM sections via filtering.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/DispatchCellNode.csGeneralizes interface dispatch cell node into a dispatch cell node.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DelegateCreationInfo.csSwitches delegate creation for GVM/interface targets to dispatch-cell-based lookup.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/Compilation.csUpdates runtime-lookup decision for the new dispatch-cell helper ID.
src/coreclr/nativeaot/Test.CoreLib/src/Test.CoreLib.csprojLinks in shared dispatch-cell type(s) and adds a ResolveDispatch export stub.
src/coreclr/nativeaot/Test.CoreLib/src/Internal/Runtime/Dispatch.csAdds Test.CoreLib ResolveDispatch export (currently stubbed).
src/coreclr/nativeaot/System.Private.TypeLoader/src/System.Private.TypeLoader.csprojAdds AnalysisCharacteristicAttribute compilation input.
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.Metadata.csUpdates GVM token handle construction call signature.
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.LdTokenResultLookup.csRemoves async-variant handling from runtime-method-handle ldtoken cache machinery.
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.GVMResolution.csReworks GVM resolution input shape (declaring type + handle + instantiation list + async flag).
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.csAdds GenericVirtualMethodsPresent analysis characteristic gate and new callback signature.
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/GenericDictionaryCell.csAllocates dynamic dispatch-cell layouts for interface cells and new GVM dispatch cells.
src/coreclr/nativeaot/System.Private.CoreLib/src/System/RuntimeMethodHandle.csRemoves async-variant flag from handle layout; adds helper to resolve GVM targets via callbacks.
src/coreclr/nativeaot/System.Private.CoreLib/src/System/Runtime/TypeLoaderExports.csRemoves old GVMLookupForSlot cache-based implementation.
src/coreclr/nativeaot/System.Private.CoreLib/src/System/Delegate.csUpdates GVM delegate initialization to go through dispatch-cell-based resolution.
src/coreclr/nativeaot/System.Private.CoreLib/src/System.Private.CoreLib.csprojLinks dispatch-cell types and adds CoreLib ResolveDispatch implementation source.
src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/Dispatch.csImplements ResolveDispatch and static/dynamic dispatch-cell resolution.
src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/CompilerServices/OpenMethodResolver.csUpdates open-method resolver to resolve GVM targets via the new handle helper.
src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/Augments/TypeLoaderCallbacks.csChanges callback signature for resolving GVM targets (more explicit components).
src/coreclr/nativeaot/System.Private.CoreLib/src/CompatibilitySuppressions.xmlAdds compat suppressions for new public dispatch-cell types.
src/coreclr/nativeaot/Runtime/riscv64/DispatchResolve.SAdds RhpDispatchResolve entrypoint (returns target rather than dispatching).
src/coreclr/nativeaot/Runtime/loongarch64/DispatchResolve.SAdds RhpDispatchResolve entrypoint (returns target rather than dispatching).
src/coreclr/nativeaot/Runtime/i386/DispatchResolve.asmAdds x86 RhpDispatchResolve (cache probe + fallback to worker).
src/coreclr/nativeaot/Runtime/EHHelpers.cppTeaches EH helper classification about RhpDispatchResolve AV locations/addresses.
src/coreclr/nativeaot/Runtime/arm64/DispatchResolve.SFactors common macro + adds RhpDispatchResolve variant (returning target).
src/coreclr/nativeaot/Runtime/arm64/DispatchResolve.asmAdds RhpDispatchResolve variant and calls RhpCidResolve_Worker for return-only slow path.
src/coreclr/nativeaot/Runtime/arm/DispatchResolve.SAdds ARM32 RhpDispatchResolve with a barrier before reading cached code.
src/coreclr/nativeaot/Runtime/amd64/DispatchResolve.SAdds RhpDispatchResolve macro variant (returning target).
src/coreclr/nativeaot/Runtime/amd64/DispatchResolve.asmAdds RhpDispatchResolve macro variant and optimized slow path.
src/coreclr/nativeaot/Runtime.Base/src/System/Runtime/InternalCalls.csAdds ClassLibFunctionId.ResolveDispatch entry.
src/coreclr/nativeaot/Runtime.Base/src/System/Runtime/CachedInterfaceDispatch.csRoutes cache misses to classlib ResolveDispatch and exports RhpCidResolve_Worker.
src/coreclr/nativeaot/Bootstrap/main.cppExposes ResolveDispatch in the classlib function table.
src/coreclr/jit/importer.cppSwitches NativeAOT GVM ldvirtftn import to pass dispatch cell instead of runtime method handle.
src/coreclr/inc/corinfo.hUpdates helper comment to document dispatch-cell argument for GVM lookup helper.

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
Comment threadsrc/coreclr/nativeaot/Runtime/riscv64/DispatchResolve.S Outdated
Comment threadsrc/coreclr/nativeaot/Runtime/loongarch64/DispatchResolve.S Outdated
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@github-actionsgithub-actionsBot mentioned this pull request Jun 19, 2026
CopilotAI review requested due to automatic review settings June 24, 2026 04: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 70 out of 70 changed files in this pull request and generated 4 comments.

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

CopilotAI review requested due to automatic review settings July 2, 2026 03:30
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

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

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings July 8, 2026 03:14
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

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

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
Comment threadsrc/coreclr/nativeaot/Runtime/EHHelpers.cpp
CopilotAI review requested due to automatic review settings July 10, 2026 05:00

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

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@jakobbotschjakobbotsch left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

The JIT change LGTM

Comment threadsrc/coreclr/nativeaot/Runtime/arm64/DispatchResolve.S
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

Thank you! I'll address the cleanups in a followup since it would reset the signoff and it would be preferable this makes it into Preview 7.

@MichalStrehovsky
MichalStrehovsky enabled auto-merge (squash) July 15, 2026 04:48
@MichalStrehovsky
MichalStrehovsky merged commit f417473 into dotnet:mainJul 15, 2026
159 of 161 checks passed
@MichalStrehovsky
MichalStrehovsky deleted the gvmdispatch branch July 15, 2026 04:49
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview7 milestone Jul 15, 2026
MichalStrehovsky added a commit that referenced this pull request Jul 21, 2026
`Delegate.Method` needs to work since it's not a trim-unsafe API.
I thought I maybe broke this in #129609, but the added test doesn't work
in .NET 10 either, so I only broke a small aspect of this (GVMs were
implicitly considered targets of reflection because of the
`RuntimeMethodHandle` used as implementation detail).
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 15, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@MichalStrehovsky@sbomer@jakobbotsch
, '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

Use dispatch cells for generic virtual method dispatch - #129609

Merged
MichalStrehovsky merged 10 commits into
dotnet:mainfrom
MichalStrehovsky:gvmdispatch
Jul 15, 2026
Merged

Use dispatch cells for generic virtual method dispatch#129609
MichalStrehovsky merged 10 commits into
dotnet:mainfrom
MichalStrehovsky:gvmdispatch

Conversation

@MichalStrehovsky

Copy link
Copy Markdown
Member

This puts generic virtual method dispatch on the same plan as interface method dispatch.

Benefits:

  • The cost of generic virtual methods went down (still not quite same as interface calls due to fat pointers, but closer)
    • Monomorpic GVM callsite: Before: ~2.45 ns/call. After: 1.74 ns/call
    • Polymorphic GVM callsite: Before: ~2.45 ns/call. After: 2.10 ns/call.
  • GVM methods no longer implicitly considered targets of reflection due to LDTOKEN used as implementation detail.
  • The weird RuntimeMethodHandle for async method variants that reflection should never see is gone

This is three commits:

  • First just deletes some dead code I noticed.
  • Second moves some of the dispatch resolution to CoreLib. We've been breaking the "interface dispatch lives in Runtime.Base" boundary for a while. This puts us closer to it living in CoreLib. We can move rest of the interface resolution later, didn't want to perturb this too much. The cache itself stays in Runtime.Base because the assembly helper can only handle one. (We can decide the assembly helper is also owned by CoreLib I guess, but we don't currently have such layer.) I think copilot could easily undo this if this is not the split we want.
  • Third commit switches the GVM calls to use the dispatch cell. We need a resolve helper variant because GVM dispatch is a resolver due to fat calls, not a dispatcher.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @dotnet/ilc-contrib
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 reworks NativeAOT generic virtual method (GVM) dispatch to use dispatch cells (aligning it more closely with interface dispatch), adds new ReadyToRun sections/nodes to emit GVM dispatch-cell metadata, and updates the JIT/AOT toolchain to consume the new helper + lookup shapes.

Changes:

  • Introduces GVM dispatch-cell sections/metadata in the compiler output and routes GVM lookups through a dispatch-cell-based helper.
  • Refactors “interface dispatch cell” infrastructure into a generalized “dispatch cell” concept used for both interface dispatch and GVM dispatch.
  • Moves parts of dispatch resolution into CoreLib (classlib function table) and adds new per-architecture “resolve” helper entrypoints.

Reviewed changes

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

Show a summary per file
FileDescription
src/coreclr/tools/Common/Internal/Runtime/RuntimeConstants.csIntroduces GvmDispatchCellFlags for encoding async-variant bit in GVM dispatch-cell metadata.
src/coreclr/tools/Common/Internal/Runtime/ModuleHeaders.csAdds new ReadyToRun section types for GVM dispatch-cell regions.
src/coreclr/tools/Common/Internal/Runtime/InterfaceDispatchCellCachePointerFlags.csRemoves unused interface-dispatch cache-pointer flags enum.
src/coreclr/tools/Common/Internal/Runtime/DispatchCell.csAdds shared dispatch-cell structs (including dynamic dispatch-cell layouts).
src/coreclr/tools/Common/Internal/NativeFormat/NativeFormat.csAllocates FixupSignatureKind.GvmDispatchCell.
src/coreclr/tools/Common/Compiler/DependencyAnalysis/SortableDependencyNode.csAdds ordered node kinds for GVM dispatch-cell sections.
src/coreclr/tools/Common/Compiler/DependencyAnalysis/GVMDependenciesNode.csMarks compilation with an analysis characteristic when GVMs are present.
src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.csSwitches call-info emission to use dispatch-cell helpers/const lookups for interface+GVM cases.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.csUses dispatch-cell symbol node instead of interface-only dispatch cell.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRunSymbolNodeFactory.csConsolidates cell cache from interface-only to general dispatch cells.
src/coreclr/tools/aot/ILCompiler.Compiler/ILCompiler.Compiler.csprojAdds new dispatch-cell nodes/sections; removes old interface-dispatch-cell node source.
src/coreclr/tools/aot/ILCompiler.Compiler/IL/ILImporter.Scanner.csUpdates dependency scanning for dispatch-cell-based GVM/interface lookups.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/MetadataManager.csTracks generalized dispatch cells; emits new GVM dispatch-cell sections into the R2R header.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/JitHelper.csMaps GVMLookupForSlot to the new RhpDispatchResolve entrypoint.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_X86/X86ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_X86/X86ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_X64/X64ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_X64/X64ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_RiscV64/RiscV64ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_RiscV64/RiscV64ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_LoongArch64/LoongArch64ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_LoongArch64/LoongArch64ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_ARM64/ARM64ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_ARM64/ARM64ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_ARM/ARMReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_ARM/ARMReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/RuntimeMethodHandleNode.csRemoves async-variant encoding from runtime method handle node emission.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/ReadyToRunHelperNode.csRenames helper ID VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/ReadyToRunGenericHelperNode.csUpdates generic-lookup signatures/comparisons to use dispatch-cell lookup kind.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.NativeLayout.csAdds native-layout dictionary slot node for GVM dispatch-cell fixup signatures.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.GenericLookups.csGeneralizes “virtual dispatch cell” generic lookup result into “dispatch cell”.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.csGeneralizes dispatch-cell node cache/factory API.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NativeLayoutVertexNode.csAdds NativeLayoutGvmDispatchGenericDictionarySlotNode implementation.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/InterfaceDispatchCellInfoSectionNode.csUpdates section emission to operate on generalized dispatch cells (filters out GVM instantiations).
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GvmDispatchCellInfoSectionNode.csAdds new section emitting GVM dispatch-cell info (token+flags+instantiation).
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GenericLookupResult.csRenames/expands dispatch-cell lookup result to support interface and GVM.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/DispatchCellSectionNode.csSplits dispatch-cell BSS into interface vs GVM sections via filtering.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/DispatchCellNode.csGeneralizes interface dispatch cell node into a dispatch cell node.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DelegateCreationInfo.csSwitches delegate creation for GVM/interface targets to dispatch-cell-based lookup.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/Compilation.csUpdates runtime-lookup decision for the new dispatch-cell helper ID.
src/coreclr/nativeaot/Test.CoreLib/src/Test.CoreLib.csprojLinks in shared dispatch-cell type(s) and adds a ResolveDispatch export stub.
src/coreclr/nativeaot/Test.CoreLib/src/Internal/Runtime/Dispatch.csAdds Test.CoreLib ResolveDispatch export (currently stubbed).
src/coreclr/nativeaot/System.Private.TypeLoader/src/System.Private.TypeLoader.csprojAdds AnalysisCharacteristicAttribute compilation input.
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.Metadata.csUpdates GVM token handle construction call signature.
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.LdTokenResultLookup.csRemoves async-variant handling from runtime-method-handle ldtoken cache machinery.
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.GVMResolution.csReworks GVM resolution input shape (declaring type + handle + instantiation list + async flag).
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.csAdds GenericVirtualMethodsPresent analysis characteristic gate and new callback signature.
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/GenericDictionaryCell.csAllocates dynamic dispatch-cell layouts for interface cells and new GVM dispatch cells.
src/coreclr/nativeaot/System.Private.CoreLib/src/System/RuntimeMethodHandle.csRemoves async-variant flag from handle layout; adds helper to resolve GVM targets via callbacks.
src/coreclr/nativeaot/System.Private.CoreLib/src/System/Runtime/TypeLoaderExports.csRemoves old GVMLookupForSlot cache-based implementation.
src/coreclr/nativeaot/System.Private.CoreLib/src/System/Delegate.csUpdates GVM delegate initialization to go through dispatch-cell-based resolution.
src/coreclr/nativeaot/System.Private.CoreLib/src/System.Private.CoreLib.csprojLinks dispatch-cell types and adds CoreLib ResolveDispatch implementation source.
src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/Dispatch.csImplements ResolveDispatch and static/dynamic dispatch-cell resolution.
src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/CompilerServices/OpenMethodResolver.csUpdates open-method resolver to resolve GVM targets via the new handle helper.
src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/Augments/TypeLoaderCallbacks.csChanges callback signature for resolving GVM targets (more explicit components).
src/coreclr/nativeaot/System.Private.CoreLib/src/CompatibilitySuppressions.xmlAdds compat suppressions for new public dispatch-cell types.
src/coreclr/nativeaot/Runtime/riscv64/DispatchResolve.SAdds RhpDispatchResolve entrypoint (returns target rather than dispatching).
src/coreclr/nativeaot/Runtime/loongarch64/DispatchResolve.SAdds RhpDispatchResolve entrypoint (returns target rather than dispatching).
src/coreclr/nativeaot/Runtime/i386/DispatchResolve.asmAdds x86 RhpDispatchResolve (cache probe + fallback to worker).
src/coreclr/nativeaot/Runtime/EHHelpers.cppTeaches EH helper classification about RhpDispatchResolve AV locations/addresses.
src/coreclr/nativeaot/Runtime/arm64/DispatchResolve.SFactors common macro + adds RhpDispatchResolve variant (returning target).
src/coreclr/nativeaot/Runtime/arm64/DispatchResolve.asmAdds RhpDispatchResolve variant and calls RhpCidResolve_Worker for return-only slow path.
src/coreclr/nativeaot/Runtime/arm/DispatchResolve.SAdds ARM32 RhpDispatchResolve with a barrier before reading cached code.
src/coreclr/nativeaot/Runtime/amd64/DispatchResolve.SAdds RhpDispatchResolve macro variant (returning target).
src/coreclr/nativeaot/Runtime/amd64/DispatchResolve.asmAdds RhpDispatchResolve macro variant and optimized slow path.
src/coreclr/nativeaot/Runtime.Base/src/System/Runtime/InternalCalls.csAdds ClassLibFunctionId.ResolveDispatch entry.
src/coreclr/nativeaot/Runtime.Base/src/System/Runtime/CachedInterfaceDispatch.csRoutes cache misses to classlib ResolveDispatch and exports RhpCidResolve_Worker.
src/coreclr/nativeaot/Bootstrap/main.cppExposes ResolveDispatch in the classlib function table.
src/coreclr/jit/importer.cppSwitches NativeAOT GVM ldvirtftn import to pass dispatch cell instead of runtime method handle.
src/coreclr/inc/corinfo.hUpdates helper comment to document dispatch-cell argument for GVM lookup helper.

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
Comment threadsrc/coreclr/nativeaot/Runtime/riscv64/DispatchResolve.S Outdated
Comment threadsrc/coreclr/nativeaot/Runtime/loongarch64/DispatchResolve.S Outdated
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@github-actionsgithub-actionsBot mentioned this pull request Jun 19, 2026
CopilotAI review requested due to automatic review settings June 24, 2026 04: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 70 out of 70 changed files in this pull request and generated 4 comments.

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

CopilotAI review requested due to automatic review settings July 2, 2026 03:30
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

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

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings July 8, 2026 03:14
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

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

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
Comment threadsrc/coreclr/nativeaot/Runtime/EHHelpers.cpp
CopilotAI review requested due to automatic review settings July 10, 2026 05:00

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

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@jakobbotschjakobbotsch left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

The JIT change LGTM

Comment threadsrc/coreclr/nativeaot/Runtime/arm64/DispatchResolve.S
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

Thank you! I'll address the cleanups in a followup since it would reset the signoff and it would be preferable this makes it into Preview 7.

@MichalStrehovsky
MichalStrehovsky enabled auto-merge (squash) July 15, 2026 04:48
@MichalStrehovsky
MichalStrehovsky merged commit f417473 into dotnet:mainJul 15, 2026
159 of 161 checks passed
@MichalStrehovsky
MichalStrehovsky deleted the gvmdispatch branch July 15, 2026 04:49
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview7 milestone Jul 15, 2026
MichalStrehovsky added a commit that referenced this pull request Jul 21, 2026
`Delegate.Method` needs to work since it's not a trim-unsafe API.
I thought I maybe broke this in #129609, but the added test doesn't work
in .NET 10 either, so I only broke a small aspect of this (GVMs were
implicitly considered targets of reflection because of the
`RuntimeMethodHandle` used as implementation detail).
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 15, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@MichalStrehovsky@sbomer@jakobbotsch
, '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

Use dispatch cells for generic virtual method dispatch - #129609

Merged
MichalStrehovsky merged 10 commits into
dotnet:mainfrom
MichalStrehovsky:gvmdispatch
Jul 15, 2026
Merged

Use dispatch cells for generic virtual method dispatch#129609
MichalStrehovsky merged 10 commits into
dotnet:mainfrom
MichalStrehovsky:gvmdispatch

Conversation

@MichalStrehovsky

Copy link
Copy Markdown
Member

This puts generic virtual method dispatch on the same plan as interface method dispatch.

Benefits:

  • The cost of generic virtual methods went down (still not quite same as interface calls due to fat pointers, but closer)
    • Monomorpic GVM callsite: Before: ~2.45 ns/call. After: 1.74 ns/call
    • Polymorphic GVM callsite: Before: ~2.45 ns/call. After: 2.10 ns/call.
  • GVM methods no longer implicitly considered targets of reflection due to LDTOKEN used as implementation detail.
  • The weird RuntimeMethodHandle for async method variants that reflection should never see is gone

This is three commits:

  • First just deletes some dead code I noticed.
  • Second moves some of the dispatch resolution to CoreLib. We've been breaking the "interface dispatch lives in Runtime.Base" boundary for a while. This puts us closer to it living in CoreLib. We can move rest of the interface resolution later, didn't want to perturb this too much. The cache itself stays in Runtime.Base because the assembly helper can only handle one. (We can decide the assembly helper is also owned by CoreLib I guess, but we don't currently have such layer.) I think copilot could easily undo this if this is not the split we want.
  • Third commit switches the GVM calls to use the dispatch cell. We need a resolve helper variant because GVM dispatch is a resolver due to fat calls, not a dispatcher.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @dotnet/ilc-contrib
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 reworks NativeAOT generic virtual method (GVM) dispatch to use dispatch cells (aligning it more closely with interface dispatch), adds new ReadyToRun sections/nodes to emit GVM dispatch-cell metadata, and updates the JIT/AOT toolchain to consume the new helper + lookup shapes.

Changes:

  • Introduces GVM dispatch-cell sections/metadata in the compiler output and routes GVM lookups through a dispatch-cell-based helper.
  • Refactors “interface dispatch cell” infrastructure into a generalized “dispatch cell” concept used for both interface dispatch and GVM dispatch.
  • Moves parts of dispatch resolution into CoreLib (classlib function table) and adds new per-architecture “resolve” helper entrypoints.

Reviewed changes

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

Show a summary per file
FileDescription
src/coreclr/tools/Common/Internal/Runtime/RuntimeConstants.csIntroduces GvmDispatchCellFlags for encoding async-variant bit in GVM dispatch-cell metadata.
src/coreclr/tools/Common/Internal/Runtime/ModuleHeaders.csAdds new ReadyToRun section types for GVM dispatch-cell regions.
src/coreclr/tools/Common/Internal/Runtime/InterfaceDispatchCellCachePointerFlags.csRemoves unused interface-dispatch cache-pointer flags enum.
src/coreclr/tools/Common/Internal/Runtime/DispatchCell.csAdds shared dispatch-cell structs (including dynamic dispatch-cell layouts).
src/coreclr/tools/Common/Internal/NativeFormat/NativeFormat.csAllocates FixupSignatureKind.GvmDispatchCell.
src/coreclr/tools/Common/Compiler/DependencyAnalysis/SortableDependencyNode.csAdds ordered node kinds for GVM dispatch-cell sections.
src/coreclr/tools/Common/Compiler/DependencyAnalysis/GVMDependenciesNode.csMarks compilation with an analysis characteristic when GVMs are present.
src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.csSwitches call-info emission to use dispatch-cell helpers/const lookups for interface+GVM cases.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.csUses dispatch-cell symbol node instead of interface-only dispatch cell.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRunSymbolNodeFactory.csConsolidates cell cache from interface-only to general dispatch cells.
src/coreclr/tools/aot/ILCompiler.Compiler/ILCompiler.Compiler.csprojAdds new dispatch-cell nodes/sections; removes old interface-dispatch-cell node source.
src/coreclr/tools/aot/ILCompiler.Compiler/IL/ILImporter.Scanner.csUpdates dependency scanning for dispatch-cell-based GVM/interface lookups.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/MetadataManager.csTracks generalized dispatch cells; emits new GVM dispatch-cell sections into the R2R header.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/JitHelper.csMaps GVMLookupForSlot to the new RhpDispatchResolve entrypoint.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_X86/X86ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_X86/X86ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_X64/X64ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_X64/X64ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_RiscV64/RiscV64ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_RiscV64/RiscV64ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_LoongArch64/LoongArch64ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_LoongArch64/LoongArch64ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_ARM64/ARM64ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_ARM64/ARM64ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_ARM/ARMReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_ARM/ARMReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/RuntimeMethodHandleNode.csRemoves async-variant encoding from runtime method handle node emission.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/ReadyToRunHelperNode.csRenames helper ID VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/ReadyToRunGenericHelperNode.csUpdates generic-lookup signatures/comparisons to use dispatch-cell lookup kind.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.NativeLayout.csAdds native-layout dictionary slot node for GVM dispatch-cell fixup signatures.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.GenericLookups.csGeneralizes “virtual dispatch cell” generic lookup result into “dispatch cell”.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.csGeneralizes dispatch-cell node cache/factory API.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NativeLayoutVertexNode.csAdds NativeLayoutGvmDispatchGenericDictionarySlotNode implementation.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/InterfaceDispatchCellInfoSectionNode.csUpdates section emission to operate on generalized dispatch cells (filters out GVM instantiations).
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GvmDispatchCellInfoSectionNode.csAdds new section emitting GVM dispatch-cell info (token+flags+instantiation).
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GenericLookupResult.csRenames/expands dispatch-cell lookup result to support interface and GVM.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/DispatchCellSectionNode.csSplits dispatch-cell BSS into interface vs GVM sections via filtering.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/DispatchCellNode.csGeneralizes interface dispatch cell node into a dispatch cell node.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DelegateCreationInfo.csSwitches delegate creation for GVM/interface targets to dispatch-cell-based lookup.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/Compilation.csUpdates runtime-lookup decision for the new dispatch-cell helper ID.
src/coreclr/nativeaot/Test.CoreLib/src/Test.CoreLib.csprojLinks in shared dispatch-cell type(s) and adds a ResolveDispatch export stub.
src/coreclr/nativeaot/Test.CoreLib/src/Internal/Runtime/Dispatch.csAdds Test.CoreLib ResolveDispatch export (currently stubbed).
src/coreclr/nativeaot/System.Private.TypeLoader/src/System.Private.TypeLoader.csprojAdds AnalysisCharacteristicAttribute compilation input.
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.Metadata.csUpdates GVM token handle construction call signature.
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.LdTokenResultLookup.csRemoves async-variant handling from runtime-method-handle ldtoken cache machinery.
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.GVMResolution.csReworks GVM resolution input shape (declaring type + handle + instantiation list + async flag).
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.csAdds GenericVirtualMethodsPresent analysis characteristic gate and new callback signature.
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/GenericDictionaryCell.csAllocates dynamic dispatch-cell layouts for interface cells and new GVM dispatch cells.
src/coreclr/nativeaot/System.Private.CoreLib/src/System/RuntimeMethodHandle.csRemoves async-variant flag from handle layout; adds helper to resolve GVM targets via callbacks.
src/coreclr/nativeaot/System.Private.CoreLib/src/System/Runtime/TypeLoaderExports.csRemoves old GVMLookupForSlot cache-based implementation.
src/coreclr/nativeaot/System.Private.CoreLib/src/System/Delegate.csUpdates GVM delegate initialization to go through dispatch-cell-based resolution.
src/coreclr/nativeaot/System.Private.CoreLib/src/System.Private.CoreLib.csprojLinks dispatch-cell types and adds CoreLib ResolveDispatch implementation source.
src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/Dispatch.csImplements ResolveDispatch and static/dynamic dispatch-cell resolution.
src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/CompilerServices/OpenMethodResolver.csUpdates open-method resolver to resolve GVM targets via the new handle helper.
src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/Augments/TypeLoaderCallbacks.csChanges callback signature for resolving GVM targets (more explicit components).
src/coreclr/nativeaot/System.Private.CoreLib/src/CompatibilitySuppressions.xmlAdds compat suppressions for new public dispatch-cell types.
src/coreclr/nativeaot/Runtime/riscv64/DispatchResolve.SAdds RhpDispatchResolve entrypoint (returns target rather than dispatching).
src/coreclr/nativeaot/Runtime/loongarch64/DispatchResolve.SAdds RhpDispatchResolve entrypoint (returns target rather than dispatching).
src/coreclr/nativeaot/Runtime/i386/DispatchResolve.asmAdds x86 RhpDispatchResolve (cache probe + fallback to worker).
src/coreclr/nativeaot/Runtime/EHHelpers.cppTeaches EH helper classification about RhpDispatchResolve AV locations/addresses.
src/coreclr/nativeaot/Runtime/arm64/DispatchResolve.SFactors common macro + adds RhpDispatchResolve variant (returning target).
src/coreclr/nativeaot/Runtime/arm64/DispatchResolve.asmAdds RhpDispatchResolve variant and calls RhpCidResolve_Worker for return-only slow path.
src/coreclr/nativeaot/Runtime/arm/DispatchResolve.SAdds ARM32 RhpDispatchResolve with a barrier before reading cached code.
src/coreclr/nativeaot/Runtime/amd64/DispatchResolve.SAdds RhpDispatchResolve macro variant (returning target).
src/coreclr/nativeaot/Runtime/amd64/DispatchResolve.asmAdds RhpDispatchResolve macro variant and optimized slow path.
src/coreclr/nativeaot/Runtime.Base/src/System/Runtime/InternalCalls.csAdds ClassLibFunctionId.ResolveDispatch entry.
src/coreclr/nativeaot/Runtime.Base/src/System/Runtime/CachedInterfaceDispatch.csRoutes cache misses to classlib ResolveDispatch and exports RhpCidResolve_Worker.
src/coreclr/nativeaot/Bootstrap/main.cppExposes ResolveDispatch in the classlib function table.
src/coreclr/jit/importer.cppSwitches NativeAOT GVM ldvirtftn import to pass dispatch cell instead of runtime method handle.
src/coreclr/inc/corinfo.hUpdates helper comment to document dispatch-cell argument for GVM lookup helper.

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
Comment threadsrc/coreclr/nativeaot/Runtime/riscv64/DispatchResolve.S Outdated
Comment threadsrc/coreclr/nativeaot/Runtime/loongarch64/DispatchResolve.S Outdated
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@github-actionsgithub-actionsBot mentioned this pull request Jun 19, 2026
CopilotAI review requested due to automatic review settings June 24, 2026 04: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 70 out of 70 changed files in this pull request and generated 4 comments.

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

CopilotAI review requested due to automatic review settings July 2, 2026 03:30
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

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

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings July 8, 2026 03:14
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

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

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
Comment threadsrc/coreclr/nativeaot/Runtime/EHHelpers.cpp
CopilotAI review requested due to automatic review settings July 10, 2026 05:00

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

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@jakobbotschjakobbotsch left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

The JIT change LGTM

Comment threadsrc/coreclr/nativeaot/Runtime/arm64/DispatchResolve.S
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

Thank you! I'll address the cleanups in a followup since it would reset the signoff and it would be preferable this makes it into Preview 7.

@MichalStrehovsky
MichalStrehovsky enabled auto-merge (squash) July 15, 2026 04:48
@MichalStrehovsky
MichalStrehovsky merged commit f417473 into dotnet:mainJul 15, 2026
159 of 161 checks passed
@MichalStrehovsky
MichalStrehovsky deleted the gvmdispatch branch July 15, 2026 04:49
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview7 milestone Jul 15, 2026
MichalStrehovsky added a commit that referenced this pull request Jul 21, 2026
`Delegate.Method` needs to work since it's not a trim-unsafe API.
I thought I maybe broke this in #129609, but the added test doesn't work
in .NET 10 either, so I only broke a small aspect of this (GVMs were
implicitly considered targets of reflection because of the
`RuntimeMethodHandle` used as implementation detail).
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 15, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@MichalStrehovsky@sbomer@jakobbotsch
, '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

Use dispatch cells for generic virtual method dispatch - #129609

Merged
MichalStrehovsky merged 10 commits into
dotnet:mainfrom
MichalStrehovsky:gvmdispatch
Jul 15, 2026
Merged

Use dispatch cells for generic virtual method dispatch#129609
MichalStrehovsky merged 10 commits into
dotnet:mainfrom
MichalStrehovsky:gvmdispatch

Conversation

@MichalStrehovsky

Copy link
Copy Markdown
Member

This puts generic virtual method dispatch on the same plan as interface method dispatch.

Benefits:

  • The cost of generic virtual methods went down (still not quite same as interface calls due to fat pointers, but closer)
    • Monomorpic GVM callsite: Before: ~2.45 ns/call. After: 1.74 ns/call
    • Polymorphic GVM callsite: Before: ~2.45 ns/call. After: 2.10 ns/call.
  • GVM methods no longer implicitly considered targets of reflection due to LDTOKEN used as implementation detail.
  • The weird RuntimeMethodHandle for async method variants that reflection should never see is gone

This is three commits:

  • First just deletes some dead code I noticed.
  • Second moves some of the dispatch resolution to CoreLib. We've been breaking the "interface dispatch lives in Runtime.Base" boundary for a while. This puts us closer to it living in CoreLib. We can move rest of the interface resolution later, didn't want to perturb this too much. The cache itself stays in Runtime.Base because the assembly helper can only handle one. (We can decide the assembly helper is also owned by CoreLib I guess, but we don't currently have such layer.) I think copilot could easily undo this if this is not the split we want.
  • Third commit switches the GVM calls to use the dispatch cell. We need a resolve helper variant because GVM dispatch is a resolver due to fat calls, not a dispatcher.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @dotnet/ilc-contrib
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 reworks NativeAOT generic virtual method (GVM) dispatch to use dispatch cells (aligning it more closely with interface dispatch), adds new ReadyToRun sections/nodes to emit GVM dispatch-cell metadata, and updates the JIT/AOT toolchain to consume the new helper + lookup shapes.

Changes:

  • Introduces GVM dispatch-cell sections/metadata in the compiler output and routes GVM lookups through a dispatch-cell-based helper.
  • Refactors “interface dispatch cell” infrastructure into a generalized “dispatch cell” concept used for both interface dispatch and GVM dispatch.
  • Moves parts of dispatch resolution into CoreLib (classlib function table) and adds new per-architecture “resolve” helper entrypoints.

Reviewed changes

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

Show a summary per file
FileDescription
src/coreclr/tools/Common/Internal/Runtime/RuntimeConstants.csIntroduces GvmDispatchCellFlags for encoding async-variant bit in GVM dispatch-cell metadata.
src/coreclr/tools/Common/Internal/Runtime/ModuleHeaders.csAdds new ReadyToRun section types for GVM dispatch-cell regions.
src/coreclr/tools/Common/Internal/Runtime/InterfaceDispatchCellCachePointerFlags.csRemoves unused interface-dispatch cache-pointer flags enum.
src/coreclr/tools/Common/Internal/Runtime/DispatchCell.csAdds shared dispatch-cell structs (including dynamic dispatch-cell layouts).
src/coreclr/tools/Common/Internal/NativeFormat/NativeFormat.csAllocates FixupSignatureKind.GvmDispatchCell.
src/coreclr/tools/Common/Compiler/DependencyAnalysis/SortableDependencyNode.csAdds ordered node kinds for GVM dispatch-cell sections.
src/coreclr/tools/Common/Compiler/DependencyAnalysis/GVMDependenciesNode.csMarks compilation with an analysis characteristic when GVMs are present.
src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.csSwitches call-info emission to use dispatch-cell helpers/const lookups for interface+GVM cases.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.csUses dispatch-cell symbol node instead of interface-only dispatch cell.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRunSymbolNodeFactory.csConsolidates cell cache from interface-only to general dispatch cells.
src/coreclr/tools/aot/ILCompiler.Compiler/ILCompiler.Compiler.csprojAdds new dispatch-cell nodes/sections; removes old interface-dispatch-cell node source.
src/coreclr/tools/aot/ILCompiler.Compiler/IL/ILImporter.Scanner.csUpdates dependency scanning for dispatch-cell-based GVM/interface lookups.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/MetadataManager.csTracks generalized dispatch cells; emits new GVM dispatch-cell sections into the R2R header.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/JitHelper.csMaps GVMLookupForSlot to the new RhpDispatchResolve entrypoint.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_X86/X86ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_X86/X86ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_X64/X64ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_X64/X64ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_RiscV64/RiscV64ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_RiscV64/RiscV64ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_LoongArch64/LoongArch64ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_LoongArch64/LoongArch64ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_ARM64/ARM64ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_ARM64/ARM64ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_ARM/ARMReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_ARM/ARMReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/RuntimeMethodHandleNode.csRemoves async-variant encoding from runtime method handle node emission.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/ReadyToRunHelperNode.csRenames helper ID VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/ReadyToRunGenericHelperNode.csUpdates generic-lookup signatures/comparisons to use dispatch-cell lookup kind.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.NativeLayout.csAdds native-layout dictionary slot node for GVM dispatch-cell fixup signatures.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.GenericLookups.csGeneralizes “virtual dispatch cell” generic lookup result into “dispatch cell”.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.csGeneralizes dispatch-cell node cache/factory API.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NativeLayoutVertexNode.csAdds NativeLayoutGvmDispatchGenericDictionarySlotNode implementation.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/InterfaceDispatchCellInfoSectionNode.csUpdates section emission to operate on generalized dispatch cells (filters out GVM instantiations).
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GvmDispatchCellInfoSectionNode.csAdds new section emitting GVM dispatch-cell info (token+flags+instantiation).
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GenericLookupResult.csRenames/expands dispatch-cell lookup result to support interface and GVM.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/DispatchCellSectionNode.csSplits dispatch-cell BSS into interface vs GVM sections via filtering.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/DispatchCellNode.csGeneralizes interface dispatch cell node into a dispatch cell node.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DelegateCreationInfo.csSwitches delegate creation for GVM/interface targets to dispatch-cell-based lookup.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/Compilation.csUpdates runtime-lookup decision for the new dispatch-cell helper ID.
src/coreclr/nativeaot/Test.CoreLib/src/Test.CoreLib.csprojLinks in shared dispatch-cell type(s) and adds a ResolveDispatch export stub.
src/coreclr/nativeaot/Test.CoreLib/src/Internal/Runtime/Dispatch.csAdds Test.CoreLib ResolveDispatch export (currently stubbed).
src/coreclr/nativeaot/System.Private.TypeLoader/src/System.Private.TypeLoader.csprojAdds AnalysisCharacteristicAttribute compilation input.
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.Metadata.csUpdates GVM token handle construction call signature.
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.LdTokenResultLookup.csRemoves async-variant handling from runtime-method-handle ldtoken cache machinery.
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.GVMResolution.csReworks GVM resolution input shape (declaring type + handle + instantiation list + async flag).
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.csAdds GenericVirtualMethodsPresent analysis characteristic gate and new callback signature.
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/GenericDictionaryCell.csAllocates dynamic dispatch-cell layouts for interface cells and new GVM dispatch cells.
src/coreclr/nativeaot/System.Private.CoreLib/src/System/RuntimeMethodHandle.csRemoves async-variant flag from handle layout; adds helper to resolve GVM targets via callbacks.
src/coreclr/nativeaot/System.Private.CoreLib/src/System/Runtime/TypeLoaderExports.csRemoves old GVMLookupForSlot cache-based implementation.
src/coreclr/nativeaot/System.Private.CoreLib/src/System/Delegate.csUpdates GVM delegate initialization to go through dispatch-cell-based resolution.
src/coreclr/nativeaot/System.Private.CoreLib/src/System.Private.CoreLib.csprojLinks dispatch-cell types and adds CoreLib ResolveDispatch implementation source.
src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/Dispatch.csImplements ResolveDispatch and static/dynamic dispatch-cell resolution.
src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/CompilerServices/OpenMethodResolver.csUpdates open-method resolver to resolve GVM targets via the new handle helper.
src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/Augments/TypeLoaderCallbacks.csChanges callback signature for resolving GVM targets (more explicit components).
src/coreclr/nativeaot/System.Private.CoreLib/src/CompatibilitySuppressions.xmlAdds compat suppressions for new public dispatch-cell types.
src/coreclr/nativeaot/Runtime/riscv64/DispatchResolve.SAdds RhpDispatchResolve entrypoint (returns target rather than dispatching).
src/coreclr/nativeaot/Runtime/loongarch64/DispatchResolve.SAdds RhpDispatchResolve entrypoint (returns target rather than dispatching).
src/coreclr/nativeaot/Runtime/i386/DispatchResolve.asmAdds x86 RhpDispatchResolve (cache probe + fallback to worker).
src/coreclr/nativeaot/Runtime/EHHelpers.cppTeaches EH helper classification about RhpDispatchResolve AV locations/addresses.
src/coreclr/nativeaot/Runtime/arm64/DispatchResolve.SFactors common macro + adds RhpDispatchResolve variant (returning target).
src/coreclr/nativeaot/Runtime/arm64/DispatchResolve.asmAdds RhpDispatchResolve variant and calls RhpCidResolve_Worker for return-only slow path.
src/coreclr/nativeaot/Runtime/arm/DispatchResolve.SAdds ARM32 RhpDispatchResolve with a barrier before reading cached code.
src/coreclr/nativeaot/Runtime/amd64/DispatchResolve.SAdds RhpDispatchResolve macro variant (returning target).
src/coreclr/nativeaot/Runtime/amd64/DispatchResolve.asmAdds RhpDispatchResolve macro variant and optimized slow path.
src/coreclr/nativeaot/Runtime.Base/src/System/Runtime/InternalCalls.csAdds ClassLibFunctionId.ResolveDispatch entry.
src/coreclr/nativeaot/Runtime.Base/src/System/Runtime/CachedInterfaceDispatch.csRoutes cache misses to classlib ResolveDispatch and exports RhpCidResolve_Worker.
src/coreclr/nativeaot/Bootstrap/main.cppExposes ResolveDispatch in the classlib function table.
src/coreclr/jit/importer.cppSwitches NativeAOT GVM ldvirtftn import to pass dispatch cell instead of runtime method handle.
src/coreclr/inc/corinfo.hUpdates helper comment to document dispatch-cell argument for GVM lookup helper.

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
Comment threadsrc/coreclr/nativeaot/Runtime/riscv64/DispatchResolve.S Outdated
Comment threadsrc/coreclr/nativeaot/Runtime/loongarch64/DispatchResolve.S Outdated
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@github-actionsgithub-actionsBot mentioned this pull request Jun 19, 2026
CopilotAI review requested due to automatic review settings June 24, 2026 04: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 70 out of 70 changed files in this pull request and generated 4 comments.

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

CopilotAI review requested due to automatic review settings July 2, 2026 03:30
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

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

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings July 8, 2026 03:14
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

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

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
Comment threadsrc/coreclr/nativeaot/Runtime/EHHelpers.cpp
CopilotAI review requested due to automatic review settings July 10, 2026 05:00

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

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@jakobbotschjakobbotsch left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

The JIT change LGTM

Comment threadsrc/coreclr/nativeaot/Runtime/arm64/DispatchResolve.S
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

Thank you! I'll address the cleanups in a followup since it would reset the signoff and it would be preferable this makes it into Preview 7.

@MichalStrehovsky
MichalStrehovsky enabled auto-merge (squash) July 15, 2026 04:48
@MichalStrehovsky
MichalStrehovsky merged commit f417473 into dotnet:mainJul 15, 2026
159 of 161 checks passed
@MichalStrehovsky
MichalStrehovsky deleted the gvmdispatch branch July 15, 2026 04:49
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview7 milestone Jul 15, 2026
MichalStrehovsky added a commit that referenced this pull request Jul 21, 2026
`Delegate.Method` needs to work since it's not a trim-unsafe API.
I thought I maybe broke this in #129609, but the added test doesn't work
in .NET 10 either, so I only broke a small aspect of this (GVMs were
implicitly considered targets of reflection because of the
`RuntimeMethodHandle` used as implementation detail).
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 15, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@MichalStrehovsky@sbomer@jakobbotsch
, '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

Use dispatch cells for generic virtual method dispatch - #129609

Merged
MichalStrehovsky merged 10 commits into
dotnet:mainfrom
MichalStrehovsky:gvmdispatch
Jul 15, 2026
Merged

Use dispatch cells for generic virtual method dispatch#129609
MichalStrehovsky merged 10 commits into
dotnet:mainfrom
MichalStrehovsky:gvmdispatch

Conversation

@MichalStrehovsky

Copy link
Copy Markdown
Member

This puts generic virtual method dispatch on the same plan as interface method dispatch.

Benefits:

  • The cost of generic virtual methods went down (still not quite same as interface calls due to fat pointers, but closer)
    • Monomorpic GVM callsite: Before: ~2.45 ns/call. After: 1.74 ns/call
    • Polymorphic GVM callsite: Before: ~2.45 ns/call. After: 2.10 ns/call.
  • GVM methods no longer implicitly considered targets of reflection due to LDTOKEN used as implementation detail.
  • The weird RuntimeMethodHandle for async method variants that reflection should never see is gone

This is three commits:

  • First just deletes some dead code I noticed.
  • Second moves some of the dispatch resolution to CoreLib. We've been breaking the "interface dispatch lives in Runtime.Base" boundary for a while. This puts us closer to it living in CoreLib. We can move rest of the interface resolution later, didn't want to perturb this too much. The cache itself stays in Runtime.Base because the assembly helper can only handle one. (We can decide the assembly helper is also owned by CoreLib I guess, but we don't currently have such layer.) I think copilot could easily undo this if this is not the split we want.
  • Third commit switches the GVM calls to use the dispatch cell. We need a resolve helper variant because GVM dispatch is a resolver due to fat calls, not a dispatcher.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @dotnet/ilc-contrib
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 reworks NativeAOT generic virtual method (GVM) dispatch to use dispatch cells (aligning it more closely with interface dispatch), adds new ReadyToRun sections/nodes to emit GVM dispatch-cell metadata, and updates the JIT/AOT toolchain to consume the new helper + lookup shapes.

Changes:

  • Introduces GVM dispatch-cell sections/metadata in the compiler output and routes GVM lookups through a dispatch-cell-based helper.
  • Refactors “interface dispatch cell” infrastructure into a generalized “dispatch cell” concept used for both interface dispatch and GVM dispatch.
  • Moves parts of dispatch resolution into CoreLib (classlib function table) and adds new per-architecture “resolve” helper entrypoints.

Reviewed changes

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

Show a summary per file
FileDescription
src/coreclr/tools/Common/Internal/Runtime/RuntimeConstants.csIntroduces GvmDispatchCellFlags for encoding async-variant bit in GVM dispatch-cell metadata.
src/coreclr/tools/Common/Internal/Runtime/ModuleHeaders.csAdds new ReadyToRun section types for GVM dispatch-cell regions.
src/coreclr/tools/Common/Internal/Runtime/InterfaceDispatchCellCachePointerFlags.csRemoves unused interface-dispatch cache-pointer flags enum.
src/coreclr/tools/Common/Internal/Runtime/DispatchCell.csAdds shared dispatch-cell structs (including dynamic dispatch-cell layouts).
src/coreclr/tools/Common/Internal/NativeFormat/NativeFormat.csAllocates FixupSignatureKind.GvmDispatchCell.
src/coreclr/tools/Common/Compiler/DependencyAnalysis/SortableDependencyNode.csAdds ordered node kinds for GVM dispatch-cell sections.
src/coreclr/tools/Common/Compiler/DependencyAnalysis/GVMDependenciesNode.csMarks compilation with an analysis characteristic when GVMs are present.
src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.csSwitches call-info emission to use dispatch-cell helpers/const lookups for interface+GVM cases.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.csUses dispatch-cell symbol node instead of interface-only dispatch cell.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRunSymbolNodeFactory.csConsolidates cell cache from interface-only to general dispatch cells.
src/coreclr/tools/aot/ILCompiler.Compiler/ILCompiler.Compiler.csprojAdds new dispatch-cell nodes/sections; removes old interface-dispatch-cell node source.
src/coreclr/tools/aot/ILCompiler.Compiler/IL/ILImporter.Scanner.csUpdates dependency scanning for dispatch-cell-based GVM/interface lookups.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/MetadataManager.csTracks generalized dispatch cells; emits new GVM dispatch-cell sections into the R2R header.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/JitHelper.csMaps GVMLookupForSlot to the new RhpDispatchResolve entrypoint.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_X86/X86ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_X86/X86ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_X64/X64ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_X64/X64ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_RiscV64/RiscV64ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_RiscV64/RiscV64ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_LoongArch64/LoongArch64ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_LoongArch64/LoongArch64ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_ARM64/ARM64ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_ARM64/ARM64ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_ARM/ARMReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_ARM/ARMReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/RuntimeMethodHandleNode.csRemoves async-variant encoding from runtime method handle node emission.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/ReadyToRunHelperNode.csRenames helper ID VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/ReadyToRunGenericHelperNode.csUpdates generic-lookup signatures/comparisons to use dispatch-cell lookup kind.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.NativeLayout.csAdds native-layout dictionary slot node for GVM dispatch-cell fixup signatures.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.GenericLookups.csGeneralizes “virtual dispatch cell” generic lookup result into “dispatch cell”.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.csGeneralizes dispatch-cell node cache/factory API.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NativeLayoutVertexNode.csAdds NativeLayoutGvmDispatchGenericDictionarySlotNode implementation.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/InterfaceDispatchCellInfoSectionNode.csUpdates section emission to operate on generalized dispatch cells (filters out GVM instantiations).
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GvmDispatchCellInfoSectionNode.csAdds new section emitting GVM dispatch-cell info (token+flags+instantiation).
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GenericLookupResult.csRenames/expands dispatch-cell lookup result to support interface and GVM.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/DispatchCellSectionNode.csSplits dispatch-cell BSS into interface vs GVM sections via filtering.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/DispatchCellNode.csGeneralizes interface dispatch cell node into a dispatch cell node.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DelegateCreationInfo.csSwitches delegate creation for GVM/interface targets to dispatch-cell-based lookup.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/Compilation.csUpdates runtime-lookup decision for the new dispatch-cell helper ID.
src/coreclr/nativeaot/Test.CoreLib/src/Test.CoreLib.csprojLinks in shared dispatch-cell type(s) and adds a ResolveDispatch export stub.
src/coreclr/nativeaot/Test.CoreLib/src/Internal/Runtime/Dispatch.csAdds Test.CoreLib ResolveDispatch export (currently stubbed).
src/coreclr/nativeaot/System.Private.TypeLoader/src/System.Private.TypeLoader.csprojAdds AnalysisCharacteristicAttribute compilation input.
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.Metadata.csUpdates GVM token handle construction call signature.
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.LdTokenResultLookup.csRemoves async-variant handling from runtime-method-handle ldtoken cache machinery.
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.GVMResolution.csReworks GVM resolution input shape (declaring type + handle + instantiation list + async flag).
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.csAdds GenericVirtualMethodsPresent analysis characteristic gate and new callback signature.
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/GenericDictionaryCell.csAllocates dynamic dispatch-cell layouts for interface cells and new GVM dispatch cells.
src/coreclr/nativeaot/System.Private.CoreLib/src/System/RuntimeMethodHandle.csRemoves async-variant flag from handle layout; adds helper to resolve GVM targets via callbacks.
src/coreclr/nativeaot/System.Private.CoreLib/src/System/Runtime/TypeLoaderExports.csRemoves old GVMLookupForSlot cache-based implementation.
src/coreclr/nativeaot/System.Private.CoreLib/src/System/Delegate.csUpdates GVM delegate initialization to go through dispatch-cell-based resolution.
src/coreclr/nativeaot/System.Private.CoreLib/src/System.Private.CoreLib.csprojLinks dispatch-cell types and adds CoreLib ResolveDispatch implementation source.
src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/Dispatch.csImplements ResolveDispatch and static/dynamic dispatch-cell resolution.
src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/CompilerServices/OpenMethodResolver.csUpdates open-method resolver to resolve GVM targets via the new handle helper.
src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/Augments/TypeLoaderCallbacks.csChanges callback signature for resolving GVM targets (more explicit components).
src/coreclr/nativeaot/System.Private.CoreLib/src/CompatibilitySuppressions.xmlAdds compat suppressions for new public dispatch-cell types.
src/coreclr/nativeaot/Runtime/riscv64/DispatchResolve.SAdds RhpDispatchResolve entrypoint (returns target rather than dispatching).
src/coreclr/nativeaot/Runtime/loongarch64/DispatchResolve.SAdds RhpDispatchResolve entrypoint (returns target rather than dispatching).
src/coreclr/nativeaot/Runtime/i386/DispatchResolve.asmAdds x86 RhpDispatchResolve (cache probe + fallback to worker).
src/coreclr/nativeaot/Runtime/EHHelpers.cppTeaches EH helper classification about RhpDispatchResolve AV locations/addresses.
src/coreclr/nativeaot/Runtime/arm64/DispatchResolve.SFactors common macro + adds RhpDispatchResolve variant (returning target).
src/coreclr/nativeaot/Runtime/arm64/DispatchResolve.asmAdds RhpDispatchResolve variant and calls RhpCidResolve_Worker for return-only slow path.
src/coreclr/nativeaot/Runtime/arm/DispatchResolve.SAdds ARM32 RhpDispatchResolve with a barrier before reading cached code.
src/coreclr/nativeaot/Runtime/amd64/DispatchResolve.SAdds RhpDispatchResolve macro variant (returning target).
src/coreclr/nativeaot/Runtime/amd64/DispatchResolve.asmAdds RhpDispatchResolve macro variant and optimized slow path.
src/coreclr/nativeaot/Runtime.Base/src/System/Runtime/InternalCalls.csAdds ClassLibFunctionId.ResolveDispatch entry.
src/coreclr/nativeaot/Runtime.Base/src/System/Runtime/CachedInterfaceDispatch.csRoutes cache misses to classlib ResolveDispatch and exports RhpCidResolve_Worker.
src/coreclr/nativeaot/Bootstrap/main.cppExposes ResolveDispatch in the classlib function table.
src/coreclr/jit/importer.cppSwitches NativeAOT GVM ldvirtftn import to pass dispatch cell instead of runtime method handle.
src/coreclr/inc/corinfo.hUpdates helper comment to document dispatch-cell argument for GVM lookup helper.

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
Comment threadsrc/coreclr/nativeaot/Runtime/riscv64/DispatchResolve.S Outdated
Comment threadsrc/coreclr/nativeaot/Runtime/loongarch64/DispatchResolve.S Outdated
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@github-actionsgithub-actionsBot mentioned this pull request Jun 19, 2026
CopilotAI review requested due to automatic review settings June 24, 2026 04: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 70 out of 70 changed files in this pull request and generated 4 comments.

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

CopilotAI review requested due to automatic review settings July 2, 2026 03:30
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

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

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings July 8, 2026 03:14
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

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

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
Comment threadsrc/coreclr/nativeaot/Runtime/EHHelpers.cpp
CopilotAI review requested due to automatic review settings July 10, 2026 05:00

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

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@jakobbotschjakobbotsch left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

The JIT change LGTM

Comment threadsrc/coreclr/nativeaot/Runtime/arm64/DispatchResolve.S
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

Thank you! I'll address the cleanups in a followup since it would reset the signoff and it would be preferable this makes it into Preview 7.

@MichalStrehovsky
MichalStrehovsky enabled auto-merge (squash) July 15, 2026 04:48
@MichalStrehovsky
MichalStrehovsky merged commit f417473 into dotnet:mainJul 15, 2026
159 of 161 checks passed
@MichalStrehovsky
MichalStrehovsky deleted the gvmdispatch branch July 15, 2026 04:49
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview7 milestone Jul 15, 2026
MichalStrehovsky added a commit that referenced this pull request Jul 21, 2026
`Delegate.Method` needs to work since it's not a trim-unsafe API.
I thought I maybe broke this in #129609, but the added test doesn't work
in .NET 10 either, so I only broke a small aspect of this (GVMs were
implicitly considered targets of reflection because of the
`RuntimeMethodHandle` used as implementation detail).
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 15, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@MichalStrehovsky@sbomer@jakobbotsch
, '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

Use dispatch cells for generic virtual method dispatch - #129609

Merged
MichalStrehovsky merged 10 commits into
dotnet:mainfrom
MichalStrehovsky:gvmdispatch
Jul 15, 2026
Merged

Use dispatch cells for generic virtual method dispatch#129609
MichalStrehovsky merged 10 commits into
dotnet:mainfrom
MichalStrehovsky:gvmdispatch

Conversation

@MichalStrehovsky

Copy link
Copy Markdown
Member

This puts generic virtual method dispatch on the same plan as interface method dispatch.

Benefits:

  • The cost of generic virtual methods went down (still not quite same as interface calls due to fat pointers, but closer)
    • Monomorpic GVM callsite: Before: ~2.45 ns/call. After: 1.74 ns/call
    • Polymorphic GVM callsite: Before: ~2.45 ns/call. After: 2.10 ns/call.
  • GVM methods no longer implicitly considered targets of reflection due to LDTOKEN used as implementation detail.
  • The weird RuntimeMethodHandle for async method variants that reflection should never see is gone

This is three commits:

  • First just deletes some dead code I noticed.
  • Second moves some of the dispatch resolution to CoreLib. We've been breaking the "interface dispatch lives in Runtime.Base" boundary for a while. This puts us closer to it living in CoreLib. We can move rest of the interface resolution later, didn't want to perturb this too much. The cache itself stays in Runtime.Base because the assembly helper can only handle one. (We can decide the assembly helper is also owned by CoreLib I guess, but we don't currently have such layer.) I think copilot could easily undo this if this is not the split we want.
  • Third commit switches the GVM calls to use the dispatch cell. We need a resolve helper variant because GVM dispatch is a resolver due to fat calls, not a dispatcher.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke, @dotnet/ilc-contrib
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 reworks NativeAOT generic virtual method (GVM) dispatch to use dispatch cells (aligning it more closely with interface dispatch), adds new ReadyToRun sections/nodes to emit GVM dispatch-cell metadata, and updates the JIT/AOT toolchain to consume the new helper + lookup shapes.

Changes:

  • Introduces GVM dispatch-cell sections/metadata in the compiler output and routes GVM lookups through a dispatch-cell-based helper.
  • Refactors “interface dispatch cell” infrastructure into a generalized “dispatch cell” concept used for both interface dispatch and GVM dispatch.
  • Moves parts of dispatch resolution into CoreLib (classlib function table) and adds new per-architecture “resolve” helper entrypoints.

Reviewed changes

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

Show a summary per file
FileDescription
src/coreclr/tools/Common/Internal/Runtime/RuntimeConstants.csIntroduces GvmDispatchCellFlags for encoding async-variant bit in GVM dispatch-cell metadata.
src/coreclr/tools/Common/Internal/Runtime/ModuleHeaders.csAdds new ReadyToRun section types for GVM dispatch-cell regions.
src/coreclr/tools/Common/Internal/Runtime/InterfaceDispatchCellCachePointerFlags.csRemoves unused interface-dispatch cache-pointer flags enum.
src/coreclr/tools/Common/Internal/Runtime/DispatchCell.csAdds shared dispatch-cell structs (including dynamic dispatch-cell layouts).
src/coreclr/tools/Common/Internal/NativeFormat/NativeFormat.csAllocates FixupSignatureKind.GvmDispatchCell.
src/coreclr/tools/Common/Compiler/DependencyAnalysis/SortableDependencyNode.csAdds ordered node kinds for GVM dispatch-cell sections.
src/coreclr/tools/Common/Compiler/DependencyAnalysis/GVMDependenciesNode.csMarks compilation with an analysis characteristic when GVMs are present.
src/coreclr/tools/aot/ILCompiler.RyuJit/JitInterface/CorInfoImpl.RyuJit.csSwitches call-info emission to use dispatch-cell helpers/const lookups for interface+GVM cases.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/JitInterface/CorInfoImpl.ReadyToRun.csUses dispatch-cell symbol node instead of interface-only dispatch cell.
src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRunSymbolNodeFactory.csConsolidates cell cache from interface-only to general dispatch cells.
src/coreclr/tools/aot/ILCompiler.Compiler/ILCompiler.Compiler.csprojAdds new dispatch-cell nodes/sections; removes old interface-dispatch-cell node source.
src/coreclr/tools/aot/ILCompiler.Compiler/IL/ILImporter.Scanner.csUpdates dependency scanning for dispatch-cell-based GVM/interface lookups.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/MetadataManager.csTracks generalized dispatch cells; emits new GVM dispatch-cell sections into the R2R header.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/JitHelper.csMaps GVMLookupForSlot to the new RhpDispatchResolve entrypoint.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_X86/X86ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_X86/X86ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_X64/X64ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_X64/X64ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_RiscV64/RiscV64ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_RiscV64/RiscV64ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_LoongArch64/LoongArch64ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_LoongArch64/LoongArch64ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_ARM64/ARM64ReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_ARM64/ARM64ReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_ARM/ARMReadyToRunHelperNode.csEmits dispatch-cell references for interface dispatch helper.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/Target_ARM/ARMReadyToRunGenericHelperNode.csRoutes generic helper ID from VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/RuntimeMethodHandleNode.csRemoves async-variant encoding from runtime method handle node emission.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/ReadyToRunHelperNode.csRenames helper ID VirtualDispatchCell to DispatchCell.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/ReadyToRunGenericHelperNode.csUpdates generic-lookup signatures/comparisons to use dispatch-cell lookup kind.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.NativeLayout.csAdds native-layout dictionary slot node for GVM dispatch-cell fixup signatures.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.GenericLookups.csGeneralizes “virtual dispatch cell” generic lookup result into “dispatch cell”.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.csGeneralizes dispatch-cell node cache/factory API.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NativeLayoutVertexNode.csAdds NativeLayoutGvmDispatchGenericDictionarySlotNode implementation.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/InterfaceDispatchCellInfoSectionNode.csUpdates section emission to operate on generalized dispatch cells (filters out GVM instantiations).
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GvmDispatchCellInfoSectionNode.csAdds new section emitting GVM dispatch-cell info (token+flags+instantiation).
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/GenericLookupResult.csRenames/expands dispatch-cell lookup result to support interface and GVM.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/DispatchCellSectionNode.csSplits dispatch-cell BSS into interface vs GVM sections via filtering.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/DispatchCellNode.csGeneralizes interface dispatch cell node into a dispatch cell node.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DelegateCreationInfo.csSwitches delegate creation for GVM/interface targets to dispatch-cell-based lookup.
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/Compilation.csUpdates runtime-lookup decision for the new dispatch-cell helper ID.
src/coreclr/nativeaot/Test.CoreLib/src/Test.CoreLib.csprojLinks in shared dispatch-cell type(s) and adds a ResolveDispatch export stub.
src/coreclr/nativeaot/Test.CoreLib/src/Internal/Runtime/Dispatch.csAdds Test.CoreLib ResolveDispatch export (currently stubbed).
src/coreclr/nativeaot/System.Private.TypeLoader/src/System.Private.TypeLoader.csprojAdds AnalysisCharacteristicAttribute compilation input.
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.Metadata.csUpdates GVM token handle construction call signature.
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.LdTokenResultLookup.csRemoves async-variant handling from runtime-method-handle ldtoken cache machinery.
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.GVMResolution.csReworks GVM resolution input shape (declaring type + handle + instantiation list + async flag).
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/TypeLoaderEnvironment.csAdds GenericVirtualMethodsPresent analysis characteristic gate and new callback signature.
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/GenericDictionaryCell.csAllocates dynamic dispatch-cell layouts for interface cells and new GVM dispatch cells.
src/coreclr/nativeaot/System.Private.CoreLib/src/System/RuntimeMethodHandle.csRemoves async-variant flag from handle layout; adds helper to resolve GVM targets via callbacks.
src/coreclr/nativeaot/System.Private.CoreLib/src/System/Runtime/TypeLoaderExports.csRemoves old GVMLookupForSlot cache-based implementation.
src/coreclr/nativeaot/System.Private.CoreLib/src/System/Delegate.csUpdates GVM delegate initialization to go through dispatch-cell-based resolution.
src/coreclr/nativeaot/System.Private.CoreLib/src/System.Private.CoreLib.csprojLinks dispatch-cell types and adds CoreLib ResolveDispatch implementation source.
src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/Dispatch.csImplements ResolveDispatch and static/dynamic dispatch-cell resolution.
src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/CompilerServices/OpenMethodResolver.csUpdates open-method resolver to resolve GVM targets via the new handle helper.
src/coreclr/nativeaot/System.Private.CoreLib/src/Internal/Runtime/Augments/TypeLoaderCallbacks.csChanges callback signature for resolving GVM targets (more explicit components).
src/coreclr/nativeaot/System.Private.CoreLib/src/CompatibilitySuppressions.xmlAdds compat suppressions for new public dispatch-cell types.
src/coreclr/nativeaot/Runtime/riscv64/DispatchResolve.SAdds RhpDispatchResolve entrypoint (returns target rather than dispatching).
src/coreclr/nativeaot/Runtime/loongarch64/DispatchResolve.SAdds RhpDispatchResolve entrypoint (returns target rather than dispatching).
src/coreclr/nativeaot/Runtime/i386/DispatchResolve.asmAdds x86 RhpDispatchResolve (cache probe + fallback to worker).
src/coreclr/nativeaot/Runtime/EHHelpers.cppTeaches EH helper classification about RhpDispatchResolve AV locations/addresses.
src/coreclr/nativeaot/Runtime/arm64/DispatchResolve.SFactors common macro + adds RhpDispatchResolve variant (returning target).
src/coreclr/nativeaot/Runtime/arm64/DispatchResolve.asmAdds RhpDispatchResolve variant and calls RhpCidResolve_Worker for return-only slow path.
src/coreclr/nativeaot/Runtime/arm/DispatchResolve.SAdds ARM32 RhpDispatchResolve with a barrier before reading cached code.
src/coreclr/nativeaot/Runtime/amd64/DispatchResolve.SAdds RhpDispatchResolve macro variant (returning target).
src/coreclr/nativeaot/Runtime/amd64/DispatchResolve.asmAdds RhpDispatchResolve macro variant and optimized slow path.
src/coreclr/nativeaot/Runtime.Base/src/System/Runtime/InternalCalls.csAdds ClassLibFunctionId.ResolveDispatch entry.
src/coreclr/nativeaot/Runtime.Base/src/System/Runtime/CachedInterfaceDispatch.csRoutes cache misses to classlib ResolveDispatch and exports RhpCidResolve_Worker.
src/coreclr/nativeaot/Bootstrap/main.cppExposes ResolveDispatch in the classlib function table.
src/coreclr/jit/importer.cppSwitches NativeAOT GVM ldvirtftn import to pass dispatch cell instead of runtime method handle.
src/coreclr/inc/corinfo.hUpdates helper comment to document dispatch-cell argument for GVM lookup helper.

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
Comment threadsrc/coreclr/nativeaot/Runtime/riscv64/DispatchResolve.S Outdated
Comment threadsrc/coreclr/nativeaot/Runtime/loongarch64/DispatchResolve.S Outdated
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@github-actionsgithub-actionsBot mentioned this pull request Jun 19, 2026
CopilotAI review requested due to automatic review settings June 24, 2026 04: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 70 out of 70 changed files in this pull request and generated 4 comments.

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

CopilotAI review requested due to automatic review settings July 2, 2026 03:30
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

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

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings July 8, 2026 03:14
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

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

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
Comment threadsrc/coreclr/nativeaot/Runtime/EHHelpers.cpp
CopilotAI review requested due to automatic review settings July 10, 2026 05:00

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

Comment threadsrc/coreclr/tools/Common/Internal/Runtime/DispatchCell.cs
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

/azp run runtime-nativeaot-outerloop

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines successfully started running 1 pipeline(s).

@jakobbotschjakobbotsch left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

The JIT change LGTM

Comment threadsrc/coreclr/nativeaot/Runtime/arm64/DispatchResolve.S
@MichalStrehovsky

Copy link
Copy Markdown
MemberAuthor

Thank you! I'll address the cleanups in a followup since it would reset the signoff and it would be preferable this makes it into Preview 7.

@MichalStrehovsky
MichalStrehovsky enabled auto-merge (squash) July 15, 2026 04:48
@MichalStrehovsky
MichalStrehovsky merged commit f417473 into dotnet:mainJul 15, 2026
159 of 161 checks passed
@MichalStrehovsky
MichalStrehovsky deleted the gvmdispatch branch July 15, 2026 04:49
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview7 milestone Jul 15, 2026
MichalStrehovsky added a commit that referenced this pull request Jul 21, 2026
`Delegate.Method` needs to work since it's not a trim-unsafe API.
I thought I maybe broke this in #129609, but the added test doesn't work
in .NET 10 either, so I only broke a small aspect of this (GVMs were
implicitly considered targets of reflection because of the
`RuntimeMethodHandle` used as implementation detail).
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Aug 15, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@MichalStrehovsky@sbomer@jakobbotsch