Add support for encoding Continuation types with specific layouts in ReadyToRun - #123643

Merged
jtschuster merged 36 commits into
dotnet:mainfrom
jtschuster:ContinuationTypeFixup
Feb 6, 2026
Merged

Add support for encoding Continuation types with specific layouts in ReadyToRun#123643
jtschuster merged 36 commits into
dotnet:mainfrom
jtschuster:ContinuationTypeFixup

Conversation

@jtschuster

@jtschusterjtschuster commented Jan 26, 2026

Copy link
Copy Markdown
Member

Encode Continuation types in R2R images using a new fixup kind (READYTORUN_FIXUP_Continuation_Layout = 0x37):

Encode the GC ref map as a bit vector expanded to a byte array
Add runtime support to read continuation type fixups from R2R images:

GetContinuationTypeFromLayout decodes the blob and creates the type
LoadDynamicInfoEntry handles the new fixup kind

Note: These code paths are not yet exercised as async2 methods are not currently compiled to ReadyToRun images.

jtschusterand others added 28 commits December 18, 2025 10:03
The generated IL thunk does not have valid tokens, so the tokens emitted in the EH handler info are invalid. It's not an invariant that there is always a reference to System.Exception or System.Object in the assembly that we are generating thunks for, so we can't always get a valid Token for the exception type token field. Instead, we can create a filter that does a type check against System.Exception. The reference to System.Exception will be filled in with a Fixup with a module override if we don't have a reference to System.Exception in the assembly.
With these changes, we no longer need separate IL for nativeaot and readytorun
* Rework async thunks generation to cross module generics infra
- Add ability for code generating an ILStub to mark that the tokens might be generated
- Funnel through various details to ensure that we trigger creation of the ManifestModuleWrappedMethodIL as needed
- Adjust method fixup signature generation to allow for VersionsWithMethodBody code which is in the MutableModule
- Add a few todos about work we might do to allow cross module compilation of runtime async code.
- Disable this for now though, since its much to complex to test without a working end-to-end scenario (See code in CrossModuleInlineableUncached
* Revert logic which attempts to treat System.Exception in EH clause specially
…foImpl.ReadyToRun.cs
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
- Clear ClassTokenOrOffset when setting R2R_SYSTEM_EXCEPTION flag
- Add COR_ILEXCEPTION_CLAUSE_R2R_SYSTEM_EXCEPTION to R2R dumper
Encode Continuation types in R2R images using a new fixup kind
(READYTORUN_FIXUP_Continuation_Layout = 0x37):
- Include OwningMethod to associate the Continuation type with the
correct loader allocator at runtime
- Encode the GC ref map as a bit vector expanded to a byte array
- Add AsyncContinuationLayoutAlgorithm for field layout computation
Add runtime support to read continuation type fixups from R2R images:
- GetContinuationTypeFromLayout decodes the blob and creates the type
- LoadDynamicInfoEntry handles the new fixup kind
Also adds helper constants for future continuation allocation helpers.
Note: These code paths are not yet exercised as async2 methods are
not currently compiled to ReadyToRun images.
…g unneeded method parameters and simplifying type resolution logic.
Comment threadsrc/coreclr/vm/jitinterface.cpp Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/CompilerTypeSystemContext.Async.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/AsyncContinuationType.cs Outdated
Make getContinuationType static
Move _validType.TryAdd to CreateValueFromKey
Remove unnecessary using
Comment threadsrc/coreclr/tools/Common/Internal/Runtime/ReadyToRunConstants.cs Outdated

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

Other than the bits of PR #123975 to remove from this change, I think this is good.

CopilotAI review requested due to automatic review settings February 4, 2026 00:15

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

Comment threadsrc/coreclr/vm/jitinterface.cpp Outdated
CopilotAI review requested due to automatic review settings February 4, 2026 18:22

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

Comment threadsrc/coreclr/vm/jitinterface.cpp Outdated
@jtschuster
jtschuster merged commit a528763 into dotnet:mainFeb 6, 2026
98 of 101 checks passed
lewing pushed a commit to lewing/runtime that referenced this pull request Feb 9, 2026
…ReadyToRun (dotnet#123643)
Enable encoding and decoding of async continuation type layouts in ReadyToRun images, allowing the R2R compiler to emit continuation types that were previously only supported at JIT time.
## Crossgen2 (compile-time) changes
- **New fixup kind `ContinuationLayout = 0x37`**: Added to `ReadyToRunFixupKind` in both native (`readytorun.h`) and managed (`ReadyToRunConstants.cs`) headers to represent the layout of an async method continuation type.
- **Remove `NotImplementedException` for `getContinuationType` in R2R**: The `#if READYTORUN` guard that blocked `getContinuationType` is removed from `CorInfoImpl.cs`, enabling continuation type creation during R2R compilation.
- **Initialize `_continuationTypeHashtable` in R2R compiler context**: The hashtable is now constructed in the `CompilerTypeSystemContext` R2R partial constructor so continuation types can be created and cached.
- **Short-circuit loadability checks for continuation types**: Newly created `AsyncContinuationType` instances are added to `_validTypes` in the `ContinuationTypeHashtable` to bypass loadability verification, since these types are always valid by construction.
- **Intercept `AsyncContinuationType` in `embedClassHandle`**: In `CorInfoImpl.ReadyToRun.cs`, when embedding a class handle for an `AsyncContinuationType`, emit a `PrecodeHelperImport` with the new `ContinuationLayout` fixup instead of attempting the normal type handle encoding path.
- **`ContinuationTypeSymbol` and `NodeCache` in `ReadyToRunSymbolNodeFactory`**: Adds a node cache and public accessor to create `PrecodeHelperImport` nodes for continuation type fixups.
- **Guard against encoding continuations on the normal type signature path**: `SignatureBuilder.EmitTypeSignature` now throws `InvalidOperationException` if it encounters an `AsyncContinuationType`, since these must go through the dedicated `ContinuationLayout` fixup path.
- **`EncodeContinuationTypeLayout` in `TypeFixupSignature`**: Encodes the continuation's GC pointer map as a bit vector packed into a byte array, along with size and alignment flags. The `ContinuationLayout` fixup emits the base `Continuation` EcmaType followed by this layout blob.
## Runtime (load-time) changes
- **`GetContinuationTypeFromLayout` in `jitinterface.cpp`**: Decodes the continuation layout blob from the R2R image — reads flags, size, and GC ref map bitmap — expands the bitmap back to a `bool` array, and calls into the continuation type creation infrastructure.
- **`LoadDynamicInfoEntry` handles `READYTORUN_FIXUP_Continuation_Layout`**: Calls `GetContinuationTypeFromLayout` to materialize the continuation `MethodTable` at runtime when the fixup is resolved.
- **Refactor `LookupOrCreateContinuationMethodTable` to accept `Module*` instead of `MethodDesc*`**: The `MethodDesc*`-taking overload of `CreateNewContinuationMethodTable` is removed and its debug naming logic is inlined into `LookupOrCreateContinuationMethodTable`, which now takes a `Module* loaderModule` directly. This enables creation of continuation types from R2R fixup decoding where no `MethodDesc` is available. A corresponding static `getContinuationType` helper is extracted from `CEEInfo::getContinuationType` for reuse by `GetContinuationTypeFromLayout`.
## Diagnostic / tooling changes
- **`ReadyToRunSignature.cs` refactoring**: The inline type layout parsing logic for `Check_TypeLayout`/`Verify_TypeLayout` is extracted into a shared `ParseTypeLayout` method, which is also reused for the new `ContinuationLayout` fixup kind. Adds display of `" Align native"` and `" GCLayout 0x00 (Empty)"` for improved diagnostic output.
> **Note:** These code paths are not yet exercised end-to-end, as async2 methods are not currently compiled into ReadyToRun images.
Co-authored-by: David Wrighton <davidwr@microsoft.com>
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
iremyux pushed a commit to iremyux/dotnet-runtime that referenced this pull request Mar 2, 2026
…ReadyToRun (dotnet#123643)
Enable encoding and decoding of async continuation type layouts in ReadyToRun images, allowing the R2R compiler to emit continuation types that were previously only supported at JIT time.
## Crossgen2 (compile-time) changes
- **New fixup kind `ContinuationLayout = 0x37`**: Added to `ReadyToRunFixupKind` in both native (`readytorun.h`) and managed (`ReadyToRunConstants.cs`) headers to represent the layout of an async method continuation type.
- **Remove `NotImplementedException` for `getContinuationType` in R2R**: The `#if READYTORUN` guard that blocked `getContinuationType` is removed from `CorInfoImpl.cs`, enabling continuation type creation during R2R compilation.
- **Initialize `_continuationTypeHashtable` in R2R compiler context**: The hashtable is now constructed in the `CompilerTypeSystemContext` R2R partial constructor so continuation types can be created and cached.
- **Short-circuit loadability checks for continuation types**: Newly created `AsyncContinuationType` instances are added to `_validTypes` in the `ContinuationTypeHashtable` to bypass loadability verification, since these types are always valid by construction.
- **Intercept `AsyncContinuationType` in `embedClassHandle`**: In `CorInfoImpl.ReadyToRun.cs`, when embedding a class handle for an `AsyncContinuationType`, emit a `PrecodeHelperImport` with the new `ContinuationLayout` fixup instead of attempting the normal type handle encoding path.
- **`ContinuationTypeSymbol` and `NodeCache` in `ReadyToRunSymbolNodeFactory`**: Adds a node cache and public accessor to create `PrecodeHelperImport` nodes for continuation type fixups.
- **Guard against encoding continuations on the normal type signature path**: `SignatureBuilder.EmitTypeSignature` now throws `InvalidOperationException` if it encounters an `AsyncContinuationType`, since these must go through the dedicated `ContinuationLayout` fixup path.
- **`EncodeContinuationTypeLayout` in `TypeFixupSignature`**: Encodes the continuation's GC pointer map as a bit vector packed into a byte array, along with size and alignment flags. The `ContinuationLayout` fixup emits the base `Continuation` EcmaType followed by this layout blob.
## Runtime (load-time) changes
- **`GetContinuationTypeFromLayout` in `jitinterface.cpp`**: Decodes the continuation layout blob from the R2R image — reads flags, size, and GC ref map bitmap — expands the bitmap back to a `bool` array, and calls into the continuation type creation infrastructure.
- **`LoadDynamicInfoEntry` handles `READYTORUN_FIXUP_Continuation_Layout`**: Calls `GetContinuationTypeFromLayout` to materialize the continuation `MethodTable` at runtime when the fixup is resolved.
- **Refactor `LookupOrCreateContinuationMethodTable` to accept `Module*` instead of `MethodDesc*`**: The `MethodDesc*`-taking overload of `CreateNewContinuationMethodTable` is removed and its debug naming logic is inlined into `LookupOrCreateContinuationMethodTable`, which now takes a `Module* loaderModule` directly. This enables creation of continuation types from R2R fixup decoding where no `MethodDesc` is available. A corresponding static `getContinuationType` helper is extracted from `CEEInfo::getContinuationType` for reuse by `GetContinuationTypeFromLayout`.
## Diagnostic / tooling changes
- **`ReadyToRunSignature.cs` refactoring**: The inline type layout parsing logic for `Check_TypeLayout`/`Verify_TypeLayout` is extracted into a shared `ParseTypeLayout` method, which is also reused for the new `ContinuationLayout` fixup kind. Adds display of `" Align native"` and `" GCLayout 0x00 (Empty)"` for improved diagnostic output.
> **Note:** These code paths are not yet exercised end-to-end, as async2 methods are not currently compiled into ReadyToRun images.
Co-authored-by: David Wrighton <davidwr@microsoft.com>
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Mar 9, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

6 participants

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

Add support for encoding Continuation types with specific layouts in ReadyToRun - #123643

Merged
jtschuster merged 36 commits into
dotnet:mainfrom
jtschuster:ContinuationTypeFixup
Feb 6, 2026
Merged

Add support for encoding Continuation types with specific layouts in ReadyToRun#123643
jtschuster merged 36 commits into
dotnet:mainfrom
jtschuster:ContinuationTypeFixup

Conversation

@jtschuster

@jtschusterjtschuster commented Jan 26, 2026

Copy link
Copy Markdown
Member

Encode Continuation types in R2R images using a new fixup kind (READYTORUN_FIXUP_Continuation_Layout = 0x37):

Encode the GC ref map as a bit vector expanded to a byte array
Add runtime support to read continuation type fixups from R2R images:

GetContinuationTypeFromLayout decodes the blob and creates the type
LoadDynamicInfoEntry handles the new fixup kind

Note: These code paths are not yet exercised as async2 methods are not currently compiled to ReadyToRun images.

jtschusterand others added 28 commits December 18, 2025 10:03
The generated IL thunk does not have valid tokens, so the tokens emitted in the EH handler info are invalid. It's not an invariant that there is always a reference to System.Exception or System.Object in the assembly that we are generating thunks for, so we can't always get a valid Token for the exception type token field. Instead, we can create a filter that does a type check against System.Exception. The reference to System.Exception will be filled in with a Fixup with a module override if we don't have a reference to System.Exception in the assembly.
With these changes, we no longer need separate IL for nativeaot and readytorun
* Rework async thunks generation to cross module generics infra
- Add ability for code generating an ILStub to mark that the tokens might be generated
- Funnel through various details to ensure that we trigger creation of the ManifestModuleWrappedMethodIL as needed
- Adjust method fixup signature generation to allow for VersionsWithMethodBody code which is in the MutableModule
- Add a few todos about work we might do to allow cross module compilation of runtime async code.
- Disable this for now though, since its much to complex to test without a working end-to-end scenario (See code in CrossModuleInlineableUncached
* Revert logic which attempts to treat System.Exception in EH clause specially
…foImpl.ReadyToRun.cs
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
- Clear ClassTokenOrOffset when setting R2R_SYSTEM_EXCEPTION flag
- Add COR_ILEXCEPTION_CLAUSE_R2R_SYSTEM_EXCEPTION to R2R dumper
Encode Continuation types in R2R images using a new fixup kind
(READYTORUN_FIXUP_Continuation_Layout = 0x37):
- Include OwningMethod to associate the Continuation type with the
correct loader allocator at runtime
- Encode the GC ref map as a bit vector expanded to a byte array
- Add AsyncContinuationLayoutAlgorithm for field layout computation
Add runtime support to read continuation type fixups from R2R images:
- GetContinuationTypeFromLayout decodes the blob and creates the type
- LoadDynamicInfoEntry handles the new fixup kind
Also adds helper constants for future continuation allocation helpers.
Note: These code paths are not yet exercised as async2 methods are
not currently compiled to ReadyToRun images.
…g unneeded method parameters and simplifying type resolution logic.
Comment threadsrc/coreclr/vm/jitinterface.cpp Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/CompilerTypeSystemContext.Async.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/AsyncContinuationType.cs Outdated
Make getContinuationType static
Move _validType.TryAdd to CreateValueFromKey
Remove unnecessary using
Comment threadsrc/coreclr/tools/Common/Internal/Runtime/ReadyToRunConstants.cs Outdated

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

Other than the bits of PR #123975 to remove from this change, I think this is good.

CopilotAI review requested due to automatic review settings February 4, 2026 00:15

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

Comment threadsrc/coreclr/vm/jitinterface.cpp Outdated
CopilotAI review requested due to automatic review settings February 4, 2026 18:22

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

Comment threadsrc/coreclr/vm/jitinterface.cpp Outdated
@jtschuster
jtschuster merged commit a528763 into dotnet:mainFeb 6, 2026
98 of 101 checks passed
lewing pushed a commit to lewing/runtime that referenced this pull request Feb 9, 2026
…ReadyToRun (dotnet#123643)
Enable encoding and decoding of async continuation type layouts in ReadyToRun images, allowing the R2R compiler to emit continuation types that were previously only supported at JIT time.
## Crossgen2 (compile-time) changes
- **New fixup kind `ContinuationLayout = 0x37`**: Added to `ReadyToRunFixupKind` in both native (`readytorun.h`) and managed (`ReadyToRunConstants.cs`) headers to represent the layout of an async method continuation type.
- **Remove `NotImplementedException` for `getContinuationType` in R2R**: The `#if READYTORUN` guard that blocked `getContinuationType` is removed from `CorInfoImpl.cs`, enabling continuation type creation during R2R compilation.
- **Initialize `_continuationTypeHashtable` in R2R compiler context**: The hashtable is now constructed in the `CompilerTypeSystemContext` R2R partial constructor so continuation types can be created and cached.
- **Short-circuit loadability checks for continuation types**: Newly created `AsyncContinuationType` instances are added to `_validTypes` in the `ContinuationTypeHashtable` to bypass loadability verification, since these types are always valid by construction.
- **Intercept `AsyncContinuationType` in `embedClassHandle`**: In `CorInfoImpl.ReadyToRun.cs`, when embedding a class handle for an `AsyncContinuationType`, emit a `PrecodeHelperImport` with the new `ContinuationLayout` fixup instead of attempting the normal type handle encoding path.
- **`ContinuationTypeSymbol` and `NodeCache` in `ReadyToRunSymbolNodeFactory`**: Adds a node cache and public accessor to create `PrecodeHelperImport` nodes for continuation type fixups.
- **Guard against encoding continuations on the normal type signature path**: `SignatureBuilder.EmitTypeSignature` now throws `InvalidOperationException` if it encounters an `AsyncContinuationType`, since these must go through the dedicated `ContinuationLayout` fixup path.
- **`EncodeContinuationTypeLayout` in `TypeFixupSignature`**: Encodes the continuation's GC pointer map as a bit vector packed into a byte array, along with size and alignment flags. The `ContinuationLayout` fixup emits the base `Continuation` EcmaType followed by this layout blob.
## Runtime (load-time) changes
- **`GetContinuationTypeFromLayout` in `jitinterface.cpp`**: Decodes the continuation layout blob from the R2R image — reads flags, size, and GC ref map bitmap — expands the bitmap back to a `bool` array, and calls into the continuation type creation infrastructure.
- **`LoadDynamicInfoEntry` handles `READYTORUN_FIXUP_Continuation_Layout`**: Calls `GetContinuationTypeFromLayout` to materialize the continuation `MethodTable` at runtime when the fixup is resolved.
- **Refactor `LookupOrCreateContinuationMethodTable` to accept `Module*` instead of `MethodDesc*`**: The `MethodDesc*`-taking overload of `CreateNewContinuationMethodTable` is removed and its debug naming logic is inlined into `LookupOrCreateContinuationMethodTable`, which now takes a `Module* loaderModule` directly. This enables creation of continuation types from R2R fixup decoding where no `MethodDesc` is available. A corresponding static `getContinuationType` helper is extracted from `CEEInfo::getContinuationType` for reuse by `GetContinuationTypeFromLayout`.
## Diagnostic / tooling changes
- **`ReadyToRunSignature.cs` refactoring**: The inline type layout parsing logic for `Check_TypeLayout`/`Verify_TypeLayout` is extracted into a shared `ParseTypeLayout` method, which is also reused for the new `ContinuationLayout` fixup kind. Adds display of `" Align native"` and `" GCLayout 0x00 (Empty)"` for improved diagnostic output.
> **Note:** These code paths are not yet exercised end-to-end, as async2 methods are not currently compiled into ReadyToRun images.
Co-authored-by: David Wrighton <davidwr@microsoft.com>
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
iremyux pushed a commit to iremyux/dotnet-runtime that referenced this pull request Mar 2, 2026
…ReadyToRun (dotnet#123643)
Enable encoding and decoding of async continuation type layouts in ReadyToRun images, allowing the R2R compiler to emit continuation types that were previously only supported at JIT time.
## Crossgen2 (compile-time) changes
- **New fixup kind `ContinuationLayout = 0x37`**: Added to `ReadyToRunFixupKind` in both native (`readytorun.h`) and managed (`ReadyToRunConstants.cs`) headers to represent the layout of an async method continuation type.
- **Remove `NotImplementedException` for `getContinuationType` in R2R**: The `#if READYTORUN` guard that blocked `getContinuationType` is removed from `CorInfoImpl.cs`, enabling continuation type creation during R2R compilation.
- **Initialize `_continuationTypeHashtable` in R2R compiler context**: The hashtable is now constructed in the `CompilerTypeSystemContext` R2R partial constructor so continuation types can be created and cached.
- **Short-circuit loadability checks for continuation types**: Newly created `AsyncContinuationType` instances are added to `_validTypes` in the `ContinuationTypeHashtable` to bypass loadability verification, since these types are always valid by construction.
- **Intercept `AsyncContinuationType` in `embedClassHandle`**: In `CorInfoImpl.ReadyToRun.cs`, when embedding a class handle for an `AsyncContinuationType`, emit a `PrecodeHelperImport` with the new `ContinuationLayout` fixup instead of attempting the normal type handle encoding path.
- **`ContinuationTypeSymbol` and `NodeCache` in `ReadyToRunSymbolNodeFactory`**: Adds a node cache and public accessor to create `PrecodeHelperImport` nodes for continuation type fixups.
- **Guard against encoding continuations on the normal type signature path**: `SignatureBuilder.EmitTypeSignature` now throws `InvalidOperationException` if it encounters an `AsyncContinuationType`, since these must go through the dedicated `ContinuationLayout` fixup path.
- **`EncodeContinuationTypeLayout` in `TypeFixupSignature`**: Encodes the continuation's GC pointer map as a bit vector packed into a byte array, along with size and alignment flags. The `ContinuationLayout` fixup emits the base `Continuation` EcmaType followed by this layout blob.
## Runtime (load-time) changes
- **`GetContinuationTypeFromLayout` in `jitinterface.cpp`**: Decodes the continuation layout blob from the R2R image — reads flags, size, and GC ref map bitmap — expands the bitmap back to a `bool` array, and calls into the continuation type creation infrastructure.
- **`LoadDynamicInfoEntry` handles `READYTORUN_FIXUP_Continuation_Layout`**: Calls `GetContinuationTypeFromLayout` to materialize the continuation `MethodTable` at runtime when the fixup is resolved.
- **Refactor `LookupOrCreateContinuationMethodTable` to accept `Module*` instead of `MethodDesc*`**: The `MethodDesc*`-taking overload of `CreateNewContinuationMethodTable` is removed and its debug naming logic is inlined into `LookupOrCreateContinuationMethodTable`, which now takes a `Module* loaderModule` directly. This enables creation of continuation types from R2R fixup decoding where no `MethodDesc` is available. A corresponding static `getContinuationType` helper is extracted from `CEEInfo::getContinuationType` for reuse by `GetContinuationTypeFromLayout`.
## Diagnostic / tooling changes
- **`ReadyToRunSignature.cs` refactoring**: The inline type layout parsing logic for `Check_TypeLayout`/`Verify_TypeLayout` is extracted into a shared `ParseTypeLayout` method, which is also reused for the new `ContinuationLayout` fixup kind. Adds display of `" Align native"` and `" GCLayout 0x00 (Empty)"` for improved diagnostic output.
> **Note:** These code paths are not yet exercised end-to-end, as async2 methods are not currently compiled into ReadyToRun images.
Co-authored-by: David Wrighton <davidwr@microsoft.com>
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Mar 9, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

6 participants

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

Add support for encoding Continuation types with specific layouts in ReadyToRun - #123643

Merged
jtschuster merged 36 commits into
dotnet:mainfrom
jtschuster:ContinuationTypeFixup
Feb 6, 2026
Merged

Add support for encoding Continuation types with specific layouts in ReadyToRun#123643
jtschuster merged 36 commits into
dotnet:mainfrom
jtschuster:ContinuationTypeFixup

Conversation

@jtschuster

@jtschusterjtschuster commented Jan 26, 2026

Copy link
Copy Markdown
Member

Encode Continuation types in R2R images using a new fixup kind (READYTORUN_FIXUP_Continuation_Layout = 0x37):

Encode the GC ref map as a bit vector expanded to a byte array
Add runtime support to read continuation type fixups from R2R images:

GetContinuationTypeFromLayout decodes the blob and creates the type
LoadDynamicInfoEntry handles the new fixup kind

Note: These code paths are not yet exercised as async2 methods are not currently compiled to ReadyToRun images.

jtschusterand others added 28 commits December 18, 2025 10:03
The generated IL thunk does not have valid tokens, so the tokens emitted in the EH handler info are invalid. It's not an invariant that there is always a reference to System.Exception or System.Object in the assembly that we are generating thunks for, so we can't always get a valid Token for the exception type token field. Instead, we can create a filter that does a type check against System.Exception. The reference to System.Exception will be filled in with a Fixup with a module override if we don't have a reference to System.Exception in the assembly.
With these changes, we no longer need separate IL for nativeaot and readytorun
* Rework async thunks generation to cross module generics infra
- Add ability for code generating an ILStub to mark that the tokens might be generated
- Funnel through various details to ensure that we trigger creation of the ManifestModuleWrappedMethodIL as needed
- Adjust method fixup signature generation to allow for VersionsWithMethodBody code which is in the MutableModule
- Add a few todos about work we might do to allow cross module compilation of runtime async code.
- Disable this for now though, since its much to complex to test without a working end-to-end scenario (See code in CrossModuleInlineableUncached
* Revert logic which attempts to treat System.Exception in EH clause specially
…foImpl.ReadyToRun.cs
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
- Clear ClassTokenOrOffset when setting R2R_SYSTEM_EXCEPTION flag
- Add COR_ILEXCEPTION_CLAUSE_R2R_SYSTEM_EXCEPTION to R2R dumper
Encode Continuation types in R2R images using a new fixup kind
(READYTORUN_FIXUP_Continuation_Layout = 0x37):
- Include OwningMethod to associate the Continuation type with the
correct loader allocator at runtime
- Encode the GC ref map as a bit vector expanded to a byte array
- Add AsyncContinuationLayoutAlgorithm for field layout computation
Add runtime support to read continuation type fixups from R2R images:
- GetContinuationTypeFromLayout decodes the blob and creates the type
- LoadDynamicInfoEntry handles the new fixup kind
Also adds helper constants for future continuation allocation helpers.
Note: These code paths are not yet exercised as async2 methods are
not currently compiled to ReadyToRun images.
…g unneeded method parameters and simplifying type resolution logic.
Comment threadsrc/coreclr/vm/jitinterface.cpp Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/CompilerTypeSystemContext.Async.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/AsyncContinuationType.cs Outdated
Make getContinuationType static
Move _validType.TryAdd to CreateValueFromKey
Remove unnecessary using
Comment threadsrc/coreclr/tools/Common/Internal/Runtime/ReadyToRunConstants.cs Outdated

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

Other than the bits of PR #123975 to remove from this change, I think this is good.

CopilotAI review requested due to automatic review settings February 4, 2026 00:15

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

Comment threadsrc/coreclr/vm/jitinterface.cpp Outdated
CopilotAI review requested due to automatic review settings February 4, 2026 18:22

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

Comment threadsrc/coreclr/vm/jitinterface.cpp Outdated
@jtschuster
jtschuster merged commit a528763 into dotnet:mainFeb 6, 2026
98 of 101 checks passed
lewing pushed a commit to lewing/runtime that referenced this pull request Feb 9, 2026
…ReadyToRun (dotnet#123643)
Enable encoding and decoding of async continuation type layouts in ReadyToRun images, allowing the R2R compiler to emit continuation types that were previously only supported at JIT time.
## Crossgen2 (compile-time) changes
- **New fixup kind `ContinuationLayout = 0x37`**: Added to `ReadyToRunFixupKind` in both native (`readytorun.h`) and managed (`ReadyToRunConstants.cs`) headers to represent the layout of an async method continuation type.
- **Remove `NotImplementedException` for `getContinuationType` in R2R**: The `#if READYTORUN` guard that blocked `getContinuationType` is removed from `CorInfoImpl.cs`, enabling continuation type creation during R2R compilation.
- **Initialize `_continuationTypeHashtable` in R2R compiler context**: The hashtable is now constructed in the `CompilerTypeSystemContext` R2R partial constructor so continuation types can be created and cached.
- **Short-circuit loadability checks for continuation types**: Newly created `AsyncContinuationType` instances are added to `_validTypes` in the `ContinuationTypeHashtable` to bypass loadability verification, since these types are always valid by construction.
- **Intercept `AsyncContinuationType` in `embedClassHandle`**: In `CorInfoImpl.ReadyToRun.cs`, when embedding a class handle for an `AsyncContinuationType`, emit a `PrecodeHelperImport` with the new `ContinuationLayout` fixup instead of attempting the normal type handle encoding path.
- **`ContinuationTypeSymbol` and `NodeCache` in `ReadyToRunSymbolNodeFactory`**: Adds a node cache and public accessor to create `PrecodeHelperImport` nodes for continuation type fixups.
- **Guard against encoding continuations on the normal type signature path**: `SignatureBuilder.EmitTypeSignature` now throws `InvalidOperationException` if it encounters an `AsyncContinuationType`, since these must go through the dedicated `ContinuationLayout` fixup path.
- **`EncodeContinuationTypeLayout` in `TypeFixupSignature`**: Encodes the continuation's GC pointer map as a bit vector packed into a byte array, along with size and alignment flags. The `ContinuationLayout` fixup emits the base `Continuation` EcmaType followed by this layout blob.
## Runtime (load-time) changes
- **`GetContinuationTypeFromLayout` in `jitinterface.cpp`**: Decodes the continuation layout blob from the R2R image — reads flags, size, and GC ref map bitmap — expands the bitmap back to a `bool` array, and calls into the continuation type creation infrastructure.
- **`LoadDynamicInfoEntry` handles `READYTORUN_FIXUP_Continuation_Layout`**: Calls `GetContinuationTypeFromLayout` to materialize the continuation `MethodTable` at runtime when the fixup is resolved.
- **Refactor `LookupOrCreateContinuationMethodTable` to accept `Module*` instead of `MethodDesc*`**: The `MethodDesc*`-taking overload of `CreateNewContinuationMethodTable` is removed and its debug naming logic is inlined into `LookupOrCreateContinuationMethodTable`, which now takes a `Module* loaderModule` directly. This enables creation of continuation types from R2R fixup decoding where no `MethodDesc` is available. A corresponding static `getContinuationType` helper is extracted from `CEEInfo::getContinuationType` for reuse by `GetContinuationTypeFromLayout`.
## Diagnostic / tooling changes
- **`ReadyToRunSignature.cs` refactoring**: The inline type layout parsing logic for `Check_TypeLayout`/`Verify_TypeLayout` is extracted into a shared `ParseTypeLayout` method, which is also reused for the new `ContinuationLayout` fixup kind. Adds display of `" Align native"` and `" GCLayout 0x00 (Empty)"` for improved diagnostic output.
> **Note:** These code paths are not yet exercised end-to-end, as async2 methods are not currently compiled into ReadyToRun images.
Co-authored-by: David Wrighton <davidwr@microsoft.com>
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
iremyux pushed a commit to iremyux/dotnet-runtime that referenced this pull request Mar 2, 2026
…ReadyToRun (dotnet#123643)
Enable encoding and decoding of async continuation type layouts in ReadyToRun images, allowing the R2R compiler to emit continuation types that were previously only supported at JIT time.
## Crossgen2 (compile-time) changes
- **New fixup kind `ContinuationLayout = 0x37`**: Added to `ReadyToRunFixupKind` in both native (`readytorun.h`) and managed (`ReadyToRunConstants.cs`) headers to represent the layout of an async method continuation type.
- **Remove `NotImplementedException` for `getContinuationType` in R2R**: The `#if READYTORUN` guard that blocked `getContinuationType` is removed from `CorInfoImpl.cs`, enabling continuation type creation during R2R compilation.
- **Initialize `_continuationTypeHashtable` in R2R compiler context**: The hashtable is now constructed in the `CompilerTypeSystemContext` R2R partial constructor so continuation types can be created and cached.
- **Short-circuit loadability checks for continuation types**: Newly created `AsyncContinuationType` instances are added to `_validTypes` in the `ContinuationTypeHashtable` to bypass loadability verification, since these types are always valid by construction.
- **Intercept `AsyncContinuationType` in `embedClassHandle`**: In `CorInfoImpl.ReadyToRun.cs`, when embedding a class handle for an `AsyncContinuationType`, emit a `PrecodeHelperImport` with the new `ContinuationLayout` fixup instead of attempting the normal type handle encoding path.
- **`ContinuationTypeSymbol` and `NodeCache` in `ReadyToRunSymbolNodeFactory`**: Adds a node cache and public accessor to create `PrecodeHelperImport` nodes for continuation type fixups.
- **Guard against encoding continuations on the normal type signature path**: `SignatureBuilder.EmitTypeSignature` now throws `InvalidOperationException` if it encounters an `AsyncContinuationType`, since these must go through the dedicated `ContinuationLayout` fixup path.
- **`EncodeContinuationTypeLayout` in `TypeFixupSignature`**: Encodes the continuation's GC pointer map as a bit vector packed into a byte array, along with size and alignment flags. The `ContinuationLayout` fixup emits the base `Continuation` EcmaType followed by this layout blob.
## Runtime (load-time) changes
- **`GetContinuationTypeFromLayout` in `jitinterface.cpp`**: Decodes the continuation layout blob from the R2R image — reads flags, size, and GC ref map bitmap — expands the bitmap back to a `bool` array, and calls into the continuation type creation infrastructure.
- **`LoadDynamicInfoEntry` handles `READYTORUN_FIXUP_Continuation_Layout`**: Calls `GetContinuationTypeFromLayout` to materialize the continuation `MethodTable` at runtime when the fixup is resolved.
- **Refactor `LookupOrCreateContinuationMethodTable` to accept `Module*` instead of `MethodDesc*`**: The `MethodDesc*`-taking overload of `CreateNewContinuationMethodTable` is removed and its debug naming logic is inlined into `LookupOrCreateContinuationMethodTable`, which now takes a `Module* loaderModule` directly. This enables creation of continuation types from R2R fixup decoding where no `MethodDesc` is available. A corresponding static `getContinuationType` helper is extracted from `CEEInfo::getContinuationType` for reuse by `GetContinuationTypeFromLayout`.
## Diagnostic / tooling changes
- **`ReadyToRunSignature.cs` refactoring**: The inline type layout parsing logic for `Check_TypeLayout`/`Verify_TypeLayout` is extracted into a shared `ParseTypeLayout` method, which is also reused for the new `ContinuationLayout` fixup kind. Adds display of `" Align native"` and `" GCLayout 0x00 (Empty)"` for improved diagnostic output.
> **Note:** These code paths are not yet exercised end-to-end, as async2 methods are not currently compiled into ReadyToRun images.
Co-authored-by: David Wrighton <davidwr@microsoft.com>
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Mar 9, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

6 participants

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

Add support for encoding Continuation types with specific layouts in ReadyToRun - #123643

Merged
jtschuster merged 36 commits into
dotnet:mainfrom
jtschuster:ContinuationTypeFixup
Feb 6, 2026
Merged

Add support for encoding Continuation types with specific layouts in ReadyToRun#123643
jtschuster merged 36 commits into
dotnet:mainfrom
jtschuster:ContinuationTypeFixup

Conversation

@jtschuster

@jtschusterjtschuster commented Jan 26, 2026

Copy link
Copy Markdown
Member

Encode Continuation types in R2R images using a new fixup kind (READYTORUN_FIXUP_Continuation_Layout = 0x37):

Encode the GC ref map as a bit vector expanded to a byte array
Add runtime support to read continuation type fixups from R2R images:

GetContinuationTypeFromLayout decodes the blob and creates the type
LoadDynamicInfoEntry handles the new fixup kind

Note: These code paths are not yet exercised as async2 methods are not currently compiled to ReadyToRun images.

jtschusterand others added 28 commits December 18, 2025 10:03
The generated IL thunk does not have valid tokens, so the tokens emitted in the EH handler info are invalid. It's not an invariant that there is always a reference to System.Exception or System.Object in the assembly that we are generating thunks for, so we can't always get a valid Token for the exception type token field. Instead, we can create a filter that does a type check against System.Exception. The reference to System.Exception will be filled in with a Fixup with a module override if we don't have a reference to System.Exception in the assembly.
With these changes, we no longer need separate IL for nativeaot and readytorun
* Rework async thunks generation to cross module generics infra
- Add ability for code generating an ILStub to mark that the tokens might be generated
- Funnel through various details to ensure that we trigger creation of the ManifestModuleWrappedMethodIL as needed
- Adjust method fixup signature generation to allow for VersionsWithMethodBody code which is in the MutableModule
- Add a few todos about work we might do to allow cross module compilation of runtime async code.
- Disable this for now though, since its much to complex to test without a working end-to-end scenario (See code in CrossModuleInlineableUncached
* Revert logic which attempts to treat System.Exception in EH clause specially
…foImpl.ReadyToRun.cs
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
- Clear ClassTokenOrOffset when setting R2R_SYSTEM_EXCEPTION flag
- Add COR_ILEXCEPTION_CLAUSE_R2R_SYSTEM_EXCEPTION to R2R dumper
Encode Continuation types in R2R images using a new fixup kind
(READYTORUN_FIXUP_Continuation_Layout = 0x37):
- Include OwningMethod to associate the Continuation type with the
correct loader allocator at runtime
- Encode the GC ref map as a bit vector expanded to a byte array
- Add AsyncContinuationLayoutAlgorithm for field layout computation
Add runtime support to read continuation type fixups from R2R images:
- GetContinuationTypeFromLayout decodes the blob and creates the type
- LoadDynamicInfoEntry handles the new fixup kind
Also adds helper constants for future continuation allocation helpers.
Note: These code paths are not yet exercised as async2 methods are
not currently compiled to ReadyToRun images.
…g unneeded method parameters and simplifying type resolution logic.
Comment threadsrc/coreclr/vm/jitinterface.cpp Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/CompilerTypeSystemContext.Async.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/AsyncContinuationType.cs Outdated
Make getContinuationType static
Move _validType.TryAdd to CreateValueFromKey
Remove unnecessary using
Comment threadsrc/coreclr/tools/Common/Internal/Runtime/ReadyToRunConstants.cs Outdated

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

Other than the bits of PR #123975 to remove from this change, I think this is good.

CopilotAI review requested due to automatic review settings February 4, 2026 00:15

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

Comment threadsrc/coreclr/vm/jitinterface.cpp Outdated
CopilotAI review requested due to automatic review settings February 4, 2026 18:22

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

Comment threadsrc/coreclr/vm/jitinterface.cpp Outdated
@jtschuster
jtschuster merged commit a528763 into dotnet:mainFeb 6, 2026
98 of 101 checks passed
lewing pushed a commit to lewing/runtime that referenced this pull request Feb 9, 2026
…ReadyToRun (dotnet#123643)
Enable encoding and decoding of async continuation type layouts in ReadyToRun images, allowing the R2R compiler to emit continuation types that were previously only supported at JIT time.
## Crossgen2 (compile-time) changes
- **New fixup kind `ContinuationLayout = 0x37`**: Added to `ReadyToRunFixupKind` in both native (`readytorun.h`) and managed (`ReadyToRunConstants.cs`) headers to represent the layout of an async method continuation type.
- **Remove `NotImplementedException` for `getContinuationType` in R2R**: The `#if READYTORUN` guard that blocked `getContinuationType` is removed from `CorInfoImpl.cs`, enabling continuation type creation during R2R compilation.
- **Initialize `_continuationTypeHashtable` in R2R compiler context**: The hashtable is now constructed in the `CompilerTypeSystemContext` R2R partial constructor so continuation types can be created and cached.
- **Short-circuit loadability checks for continuation types**: Newly created `AsyncContinuationType` instances are added to `_validTypes` in the `ContinuationTypeHashtable` to bypass loadability verification, since these types are always valid by construction.
- **Intercept `AsyncContinuationType` in `embedClassHandle`**: In `CorInfoImpl.ReadyToRun.cs`, when embedding a class handle for an `AsyncContinuationType`, emit a `PrecodeHelperImport` with the new `ContinuationLayout` fixup instead of attempting the normal type handle encoding path.
- **`ContinuationTypeSymbol` and `NodeCache` in `ReadyToRunSymbolNodeFactory`**: Adds a node cache and public accessor to create `PrecodeHelperImport` nodes for continuation type fixups.
- **Guard against encoding continuations on the normal type signature path**: `SignatureBuilder.EmitTypeSignature` now throws `InvalidOperationException` if it encounters an `AsyncContinuationType`, since these must go through the dedicated `ContinuationLayout` fixup path.
- **`EncodeContinuationTypeLayout` in `TypeFixupSignature`**: Encodes the continuation's GC pointer map as a bit vector packed into a byte array, along with size and alignment flags. The `ContinuationLayout` fixup emits the base `Continuation` EcmaType followed by this layout blob.
## Runtime (load-time) changes
- **`GetContinuationTypeFromLayout` in `jitinterface.cpp`**: Decodes the continuation layout blob from the R2R image — reads flags, size, and GC ref map bitmap — expands the bitmap back to a `bool` array, and calls into the continuation type creation infrastructure.
- **`LoadDynamicInfoEntry` handles `READYTORUN_FIXUP_Continuation_Layout`**: Calls `GetContinuationTypeFromLayout` to materialize the continuation `MethodTable` at runtime when the fixup is resolved.
- **Refactor `LookupOrCreateContinuationMethodTable` to accept `Module*` instead of `MethodDesc*`**: The `MethodDesc*`-taking overload of `CreateNewContinuationMethodTable` is removed and its debug naming logic is inlined into `LookupOrCreateContinuationMethodTable`, which now takes a `Module* loaderModule` directly. This enables creation of continuation types from R2R fixup decoding where no `MethodDesc` is available. A corresponding static `getContinuationType` helper is extracted from `CEEInfo::getContinuationType` for reuse by `GetContinuationTypeFromLayout`.
## Diagnostic / tooling changes
- **`ReadyToRunSignature.cs` refactoring**: The inline type layout parsing logic for `Check_TypeLayout`/`Verify_TypeLayout` is extracted into a shared `ParseTypeLayout` method, which is also reused for the new `ContinuationLayout` fixup kind. Adds display of `" Align native"` and `" GCLayout 0x00 (Empty)"` for improved diagnostic output.
> **Note:** These code paths are not yet exercised end-to-end, as async2 methods are not currently compiled into ReadyToRun images.
Co-authored-by: David Wrighton <davidwr@microsoft.com>
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
iremyux pushed a commit to iremyux/dotnet-runtime that referenced this pull request Mar 2, 2026
…ReadyToRun (dotnet#123643)
Enable encoding and decoding of async continuation type layouts in ReadyToRun images, allowing the R2R compiler to emit continuation types that were previously only supported at JIT time.
## Crossgen2 (compile-time) changes
- **New fixup kind `ContinuationLayout = 0x37`**: Added to `ReadyToRunFixupKind` in both native (`readytorun.h`) and managed (`ReadyToRunConstants.cs`) headers to represent the layout of an async method continuation type.
- **Remove `NotImplementedException` for `getContinuationType` in R2R**: The `#if READYTORUN` guard that blocked `getContinuationType` is removed from `CorInfoImpl.cs`, enabling continuation type creation during R2R compilation.
- **Initialize `_continuationTypeHashtable` in R2R compiler context**: The hashtable is now constructed in the `CompilerTypeSystemContext` R2R partial constructor so continuation types can be created and cached.
- **Short-circuit loadability checks for continuation types**: Newly created `AsyncContinuationType` instances are added to `_validTypes` in the `ContinuationTypeHashtable` to bypass loadability verification, since these types are always valid by construction.
- **Intercept `AsyncContinuationType` in `embedClassHandle`**: In `CorInfoImpl.ReadyToRun.cs`, when embedding a class handle for an `AsyncContinuationType`, emit a `PrecodeHelperImport` with the new `ContinuationLayout` fixup instead of attempting the normal type handle encoding path.
- **`ContinuationTypeSymbol` and `NodeCache` in `ReadyToRunSymbolNodeFactory`**: Adds a node cache and public accessor to create `PrecodeHelperImport` nodes for continuation type fixups.
- **Guard against encoding continuations on the normal type signature path**: `SignatureBuilder.EmitTypeSignature` now throws `InvalidOperationException` if it encounters an `AsyncContinuationType`, since these must go through the dedicated `ContinuationLayout` fixup path.
- **`EncodeContinuationTypeLayout` in `TypeFixupSignature`**: Encodes the continuation's GC pointer map as a bit vector packed into a byte array, along with size and alignment flags. The `ContinuationLayout` fixup emits the base `Continuation` EcmaType followed by this layout blob.
## Runtime (load-time) changes
- **`GetContinuationTypeFromLayout` in `jitinterface.cpp`**: Decodes the continuation layout blob from the R2R image — reads flags, size, and GC ref map bitmap — expands the bitmap back to a `bool` array, and calls into the continuation type creation infrastructure.
- **`LoadDynamicInfoEntry` handles `READYTORUN_FIXUP_Continuation_Layout`**: Calls `GetContinuationTypeFromLayout` to materialize the continuation `MethodTable` at runtime when the fixup is resolved.
- **Refactor `LookupOrCreateContinuationMethodTable` to accept `Module*` instead of `MethodDesc*`**: The `MethodDesc*`-taking overload of `CreateNewContinuationMethodTable` is removed and its debug naming logic is inlined into `LookupOrCreateContinuationMethodTable`, which now takes a `Module* loaderModule` directly. This enables creation of continuation types from R2R fixup decoding where no `MethodDesc` is available. A corresponding static `getContinuationType` helper is extracted from `CEEInfo::getContinuationType` for reuse by `GetContinuationTypeFromLayout`.
## Diagnostic / tooling changes
- **`ReadyToRunSignature.cs` refactoring**: The inline type layout parsing logic for `Check_TypeLayout`/`Verify_TypeLayout` is extracted into a shared `ParseTypeLayout` method, which is also reused for the new `ContinuationLayout` fixup kind. Adds display of `" Align native"` and `" GCLayout 0x00 (Empty)"` for improved diagnostic output.
> **Note:** These code paths are not yet exercised end-to-end, as async2 methods are not currently compiled into ReadyToRun images.
Co-authored-by: David Wrighton <davidwr@microsoft.com>
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Mar 9, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

6 participants

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

Add support for encoding Continuation types with specific layouts in ReadyToRun - #123643

Merged
jtschuster merged 36 commits into
dotnet:mainfrom
jtschuster:ContinuationTypeFixup
Feb 6, 2026
Merged

Add support for encoding Continuation types with specific layouts in ReadyToRun#123643
jtschuster merged 36 commits into
dotnet:mainfrom
jtschuster:ContinuationTypeFixup

Conversation

@jtschuster

@jtschusterjtschuster commented Jan 26, 2026

Copy link
Copy Markdown
Member

Encode Continuation types in R2R images using a new fixup kind (READYTORUN_FIXUP_Continuation_Layout = 0x37):

Encode the GC ref map as a bit vector expanded to a byte array
Add runtime support to read continuation type fixups from R2R images:

GetContinuationTypeFromLayout decodes the blob and creates the type
LoadDynamicInfoEntry handles the new fixup kind

Note: These code paths are not yet exercised as async2 methods are not currently compiled to ReadyToRun images.

jtschusterand others added 28 commits December 18, 2025 10:03
The generated IL thunk does not have valid tokens, so the tokens emitted in the EH handler info are invalid. It's not an invariant that there is always a reference to System.Exception or System.Object in the assembly that we are generating thunks for, so we can't always get a valid Token for the exception type token field. Instead, we can create a filter that does a type check against System.Exception. The reference to System.Exception will be filled in with a Fixup with a module override if we don't have a reference to System.Exception in the assembly.
With these changes, we no longer need separate IL for nativeaot and readytorun
* Rework async thunks generation to cross module generics infra
- Add ability for code generating an ILStub to mark that the tokens might be generated
- Funnel through various details to ensure that we trigger creation of the ManifestModuleWrappedMethodIL as needed
- Adjust method fixup signature generation to allow for VersionsWithMethodBody code which is in the MutableModule
- Add a few todos about work we might do to allow cross module compilation of runtime async code.
- Disable this for now though, since its much to complex to test without a working end-to-end scenario (See code in CrossModuleInlineableUncached
* Revert logic which attempts to treat System.Exception in EH clause specially
…foImpl.ReadyToRun.cs
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
- Clear ClassTokenOrOffset when setting R2R_SYSTEM_EXCEPTION flag
- Add COR_ILEXCEPTION_CLAUSE_R2R_SYSTEM_EXCEPTION to R2R dumper
Encode Continuation types in R2R images using a new fixup kind
(READYTORUN_FIXUP_Continuation_Layout = 0x37):
- Include OwningMethod to associate the Continuation type with the
correct loader allocator at runtime
- Encode the GC ref map as a bit vector expanded to a byte array
- Add AsyncContinuationLayoutAlgorithm for field layout computation
Add runtime support to read continuation type fixups from R2R images:
- GetContinuationTypeFromLayout decodes the blob and creates the type
- LoadDynamicInfoEntry handles the new fixup kind
Also adds helper constants for future continuation allocation helpers.
Note: These code paths are not yet exercised as async2 methods are
not currently compiled to ReadyToRun images.
…g unneeded method parameters and simplifying type resolution logic.
Comment threadsrc/coreclr/vm/jitinterface.cpp Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/CompilerTypeSystemContext.Async.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/AsyncContinuationType.cs Outdated
Make getContinuationType static
Move _validType.TryAdd to CreateValueFromKey
Remove unnecessary using
Comment threadsrc/coreclr/tools/Common/Internal/Runtime/ReadyToRunConstants.cs Outdated

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

Other than the bits of PR #123975 to remove from this change, I think this is good.

CopilotAI review requested due to automatic review settings February 4, 2026 00:15

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

Comment threadsrc/coreclr/vm/jitinterface.cpp Outdated
CopilotAI review requested due to automatic review settings February 4, 2026 18:22

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

Comment threadsrc/coreclr/vm/jitinterface.cpp Outdated
@jtschuster
jtschuster merged commit a528763 into dotnet:mainFeb 6, 2026
98 of 101 checks passed
lewing pushed a commit to lewing/runtime that referenced this pull request Feb 9, 2026
…ReadyToRun (dotnet#123643)
Enable encoding and decoding of async continuation type layouts in ReadyToRun images, allowing the R2R compiler to emit continuation types that were previously only supported at JIT time.
## Crossgen2 (compile-time) changes
- **New fixup kind `ContinuationLayout = 0x37`**: Added to `ReadyToRunFixupKind` in both native (`readytorun.h`) and managed (`ReadyToRunConstants.cs`) headers to represent the layout of an async method continuation type.
- **Remove `NotImplementedException` for `getContinuationType` in R2R**: The `#if READYTORUN` guard that blocked `getContinuationType` is removed from `CorInfoImpl.cs`, enabling continuation type creation during R2R compilation.
- **Initialize `_continuationTypeHashtable` in R2R compiler context**: The hashtable is now constructed in the `CompilerTypeSystemContext` R2R partial constructor so continuation types can be created and cached.
- **Short-circuit loadability checks for continuation types**: Newly created `AsyncContinuationType` instances are added to `_validTypes` in the `ContinuationTypeHashtable` to bypass loadability verification, since these types are always valid by construction.
- **Intercept `AsyncContinuationType` in `embedClassHandle`**: In `CorInfoImpl.ReadyToRun.cs`, when embedding a class handle for an `AsyncContinuationType`, emit a `PrecodeHelperImport` with the new `ContinuationLayout` fixup instead of attempting the normal type handle encoding path.
- **`ContinuationTypeSymbol` and `NodeCache` in `ReadyToRunSymbolNodeFactory`**: Adds a node cache and public accessor to create `PrecodeHelperImport` nodes for continuation type fixups.
- **Guard against encoding continuations on the normal type signature path**: `SignatureBuilder.EmitTypeSignature` now throws `InvalidOperationException` if it encounters an `AsyncContinuationType`, since these must go through the dedicated `ContinuationLayout` fixup path.
- **`EncodeContinuationTypeLayout` in `TypeFixupSignature`**: Encodes the continuation's GC pointer map as a bit vector packed into a byte array, along with size and alignment flags. The `ContinuationLayout` fixup emits the base `Continuation` EcmaType followed by this layout blob.
## Runtime (load-time) changes
- **`GetContinuationTypeFromLayout` in `jitinterface.cpp`**: Decodes the continuation layout blob from the R2R image — reads flags, size, and GC ref map bitmap — expands the bitmap back to a `bool` array, and calls into the continuation type creation infrastructure.
- **`LoadDynamicInfoEntry` handles `READYTORUN_FIXUP_Continuation_Layout`**: Calls `GetContinuationTypeFromLayout` to materialize the continuation `MethodTable` at runtime when the fixup is resolved.
- **Refactor `LookupOrCreateContinuationMethodTable` to accept `Module*` instead of `MethodDesc*`**: The `MethodDesc*`-taking overload of `CreateNewContinuationMethodTable` is removed and its debug naming logic is inlined into `LookupOrCreateContinuationMethodTable`, which now takes a `Module* loaderModule` directly. This enables creation of continuation types from R2R fixup decoding where no `MethodDesc` is available. A corresponding static `getContinuationType` helper is extracted from `CEEInfo::getContinuationType` for reuse by `GetContinuationTypeFromLayout`.
## Diagnostic / tooling changes
- **`ReadyToRunSignature.cs` refactoring**: The inline type layout parsing logic for `Check_TypeLayout`/`Verify_TypeLayout` is extracted into a shared `ParseTypeLayout` method, which is also reused for the new `ContinuationLayout` fixup kind. Adds display of `" Align native"` and `" GCLayout 0x00 (Empty)"` for improved diagnostic output.
> **Note:** These code paths are not yet exercised end-to-end, as async2 methods are not currently compiled into ReadyToRun images.
Co-authored-by: David Wrighton <davidwr@microsoft.com>
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
iremyux pushed a commit to iremyux/dotnet-runtime that referenced this pull request Mar 2, 2026
…ReadyToRun (dotnet#123643)
Enable encoding and decoding of async continuation type layouts in ReadyToRun images, allowing the R2R compiler to emit continuation types that were previously only supported at JIT time.
## Crossgen2 (compile-time) changes
- **New fixup kind `ContinuationLayout = 0x37`**: Added to `ReadyToRunFixupKind` in both native (`readytorun.h`) and managed (`ReadyToRunConstants.cs`) headers to represent the layout of an async method continuation type.
- **Remove `NotImplementedException` for `getContinuationType` in R2R**: The `#if READYTORUN` guard that blocked `getContinuationType` is removed from `CorInfoImpl.cs`, enabling continuation type creation during R2R compilation.
- **Initialize `_continuationTypeHashtable` in R2R compiler context**: The hashtable is now constructed in the `CompilerTypeSystemContext` R2R partial constructor so continuation types can be created and cached.
- **Short-circuit loadability checks for continuation types**: Newly created `AsyncContinuationType` instances are added to `_validTypes` in the `ContinuationTypeHashtable` to bypass loadability verification, since these types are always valid by construction.
- **Intercept `AsyncContinuationType` in `embedClassHandle`**: In `CorInfoImpl.ReadyToRun.cs`, when embedding a class handle for an `AsyncContinuationType`, emit a `PrecodeHelperImport` with the new `ContinuationLayout` fixup instead of attempting the normal type handle encoding path.
- **`ContinuationTypeSymbol` and `NodeCache` in `ReadyToRunSymbolNodeFactory`**: Adds a node cache and public accessor to create `PrecodeHelperImport` nodes for continuation type fixups.
- **Guard against encoding continuations on the normal type signature path**: `SignatureBuilder.EmitTypeSignature` now throws `InvalidOperationException` if it encounters an `AsyncContinuationType`, since these must go through the dedicated `ContinuationLayout` fixup path.
- **`EncodeContinuationTypeLayout` in `TypeFixupSignature`**: Encodes the continuation's GC pointer map as a bit vector packed into a byte array, along with size and alignment flags. The `ContinuationLayout` fixup emits the base `Continuation` EcmaType followed by this layout blob.
## Runtime (load-time) changes
- **`GetContinuationTypeFromLayout` in `jitinterface.cpp`**: Decodes the continuation layout blob from the R2R image — reads flags, size, and GC ref map bitmap — expands the bitmap back to a `bool` array, and calls into the continuation type creation infrastructure.
- **`LoadDynamicInfoEntry` handles `READYTORUN_FIXUP_Continuation_Layout`**: Calls `GetContinuationTypeFromLayout` to materialize the continuation `MethodTable` at runtime when the fixup is resolved.
- **Refactor `LookupOrCreateContinuationMethodTable` to accept `Module*` instead of `MethodDesc*`**: The `MethodDesc*`-taking overload of `CreateNewContinuationMethodTable` is removed and its debug naming logic is inlined into `LookupOrCreateContinuationMethodTable`, which now takes a `Module* loaderModule` directly. This enables creation of continuation types from R2R fixup decoding where no `MethodDesc` is available. A corresponding static `getContinuationType` helper is extracted from `CEEInfo::getContinuationType` for reuse by `GetContinuationTypeFromLayout`.
## Diagnostic / tooling changes
- **`ReadyToRunSignature.cs` refactoring**: The inline type layout parsing logic for `Check_TypeLayout`/`Verify_TypeLayout` is extracted into a shared `ParseTypeLayout` method, which is also reused for the new `ContinuationLayout` fixup kind. Adds display of `" Align native"` and `" GCLayout 0x00 (Empty)"` for improved diagnostic output.
> **Note:** These code paths are not yet exercised end-to-end, as async2 methods are not currently compiled into ReadyToRun images.
Co-authored-by: David Wrighton <davidwr@microsoft.com>
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Mar 9, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

6 participants

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

Add support for encoding Continuation types with specific layouts in ReadyToRun - #123643

Merged
jtschuster merged 36 commits into
dotnet:mainfrom
jtschuster:ContinuationTypeFixup
Feb 6, 2026
Merged

Add support for encoding Continuation types with specific layouts in ReadyToRun#123643
jtschuster merged 36 commits into
dotnet:mainfrom
jtschuster:ContinuationTypeFixup

Conversation

@jtschuster

@jtschusterjtschuster commented Jan 26, 2026

Copy link
Copy Markdown
Member

Encode Continuation types in R2R images using a new fixup kind (READYTORUN_FIXUP_Continuation_Layout = 0x37):

Encode the GC ref map as a bit vector expanded to a byte array
Add runtime support to read continuation type fixups from R2R images:

GetContinuationTypeFromLayout decodes the blob and creates the type
LoadDynamicInfoEntry handles the new fixup kind

Note: These code paths are not yet exercised as async2 methods are not currently compiled to ReadyToRun images.

jtschusterand others added 28 commits December 18, 2025 10:03
The generated IL thunk does not have valid tokens, so the tokens emitted in the EH handler info are invalid. It's not an invariant that there is always a reference to System.Exception or System.Object in the assembly that we are generating thunks for, so we can't always get a valid Token for the exception type token field. Instead, we can create a filter that does a type check against System.Exception. The reference to System.Exception will be filled in with a Fixup with a module override if we don't have a reference to System.Exception in the assembly.
With these changes, we no longer need separate IL for nativeaot and readytorun
* Rework async thunks generation to cross module generics infra
- Add ability for code generating an ILStub to mark that the tokens might be generated
- Funnel through various details to ensure that we trigger creation of the ManifestModuleWrappedMethodIL as needed
- Adjust method fixup signature generation to allow for VersionsWithMethodBody code which is in the MutableModule
- Add a few todos about work we might do to allow cross module compilation of runtime async code.
- Disable this for now though, since its much to complex to test without a working end-to-end scenario (See code in CrossModuleInlineableUncached
* Revert logic which attempts to treat System.Exception in EH clause specially
…foImpl.ReadyToRun.cs
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
- Clear ClassTokenOrOffset when setting R2R_SYSTEM_EXCEPTION flag
- Add COR_ILEXCEPTION_CLAUSE_R2R_SYSTEM_EXCEPTION to R2R dumper
Encode Continuation types in R2R images using a new fixup kind
(READYTORUN_FIXUP_Continuation_Layout = 0x37):
- Include OwningMethod to associate the Continuation type with the
correct loader allocator at runtime
- Encode the GC ref map as a bit vector expanded to a byte array
- Add AsyncContinuationLayoutAlgorithm for field layout computation
Add runtime support to read continuation type fixups from R2R images:
- GetContinuationTypeFromLayout decodes the blob and creates the type
- LoadDynamicInfoEntry handles the new fixup kind
Also adds helper constants for future continuation allocation helpers.
Note: These code paths are not yet exercised as async2 methods are
not currently compiled to ReadyToRun images.
…g unneeded method parameters and simplifying type resolution logic.
Comment threadsrc/coreclr/vm/jitinterface.cpp Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/CompilerTypeSystemContext.Async.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/AsyncContinuationType.cs Outdated
Make getContinuationType static
Move _validType.TryAdd to CreateValueFromKey
Remove unnecessary using
Comment threadsrc/coreclr/tools/Common/Internal/Runtime/ReadyToRunConstants.cs Outdated

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

Other than the bits of PR #123975 to remove from this change, I think this is good.

CopilotAI review requested due to automatic review settings February 4, 2026 00:15

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

Comment threadsrc/coreclr/vm/jitinterface.cpp Outdated
CopilotAI review requested due to automatic review settings February 4, 2026 18:22

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

Comment threadsrc/coreclr/vm/jitinterface.cpp Outdated
@jtschuster
jtschuster merged commit a528763 into dotnet:mainFeb 6, 2026
98 of 101 checks passed
lewing pushed a commit to lewing/runtime that referenced this pull request Feb 9, 2026
…ReadyToRun (dotnet#123643)
Enable encoding and decoding of async continuation type layouts in ReadyToRun images, allowing the R2R compiler to emit continuation types that were previously only supported at JIT time.
## Crossgen2 (compile-time) changes
- **New fixup kind `ContinuationLayout = 0x37`**: Added to `ReadyToRunFixupKind` in both native (`readytorun.h`) and managed (`ReadyToRunConstants.cs`) headers to represent the layout of an async method continuation type.
- **Remove `NotImplementedException` for `getContinuationType` in R2R**: The `#if READYTORUN` guard that blocked `getContinuationType` is removed from `CorInfoImpl.cs`, enabling continuation type creation during R2R compilation.
- **Initialize `_continuationTypeHashtable` in R2R compiler context**: The hashtable is now constructed in the `CompilerTypeSystemContext` R2R partial constructor so continuation types can be created and cached.
- **Short-circuit loadability checks for continuation types**: Newly created `AsyncContinuationType` instances are added to `_validTypes` in the `ContinuationTypeHashtable` to bypass loadability verification, since these types are always valid by construction.
- **Intercept `AsyncContinuationType` in `embedClassHandle`**: In `CorInfoImpl.ReadyToRun.cs`, when embedding a class handle for an `AsyncContinuationType`, emit a `PrecodeHelperImport` with the new `ContinuationLayout` fixup instead of attempting the normal type handle encoding path.
- **`ContinuationTypeSymbol` and `NodeCache` in `ReadyToRunSymbolNodeFactory`**: Adds a node cache and public accessor to create `PrecodeHelperImport` nodes for continuation type fixups.
- **Guard against encoding continuations on the normal type signature path**: `SignatureBuilder.EmitTypeSignature` now throws `InvalidOperationException` if it encounters an `AsyncContinuationType`, since these must go through the dedicated `ContinuationLayout` fixup path.
- **`EncodeContinuationTypeLayout` in `TypeFixupSignature`**: Encodes the continuation's GC pointer map as a bit vector packed into a byte array, along with size and alignment flags. The `ContinuationLayout` fixup emits the base `Continuation` EcmaType followed by this layout blob.
## Runtime (load-time) changes
- **`GetContinuationTypeFromLayout` in `jitinterface.cpp`**: Decodes the continuation layout blob from the R2R image — reads flags, size, and GC ref map bitmap — expands the bitmap back to a `bool` array, and calls into the continuation type creation infrastructure.
- **`LoadDynamicInfoEntry` handles `READYTORUN_FIXUP_Continuation_Layout`**: Calls `GetContinuationTypeFromLayout` to materialize the continuation `MethodTable` at runtime when the fixup is resolved.
- **Refactor `LookupOrCreateContinuationMethodTable` to accept `Module*` instead of `MethodDesc*`**: The `MethodDesc*`-taking overload of `CreateNewContinuationMethodTable` is removed and its debug naming logic is inlined into `LookupOrCreateContinuationMethodTable`, which now takes a `Module* loaderModule` directly. This enables creation of continuation types from R2R fixup decoding where no `MethodDesc` is available. A corresponding static `getContinuationType` helper is extracted from `CEEInfo::getContinuationType` for reuse by `GetContinuationTypeFromLayout`.
## Diagnostic / tooling changes
- **`ReadyToRunSignature.cs` refactoring**: The inline type layout parsing logic for `Check_TypeLayout`/`Verify_TypeLayout` is extracted into a shared `ParseTypeLayout` method, which is also reused for the new `ContinuationLayout` fixup kind. Adds display of `" Align native"` and `" GCLayout 0x00 (Empty)"` for improved diagnostic output.
> **Note:** These code paths are not yet exercised end-to-end, as async2 methods are not currently compiled into ReadyToRun images.
Co-authored-by: David Wrighton <davidwr@microsoft.com>
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
iremyux pushed a commit to iremyux/dotnet-runtime that referenced this pull request Mar 2, 2026
…ReadyToRun (dotnet#123643)
Enable encoding and decoding of async continuation type layouts in ReadyToRun images, allowing the R2R compiler to emit continuation types that were previously only supported at JIT time.
## Crossgen2 (compile-time) changes
- **New fixup kind `ContinuationLayout = 0x37`**: Added to `ReadyToRunFixupKind` in both native (`readytorun.h`) and managed (`ReadyToRunConstants.cs`) headers to represent the layout of an async method continuation type.
- **Remove `NotImplementedException` for `getContinuationType` in R2R**: The `#if READYTORUN` guard that blocked `getContinuationType` is removed from `CorInfoImpl.cs`, enabling continuation type creation during R2R compilation.
- **Initialize `_continuationTypeHashtable` in R2R compiler context**: The hashtable is now constructed in the `CompilerTypeSystemContext` R2R partial constructor so continuation types can be created and cached.
- **Short-circuit loadability checks for continuation types**: Newly created `AsyncContinuationType` instances are added to `_validTypes` in the `ContinuationTypeHashtable` to bypass loadability verification, since these types are always valid by construction.
- **Intercept `AsyncContinuationType` in `embedClassHandle`**: In `CorInfoImpl.ReadyToRun.cs`, when embedding a class handle for an `AsyncContinuationType`, emit a `PrecodeHelperImport` with the new `ContinuationLayout` fixup instead of attempting the normal type handle encoding path.
- **`ContinuationTypeSymbol` and `NodeCache` in `ReadyToRunSymbolNodeFactory`**: Adds a node cache and public accessor to create `PrecodeHelperImport` nodes for continuation type fixups.
- **Guard against encoding continuations on the normal type signature path**: `SignatureBuilder.EmitTypeSignature` now throws `InvalidOperationException` if it encounters an `AsyncContinuationType`, since these must go through the dedicated `ContinuationLayout` fixup path.
- **`EncodeContinuationTypeLayout` in `TypeFixupSignature`**: Encodes the continuation's GC pointer map as a bit vector packed into a byte array, along with size and alignment flags. The `ContinuationLayout` fixup emits the base `Continuation` EcmaType followed by this layout blob.
## Runtime (load-time) changes
- **`GetContinuationTypeFromLayout` in `jitinterface.cpp`**: Decodes the continuation layout blob from the R2R image — reads flags, size, and GC ref map bitmap — expands the bitmap back to a `bool` array, and calls into the continuation type creation infrastructure.
- **`LoadDynamicInfoEntry` handles `READYTORUN_FIXUP_Continuation_Layout`**: Calls `GetContinuationTypeFromLayout` to materialize the continuation `MethodTable` at runtime when the fixup is resolved.
- **Refactor `LookupOrCreateContinuationMethodTable` to accept `Module*` instead of `MethodDesc*`**: The `MethodDesc*`-taking overload of `CreateNewContinuationMethodTable` is removed and its debug naming logic is inlined into `LookupOrCreateContinuationMethodTable`, which now takes a `Module* loaderModule` directly. This enables creation of continuation types from R2R fixup decoding where no `MethodDesc` is available. A corresponding static `getContinuationType` helper is extracted from `CEEInfo::getContinuationType` for reuse by `GetContinuationTypeFromLayout`.
## Diagnostic / tooling changes
- **`ReadyToRunSignature.cs` refactoring**: The inline type layout parsing logic for `Check_TypeLayout`/`Verify_TypeLayout` is extracted into a shared `ParseTypeLayout` method, which is also reused for the new `ContinuationLayout` fixup kind. Adds display of `" Align native"` and `" GCLayout 0x00 (Empty)"` for improved diagnostic output.
> **Note:** These code paths are not yet exercised end-to-end, as async2 methods are not currently compiled into ReadyToRun images.
Co-authored-by: David Wrighton <davidwr@microsoft.com>
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Mar 9, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

6 participants

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

Add support for encoding Continuation types with specific layouts in ReadyToRun - #123643

Merged
jtschuster merged 36 commits into
dotnet:mainfrom
jtschuster:ContinuationTypeFixup
Feb 6, 2026
Merged

Add support for encoding Continuation types with specific layouts in ReadyToRun#123643
jtschuster merged 36 commits into
dotnet:mainfrom
jtschuster:ContinuationTypeFixup

Conversation

@jtschuster

@jtschusterjtschuster commented Jan 26, 2026

Copy link
Copy Markdown
Member

Encode Continuation types in R2R images using a new fixup kind (READYTORUN_FIXUP_Continuation_Layout = 0x37):

Encode the GC ref map as a bit vector expanded to a byte array
Add runtime support to read continuation type fixups from R2R images:

GetContinuationTypeFromLayout decodes the blob and creates the type
LoadDynamicInfoEntry handles the new fixup kind

Note: These code paths are not yet exercised as async2 methods are not currently compiled to ReadyToRun images.

jtschusterand others added 28 commits December 18, 2025 10:03
The generated IL thunk does not have valid tokens, so the tokens emitted in the EH handler info are invalid. It's not an invariant that there is always a reference to System.Exception or System.Object in the assembly that we are generating thunks for, so we can't always get a valid Token for the exception type token field. Instead, we can create a filter that does a type check against System.Exception. The reference to System.Exception will be filled in with a Fixup with a module override if we don't have a reference to System.Exception in the assembly.
With these changes, we no longer need separate IL for nativeaot and readytorun
* Rework async thunks generation to cross module generics infra
- Add ability for code generating an ILStub to mark that the tokens might be generated
- Funnel through various details to ensure that we trigger creation of the ManifestModuleWrappedMethodIL as needed
- Adjust method fixup signature generation to allow for VersionsWithMethodBody code which is in the MutableModule
- Add a few todos about work we might do to allow cross module compilation of runtime async code.
- Disable this for now though, since its much to complex to test without a working end-to-end scenario (See code in CrossModuleInlineableUncached
* Revert logic which attempts to treat System.Exception in EH clause specially
…foImpl.ReadyToRun.cs
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
- Clear ClassTokenOrOffset when setting R2R_SYSTEM_EXCEPTION flag
- Add COR_ILEXCEPTION_CLAUSE_R2R_SYSTEM_EXCEPTION to R2R dumper
Encode Continuation types in R2R images using a new fixup kind
(READYTORUN_FIXUP_Continuation_Layout = 0x37):
- Include OwningMethod to associate the Continuation type with the
correct loader allocator at runtime
- Encode the GC ref map as a bit vector expanded to a byte array
- Add AsyncContinuationLayoutAlgorithm for field layout computation
Add runtime support to read continuation type fixups from R2R images:
- GetContinuationTypeFromLayout decodes the blob and creates the type
- LoadDynamicInfoEntry handles the new fixup kind
Also adds helper constants for future continuation allocation helpers.
Note: These code paths are not yet exercised as async2 methods are
not currently compiled to ReadyToRun images.
…g unneeded method parameters and simplifying type resolution logic.
Comment threadsrc/coreclr/vm/jitinterface.cpp Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/CompilerTypeSystemContext.Async.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/AsyncContinuationType.cs Outdated
Make getContinuationType static
Move _validType.TryAdd to CreateValueFromKey
Remove unnecessary using
Comment threadsrc/coreclr/tools/Common/Internal/Runtime/ReadyToRunConstants.cs Outdated

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

Other than the bits of PR #123975 to remove from this change, I think this is good.

CopilotAI review requested due to automatic review settings February 4, 2026 00:15

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

Comment threadsrc/coreclr/vm/jitinterface.cpp Outdated
CopilotAI review requested due to automatic review settings February 4, 2026 18:22

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

Comment threadsrc/coreclr/vm/jitinterface.cpp Outdated
@jtschuster
jtschuster merged commit a528763 into dotnet:mainFeb 6, 2026
98 of 101 checks passed
lewing pushed a commit to lewing/runtime that referenced this pull request Feb 9, 2026
…ReadyToRun (dotnet#123643)
Enable encoding and decoding of async continuation type layouts in ReadyToRun images, allowing the R2R compiler to emit continuation types that were previously only supported at JIT time.
## Crossgen2 (compile-time) changes
- **New fixup kind `ContinuationLayout = 0x37`**: Added to `ReadyToRunFixupKind` in both native (`readytorun.h`) and managed (`ReadyToRunConstants.cs`) headers to represent the layout of an async method continuation type.
- **Remove `NotImplementedException` for `getContinuationType` in R2R**: The `#if READYTORUN` guard that blocked `getContinuationType` is removed from `CorInfoImpl.cs`, enabling continuation type creation during R2R compilation.
- **Initialize `_continuationTypeHashtable` in R2R compiler context**: The hashtable is now constructed in the `CompilerTypeSystemContext` R2R partial constructor so continuation types can be created and cached.
- **Short-circuit loadability checks for continuation types**: Newly created `AsyncContinuationType` instances are added to `_validTypes` in the `ContinuationTypeHashtable` to bypass loadability verification, since these types are always valid by construction.
- **Intercept `AsyncContinuationType` in `embedClassHandle`**: In `CorInfoImpl.ReadyToRun.cs`, when embedding a class handle for an `AsyncContinuationType`, emit a `PrecodeHelperImport` with the new `ContinuationLayout` fixup instead of attempting the normal type handle encoding path.
- **`ContinuationTypeSymbol` and `NodeCache` in `ReadyToRunSymbolNodeFactory`**: Adds a node cache and public accessor to create `PrecodeHelperImport` nodes for continuation type fixups.
- **Guard against encoding continuations on the normal type signature path**: `SignatureBuilder.EmitTypeSignature` now throws `InvalidOperationException` if it encounters an `AsyncContinuationType`, since these must go through the dedicated `ContinuationLayout` fixup path.
- **`EncodeContinuationTypeLayout` in `TypeFixupSignature`**: Encodes the continuation's GC pointer map as a bit vector packed into a byte array, along with size and alignment flags. The `ContinuationLayout` fixup emits the base `Continuation` EcmaType followed by this layout blob.
## Runtime (load-time) changes
- **`GetContinuationTypeFromLayout` in `jitinterface.cpp`**: Decodes the continuation layout blob from the R2R image — reads flags, size, and GC ref map bitmap — expands the bitmap back to a `bool` array, and calls into the continuation type creation infrastructure.
- **`LoadDynamicInfoEntry` handles `READYTORUN_FIXUP_Continuation_Layout`**: Calls `GetContinuationTypeFromLayout` to materialize the continuation `MethodTable` at runtime when the fixup is resolved.
- **Refactor `LookupOrCreateContinuationMethodTable` to accept `Module*` instead of `MethodDesc*`**: The `MethodDesc*`-taking overload of `CreateNewContinuationMethodTable` is removed and its debug naming logic is inlined into `LookupOrCreateContinuationMethodTable`, which now takes a `Module* loaderModule` directly. This enables creation of continuation types from R2R fixup decoding where no `MethodDesc` is available. A corresponding static `getContinuationType` helper is extracted from `CEEInfo::getContinuationType` for reuse by `GetContinuationTypeFromLayout`.
## Diagnostic / tooling changes
- **`ReadyToRunSignature.cs` refactoring**: The inline type layout parsing logic for `Check_TypeLayout`/`Verify_TypeLayout` is extracted into a shared `ParseTypeLayout` method, which is also reused for the new `ContinuationLayout` fixup kind. Adds display of `" Align native"` and `" GCLayout 0x00 (Empty)"` for improved diagnostic output.
> **Note:** These code paths are not yet exercised end-to-end, as async2 methods are not currently compiled into ReadyToRun images.
Co-authored-by: David Wrighton <davidwr@microsoft.com>
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
iremyux pushed a commit to iremyux/dotnet-runtime that referenced this pull request Mar 2, 2026
…ReadyToRun (dotnet#123643)
Enable encoding and decoding of async continuation type layouts in ReadyToRun images, allowing the R2R compiler to emit continuation types that were previously only supported at JIT time.
## Crossgen2 (compile-time) changes
- **New fixup kind `ContinuationLayout = 0x37`**: Added to `ReadyToRunFixupKind` in both native (`readytorun.h`) and managed (`ReadyToRunConstants.cs`) headers to represent the layout of an async method continuation type.
- **Remove `NotImplementedException` for `getContinuationType` in R2R**: The `#if READYTORUN` guard that blocked `getContinuationType` is removed from `CorInfoImpl.cs`, enabling continuation type creation during R2R compilation.
- **Initialize `_continuationTypeHashtable` in R2R compiler context**: The hashtable is now constructed in the `CompilerTypeSystemContext` R2R partial constructor so continuation types can be created and cached.
- **Short-circuit loadability checks for continuation types**: Newly created `AsyncContinuationType` instances are added to `_validTypes` in the `ContinuationTypeHashtable` to bypass loadability verification, since these types are always valid by construction.
- **Intercept `AsyncContinuationType` in `embedClassHandle`**: In `CorInfoImpl.ReadyToRun.cs`, when embedding a class handle for an `AsyncContinuationType`, emit a `PrecodeHelperImport` with the new `ContinuationLayout` fixup instead of attempting the normal type handle encoding path.
- **`ContinuationTypeSymbol` and `NodeCache` in `ReadyToRunSymbolNodeFactory`**: Adds a node cache and public accessor to create `PrecodeHelperImport` nodes for continuation type fixups.
- **Guard against encoding continuations on the normal type signature path**: `SignatureBuilder.EmitTypeSignature` now throws `InvalidOperationException` if it encounters an `AsyncContinuationType`, since these must go through the dedicated `ContinuationLayout` fixup path.
- **`EncodeContinuationTypeLayout` in `TypeFixupSignature`**: Encodes the continuation's GC pointer map as a bit vector packed into a byte array, along with size and alignment flags. The `ContinuationLayout` fixup emits the base `Continuation` EcmaType followed by this layout blob.
## Runtime (load-time) changes
- **`GetContinuationTypeFromLayout` in `jitinterface.cpp`**: Decodes the continuation layout blob from the R2R image — reads flags, size, and GC ref map bitmap — expands the bitmap back to a `bool` array, and calls into the continuation type creation infrastructure.
- **`LoadDynamicInfoEntry` handles `READYTORUN_FIXUP_Continuation_Layout`**: Calls `GetContinuationTypeFromLayout` to materialize the continuation `MethodTable` at runtime when the fixup is resolved.
- **Refactor `LookupOrCreateContinuationMethodTable` to accept `Module*` instead of `MethodDesc*`**: The `MethodDesc*`-taking overload of `CreateNewContinuationMethodTable` is removed and its debug naming logic is inlined into `LookupOrCreateContinuationMethodTable`, which now takes a `Module* loaderModule` directly. This enables creation of continuation types from R2R fixup decoding where no `MethodDesc` is available. A corresponding static `getContinuationType` helper is extracted from `CEEInfo::getContinuationType` for reuse by `GetContinuationTypeFromLayout`.
## Diagnostic / tooling changes
- **`ReadyToRunSignature.cs` refactoring**: The inline type layout parsing logic for `Check_TypeLayout`/`Verify_TypeLayout` is extracted into a shared `ParseTypeLayout` method, which is also reused for the new `ContinuationLayout` fixup kind. Adds display of `" Align native"` and `" GCLayout 0x00 (Empty)"` for improved diagnostic output.
> **Note:** These code paths are not yet exercised end-to-end, as async2 methods are not currently compiled into ReadyToRun images.
Co-authored-by: David Wrighton <davidwr@microsoft.com>
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Mar 9, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

6 participants

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

Add support for encoding Continuation types with specific layouts in ReadyToRun - #123643

Merged
jtschuster merged 36 commits into
dotnet:mainfrom
jtschuster:ContinuationTypeFixup
Feb 6, 2026
Merged

Add support for encoding Continuation types with specific layouts in ReadyToRun#123643
jtschuster merged 36 commits into
dotnet:mainfrom
jtschuster:ContinuationTypeFixup

Conversation

@jtschuster

@jtschusterjtschuster commented Jan 26, 2026

Copy link
Copy Markdown
Member

Encode Continuation types in R2R images using a new fixup kind (READYTORUN_FIXUP_Continuation_Layout = 0x37):

Encode the GC ref map as a bit vector expanded to a byte array
Add runtime support to read continuation type fixups from R2R images:

GetContinuationTypeFromLayout decodes the blob and creates the type
LoadDynamicInfoEntry handles the new fixup kind

Note: These code paths are not yet exercised as async2 methods are not currently compiled to ReadyToRun images.

jtschusterand others added 28 commits December 18, 2025 10:03
The generated IL thunk does not have valid tokens, so the tokens emitted in the EH handler info are invalid. It's not an invariant that there is always a reference to System.Exception or System.Object in the assembly that we are generating thunks for, so we can't always get a valid Token for the exception type token field. Instead, we can create a filter that does a type check against System.Exception. The reference to System.Exception will be filled in with a Fixup with a module override if we don't have a reference to System.Exception in the assembly.
With these changes, we no longer need separate IL for nativeaot and readytorun
* Rework async thunks generation to cross module generics infra
- Add ability for code generating an ILStub to mark that the tokens might be generated
- Funnel through various details to ensure that we trigger creation of the ManifestModuleWrappedMethodIL as needed
- Adjust method fixup signature generation to allow for VersionsWithMethodBody code which is in the MutableModule
- Add a few todos about work we might do to allow cross module compilation of runtime async code.
- Disable this for now though, since its much to complex to test without a working end-to-end scenario (See code in CrossModuleInlineableUncached
* Revert logic which attempts to treat System.Exception in EH clause specially
…foImpl.ReadyToRun.cs
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
- Clear ClassTokenOrOffset when setting R2R_SYSTEM_EXCEPTION flag
- Add COR_ILEXCEPTION_CLAUSE_R2R_SYSTEM_EXCEPTION to R2R dumper
Encode Continuation types in R2R images using a new fixup kind
(READYTORUN_FIXUP_Continuation_Layout = 0x37):
- Include OwningMethod to associate the Continuation type with the
correct loader allocator at runtime
- Encode the GC ref map as a bit vector expanded to a byte array
- Add AsyncContinuationLayoutAlgorithm for field layout computation
Add runtime support to read continuation type fixups from R2R images:
- GetContinuationTypeFromLayout decodes the blob and creates the type
- LoadDynamicInfoEntry handles the new fixup kind
Also adds helper constants for future continuation allocation helpers.
Note: These code paths are not yet exercised as async2 methods are
not currently compiled to ReadyToRun images.
…g unneeded method parameters and simplifying type resolution logic.
Comment threadsrc/coreclr/vm/jitinterface.cpp Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/CompilerTypeSystemContext.Async.cs Outdated
Comment threadsrc/coreclr/tools/Common/Compiler/AsyncContinuationType.cs Outdated
Make getContinuationType static
Move _validType.TryAdd to CreateValueFromKey
Remove unnecessary using
Comment threadsrc/coreclr/tools/Common/Internal/Runtime/ReadyToRunConstants.cs Outdated

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

Other than the bits of PR #123975 to remove from this change, I think this is good.

CopilotAI review requested due to automatic review settings February 4, 2026 00:15

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

Comment threadsrc/coreclr/vm/jitinterface.cpp Outdated
CopilotAI review requested due to automatic review settings February 4, 2026 18:22

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

Comment threadsrc/coreclr/vm/jitinterface.cpp Outdated
@jtschuster
jtschuster merged commit a528763 into dotnet:mainFeb 6, 2026
98 of 101 checks passed
lewing pushed a commit to lewing/runtime that referenced this pull request Feb 9, 2026
…ReadyToRun (dotnet#123643)
Enable encoding and decoding of async continuation type layouts in ReadyToRun images, allowing the R2R compiler to emit continuation types that were previously only supported at JIT time.
## Crossgen2 (compile-time) changes
- **New fixup kind `ContinuationLayout = 0x37`**: Added to `ReadyToRunFixupKind` in both native (`readytorun.h`) and managed (`ReadyToRunConstants.cs`) headers to represent the layout of an async method continuation type.
- **Remove `NotImplementedException` for `getContinuationType` in R2R**: The `#if READYTORUN` guard that blocked `getContinuationType` is removed from `CorInfoImpl.cs`, enabling continuation type creation during R2R compilation.
- **Initialize `_continuationTypeHashtable` in R2R compiler context**: The hashtable is now constructed in the `CompilerTypeSystemContext` R2R partial constructor so continuation types can be created and cached.
- **Short-circuit loadability checks for continuation types**: Newly created `AsyncContinuationType` instances are added to `_validTypes` in the `ContinuationTypeHashtable` to bypass loadability verification, since these types are always valid by construction.
- **Intercept `AsyncContinuationType` in `embedClassHandle`**: In `CorInfoImpl.ReadyToRun.cs`, when embedding a class handle for an `AsyncContinuationType`, emit a `PrecodeHelperImport` with the new `ContinuationLayout` fixup instead of attempting the normal type handle encoding path.
- **`ContinuationTypeSymbol` and `NodeCache` in `ReadyToRunSymbolNodeFactory`**: Adds a node cache and public accessor to create `PrecodeHelperImport` nodes for continuation type fixups.
- **Guard against encoding continuations on the normal type signature path**: `SignatureBuilder.EmitTypeSignature` now throws `InvalidOperationException` if it encounters an `AsyncContinuationType`, since these must go through the dedicated `ContinuationLayout` fixup path.
- **`EncodeContinuationTypeLayout` in `TypeFixupSignature`**: Encodes the continuation's GC pointer map as a bit vector packed into a byte array, along with size and alignment flags. The `ContinuationLayout` fixup emits the base `Continuation` EcmaType followed by this layout blob.
## Runtime (load-time) changes
- **`GetContinuationTypeFromLayout` in `jitinterface.cpp`**: Decodes the continuation layout blob from the R2R image — reads flags, size, and GC ref map bitmap — expands the bitmap back to a `bool` array, and calls into the continuation type creation infrastructure.
- **`LoadDynamicInfoEntry` handles `READYTORUN_FIXUP_Continuation_Layout`**: Calls `GetContinuationTypeFromLayout` to materialize the continuation `MethodTable` at runtime when the fixup is resolved.
- **Refactor `LookupOrCreateContinuationMethodTable` to accept `Module*` instead of `MethodDesc*`**: The `MethodDesc*`-taking overload of `CreateNewContinuationMethodTable` is removed and its debug naming logic is inlined into `LookupOrCreateContinuationMethodTable`, which now takes a `Module* loaderModule` directly. This enables creation of continuation types from R2R fixup decoding where no `MethodDesc` is available. A corresponding static `getContinuationType` helper is extracted from `CEEInfo::getContinuationType` for reuse by `GetContinuationTypeFromLayout`.
## Diagnostic / tooling changes
- **`ReadyToRunSignature.cs` refactoring**: The inline type layout parsing logic for `Check_TypeLayout`/`Verify_TypeLayout` is extracted into a shared `ParseTypeLayout` method, which is also reused for the new `ContinuationLayout` fixup kind. Adds display of `" Align native"` and `" GCLayout 0x00 (Empty)"` for improved diagnostic output.
> **Note:** These code paths are not yet exercised end-to-end, as async2 methods are not currently compiled into ReadyToRun images.
Co-authored-by: David Wrighton <davidwr@microsoft.com>
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
iremyux pushed a commit to iremyux/dotnet-runtime that referenced this pull request Mar 2, 2026
…ReadyToRun (dotnet#123643)
Enable encoding and decoding of async continuation type layouts in ReadyToRun images, allowing the R2R compiler to emit continuation types that were previously only supported at JIT time.
## Crossgen2 (compile-time) changes
- **New fixup kind `ContinuationLayout = 0x37`**: Added to `ReadyToRunFixupKind` in both native (`readytorun.h`) and managed (`ReadyToRunConstants.cs`) headers to represent the layout of an async method continuation type.
- **Remove `NotImplementedException` for `getContinuationType` in R2R**: The `#if READYTORUN` guard that blocked `getContinuationType` is removed from `CorInfoImpl.cs`, enabling continuation type creation during R2R compilation.
- **Initialize `_continuationTypeHashtable` in R2R compiler context**: The hashtable is now constructed in the `CompilerTypeSystemContext` R2R partial constructor so continuation types can be created and cached.
- **Short-circuit loadability checks for continuation types**: Newly created `AsyncContinuationType` instances are added to `_validTypes` in the `ContinuationTypeHashtable` to bypass loadability verification, since these types are always valid by construction.
- **Intercept `AsyncContinuationType` in `embedClassHandle`**: In `CorInfoImpl.ReadyToRun.cs`, when embedding a class handle for an `AsyncContinuationType`, emit a `PrecodeHelperImport` with the new `ContinuationLayout` fixup instead of attempting the normal type handle encoding path.
- **`ContinuationTypeSymbol` and `NodeCache` in `ReadyToRunSymbolNodeFactory`**: Adds a node cache and public accessor to create `PrecodeHelperImport` nodes for continuation type fixups.
- **Guard against encoding continuations on the normal type signature path**: `SignatureBuilder.EmitTypeSignature` now throws `InvalidOperationException` if it encounters an `AsyncContinuationType`, since these must go through the dedicated `ContinuationLayout` fixup path.
- **`EncodeContinuationTypeLayout` in `TypeFixupSignature`**: Encodes the continuation's GC pointer map as a bit vector packed into a byte array, along with size and alignment flags. The `ContinuationLayout` fixup emits the base `Continuation` EcmaType followed by this layout blob.
## Runtime (load-time) changes
- **`GetContinuationTypeFromLayout` in `jitinterface.cpp`**: Decodes the continuation layout blob from the R2R image — reads flags, size, and GC ref map bitmap — expands the bitmap back to a `bool` array, and calls into the continuation type creation infrastructure.
- **`LoadDynamicInfoEntry` handles `READYTORUN_FIXUP_Continuation_Layout`**: Calls `GetContinuationTypeFromLayout` to materialize the continuation `MethodTable` at runtime when the fixup is resolved.
- **Refactor `LookupOrCreateContinuationMethodTable` to accept `Module*` instead of `MethodDesc*`**: The `MethodDesc*`-taking overload of `CreateNewContinuationMethodTable` is removed and its debug naming logic is inlined into `LookupOrCreateContinuationMethodTable`, which now takes a `Module* loaderModule` directly. This enables creation of continuation types from R2R fixup decoding where no `MethodDesc` is available. A corresponding static `getContinuationType` helper is extracted from `CEEInfo::getContinuationType` for reuse by `GetContinuationTypeFromLayout`.
## Diagnostic / tooling changes
- **`ReadyToRunSignature.cs` refactoring**: The inline type layout parsing logic for `Check_TypeLayout`/`Verify_TypeLayout` is extracted into a shared `ParseTypeLayout` method, which is also reused for the new `ContinuationLayout` fixup kind. Adds display of `" Align native"` and `" GCLayout 0x00 (Empty)"` for improved diagnostic output.
> **Note:** These code paths are not yet exercised end-to-end, as async2 methods are not currently compiled into ReadyToRun images.
Co-authored-by: David Wrighton <davidwr@microsoft.com>
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Mar 9, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

6 participants

@jtschuster@jkotas@jakobbotsch@davidwrighton@MichalStrehovsky