JIT: Preserve async continuation arg across EnC remap - #128664

Merged
tommcdon merged 2 commits into
dotnet:mainfrom
tommcdon:dev/tommcdon/fix-asyncv2-enc-continuation-preserved
Jun 1, 2026
Merged

JIT: Preserve async continuation arg across EnC remap#128664
tommcdon merged 2 commits into
dotnet:mainfrom
tommcdon:dev/tommcdon/fix-asyncv2-enc-continuation-preserved

Conversation

@tommcdon

@tommcdontommcdon commented May 27, 2026

Copy link
Copy Markdown
Member

The async continuation argument was homed in the local frame area which gets zeroed by FixContextForEnC during EnC remap. On platforms with shadow space, the continuation accidentally survived because it was homed above callerSP, outside the zeroed region. On platforms without shadow space, the continuation was destroyed.

Fix: Assign a dedicated IL number (ASYNC_CONTINUATION_ILNUM = -4) so the continuation arg appears in NativeVarInfo and survives EnC remap on all platforms.

This shifts MAX_ILNUM from -4 to -5, changing the NativeVarInfo encoding bias. R2R major version bumped accordingly.

@tommcdontommcdon added this to the 11.0.0 milestone May 27, 2026
@tommcdontommcdon self-assigned this May 27, 2026
CopilotAI review requested due to automatic review settings May 27, 2026 20:42
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR adjusts CoreCLR JIT frame layout for async methods under Edit-and-Continue (EnC) so the async continuation argument’s stack home is placed in the EnC-preserved “frame header” region, and updates GC info preserved-area sizing on x64 and ARM64 accordingly.

Changes:

  • lclvars.cpp: Skips normal arg/local offset assignment for lvaAsyncContinuationArg under EnC and allocates its stack slot via lvaAllocAsyncContexts.
  • codegenxarch.cpp: Extends EnC preserved-area size to include the continuation slot on x64.
  • codegenarmarch.cpp: Extends EnC preserved-area size to include the continuation slot on ARM64.

Reviewed changes

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

FileDescription
src/coreclr/jit/lclvars.cppChanges EnC frame-layout allocation/skip logic so the async continuation arg is intended to live in the EnC-preserved header region.
src/coreclr/jit/codegenxarch.cppUpdates x64 EnC preserved-area size computation to account for the continuation slot.
src/coreclr/jit/codegenarmarch.cppUpdates ARM64 EnC preserved-area size computation to account for the continuation slot.

Comment threadsrc/coreclr/jit/lclvars.cpp Outdated
@jakobbotsch

Copy link
Copy Markdown
Member

How does the generic context get handled? We should align these.

@tommcdon

Copy link
Copy Markdown
MemberAuthor

How does the generic context get handled? We should align these.

Generic context is stored as an explicit parameter so is automatically stored into NativeVarInfo. The continuation arg, however, has UNKNOWN_ILNUM so doesn't automatically get stored.

@jakobbotsch

Copy link
Copy Markdown
Member

I wonder if we should give this a number instead. I am not totally sure if things will work out correctly in all cases if we try to allocate an argument together with locals.

@tommcdon

Copy link
Copy Markdown
MemberAuthor

I wonder if we should give this a number instead. I am not totally sure if things will work out correctly in all cases if we try to allocate an argument together with locals.

I think it makes sense. The variable already has a normal parameter home, so we would simply be assigning it a proper IL value, like ASYNC_CONTINUATION_ILNUM = -4. FixContextForEnC will find the variable in NativeVarInfo and copy its value from old frame to the new frame. Unless there are objections, I'll push a commit with the proposed change.

@tommcdon

Copy link
Copy Markdown
MemberAuthor

I wonder if we should give this a number instead. I am not totally sure if things will work out correctly in all cases if we try to allocate an argument together with locals.

I think it makes sense. The variable already has a normal parameter home, so we would simply be assigning it a proper IL value, like ASYNC_CONTINUATION_ILNUM = -4. FixContextForEnC will find the variable in NativeVarInfo and copy its value from old frame to the new frame. Unless there are objections, I'll push a commit with the proposed change.

I believe this approach will require a R2R major version bump, because NativeVarInfo isn't versioned today.

@jakobbotsch

Copy link
Copy Markdown
Member

I think that should be ok, we can combine it with the change for #128397.
I think we already took a major version change in .NET 11, so I am not sure if we actually need to take another. We don't guarantee compatibility between previews.

CopilotAI review requested due to automatic review settings May 28, 2026 16:54

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Comment threadsrc/coreclr/jit/lclvars.cpp
Comment threadsrc/coreclr/jit/lclvars.cpp
Comment threadsrc/coreclr/inc/readytorun.h Outdated
Comment threadsrc/coreclr/inc/cordebuginfo.h
@tommcdon

Copy link
Copy Markdown
MemberAuthor

I think that should be ok, we can combine it with the change for #128397. I think we already took a major version change in .NET 11, so I am not sure if we actually need to take another. We don't guarantee compatibility between previews.

@jakobbotsch you are correct - the R2R major version was bumped on #122704 which is during .NET 11. @jkotas do you see any issues with breaking the R2R format across daily .NET 11 builds and previews?

@jkotas

Copy link
Copy Markdown
Member

do you see any issues with breaking the R2R format across daily .NET 11 builds and previews?

I do not see any issues, as you have said we started a new compat tier for .NET 11 already.

Comment threadsrc/coreclr/inc/readytorun.h
@jkotas

Copy link
Copy Markdown
Member

I thought that you are asking about whether it is ok to bump the version. We like to bump the version whenever we break the format to save us debugging weird crashes caused by mismatched versions.

CopilotAI review requested due to automatic review settings May 28, 2026 20:35
@tommcdon

Copy link
Copy Markdown
MemberAuthor

I thought that you are asking about whether it is ok to bump the version. We like to bump the version whenever we break the format to save us debugging weird crashes caused by mismatched versions.

Ahh - I thought there was agreement on no version bump. Bringing it back!

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Comment threadsrc/coreclr/jit/lclvars.cpp
Comment threadsrc/coreclr/inc/readytorun.h Outdated
Comment threadsrc/coreclr/jit/lclvars.cpp
@tommcdon

tommcdon commented May 29, 2026

Copy link
Copy Markdown
MemberAuthor

FYI - it looks like we just took another R2R breaking change in main

<<<<<<< dev/tommcdon/fix-asyncv2-enc-continuation-preserved
// R2R Version 19.0 changes NativeVarInfo encoding to include ASYNC_CONTINUATION_ILNUM
=======
// R2R Version 19 removes the READYTORUN_HELPER_ByRefWriteBarrier helper
>>>>>>> main

@jkotas

jkotas commented May 29, 2026

Copy link
Copy Markdown
Member

it looks like we just took another R2R breaking change in main

Change this one to 20 to resolve the conflict.

tommcdonand others added 2 commits May 29, 2026 18:47
When async V2 is enabled and EnC is active, the JIT now assigns
ASYNC_CONTINUATION_ILNUM (-4) to the async continuation arg variable
instead of UNKNOWN_ILNUM (-4, previously). This allows the debugger to
identify and preserve this variable across EnC remaps.
Also adds compMapILvarNum reverse mapping case and fixes a typo in
cordebuginfo.h.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The ASYNC_CONTINUATION_ILNUM addition changes MAX_ILNUM from -4 to -5,
which alters the NativeVarInfo encoding bias. Bump the R2R major version
so old images are rejected rather than silently misinterpreting variable
info.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@tommcdon
tommcdonforce-pushed the dev/tommcdon/fix-asyncv2-enc-continuation-preserved branch from 2e5c78f to 683aa07CompareMay 29, 2026 23:04
CopilotAI review requested due to automatic review settings May 29, 2026 23:04

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Comment threadsrc/coreclr/inc/readytorun.h
@tommcdon

Copy link
Copy Markdown
MemberAuthor

/ba-g failures are unrelated

@tommcdon
tommcdon merged commit 5d31f77 into dotnet:mainJun 1, 2026
136 of 152 checks passed
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 2, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@tommcdon@jakobbotsch@jkotas
, '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

JIT: Preserve async continuation arg across EnC remap - #128664

Merged
tommcdon merged 2 commits into
dotnet:mainfrom
tommcdon:dev/tommcdon/fix-asyncv2-enc-continuation-preserved
Jun 1, 2026
Merged

JIT: Preserve async continuation arg across EnC remap#128664
tommcdon merged 2 commits into
dotnet:mainfrom
tommcdon:dev/tommcdon/fix-asyncv2-enc-continuation-preserved

Conversation

@tommcdon

@tommcdontommcdon commented May 27, 2026

Copy link
Copy Markdown
Member

The async continuation argument was homed in the local frame area which gets zeroed by FixContextForEnC during EnC remap. On platforms with shadow space, the continuation accidentally survived because it was homed above callerSP, outside the zeroed region. On platforms without shadow space, the continuation was destroyed.

Fix: Assign a dedicated IL number (ASYNC_CONTINUATION_ILNUM = -4) so the continuation arg appears in NativeVarInfo and survives EnC remap on all platforms.

This shifts MAX_ILNUM from -4 to -5, changing the NativeVarInfo encoding bias. R2R major version bumped accordingly.

@tommcdontommcdon added this to the 11.0.0 milestone May 27, 2026
@tommcdontommcdon self-assigned this May 27, 2026
CopilotAI review requested due to automatic review settings May 27, 2026 20:42
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR adjusts CoreCLR JIT frame layout for async methods under Edit-and-Continue (EnC) so the async continuation argument’s stack home is placed in the EnC-preserved “frame header” region, and updates GC info preserved-area sizing on x64 and ARM64 accordingly.

Changes:

  • lclvars.cpp: Skips normal arg/local offset assignment for lvaAsyncContinuationArg under EnC and allocates its stack slot via lvaAllocAsyncContexts.
  • codegenxarch.cpp: Extends EnC preserved-area size to include the continuation slot on x64.
  • codegenarmarch.cpp: Extends EnC preserved-area size to include the continuation slot on ARM64.

Reviewed changes

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

FileDescription
src/coreclr/jit/lclvars.cppChanges EnC frame-layout allocation/skip logic so the async continuation arg is intended to live in the EnC-preserved header region.
src/coreclr/jit/codegenxarch.cppUpdates x64 EnC preserved-area size computation to account for the continuation slot.
src/coreclr/jit/codegenarmarch.cppUpdates ARM64 EnC preserved-area size computation to account for the continuation slot.

Comment threadsrc/coreclr/jit/lclvars.cpp Outdated
@jakobbotsch

Copy link
Copy Markdown
Member

How does the generic context get handled? We should align these.

@tommcdon

Copy link
Copy Markdown
MemberAuthor

How does the generic context get handled? We should align these.

Generic context is stored as an explicit parameter so is automatically stored into NativeVarInfo. The continuation arg, however, has UNKNOWN_ILNUM so doesn't automatically get stored.

@jakobbotsch

Copy link
Copy Markdown
Member

I wonder if we should give this a number instead. I am not totally sure if things will work out correctly in all cases if we try to allocate an argument together with locals.

@tommcdon

Copy link
Copy Markdown
MemberAuthor

I wonder if we should give this a number instead. I am not totally sure if things will work out correctly in all cases if we try to allocate an argument together with locals.

I think it makes sense. The variable already has a normal parameter home, so we would simply be assigning it a proper IL value, like ASYNC_CONTINUATION_ILNUM = -4. FixContextForEnC will find the variable in NativeVarInfo and copy its value from old frame to the new frame. Unless there are objections, I'll push a commit with the proposed change.

@tommcdon

Copy link
Copy Markdown
MemberAuthor

I wonder if we should give this a number instead. I am not totally sure if things will work out correctly in all cases if we try to allocate an argument together with locals.

I think it makes sense. The variable already has a normal parameter home, so we would simply be assigning it a proper IL value, like ASYNC_CONTINUATION_ILNUM = -4. FixContextForEnC will find the variable in NativeVarInfo and copy its value from old frame to the new frame. Unless there are objections, I'll push a commit with the proposed change.

I believe this approach will require a R2R major version bump, because NativeVarInfo isn't versioned today.

@jakobbotsch

Copy link
Copy Markdown
Member

I think that should be ok, we can combine it with the change for #128397.
I think we already took a major version change in .NET 11, so I am not sure if we actually need to take another. We don't guarantee compatibility between previews.

CopilotAI review requested due to automatic review settings May 28, 2026 16:54

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Comment threadsrc/coreclr/jit/lclvars.cpp
Comment threadsrc/coreclr/jit/lclvars.cpp
Comment threadsrc/coreclr/inc/readytorun.h Outdated
Comment threadsrc/coreclr/inc/cordebuginfo.h
@tommcdon

Copy link
Copy Markdown
MemberAuthor

I think that should be ok, we can combine it with the change for #128397. I think we already took a major version change in .NET 11, so I am not sure if we actually need to take another. We don't guarantee compatibility between previews.

@jakobbotsch you are correct - the R2R major version was bumped on #122704 which is during .NET 11. @jkotas do you see any issues with breaking the R2R format across daily .NET 11 builds and previews?

@jkotas

Copy link
Copy Markdown
Member

do you see any issues with breaking the R2R format across daily .NET 11 builds and previews?

I do not see any issues, as you have said we started a new compat tier for .NET 11 already.

Comment threadsrc/coreclr/inc/readytorun.h
@jkotas

Copy link
Copy Markdown
Member

I thought that you are asking about whether it is ok to bump the version. We like to bump the version whenever we break the format to save us debugging weird crashes caused by mismatched versions.

CopilotAI review requested due to automatic review settings May 28, 2026 20:35
@tommcdon

Copy link
Copy Markdown
MemberAuthor

I thought that you are asking about whether it is ok to bump the version. We like to bump the version whenever we break the format to save us debugging weird crashes caused by mismatched versions.

Ahh - I thought there was agreement on no version bump. Bringing it back!

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Comment threadsrc/coreclr/jit/lclvars.cpp
Comment threadsrc/coreclr/inc/readytorun.h Outdated
Comment threadsrc/coreclr/jit/lclvars.cpp
@tommcdon

tommcdon commented May 29, 2026

Copy link
Copy Markdown
MemberAuthor

FYI - it looks like we just took another R2R breaking change in main

<<<<<<< dev/tommcdon/fix-asyncv2-enc-continuation-preserved
// R2R Version 19.0 changes NativeVarInfo encoding to include ASYNC_CONTINUATION_ILNUM
=======
// R2R Version 19 removes the READYTORUN_HELPER_ByRefWriteBarrier helper
>>>>>>> main

@jkotas

jkotas commented May 29, 2026

Copy link
Copy Markdown
Member

it looks like we just took another R2R breaking change in main

Change this one to 20 to resolve the conflict.

tommcdonand others added 2 commits May 29, 2026 18:47
When async V2 is enabled and EnC is active, the JIT now assigns
ASYNC_CONTINUATION_ILNUM (-4) to the async continuation arg variable
instead of UNKNOWN_ILNUM (-4, previously). This allows the debugger to
identify and preserve this variable across EnC remaps.
Also adds compMapILvarNum reverse mapping case and fixes a typo in
cordebuginfo.h.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The ASYNC_CONTINUATION_ILNUM addition changes MAX_ILNUM from -4 to -5,
which alters the NativeVarInfo encoding bias. Bump the R2R major version
so old images are rejected rather than silently misinterpreting variable
info.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@tommcdon
tommcdonforce-pushed the dev/tommcdon/fix-asyncv2-enc-continuation-preserved branch from 2e5c78f to 683aa07CompareMay 29, 2026 23:04
CopilotAI review requested due to automatic review settings May 29, 2026 23:04

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Comment threadsrc/coreclr/inc/readytorun.h
@tommcdon

Copy link
Copy Markdown
MemberAuthor

/ba-g failures are unrelated

@tommcdon
tommcdon merged commit 5d31f77 into dotnet:mainJun 1, 2026
136 of 152 checks passed
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 2, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@tommcdon@jakobbotsch@jkotas
, '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

JIT: Preserve async continuation arg across EnC remap - #128664

Merged
tommcdon merged 2 commits into
dotnet:mainfrom
tommcdon:dev/tommcdon/fix-asyncv2-enc-continuation-preserved
Jun 1, 2026
Merged

JIT: Preserve async continuation arg across EnC remap#128664
tommcdon merged 2 commits into
dotnet:mainfrom
tommcdon:dev/tommcdon/fix-asyncv2-enc-continuation-preserved

Conversation

@tommcdon

@tommcdontommcdon commented May 27, 2026

Copy link
Copy Markdown
Member

The async continuation argument was homed in the local frame area which gets zeroed by FixContextForEnC during EnC remap. On platforms with shadow space, the continuation accidentally survived because it was homed above callerSP, outside the zeroed region. On platforms without shadow space, the continuation was destroyed.

Fix: Assign a dedicated IL number (ASYNC_CONTINUATION_ILNUM = -4) so the continuation arg appears in NativeVarInfo and survives EnC remap on all platforms.

This shifts MAX_ILNUM from -4 to -5, changing the NativeVarInfo encoding bias. R2R major version bumped accordingly.

@tommcdontommcdon added this to the 11.0.0 milestone May 27, 2026
@tommcdontommcdon self-assigned this May 27, 2026
CopilotAI review requested due to automatic review settings May 27, 2026 20:42
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR adjusts CoreCLR JIT frame layout for async methods under Edit-and-Continue (EnC) so the async continuation argument’s stack home is placed in the EnC-preserved “frame header” region, and updates GC info preserved-area sizing on x64 and ARM64 accordingly.

Changes:

  • lclvars.cpp: Skips normal arg/local offset assignment for lvaAsyncContinuationArg under EnC and allocates its stack slot via lvaAllocAsyncContexts.
  • codegenxarch.cpp: Extends EnC preserved-area size to include the continuation slot on x64.
  • codegenarmarch.cpp: Extends EnC preserved-area size to include the continuation slot on ARM64.

Reviewed changes

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

FileDescription
src/coreclr/jit/lclvars.cppChanges EnC frame-layout allocation/skip logic so the async continuation arg is intended to live in the EnC-preserved header region.
src/coreclr/jit/codegenxarch.cppUpdates x64 EnC preserved-area size computation to account for the continuation slot.
src/coreclr/jit/codegenarmarch.cppUpdates ARM64 EnC preserved-area size computation to account for the continuation slot.

Comment threadsrc/coreclr/jit/lclvars.cpp Outdated
@jakobbotsch

Copy link
Copy Markdown
Member

How does the generic context get handled? We should align these.

@tommcdon

Copy link
Copy Markdown
MemberAuthor

How does the generic context get handled? We should align these.

Generic context is stored as an explicit parameter so is automatically stored into NativeVarInfo. The continuation arg, however, has UNKNOWN_ILNUM so doesn't automatically get stored.

@jakobbotsch

Copy link
Copy Markdown
Member

I wonder if we should give this a number instead. I am not totally sure if things will work out correctly in all cases if we try to allocate an argument together with locals.

@tommcdon

Copy link
Copy Markdown
MemberAuthor

I wonder if we should give this a number instead. I am not totally sure if things will work out correctly in all cases if we try to allocate an argument together with locals.

I think it makes sense. The variable already has a normal parameter home, so we would simply be assigning it a proper IL value, like ASYNC_CONTINUATION_ILNUM = -4. FixContextForEnC will find the variable in NativeVarInfo and copy its value from old frame to the new frame. Unless there are objections, I'll push a commit with the proposed change.

@tommcdon

Copy link
Copy Markdown
MemberAuthor

I wonder if we should give this a number instead. I am not totally sure if things will work out correctly in all cases if we try to allocate an argument together with locals.

I think it makes sense. The variable already has a normal parameter home, so we would simply be assigning it a proper IL value, like ASYNC_CONTINUATION_ILNUM = -4. FixContextForEnC will find the variable in NativeVarInfo and copy its value from old frame to the new frame. Unless there are objections, I'll push a commit with the proposed change.

I believe this approach will require a R2R major version bump, because NativeVarInfo isn't versioned today.

@jakobbotsch

Copy link
Copy Markdown
Member

I think that should be ok, we can combine it with the change for #128397.
I think we already took a major version change in .NET 11, so I am not sure if we actually need to take another. We don't guarantee compatibility between previews.

CopilotAI review requested due to automatic review settings May 28, 2026 16:54

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Comment threadsrc/coreclr/jit/lclvars.cpp
Comment threadsrc/coreclr/jit/lclvars.cpp
Comment threadsrc/coreclr/inc/readytorun.h Outdated
Comment threadsrc/coreclr/inc/cordebuginfo.h
@tommcdon

Copy link
Copy Markdown
MemberAuthor

I think that should be ok, we can combine it with the change for #128397. I think we already took a major version change in .NET 11, so I am not sure if we actually need to take another. We don't guarantee compatibility between previews.

@jakobbotsch you are correct - the R2R major version was bumped on #122704 which is during .NET 11. @jkotas do you see any issues with breaking the R2R format across daily .NET 11 builds and previews?

@jkotas

Copy link
Copy Markdown
Member

do you see any issues with breaking the R2R format across daily .NET 11 builds and previews?

I do not see any issues, as you have said we started a new compat tier for .NET 11 already.

Comment threadsrc/coreclr/inc/readytorun.h
@jkotas

Copy link
Copy Markdown
Member

I thought that you are asking about whether it is ok to bump the version. We like to bump the version whenever we break the format to save us debugging weird crashes caused by mismatched versions.

CopilotAI review requested due to automatic review settings May 28, 2026 20:35
@tommcdon

Copy link
Copy Markdown
MemberAuthor

I thought that you are asking about whether it is ok to bump the version. We like to bump the version whenever we break the format to save us debugging weird crashes caused by mismatched versions.

Ahh - I thought there was agreement on no version bump. Bringing it back!

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Comment threadsrc/coreclr/jit/lclvars.cpp
Comment threadsrc/coreclr/inc/readytorun.h Outdated
Comment threadsrc/coreclr/jit/lclvars.cpp
@tommcdon

tommcdon commented May 29, 2026

Copy link
Copy Markdown
MemberAuthor

FYI - it looks like we just took another R2R breaking change in main

<<<<<<< dev/tommcdon/fix-asyncv2-enc-continuation-preserved
// R2R Version 19.0 changes NativeVarInfo encoding to include ASYNC_CONTINUATION_ILNUM
=======
// R2R Version 19 removes the READYTORUN_HELPER_ByRefWriteBarrier helper
>>>>>>> main

@jkotas

jkotas commented May 29, 2026

Copy link
Copy Markdown
Member

it looks like we just took another R2R breaking change in main

Change this one to 20 to resolve the conflict.

tommcdonand others added 2 commits May 29, 2026 18:47
When async V2 is enabled and EnC is active, the JIT now assigns
ASYNC_CONTINUATION_ILNUM (-4) to the async continuation arg variable
instead of UNKNOWN_ILNUM (-4, previously). This allows the debugger to
identify and preserve this variable across EnC remaps.
Also adds compMapILvarNum reverse mapping case and fixes a typo in
cordebuginfo.h.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The ASYNC_CONTINUATION_ILNUM addition changes MAX_ILNUM from -4 to -5,
which alters the NativeVarInfo encoding bias. Bump the R2R major version
so old images are rejected rather than silently misinterpreting variable
info.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@tommcdon
tommcdonforce-pushed the dev/tommcdon/fix-asyncv2-enc-continuation-preserved branch from 2e5c78f to 683aa07CompareMay 29, 2026 23:04
CopilotAI review requested due to automatic review settings May 29, 2026 23:04

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Comment threadsrc/coreclr/inc/readytorun.h
@tommcdon

Copy link
Copy Markdown
MemberAuthor

/ba-g failures are unrelated

@tommcdon
tommcdon merged commit 5d31f77 into dotnet:mainJun 1, 2026
136 of 152 checks passed
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 2, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@tommcdon@jakobbotsch@jkotas
, '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

JIT: Preserve async continuation arg across EnC remap - #128664

Merged
tommcdon merged 2 commits into
dotnet:mainfrom
tommcdon:dev/tommcdon/fix-asyncv2-enc-continuation-preserved
Jun 1, 2026
Merged

JIT: Preserve async continuation arg across EnC remap#128664
tommcdon merged 2 commits into
dotnet:mainfrom
tommcdon:dev/tommcdon/fix-asyncv2-enc-continuation-preserved

Conversation

@tommcdon

@tommcdontommcdon commented May 27, 2026

Copy link
Copy Markdown
Member

The async continuation argument was homed in the local frame area which gets zeroed by FixContextForEnC during EnC remap. On platforms with shadow space, the continuation accidentally survived because it was homed above callerSP, outside the zeroed region. On platforms without shadow space, the continuation was destroyed.

Fix: Assign a dedicated IL number (ASYNC_CONTINUATION_ILNUM = -4) so the continuation arg appears in NativeVarInfo and survives EnC remap on all platforms.

This shifts MAX_ILNUM from -4 to -5, changing the NativeVarInfo encoding bias. R2R major version bumped accordingly.

@tommcdontommcdon added this to the 11.0.0 milestone May 27, 2026
@tommcdontommcdon self-assigned this May 27, 2026
CopilotAI review requested due to automatic review settings May 27, 2026 20:42
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR adjusts CoreCLR JIT frame layout for async methods under Edit-and-Continue (EnC) so the async continuation argument’s stack home is placed in the EnC-preserved “frame header” region, and updates GC info preserved-area sizing on x64 and ARM64 accordingly.

Changes:

  • lclvars.cpp: Skips normal arg/local offset assignment for lvaAsyncContinuationArg under EnC and allocates its stack slot via lvaAllocAsyncContexts.
  • codegenxarch.cpp: Extends EnC preserved-area size to include the continuation slot on x64.
  • codegenarmarch.cpp: Extends EnC preserved-area size to include the continuation slot on ARM64.

Reviewed changes

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

FileDescription
src/coreclr/jit/lclvars.cppChanges EnC frame-layout allocation/skip logic so the async continuation arg is intended to live in the EnC-preserved header region.
src/coreclr/jit/codegenxarch.cppUpdates x64 EnC preserved-area size computation to account for the continuation slot.
src/coreclr/jit/codegenarmarch.cppUpdates ARM64 EnC preserved-area size computation to account for the continuation slot.

Comment threadsrc/coreclr/jit/lclvars.cpp Outdated
@jakobbotsch

Copy link
Copy Markdown
Member

How does the generic context get handled? We should align these.

@tommcdon

Copy link
Copy Markdown
MemberAuthor

How does the generic context get handled? We should align these.

Generic context is stored as an explicit parameter so is automatically stored into NativeVarInfo. The continuation arg, however, has UNKNOWN_ILNUM so doesn't automatically get stored.

@jakobbotsch

Copy link
Copy Markdown
Member

I wonder if we should give this a number instead. I am not totally sure if things will work out correctly in all cases if we try to allocate an argument together with locals.

@tommcdon

Copy link
Copy Markdown
MemberAuthor

I wonder if we should give this a number instead. I am not totally sure if things will work out correctly in all cases if we try to allocate an argument together with locals.

I think it makes sense. The variable already has a normal parameter home, so we would simply be assigning it a proper IL value, like ASYNC_CONTINUATION_ILNUM = -4. FixContextForEnC will find the variable in NativeVarInfo and copy its value from old frame to the new frame. Unless there are objections, I'll push a commit with the proposed change.

@tommcdon

Copy link
Copy Markdown
MemberAuthor

I wonder if we should give this a number instead. I am not totally sure if things will work out correctly in all cases if we try to allocate an argument together with locals.

I think it makes sense. The variable already has a normal parameter home, so we would simply be assigning it a proper IL value, like ASYNC_CONTINUATION_ILNUM = -4. FixContextForEnC will find the variable in NativeVarInfo and copy its value from old frame to the new frame. Unless there are objections, I'll push a commit with the proposed change.

I believe this approach will require a R2R major version bump, because NativeVarInfo isn't versioned today.

@jakobbotsch

Copy link
Copy Markdown
Member

I think that should be ok, we can combine it with the change for #128397.
I think we already took a major version change in .NET 11, so I am not sure if we actually need to take another. We don't guarantee compatibility between previews.

CopilotAI review requested due to automatic review settings May 28, 2026 16:54

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Comment threadsrc/coreclr/jit/lclvars.cpp
Comment threadsrc/coreclr/jit/lclvars.cpp
Comment threadsrc/coreclr/inc/readytorun.h Outdated
Comment threadsrc/coreclr/inc/cordebuginfo.h
@tommcdon

Copy link
Copy Markdown
MemberAuthor

I think that should be ok, we can combine it with the change for #128397. I think we already took a major version change in .NET 11, so I am not sure if we actually need to take another. We don't guarantee compatibility between previews.

@jakobbotsch you are correct - the R2R major version was bumped on #122704 which is during .NET 11. @jkotas do you see any issues with breaking the R2R format across daily .NET 11 builds and previews?

@jkotas

Copy link
Copy Markdown
Member

do you see any issues with breaking the R2R format across daily .NET 11 builds and previews?

I do not see any issues, as you have said we started a new compat tier for .NET 11 already.

Comment threadsrc/coreclr/inc/readytorun.h
@jkotas

Copy link
Copy Markdown
Member

I thought that you are asking about whether it is ok to bump the version. We like to bump the version whenever we break the format to save us debugging weird crashes caused by mismatched versions.

CopilotAI review requested due to automatic review settings May 28, 2026 20:35
@tommcdon

Copy link
Copy Markdown
MemberAuthor

I thought that you are asking about whether it is ok to bump the version. We like to bump the version whenever we break the format to save us debugging weird crashes caused by mismatched versions.

Ahh - I thought there was agreement on no version bump. Bringing it back!

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Comment threadsrc/coreclr/jit/lclvars.cpp
Comment threadsrc/coreclr/inc/readytorun.h Outdated
Comment threadsrc/coreclr/jit/lclvars.cpp
@tommcdon

tommcdon commented May 29, 2026

Copy link
Copy Markdown
MemberAuthor

FYI - it looks like we just took another R2R breaking change in main

<<<<<<< dev/tommcdon/fix-asyncv2-enc-continuation-preserved
// R2R Version 19.0 changes NativeVarInfo encoding to include ASYNC_CONTINUATION_ILNUM
=======
// R2R Version 19 removes the READYTORUN_HELPER_ByRefWriteBarrier helper
>>>>>>> main

@jkotas

jkotas commented May 29, 2026

Copy link
Copy Markdown
Member

it looks like we just took another R2R breaking change in main

Change this one to 20 to resolve the conflict.

tommcdonand others added 2 commits May 29, 2026 18:47
When async V2 is enabled and EnC is active, the JIT now assigns
ASYNC_CONTINUATION_ILNUM (-4) to the async continuation arg variable
instead of UNKNOWN_ILNUM (-4, previously). This allows the debugger to
identify and preserve this variable across EnC remaps.
Also adds compMapILvarNum reverse mapping case and fixes a typo in
cordebuginfo.h.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The ASYNC_CONTINUATION_ILNUM addition changes MAX_ILNUM from -4 to -5,
which alters the NativeVarInfo encoding bias. Bump the R2R major version
so old images are rejected rather than silently misinterpreting variable
info.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@tommcdon
tommcdonforce-pushed the dev/tommcdon/fix-asyncv2-enc-continuation-preserved branch from 2e5c78f to 683aa07CompareMay 29, 2026 23:04
CopilotAI review requested due to automatic review settings May 29, 2026 23:04

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Comment threadsrc/coreclr/inc/readytorun.h
@tommcdon

Copy link
Copy Markdown
MemberAuthor

/ba-g failures are unrelated

@tommcdon
tommcdon merged commit 5d31f77 into dotnet:mainJun 1, 2026
136 of 152 checks passed
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 2, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@tommcdon@jakobbotsch@jkotas
, '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

JIT: Preserve async continuation arg across EnC remap - #128664

Merged
tommcdon merged 2 commits into
dotnet:mainfrom
tommcdon:dev/tommcdon/fix-asyncv2-enc-continuation-preserved
Jun 1, 2026
Merged

JIT: Preserve async continuation arg across EnC remap#128664
tommcdon merged 2 commits into
dotnet:mainfrom
tommcdon:dev/tommcdon/fix-asyncv2-enc-continuation-preserved

Conversation

@tommcdon

@tommcdontommcdon commented May 27, 2026

Copy link
Copy Markdown
Member

The async continuation argument was homed in the local frame area which gets zeroed by FixContextForEnC during EnC remap. On platforms with shadow space, the continuation accidentally survived because it was homed above callerSP, outside the zeroed region. On platforms without shadow space, the continuation was destroyed.

Fix: Assign a dedicated IL number (ASYNC_CONTINUATION_ILNUM = -4) so the continuation arg appears in NativeVarInfo and survives EnC remap on all platforms.

This shifts MAX_ILNUM from -4 to -5, changing the NativeVarInfo encoding bias. R2R major version bumped accordingly.

@tommcdontommcdon added this to the 11.0.0 milestone May 27, 2026
@tommcdontommcdon self-assigned this May 27, 2026
CopilotAI review requested due to automatic review settings May 27, 2026 20:42
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR adjusts CoreCLR JIT frame layout for async methods under Edit-and-Continue (EnC) so the async continuation argument’s stack home is placed in the EnC-preserved “frame header” region, and updates GC info preserved-area sizing on x64 and ARM64 accordingly.

Changes:

  • lclvars.cpp: Skips normal arg/local offset assignment for lvaAsyncContinuationArg under EnC and allocates its stack slot via lvaAllocAsyncContexts.
  • codegenxarch.cpp: Extends EnC preserved-area size to include the continuation slot on x64.
  • codegenarmarch.cpp: Extends EnC preserved-area size to include the continuation slot on ARM64.

Reviewed changes

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

FileDescription
src/coreclr/jit/lclvars.cppChanges EnC frame-layout allocation/skip logic so the async continuation arg is intended to live in the EnC-preserved header region.
src/coreclr/jit/codegenxarch.cppUpdates x64 EnC preserved-area size computation to account for the continuation slot.
src/coreclr/jit/codegenarmarch.cppUpdates ARM64 EnC preserved-area size computation to account for the continuation slot.

Comment threadsrc/coreclr/jit/lclvars.cpp Outdated
@jakobbotsch

Copy link
Copy Markdown
Member

How does the generic context get handled? We should align these.

@tommcdon

Copy link
Copy Markdown
MemberAuthor

How does the generic context get handled? We should align these.

Generic context is stored as an explicit parameter so is automatically stored into NativeVarInfo. The continuation arg, however, has UNKNOWN_ILNUM so doesn't automatically get stored.

@jakobbotsch

Copy link
Copy Markdown
Member

I wonder if we should give this a number instead. I am not totally sure if things will work out correctly in all cases if we try to allocate an argument together with locals.

@tommcdon

Copy link
Copy Markdown
MemberAuthor

I wonder if we should give this a number instead. I am not totally sure if things will work out correctly in all cases if we try to allocate an argument together with locals.

I think it makes sense. The variable already has a normal parameter home, so we would simply be assigning it a proper IL value, like ASYNC_CONTINUATION_ILNUM = -4. FixContextForEnC will find the variable in NativeVarInfo and copy its value from old frame to the new frame. Unless there are objections, I'll push a commit with the proposed change.

@tommcdon

Copy link
Copy Markdown
MemberAuthor

I wonder if we should give this a number instead. I am not totally sure if things will work out correctly in all cases if we try to allocate an argument together with locals.

I think it makes sense. The variable already has a normal parameter home, so we would simply be assigning it a proper IL value, like ASYNC_CONTINUATION_ILNUM = -4. FixContextForEnC will find the variable in NativeVarInfo and copy its value from old frame to the new frame. Unless there are objections, I'll push a commit with the proposed change.

I believe this approach will require a R2R major version bump, because NativeVarInfo isn't versioned today.

@jakobbotsch

Copy link
Copy Markdown
Member

I think that should be ok, we can combine it with the change for #128397.
I think we already took a major version change in .NET 11, so I am not sure if we actually need to take another. We don't guarantee compatibility between previews.

CopilotAI review requested due to automatic review settings May 28, 2026 16:54

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Comment threadsrc/coreclr/jit/lclvars.cpp
Comment threadsrc/coreclr/jit/lclvars.cpp
Comment threadsrc/coreclr/inc/readytorun.h Outdated
Comment threadsrc/coreclr/inc/cordebuginfo.h
@tommcdon

Copy link
Copy Markdown
MemberAuthor

I think that should be ok, we can combine it with the change for #128397. I think we already took a major version change in .NET 11, so I am not sure if we actually need to take another. We don't guarantee compatibility between previews.

@jakobbotsch you are correct - the R2R major version was bumped on #122704 which is during .NET 11. @jkotas do you see any issues with breaking the R2R format across daily .NET 11 builds and previews?

@jkotas

Copy link
Copy Markdown
Member

do you see any issues with breaking the R2R format across daily .NET 11 builds and previews?

I do not see any issues, as you have said we started a new compat tier for .NET 11 already.

Comment threadsrc/coreclr/inc/readytorun.h
@jkotas

Copy link
Copy Markdown
Member

I thought that you are asking about whether it is ok to bump the version. We like to bump the version whenever we break the format to save us debugging weird crashes caused by mismatched versions.

CopilotAI review requested due to automatic review settings May 28, 2026 20:35
@tommcdon

Copy link
Copy Markdown
MemberAuthor

I thought that you are asking about whether it is ok to bump the version. We like to bump the version whenever we break the format to save us debugging weird crashes caused by mismatched versions.

Ahh - I thought there was agreement on no version bump. Bringing it back!

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Comment threadsrc/coreclr/jit/lclvars.cpp
Comment threadsrc/coreclr/inc/readytorun.h Outdated
Comment threadsrc/coreclr/jit/lclvars.cpp
@tommcdon

tommcdon commented May 29, 2026

Copy link
Copy Markdown
MemberAuthor

FYI - it looks like we just took another R2R breaking change in main

<<<<<<< dev/tommcdon/fix-asyncv2-enc-continuation-preserved
// R2R Version 19.0 changes NativeVarInfo encoding to include ASYNC_CONTINUATION_ILNUM
=======
// R2R Version 19 removes the READYTORUN_HELPER_ByRefWriteBarrier helper
>>>>>>> main

@jkotas

jkotas commented May 29, 2026

Copy link
Copy Markdown
Member

it looks like we just took another R2R breaking change in main

Change this one to 20 to resolve the conflict.

tommcdonand others added 2 commits May 29, 2026 18:47
When async V2 is enabled and EnC is active, the JIT now assigns
ASYNC_CONTINUATION_ILNUM (-4) to the async continuation arg variable
instead of UNKNOWN_ILNUM (-4, previously). This allows the debugger to
identify and preserve this variable across EnC remaps.
Also adds compMapILvarNum reverse mapping case and fixes a typo in
cordebuginfo.h.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The ASYNC_CONTINUATION_ILNUM addition changes MAX_ILNUM from -4 to -5,
which alters the NativeVarInfo encoding bias. Bump the R2R major version
so old images are rejected rather than silently misinterpreting variable
info.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@tommcdon
tommcdonforce-pushed the dev/tommcdon/fix-asyncv2-enc-continuation-preserved branch from 2e5c78f to 683aa07CompareMay 29, 2026 23:04
CopilotAI review requested due to automatic review settings May 29, 2026 23:04

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Comment threadsrc/coreclr/inc/readytorun.h
@tommcdon

Copy link
Copy Markdown
MemberAuthor

/ba-g failures are unrelated

@tommcdon
tommcdon merged commit 5d31f77 into dotnet:mainJun 1, 2026
136 of 152 checks passed
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 2, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@tommcdon@jakobbotsch@jkotas
, '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

JIT: Preserve async continuation arg across EnC remap - #128664

Merged
tommcdon merged 2 commits into
dotnet:mainfrom
tommcdon:dev/tommcdon/fix-asyncv2-enc-continuation-preserved
Jun 1, 2026
Merged

JIT: Preserve async continuation arg across EnC remap#128664
tommcdon merged 2 commits into
dotnet:mainfrom
tommcdon:dev/tommcdon/fix-asyncv2-enc-continuation-preserved

Conversation

@tommcdon

@tommcdontommcdon commented May 27, 2026

Copy link
Copy Markdown
Member

The async continuation argument was homed in the local frame area which gets zeroed by FixContextForEnC during EnC remap. On platforms with shadow space, the continuation accidentally survived because it was homed above callerSP, outside the zeroed region. On platforms without shadow space, the continuation was destroyed.

Fix: Assign a dedicated IL number (ASYNC_CONTINUATION_ILNUM = -4) so the continuation arg appears in NativeVarInfo and survives EnC remap on all platforms.

This shifts MAX_ILNUM from -4 to -5, changing the NativeVarInfo encoding bias. R2R major version bumped accordingly.

@tommcdontommcdon added this to the 11.0.0 milestone May 27, 2026
@tommcdontommcdon self-assigned this May 27, 2026
CopilotAI review requested due to automatic review settings May 27, 2026 20:42
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR adjusts CoreCLR JIT frame layout for async methods under Edit-and-Continue (EnC) so the async continuation argument’s stack home is placed in the EnC-preserved “frame header” region, and updates GC info preserved-area sizing on x64 and ARM64 accordingly.

Changes:

  • lclvars.cpp: Skips normal arg/local offset assignment for lvaAsyncContinuationArg under EnC and allocates its stack slot via lvaAllocAsyncContexts.
  • codegenxarch.cpp: Extends EnC preserved-area size to include the continuation slot on x64.
  • codegenarmarch.cpp: Extends EnC preserved-area size to include the continuation slot on ARM64.

Reviewed changes

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

FileDescription
src/coreclr/jit/lclvars.cppChanges EnC frame-layout allocation/skip logic so the async continuation arg is intended to live in the EnC-preserved header region.
src/coreclr/jit/codegenxarch.cppUpdates x64 EnC preserved-area size computation to account for the continuation slot.
src/coreclr/jit/codegenarmarch.cppUpdates ARM64 EnC preserved-area size computation to account for the continuation slot.

Comment threadsrc/coreclr/jit/lclvars.cpp Outdated
@jakobbotsch

Copy link
Copy Markdown
Member

How does the generic context get handled? We should align these.

@tommcdon

Copy link
Copy Markdown
MemberAuthor

How does the generic context get handled? We should align these.

Generic context is stored as an explicit parameter so is automatically stored into NativeVarInfo. The continuation arg, however, has UNKNOWN_ILNUM so doesn't automatically get stored.

@jakobbotsch

Copy link
Copy Markdown
Member

I wonder if we should give this a number instead. I am not totally sure if things will work out correctly in all cases if we try to allocate an argument together with locals.

@tommcdon

Copy link
Copy Markdown
MemberAuthor

I wonder if we should give this a number instead. I am not totally sure if things will work out correctly in all cases if we try to allocate an argument together with locals.

I think it makes sense. The variable already has a normal parameter home, so we would simply be assigning it a proper IL value, like ASYNC_CONTINUATION_ILNUM = -4. FixContextForEnC will find the variable in NativeVarInfo and copy its value from old frame to the new frame. Unless there are objections, I'll push a commit with the proposed change.

@tommcdon

Copy link
Copy Markdown
MemberAuthor

I wonder if we should give this a number instead. I am not totally sure if things will work out correctly in all cases if we try to allocate an argument together with locals.

I think it makes sense. The variable already has a normal parameter home, so we would simply be assigning it a proper IL value, like ASYNC_CONTINUATION_ILNUM = -4. FixContextForEnC will find the variable in NativeVarInfo and copy its value from old frame to the new frame. Unless there are objections, I'll push a commit with the proposed change.

I believe this approach will require a R2R major version bump, because NativeVarInfo isn't versioned today.

@jakobbotsch

Copy link
Copy Markdown
Member

I think that should be ok, we can combine it with the change for #128397.
I think we already took a major version change in .NET 11, so I am not sure if we actually need to take another. We don't guarantee compatibility between previews.

CopilotAI review requested due to automatic review settings May 28, 2026 16:54

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Comment threadsrc/coreclr/jit/lclvars.cpp
Comment threadsrc/coreclr/jit/lclvars.cpp
Comment threadsrc/coreclr/inc/readytorun.h Outdated
Comment threadsrc/coreclr/inc/cordebuginfo.h
@tommcdon

Copy link
Copy Markdown
MemberAuthor

I think that should be ok, we can combine it with the change for #128397. I think we already took a major version change in .NET 11, so I am not sure if we actually need to take another. We don't guarantee compatibility between previews.

@jakobbotsch you are correct - the R2R major version was bumped on #122704 which is during .NET 11. @jkotas do you see any issues with breaking the R2R format across daily .NET 11 builds and previews?

@jkotas

Copy link
Copy Markdown
Member

do you see any issues with breaking the R2R format across daily .NET 11 builds and previews?

I do not see any issues, as you have said we started a new compat tier for .NET 11 already.

Comment threadsrc/coreclr/inc/readytorun.h
@jkotas

Copy link
Copy Markdown
Member

I thought that you are asking about whether it is ok to bump the version. We like to bump the version whenever we break the format to save us debugging weird crashes caused by mismatched versions.

CopilotAI review requested due to automatic review settings May 28, 2026 20:35
@tommcdon

Copy link
Copy Markdown
MemberAuthor

I thought that you are asking about whether it is ok to bump the version. We like to bump the version whenever we break the format to save us debugging weird crashes caused by mismatched versions.

Ahh - I thought there was agreement on no version bump. Bringing it back!

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Comment threadsrc/coreclr/jit/lclvars.cpp
Comment threadsrc/coreclr/inc/readytorun.h Outdated
Comment threadsrc/coreclr/jit/lclvars.cpp
@tommcdon

tommcdon commented May 29, 2026

Copy link
Copy Markdown
MemberAuthor

FYI - it looks like we just took another R2R breaking change in main

<<<<<<< dev/tommcdon/fix-asyncv2-enc-continuation-preserved
// R2R Version 19.0 changes NativeVarInfo encoding to include ASYNC_CONTINUATION_ILNUM
=======
// R2R Version 19 removes the READYTORUN_HELPER_ByRefWriteBarrier helper
>>>>>>> main

@jkotas

jkotas commented May 29, 2026

Copy link
Copy Markdown
Member

it looks like we just took another R2R breaking change in main

Change this one to 20 to resolve the conflict.

tommcdonand others added 2 commits May 29, 2026 18:47
When async V2 is enabled and EnC is active, the JIT now assigns
ASYNC_CONTINUATION_ILNUM (-4) to the async continuation arg variable
instead of UNKNOWN_ILNUM (-4, previously). This allows the debugger to
identify and preserve this variable across EnC remaps.
Also adds compMapILvarNum reverse mapping case and fixes a typo in
cordebuginfo.h.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The ASYNC_CONTINUATION_ILNUM addition changes MAX_ILNUM from -4 to -5,
which alters the NativeVarInfo encoding bias. Bump the R2R major version
so old images are rejected rather than silently misinterpreting variable
info.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@tommcdon
tommcdonforce-pushed the dev/tommcdon/fix-asyncv2-enc-continuation-preserved branch from 2e5c78f to 683aa07CompareMay 29, 2026 23:04
CopilotAI review requested due to automatic review settings May 29, 2026 23:04

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Comment threadsrc/coreclr/inc/readytorun.h
@tommcdon

Copy link
Copy Markdown
MemberAuthor

/ba-g failures are unrelated

@tommcdon
tommcdon merged commit 5d31f77 into dotnet:mainJun 1, 2026
136 of 152 checks passed
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 2, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@tommcdon@jakobbotsch@jkotas
, '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

JIT: Preserve async continuation arg across EnC remap - #128664

Merged
tommcdon merged 2 commits into
dotnet:mainfrom
tommcdon:dev/tommcdon/fix-asyncv2-enc-continuation-preserved
Jun 1, 2026
Merged

JIT: Preserve async continuation arg across EnC remap#128664
tommcdon merged 2 commits into
dotnet:mainfrom
tommcdon:dev/tommcdon/fix-asyncv2-enc-continuation-preserved

Conversation

@tommcdon

@tommcdontommcdon commented May 27, 2026

Copy link
Copy Markdown
Member

The async continuation argument was homed in the local frame area which gets zeroed by FixContextForEnC during EnC remap. On platforms with shadow space, the continuation accidentally survived because it was homed above callerSP, outside the zeroed region. On platforms without shadow space, the continuation was destroyed.

Fix: Assign a dedicated IL number (ASYNC_CONTINUATION_ILNUM = -4) so the continuation arg appears in NativeVarInfo and survives EnC remap on all platforms.

This shifts MAX_ILNUM from -4 to -5, changing the NativeVarInfo encoding bias. R2R major version bumped accordingly.

@tommcdontommcdon added this to the 11.0.0 milestone May 27, 2026
@tommcdontommcdon self-assigned this May 27, 2026
CopilotAI review requested due to automatic review settings May 27, 2026 20:42
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR adjusts CoreCLR JIT frame layout for async methods under Edit-and-Continue (EnC) so the async continuation argument’s stack home is placed in the EnC-preserved “frame header” region, and updates GC info preserved-area sizing on x64 and ARM64 accordingly.

Changes:

  • lclvars.cpp: Skips normal arg/local offset assignment for lvaAsyncContinuationArg under EnC and allocates its stack slot via lvaAllocAsyncContexts.
  • codegenxarch.cpp: Extends EnC preserved-area size to include the continuation slot on x64.
  • codegenarmarch.cpp: Extends EnC preserved-area size to include the continuation slot on ARM64.

Reviewed changes

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

FileDescription
src/coreclr/jit/lclvars.cppChanges EnC frame-layout allocation/skip logic so the async continuation arg is intended to live in the EnC-preserved header region.
src/coreclr/jit/codegenxarch.cppUpdates x64 EnC preserved-area size computation to account for the continuation slot.
src/coreclr/jit/codegenarmarch.cppUpdates ARM64 EnC preserved-area size computation to account for the continuation slot.

Comment threadsrc/coreclr/jit/lclvars.cpp Outdated
@jakobbotsch

Copy link
Copy Markdown
Member

How does the generic context get handled? We should align these.

@tommcdon

Copy link
Copy Markdown
MemberAuthor

How does the generic context get handled? We should align these.

Generic context is stored as an explicit parameter so is automatically stored into NativeVarInfo. The continuation arg, however, has UNKNOWN_ILNUM so doesn't automatically get stored.

@jakobbotsch

Copy link
Copy Markdown
Member

I wonder if we should give this a number instead. I am not totally sure if things will work out correctly in all cases if we try to allocate an argument together with locals.

@tommcdon

Copy link
Copy Markdown
MemberAuthor

I wonder if we should give this a number instead. I am not totally sure if things will work out correctly in all cases if we try to allocate an argument together with locals.

I think it makes sense. The variable already has a normal parameter home, so we would simply be assigning it a proper IL value, like ASYNC_CONTINUATION_ILNUM = -4. FixContextForEnC will find the variable in NativeVarInfo and copy its value from old frame to the new frame. Unless there are objections, I'll push a commit with the proposed change.

@tommcdon

Copy link
Copy Markdown
MemberAuthor

I wonder if we should give this a number instead. I am not totally sure if things will work out correctly in all cases if we try to allocate an argument together with locals.

I think it makes sense. The variable already has a normal parameter home, so we would simply be assigning it a proper IL value, like ASYNC_CONTINUATION_ILNUM = -4. FixContextForEnC will find the variable in NativeVarInfo and copy its value from old frame to the new frame. Unless there are objections, I'll push a commit with the proposed change.

I believe this approach will require a R2R major version bump, because NativeVarInfo isn't versioned today.

@jakobbotsch

Copy link
Copy Markdown
Member

I think that should be ok, we can combine it with the change for #128397.
I think we already took a major version change in .NET 11, so I am not sure if we actually need to take another. We don't guarantee compatibility between previews.

CopilotAI review requested due to automatic review settings May 28, 2026 16:54

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Comment threadsrc/coreclr/jit/lclvars.cpp
Comment threadsrc/coreclr/jit/lclvars.cpp
Comment threadsrc/coreclr/inc/readytorun.h Outdated
Comment threadsrc/coreclr/inc/cordebuginfo.h
@tommcdon

Copy link
Copy Markdown
MemberAuthor

I think that should be ok, we can combine it with the change for #128397. I think we already took a major version change in .NET 11, so I am not sure if we actually need to take another. We don't guarantee compatibility between previews.

@jakobbotsch you are correct - the R2R major version was bumped on #122704 which is during .NET 11. @jkotas do you see any issues with breaking the R2R format across daily .NET 11 builds and previews?

@jkotas

Copy link
Copy Markdown
Member

do you see any issues with breaking the R2R format across daily .NET 11 builds and previews?

I do not see any issues, as you have said we started a new compat tier for .NET 11 already.

Comment threadsrc/coreclr/inc/readytorun.h
@jkotas

Copy link
Copy Markdown
Member

I thought that you are asking about whether it is ok to bump the version. We like to bump the version whenever we break the format to save us debugging weird crashes caused by mismatched versions.

CopilotAI review requested due to automatic review settings May 28, 2026 20:35
@tommcdon

Copy link
Copy Markdown
MemberAuthor

I thought that you are asking about whether it is ok to bump the version. We like to bump the version whenever we break the format to save us debugging weird crashes caused by mismatched versions.

Ahh - I thought there was agreement on no version bump. Bringing it back!

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Comment threadsrc/coreclr/jit/lclvars.cpp
Comment threadsrc/coreclr/inc/readytorun.h Outdated
Comment threadsrc/coreclr/jit/lclvars.cpp
@tommcdon

tommcdon commented May 29, 2026

Copy link
Copy Markdown
MemberAuthor

FYI - it looks like we just took another R2R breaking change in main

<<<<<<< dev/tommcdon/fix-asyncv2-enc-continuation-preserved
// R2R Version 19.0 changes NativeVarInfo encoding to include ASYNC_CONTINUATION_ILNUM
=======
// R2R Version 19 removes the READYTORUN_HELPER_ByRefWriteBarrier helper
>>>>>>> main

@jkotas

jkotas commented May 29, 2026

Copy link
Copy Markdown
Member

it looks like we just took another R2R breaking change in main

Change this one to 20 to resolve the conflict.

tommcdonand others added 2 commits May 29, 2026 18:47
When async V2 is enabled and EnC is active, the JIT now assigns
ASYNC_CONTINUATION_ILNUM (-4) to the async continuation arg variable
instead of UNKNOWN_ILNUM (-4, previously). This allows the debugger to
identify and preserve this variable across EnC remaps.
Also adds compMapILvarNum reverse mapping case and fixes a typo in
cordebuginfo.h.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The ASYNC_CONTINUATION_ILNUM addition changes MAX_ILNUM from -4 to -5,
which alters the NativeVarInfo encoding bias. Bump the R2R major version
so old images are rejected rather than silently misinterpreting variable
info.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@tommcdon
tommcdonforce-pushed the dev/tommcdon/fix-asyncv2-enc-continuation-preserved branch from 2e5c78f to 683aa07CompareMay 29, 2026 23:04
CopilotAI review requested due to automatic review settings May 29, 2026 23:04

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Comment threadsrc/coreclr/inc/readytorun.h
@tommcdon

Copy link
Copy Markdown
MemberAuthor

/ba-g failures are unrelated

@tommcdon
tommcdon merged commit 5d31f77 into dotnet:mainJun 1, 2026
136 of 152 checks passed
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 2, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@tommcdon@jakobbotsch@jkotas
, '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

JIT: Preserve async continuation arg across EnC remap - #128664

Merged
tommcdon merged 2 commits into
dotnet:mainfrom
tommcdon:dev/tommcdon/fix-asyncv2-enc-continuation-preserved
Jun 1, 2026
Merged

JIT: Preserve async continuation arg across EnC remap#128664
tommcdon merged 2 commits into
dotnet:mainfrom
tommcdon:dev/tommcdon/fix-asyncv2-enc-continuation-preserved

Conversation

@tommcdon

@tommcdontommcdon commented May 27, 2026

Copy link
Copy Markdown
Member

The async continuation argument was homed in the local frame area which gets zeroed by FixContextForEnC during EnC remap. On platforms with shadow space, the continuation accidentally survived because it was homed above callerSP, outside the zeroed region. On platforms without shadow space, the continuation was destroyed.

Fix: Assign a dedicated IL number (ASYNC_CONTINUATION_ILNUM = -4) so the continuation arg appears in NativeVarInfo and survives EnC remap on all platforms.

This shifts MAX_ILNUM from -4 to -5, changing the NativeVarInfo encoding bias. R2R major version bumped accordingly.

@tommcdontommcdon added this to the 11.0.0 milestone May 27, 2026
@tommcdontommcdon self-assigned this May 27, 2026
CopilotAI review requested due to automatic review settings May 27, 2026 20:42
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR adjusts CoreCLR JIT frame layout for async methods under Edit-and-Continue (EnC) so the async continuation argument’s stack home is placed in the EnC-preserved “frame header” region, and updates GC info preserved-area sizing on x64 and ARM64 accordingly.

Changes:

  • lclvars.cpp: Skips normal arg/local offset assignment for lvaAsyncContinuationArg under EnC and allocates its stack slot via lvaAllocAsyncContexts.
  • codegenxarch.cpp: Extends EnC preserved-area size to include the continuation slot on x64.
  • codegenarmarch.cpp: Extends EnC preserved-area size to include the continuation slot on ARM64.

Reviewed changes

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

FileDescription
src/coreclr/jit/lclvars.cppChanges EnC frame-layout allocation/skip logic so the async continuation arg is intended to live in the EnC-preserved header region.
src/coreclr/jit/codegenxarch.cppUpdates x64 EnC preserved-area size computation to account for the continuation slot.
src/coreclr/jit/codegenarmarch.cppUpdates ARM64 EnC preserved-area size computation to account for the continuation slot.

Comment threadsrc/coreclr/jit/lclvars.cpp Outdated
@jakobbotsch

Copy link
Copy Markdown
Member

How does the generic context get handled? We should align these.

@tommcdon

Copy link
Copy Markdown
MemberAuthor

How does the generic context get handled? We should align these.

Generic context is stored as an explicit parameter so is automatically stored into NativeVarInfo. The continuation arg, however, has UNKNOWN_ILNUM so doesn't automatically get stored.

@jakobbotsch

Copy link
Copy Markdown
Member

I wonder if we should give this a number instead. I am not totally sure if things will work out correctly in all cases if we try to allocate an argument together with locals.

@tommcdon

Copy link
Copy Markdown
MemberAuthor

I wonder if we should give this a number instead. I am not totally sure if things will work out correctly in all cases if we try to allocate an argument together with locals.

I think it makes sense. The variable already has a normal parameter home, so we would simply be assigning it a proper IL value, like ASYNC_CONTINUATION_ILNUM = -4. FixContextForEnC will find the variable in NativeVarInfo and copy its value from old frame to the new frame. Unless there are objections, I'll push a commit with the proposed change.

@tommcdon

Copy link
Copy Markdown
MemberAuthor

I wonder if we should give this a number instead. I am not totally sure if things will work out correctly in all cases if we try to allocate an argument together with locals.

I think it makes sense. The variable already has a normal parameter home, so we would simply be assigning it a proper IL value, like ASYNC_CONTINUATION_ILNUM = -4. FixContextForEnC will find the variable in NativeVarInfo and copy its value from old frame to the new frame. Unless there are objections, I'll push a commit with the proposed change.

I believe this approach will require a R2R major version bump, because NativeVarInfo isn't versioned today.

@jakobbotsch

Copy link
Copy Markdown
Member

I think that should be ok, we can combine it with the change for #128397.
I think we already took a major version change in .NET 11, so I am not sure if we actually need to take another. We don't guarantee compatibility between previews.

CopilotAI review requested due to automatic review settings May 28, 2026 16:54

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Comment threadsrc/coreclr/jit/lclvars.cpp
Comment threadsrc/coreclr/jit/lclvars.cpp
Comment threadsrc/coreclr/inc/readytorun.h Outdated
Comment threadsrc/coreclr/inc/cordebuginfo.h
@tommcdon

Copy link
Copy Markdown
MemberAuthor

I think that should be ok, we can combine it with the change for #128397. I think we already took a major version change in .NET 11, so I am not sure if we actually need to take another. We don't guarantee compatibility between previews.

@jakobbotsch you are correct - the R2R major version was bumped on #122704 which is during .NET 11. @jkotas do you see any issues with breaking the R2R format across daily .NET 11 builds and previews?

@jkotas

Copy link
Copy Markdown
Member

do you see any issues with breaking the R2R format across daily .NET 11 builds and previews?

I do not see any issues, as you have said we started a new compat tier for .NET 11 already.

Comment threadsrc/coreclr/inc/readytorun.h
@jkotas

Copy link
Copy Markdown
Member

I thought that you are asking about whether it is ok to bump the version. We like to bump the version whenever we break the format to save us debugging weird crashes caused by mismatched versions.

CopilotAI review requested due to automatic review settings May 28, 2026 20:35
@tommcdon

Copy link
Copy Markdown
MemberAuthor

I thought that you are asking about whether it is ok to bump the version. We like to bump the version whenever we break the format to save us debugging weird crashes caused by mismatched versions.

Ahh - I thought there was agreement on no version bump. Bringing it back!

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Comment threadsrc/coreclr/jit/lclvars.cpp
Comment threadsrc/coreclr/inc/readytorun.h Outdated
Comment threadsrc/coreclr/jit/lclvars.cpp
@tommcdon

tommcdon commented May 29, 2026

Copy link
Copy Markdown
MemberAuthor

FYI - it looks like we just took another R2R breaking change in main

<<<<<<< dev/tommcdon/fix-asyncv2-enc-continuation-preserved
// R2R Version 19.0 changes NativeVarInfo encoding to include ASYNC_CONTINUATION_ILNUM
=======
// R2R Version 19 removes the READYTORUN_HELPER_ByRefWriteBarrier helper
>>>>>>> main

@jkotas

jkotas commented May 29, 2026

Copy link
Copy Markdown
Member

it looks like we just took another R2R breaking change in main

Change this one to 20 to resolve the conflict.

tommcdonand others added 2 commits May 29, 2026 18:47
When async V2 is enabled and EnC is active, the JIT now assigns
ASYNC_CONTINUATION_ILNUM (-4) to the async continuation arg variable
instead of UNKNOWN_ILNUM (-4, previously). This allows the debugger to
identify and preserve this variable across EnC remaps.
Also adds compMapILvarNum reverse mapping case and fixes a typo in
cordebuginfo.h.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The ASYNC_CONTINUATION_ILNUM addition changes MAX_ILNUM from -4 to -5,
which alters the NativeVarInfo encoding bias. Bump the R2R major version
so old images are rejected rather than silently misinterpreting variable
info.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@tommcdon
tommcdonforce-pushed the dev/tommcdon/fix-asyncv2-enc-continuation-preserved branch from 2e5c78f to 683aa07CompareMay 29, 2026 23:04
CopilotAI review requested due to automatic review settings May 29, 2026 23:04

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

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

Comment threadsrc/coreclr/inc/readytorun.h
@tommcdon

Copy link
Copy Markdown
MemberAuthor

/ba-g failures are unrelated

@tommcdon
tommcdon merged commit 5d31f77 into dotnet:mainJun 1, 2026
136 of 152 checks passed
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 2, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@tommcdon@jakobbotsch@jkotas