Skip to content

Resume after catch for interpreter via native EH - #128728

Merged
janvorli merged 12 commits into
dotnet:mainfrom
janvorli:resume-after-catch-via-native-eh
Jun 9, 2026
Merged

Resume after catch for interpreter via native EH#128728
janvorli merged 12 commits into
dotnet:mainfrom
janvorli:resume-after-catch-via-native-eh

Conversation

@janvorli

Copy link
Copy Markdown
Member

This changes the way resume after catch in interpreted code works. It removes the need to use libunwind and uses C++ exception handling to unwind the stack.

This is basically the same way as we use for WASM, except for some extra handling of cases when the ResumeAfterCatchException would flow into managed frames. In those cases, we skip the managed frames using the explicit frames.

@janvorlijanvorli self-assigned this May 28, 2026
CopilotAI review requested due to automatic review settings May 28, 2026 21:08
@janvorli
janvorli requested review from BrzVlad and kg as code ownersMay 28, 2026 21:08
@janvorli

Copy link
Copy Markdown
MemberAuthor

cc: @am11

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @JulieLeeMSFT, @BrzVlad, @janvorli, @kg
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 changes CoreCLR interpreter resume-after-catch handling to use native C++ exception unwinding instead of the previous libunwind/manual unwind path, adding resume-after-catch handlers at native/managed boundaries and removing stored interpreter stack-pointer state.

Changes:

  • Adds ResumeAfterCatchException rethrow helpers and install/uninstall macros for native/managed boundary handling.
  • Updates interpreter, EH, QCall, PInvoke, prestub, VSD, and allocation helper paths to use the new propagation model.
  • Removes interpreter-frame saved SP plumbing and adjusts Unix UM entry prestub personalities.

Reviewed changes

Copilot reviewed 21 out of 21 changed files in this pull request and generated 3 comments.

Show a summary per file
FileDescription
src/coreclr/vm/virtualcallstub.cppWraps VSD resolve workers with resume-after-catch handlers.
src/coreclr/vm/riscv64/asmhelpers.SChanges UM entry prestub personality to NoHandler.
src/coreclr/vm/qcall.hAdds resume-after-catch handling around QCalls.
src/coreclr/vm/prestub.cppAdds handlers around prestub and interpreted-method execution.
src/coreclr/vm/loongarch64/asmhelpers.SChanges UM entry prestub personality to NoHandler.
src/coreclr/vm/jithelpers.cppWraps throw/rethrow helpers with context-based resume handling.
src/coreclr/vm/interpexec.hRemoves obsolete saved-SP comment.
src/coreclr/vm/interpexec.cppRemoves saved-SP tracking and restores coop mode in resume-after-catch catch block.
src/coreclr/vm/i386/umthunkstub.SChanges UM entry prestub personality to NoHandler.
src/coreclr/vm/gchelpers.cppWraps failed allocation helper with resume-after-catch handling.
src/coreclr/vm/frames.hRemoves interpreter-frame saved SP field/accessors.
src/coreclr/vm/frames.cppStops passing saved interpreter SP to floating-point register update.
src/coreclr/vm/exceptmacros.hDefines new resume-after-catch handler macros.
src/coreclr/vm/exceptionhandling.hDeclares resume-after-catch rethrow helper.
src/coreclr/vm/exceptionhandling.cppImplements managed-frame skipping rethrow helpers and wraps hardware EH path.
src/coreclr/vm/excep.cppGeneralizes native-frame propagation path and removes old resume-after-catch unwind helper.
src/coreclr/vm/eetwain.cppSimplifies interpreter resume-after-catch to throw directly.
src/coreclr/vm/dllimport.cppWraps PInvoke import worker with resume-after-catch handling.
src/coreclr/vm/arm64/stubs.cppMakes arm64 inlined-call-frame interpreter check null-safe.
src/coreclr/vm/arm64/asmhelpers.SChanges UM entry prestub personality to NoHandler.
src/coreclr/vm/amd64/umthunkstub.SChanges UM entry prestub personality to NoHandler.

Comment threadsrc/coreclr/vm/exceptionhandling.cpp Outdated
Comment threadsrc/coreclr/vm/amd64/umthunkstub.S
Comment threadsrc/coreclr/vm/exceptionhandling.cpp Outdated
@janvorli

Copy link
Copy Markdown
MemberAuthor

The change was created / tested on macOS arm64. There seem to be some issues on other targets that I need to address.

This changes the way resume after catch in interpreted code works.
It removes the need to use libunwind and uses C++ exception handling
to unwind the stack.
This is basically the same way as we use for WASM, except for some
extra handling of cases when the ResumeAfterCatchException would
flow into managed frames. In those cases, we skip the managed frames
using the explicit frames.
CopilotAI review requested due to automatic review settings June 2, 2026 23:55

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

Comment threadsrc/coreclr/vm/interpexec.cpp
Comment threadsrc/coreclr/vm/exceptionhandling.cpp
CopilotAI review requested due to automatic review settings June 3, 2026 17:20
CopilotAI review requested due to automatic review settings June 8, 2026 19:59

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

Comment threadsrc/coreclr/vm/exceptmacros.h
Comment threadsrc/coreclr/vm/interpexec.cpp Outdated
@janvorli
janvorli merged commit 4a1d144 into dotnet:mainJun 9, 2026
130 checks passed
@janvorli
janvorli deleted the resume-after-catch-via-native-eh branch June 9, 2026 09:20
@clamp03clamp03 mentioned this pull request Jun 10, 2026
@github-actionsgithub-actionsBot mentioned this pull request Jun 10, 2026
BrzVlad added a commit that referenced this pull request Jun 12, 2026
Fixes regressions after #128728
where C++ throw fails to excecute because it encounters JIT frames. This
failed with `terminate called after throwing an instance of
'ResumeAfterCatchException'` on several interpreter libraries tests in
interp mode 1.
When EH needs to resume execution in the interpreter following a catch,
it throws this exception which needs to propagate all the way to the
interpreter execution loop. At managed to native boundaries we need to
catch this exception and rethrow it below the jitted frames.
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 17, 2026
janvorli pushed a commit that referenced this pull request Jul 8, 2026
This reverts the workaround previously required for the arm32
environment.
It is now safe to restore the original behavior, thanks to the native
exception handling improvements implemented in PR #128728.
---------
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
This changes the way resume after catch in interpreted code works. It
removes the need to use libunwind and uses C++ exception handling to
unwind the stack.
This is basically the same way as we use for WASM, except for some extra
handling of cases when the ResumeAfterCatchException would flow into
managed frames. In those cases, we skip the managed frames using the
explicit frames.
---------
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
Fixes regressions after #128728
where C++ throw fails to excecute because it encounters JIT frames. This
failed with `terminate called after throwing an instance of
'ResumeAfterCatchException'` on several interpreter libraries tests in
interp mode 1.
When EH needs to resume execution in the interpreter following a catch,
it throws this exception which needs to propagate all the way to the
interpreter execution loop. At managed to native boundaries we need to
catch this exception and rethrow it below the jitted frames.
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
This reverts the workaround previously required for the arm32
environment.
It is now safe to restore the original behavior, thanks to the native
exception handling improvements implemented in PR #128728.
---------
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 18, 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.

5 participants

@janvorli@am11@BrzVlad@jkotas
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Resume after catch for interpreter via native EH by janvorli · Pull Request #128728 · dotnet/runtime · GitHub
Skip to content

Resume after catch for interpreter via native EH - #128728

Merged
janvorli merged 12 commits into
dotnet:mainfrom
janvorli:resume-after-catch-via-native-eh
Jun 9, 2026
Merged

Resume after catch for interpreter via native EH#128728
janvorli merged 12 commits into
dotnet:mainfrom
janvorli:resume-after-catch-via-native-eh

Conversation

@janvorli

Copy link
Copy Markdown
Member

This changes the way resume after catch in interpreted code works. It removes the need to use libunwind and uses C++ exception handling to unwind the stack.

This is basically the same way as we use for WASM, except for some extra handling of cases when the ResumeAfterCatchException would flow into managed frames. In those cases, we skip the managed frames using the explicit frames.

@janvorlijanvorli self-assigned this May 28, 2026
CopilotAI review requested due to automatic review settings May 28, 2026 21:08
@janvorli
janvorli requested review from BrzVlad and kg as code ownersMay 28, 2026 21:08
@janvorli

Copy link
Copy Markdown
MemberAuthor

cc: @am11

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @JulieLeeMSFT, @BrzVlad, @janvorli, @kg
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 changes CoreCLR interpreter resume-after-catch handling to use native C++ exception unwinding instead of the previous libunwind/manual unwind path, adding resume-after-catch handlers at native/managed boundaries and removing stored interpreter stack-pointer state.

Changes:

  • Adds ResumeAfterCatchException rethrow helpers and install/uninstall macros for native/managed boundary handling.
  • Updates interpreter, EH, QCall, PInvoke, prestub, VSD, and allocation helper paths to use the new propagation model.
  • Removes interpreter-frame saved SP plumbing and adjusts Unix UM entry prestub personalities.

Reviewed changes

Copilot reviewed 21 out of 21 changed files in this pull request and generated 3 comments.

Show a summary per file
FileDescription
src/coreclr/vm/virtualcallstub.cppWraps VSD resolve workers with resume-after-catch handlers.
src/coreclr/vm/riscv64/asmhelpers.SChanges UM entry prestub personality to NoHandler.
src/coreclr/vm/qcall.hAdds resume-after-catch handling around QCalls.
src/coreclr/vm/prestub.cppAdds handlers around prestub and interpreted-method execution.
src/coreclr/vm/loongarch64/asmhelpers.SChanges UM entry prestub personality to NoHandler.
src/coreclr/vm/jithelpers.cppWraps throw/rethrow helpers with context-based resume handling.
src/coreclr/vm/interpexec.hRemoves obsolete saved-SP comment.
src/coreclr/vm/interpexec.cppRemoves saved-SP tracking and restores coop mode in resume-after-catch catch block.
src/coreclr/vm/i386/umthunkstub.SChanges UM entry prestub personality to NoHandler.
src/coreclr/vm/gchelpers.cppWraps failed allocation helper with resume-after-catch handling.
src/coreclr/vm/frames.hRemoves interpreter-frame saved SP field/accessors.
src/coreclr/vm/frames.cppStops passing saved interpreter SP to floating-point register update.
src/coreclr/vm/exceptmacros.hDefines new resume-after-catch handler macros.
src/coreclr/vm/exceptionhandling.hDeclares resume-after-catch rethrow helper.
src/coreclr/vm/exceptionhandling.cppImplements managed-frame skipping rethrow helpers and wraps hardware EH path.
src/coreclr/vm/excep.cppGeneralizes native-frame propagation path and removes old resume-after-catch unwind helper.
src/coreclr/vm/eetwain.cppSimplifies interpreter resume-after-catch to throw directly.
src/coreclr/vm/dllimport.cppWraps PInvoke import worker with resume-after-catch handling.
src/coreclr/vm/arm64/stubs.cppMakes arm64 inlined-call-frame interpreter check null-safe.
src/coreclr/vm/arm64/asmhelpers.SChanges UM entry prestub personality to NoHandler.
src/coreclr/vm/amd64/umthunkstub.SChanges UM entry prestub personality to NoHandler.

Comment threadsrc/coreclr/vm/exceptionhandling.cpp Outdated
Comment threadsrc/coreclr/vm/amd64/umthunkstub.S
Comment threadsrc/coreclr/vm/exceptionhandling.cpp Outdated
@janvorli

Copy link
Copy Markdown
MemberAuthor

The change was created / tested on macOS arm64. There seem to be some issues on other targets that I need to address.

This changes the way resume after catch in interpreted code works.
It removes the need to use libunwind and uses C++ exception handling
to unwind the stack.
This is basically the same way as we use for WASM, except for some
extra handling of cases when the ResumeAfterCatchException would
flow into managed frames. In those cases, we skip the managed frames
using the explicit frames.
CopilotAI review requested due to automatic review settings June 2, 2026 23:55

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

Comment threadsrc/coreclr/vm/interpexec.cpp
Comment threadsrc/coreclr/vm/exceptionhandling.cpp
CopilotAI review requested due to automatic review settings June 3, 2026 17:20
CopilotAI review requested due to automatic review settings June 8, 2026 19:59

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

Comment threadsrc/coreclr/vm/exceptmacros.h
Comment threadsrc/coreclr/vm/interpexec.cpp Outdated
@janvorli
janvorli merged commit 4a1d144 into dotnet:mainJun 9, 2026
130 checks passed
@janvorli
janvorli deleted the resume-after-catch-via-native-eh branch June 9, 2026 09:20
@clamp03clamp03 mentioned this pull request Jun 10, 2026
@github-actionsgithub-actionsBot mentioned this pull request Jun 10, 2026
BrzVlad added a commit that referenced this pull request Jun 12, 2026
Fixes regressions after #128728
where C++ throw fails to excecute because it encounters JIT frames. This
failed with `terminate called after throwing an instance of
'ResumeAfterCatchException'` on several interpreter libraries tests in
interp mode 1.
When EH needs to resume execution in the interpreter following a catch,
it throws this exception which needs to propagate all the way to the
interpreter execution loop. At managed to native boundaries we need to
catch this exception and rethrow it below the jitted frames.
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 17, 2026
janvorli pushed a commit that referenced this pull request Jul 8, 2026
This reverts the workaround previously required for the arm32
environment.
It is now safe to restore the original behavior, thanks to the native
exception handling improvements implemented in PR #128728.
---------
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
This changes the way resume after catch in interpreted code works. It
removes the need to use libunwind and uses C++ exception handling to
unwind the stack.
This is basically the same way as we use for WASM, except for some extra
handling of cases when the ResumeAfterCatchException would flow into
managed frames. In those cases, we skip the managed frames using the
explicit frames.
---------
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
Fixes regressions after #128728
where C++ throw fails to excecute because it encounters JIT frames. This
failed with `terminate called after throwing an instance of
'ResumeAfterCatchException'` on several interpreter libraries tests in
interp mode 1.
When EH needs to resume execution in the interpreter following a catch,
it throws this exception which needs to propagate all the way to the
interpreter execution loop. At managed to native boundaries we need to
catch this exception and rethrow it below the jitted frames.
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
This reverts the workaround previously required for the arm32
environment.
It is now safe to restore the original behavior, thanks to the native
exception handling improvements implemented in PR #128728.
---------
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 18, 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.

5 participants

@janvorli@am11@BrzVlad@jkotas
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Resume after catch for interpreter via native EH by janvorli · Pull Request #128728 · dotnet/runtime · GitHub
Skip to content

Resume after catch for interpreter via native EH - #128728

Merged
janvorli merged 12 commits into
dotnet:mainfrom
janvorli:resume-after-catch-via-native-eh
Jun 9, 2026
Merged

Resume after catch for interpreter via native EH#128728
janvorli merged 12 commits into
dotnet:mainfrom
janvorli:resume-after-catch-via-native-eh

Conversation

@janvorli

Copy link
Copy Markdown
Member

This changes the way resume after catch in interpreted code works. It removes the need to use libunwind and uses C++ exception handling to unwind the stack.

This is basically the same way as we use for WASM, except for some extra handling of cases when the ResumeAfterCatchException would flow into managed frames. In those cases, we skip the managed frames using the explicit frames.

@janvorlijanvorli self-assigned this May 28, 2026
CopilotAI review requested due to automatic review settings May 28, 2026 21:08
@janvorli
janvorli requested review from BrzVlad and kg as code ownersMay 28, 2026 21:08
@janvorli

Copy link
Copy Markdown
MemberAuthor

cc: @am11

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @JulieLeeMSFT, @BrzVlad, @janvorli, @kg
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 changes CoreCLR interpreter resume-after-catch handling to use native C++ exception unwinding instead of the previous libunwind/manual unwind path, adding resume-after-catch handlers at native/managed boundaries and removing stored interpreter stack-pointer state.

Changes:

  • Adds ResumeAfterCatchException rethrow helpers and install/uninstall macros for native/managed boundary handling.
  • Updates interpreter, EH, QCall, PInvoke, prestub, VSD, and allocation helper paths to use the new propagation model.
  • Removes interpreter-frame saved SP plumbing and adjusts Unix UM entry prestub personalities.

Reviewed changes

Copilot reviewed 21 out of 21 changed files in this pull request and generated 3 comments.

Show a summary per file
FileDescription
src/coreclr/vm/virtualcallstub.cppWraps VSD resolve workers with resume-after-catch handlers.
src/coreclr/vm/riscv64/asmhelpers.SChanges UM entry prestub personality to NoHandler.
src/coreclr/vm/qcall.hAdds resume-after-catch handling around QCalls.
src/coreclr/vm/prestub.cppAdds handlers around prestub and interpreted-method execution.
src/coreclr/vm/loongarch64/asmhelpers.SChanges UM entry prestub personality to NoHandler.
src/coreclr/vm/jithelpers.cppWraps throw/rethrow helpers with context-based resume handling.
src/coreclr/vm/interpexec.hRemoves obsolete saved-SP comment.
src/coreclr/vm/interpexec.cppRemoves saved-SP tracking and restores coop mode in resume-after-catch catch block.
src/coreclr/vm/i386/umthunkstub.SChanges UM entry prestub personality to NoHandler.
src/coreclr/vm/gchelpers.cppWraps failed allocation helper with resume-after-catch handling.
src/coreclr/vm/frames.hRemoves interpreter-frame saved SP field/accessors.
src/coreclr/vm/frames.cppStops passing saved interpreter SP to floating-point register update.
src/coreclr/vm/exceptmacros.hDefines new resume-after-catch handler macros.
src/coreclr/vm/exceptionhandling.hDeclares resume-after-catch rethrow helper.
src/coreclr/vm/exceptionhandling.cppImplements managed-frame skipping rethrow helpers and wraps hardware EH path.
src/coreclr/vm/excep.cppGeneralizes native-frame propagation path and removes old resume-after-catch unwind helper.
src/coreclr/vm/eetwain.cppSimplifies interpreter resume-after-catch to throw directly.
src/coreclr/vm/dllimport.cppWraps PInvoke import worker with resume-after-catch handling.
src/coreclr/vm/arm64/stubs.cppMakes arm64 inlined-call-frame interpreter check null-safe.
src/coreclr/vm/arm64/asmhelpers.SChanges UM entry prestub personality to NoHandler.
src/coreclr/vm/amd64/umthunkstub.SChanges UM entry prestub personality to NoHandler.

Comment threadsrc/coreclr/vm/exceptionhandling.cpp Outdated
Comment threadsrc/coreclr/vm/amd64/umthunkstub.S
Comment threadsrc/coreclr/vm/exceptionhandling.cpp Outdated
@janvorli

Copy link
Copy Markdown
MemberAuthor

The change was created / tested on macOS arm64. There seem to be some issues on other targets that I need to address.

This changes the way resume after catch in interpreted code works.
It removes the need to use libunwind and uses C++ exception handling
to unwind the stack.
This is basically the same way as we use for WASM, except for some
extra handling of cases when the ResumeAfterCatchException would
flow into managed frames. In those cases, we skip the managed frames
using the explicit frames.
CopilotAI review requested due to automatic review settings June 2, 2026 23:55

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

Comment threadsrc/coreclr/vm/interpexec.cpp
Comment threadsrc/coreclr/vm/exceptionhandling.cpp
CopilotAI review requested due to automatic review settings June 3, 2026 17:20
CopilotAI review requested due to automatic review settings June 8, 2026 19:59

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

Comment threadsrc/coreclr/vm/exceptmacros.h
Comment threadsrc/coreclr/vm/interpexec.cpp Outdated
@janvorli
janvorli merged commit 4a1d144 into dotnet:mainJun 9, 2026
130 checks passed
@janvorli
janvorli deleted the resume-after-catch-via-native-eh branch June 9, 2026 09:20
@clamp03clamp03 mentioned this pull request Jun 10, 2026
@github-actionsgithub-actionsBot mentioned this pull request Jun 10, 2026
BrzVlad added a commit that referenced this pull request Jun 12, 2026
Fixes regressions after #128728
where C++ throw fails to excecute because it encounters JIT frames. This
failed with `terminate called after throwing an instance of
'ResumeAfterCatchException'` on several interpreter libraries tests in
interp mode 1.
When EH needs to resume execution in the interpreter following a catch,
it throws this exception which needs to propagate all the way to the
interpreter execution loop. At managed to native boundaries we need to
catch this exception and rethrow it below the jitted frames.
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 17, 2026
janvorli pushed a commit that referenced this pull request Jul 8, 2026
This reverts the workaround previously required for the arm32
environment.
It is now safe to restore the original behavior, thanks to the native
exception handling improvements implemented in PR #128728.
---------
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
This changes the way resume after catch in interpreted code works. It
removes the need to use libunwind and uses C++ exception handling to
unwind the stack.
This is basically the same way as we use for WASM, except for some extra
handling of cases when the ResumeAfterCatchException would flow into
managed frames. In those cases, we skip the managed frames using the
explicit frames.
---------
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
Fixes regressions after #128728
where C++ throw fails to excecute because it encounters JIT frames. This
failed with `terminate called after throwing an instance of
'ResumeAfterCatchException'` on several interpreter libraries tests in
interp mode 1.
When EH needs to resume execution in the interpreter following a catch,
it throws this exception which needs to propagate all the way to the
interpreter execution loop. At managed to native boundaries we need to
catch this exception and rethrow it below the jitted frames.
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
This reverts the workaround previously required for the arm32
environment.
It is now safe to restore the original behavior, thanks to the native
exception handling improvements implemented in PR #128728.
---------
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 18, 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.

5 participants

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

Resume after catch for interpreter via native EH - #128728

Merged
janvorli merged 12 commits into
dotnet:mainfrom
janvorli:resume-after-catch-via-native-eh
Jun 9, 2026
Merged

Resume after catch for interpreter via native EH#128728
janvorli merged 12 commits into
dotnet:mainfrom
janvorli:resume-after-catch-via-native-eh

Conversation

@janvorli

Copy link
Copy Markdown
Member

This changes the way resume after catch in interpreted code works. It removes the need to use libunwind and uses C++ exception handling to unwind the stack.

This is basically the same way as we use for WASM, except for some extra handling of cases when the ResumeAfterCatchException would flow into managed frames. In those cases, we skip the managed frames using the explicit frames.

@janvorlijanvorli self-assigned this May 28, 2026
CopilotAI review requested due to automatic review settings May 28, 2026 21:08
@janvorli
janvorli requested review from BrzVlad and kg as code ownersMay 28, 2026 21:08
@janvorli

Copy link
Copy Markdown
MemberAuthor

cc: @am11

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @JulieLeeMSFT, @BrzVlad, @janvorli, @kg
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 changes CoreCLR interpreter resume-after-catch handling to use native C++ exception unwinding instead of the previous libunwind/manual unwind path, adding resume-after-catch handlers at native/managed boundaries and removing stored interpreter stack-pointer state.

Changes:

  • Adds ResumeAfterCatchException rethrow helpers and install/uninstall macros for native/managed boundary handling.
  • Updates interpreter, EH, QCall, PInvoke, prestub, VSD, and allocation helper paths to use the new propagation model.
  • Removes interpreter-frame saved SP plumbing and adjusts Unix UM entry prestub personalities.

Reviewed changes

Copilot reviewed 21 out of 21 changed files in this pull request and generated 3 comments.

Show a summary per file
FileDescription
src/coreclr/vm/virtualcallstub.cppWraps VSD resolve workers with resume-after-catch handlers.
src/coreclr/vm/riscv64/asmhelpers.SChanges UM entry prestub personality to NoHandler.
src/coreclr/vm/qcall.hAdds resume-after-catch handling around QCalls.
src/coreclr/vm/prestub.cppAdds handlers around prestub and interpreted-method execution.
src/coreclr/vm/loongarch64/asmhelpers.SChanges UM entry prestub personality to NoHandler.
src/coreclr/vm/jithelpers.cppWraps throw/rethrow helpers with context-based resume handling.
src/coreclr/vm/interpexec.hRemoves obsolete saved-SP comment.
src/coreclr/vm/interpexec.cppRemoves saved-SP tracking and restores coop mode in resume-after-catch catch block.
src/coreclr/vm/i386/umthunkstub.SChanges UM entry prestub personality to NoHandler.
src/coreclr/vm/gchelpers.cppWraps failed allocation helper with resume-after-catch handling.
src/coreclr/vm/frames.hRemoves interpreter-frame saved SP field/accessors.
src/coreclr/vm/frames.cppStops passing saved interpreter SP to floating-point register update.
src/coreclr/vm/exceptmacros.hDefines new resume-after-catch handler macros.
src/coreclr/vm/exceptionhandling.hDeclares resume-after-catch rethrow helper.
src/coreclr/vm/exceptionhandling.cppImplements managed-frame skipping rethrow helpers and wraps hardware EH path.
src/coreclr/vm/excep.cppGeneralizes native-frame propagation path and removes old resume-after-catch unwind helper.
src/coreclr/vm/eetwain.cppSimplifies interpreter resume-after-catch to throw directly.
src/coreclr/vm/dllimport.cppWraps PInvoke import worker with resume-after-catch handling.
src/coreclr/vm/arm64/stubs.cppMakes arm64 inlined-call-frame interpreter check null-safe.
src/coreclr/vm/arm64/asmhelpers.SChanges UM entry prestub personality to NoHandler.
src/coreclr/vm/amd64/umthunkstub.SChanges UM entry prestub personality to NoHandler.

Comment threadsrc/coreclr/vm/exceptionhandling.cpp Outdated
Comment threadsrc/coreclr/vm/amd64/umthunkstub.S
Comment threadsrc/coreclr/vm/exceptionhandling.cpp Outdated
@janvorli

Copy link
Copy Markdown
MemberAuthor

The change was created / tested on macOS arm64. There seem to be some issues on other targets that I need to address.

This changes the way resume after catch in interpreted code works.
It removes the need to use libunwind and uses C++ exception handling
to unwind the stack.
This is basically the same way as we use for WASM, except for some
extra handling of cases when the ResumeAfterCatchException would
flow into managed frames. In those cases, we skip the managed frames
using the explicit frames.
CopilotAI review requested due to automatic review settings June 2, 2026 23:55

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

Comment threadsrc/coreclr/vm/interpexec.cpp
Comment threadsrc/coreclr/vm/exceptionhandling.cpp
CopilotAI review requested due to automatic review settings June 3, 2026 17:20
CopilotAI review requested due to automatic review settings June 8, 2026 19:59

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

Comment threadsrc/coreclr/vm/exceptmacros.h
Comment threadsrc/coreclr/vm/interpexec.cpp Outdated
@janvorli
janvorli merged commit 4a1d144 into dotnet:mainJun 9, 2026
130 checks passed
@janvorli
janvorli deleted the resume-after-catch-via-native-eh branch June 9, 2026 09:20
@clamp03clamp03 mentioned this pull request Jun 10, 2026
@github-actionsgithub-actionsBot mentioned this pull request Jun 10, 2026
BrzVlad added a commit that referenced this pull request Jun 12, 2026
Fixes regressions after #128728
where C++ throw fails to excecute because it encounters JIT frames. This
failed with `terminate called after throwing an instance of
'ResumeAfterCatchException'` on several interpreter libraries tests in
interp mode 1.
When EH needs to resume execution in the interpreter following a catch,
it throws this exception which needs to propagate all the way to the
interpreter execution loop. At managed to native boundaries we need to
catch this exception and rethrow it below the jitted frames.
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 17, 2026
janvorli pushed a commit that referenced this pull request Jul 8, 2026
This reverts the workaround previously required for the arm32
environment.
It is now safe to restore the original behavior, thanks to the native
exception handling improvements implemented in PR #128728.
---------
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
This changes the way resume after catch in interpreted code works. It
removes the need to use libunwind and uses C++ exception handling to
unwind the stack.
This is basically the same way as we use for WASM, except for some extra
handling of cases when the ResumeAfterCatchException would flow into
managed frames. In those cases, we skip the managed frames using the
explicit frames.
---------
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
Fixes regressions after #128728
where C++ throw fails to excecute because it encounters JIT frames. This
failed with `terminate called after throwing an instance of
'ResumeAfterCatchException'` on several interpreter libraries tests in
interp mode 1.
When EH needs to resume execution in the interpreter following a catch,
it throws this exception which needs to propagate all the way to the
interpreter execution loop. At managed to native boundaries we need to
catch this exception and rethrow it below the jitted frames.
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
This reverts the workaround previously required for the arm32
environment.
It is now safe to restore the original behavior, thanks to the native
exception handling improvements implemented in PR #128728.
---------
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 18, 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.

5 participants

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

Resume after catch for interpreter via native EH - #128728

Merged
janvorli merged 12 commits into
dotnet:mainfrom
janvorli:resume-after-catch-via-native-eh
Jun 9, 2026
Merged

Resume after catch for interpreter via native EH#128728
janvorli merged 12 commits into
dotnet:mainfrom
janvorli:resume-after-catch-via-native-eh

Conversation

@janvorli

Copy link
Copy Markdown
Member

This changes the way resume after catch in interpreted code works. It removes the need to use libunwind and uses C++ exception handling to unwind the stack.

This is basically the same way as we use for WASM, except for some extra handling of cases when the ResumeAfterCatchException would flow into managed frames. In those cases, we skip the managed frames using the explicit frames.

@janvorlijanvorli self-assigned this May 28, 2026
CopilotAI review requested due to automatic review settings May 28, 2026 21:08
@janvorli
janvorli requested review from BrzVlad and kg as code ownersMay 28, 2026 21:08
@janvorli

Copy link
Copy Markdown
MemberAuthor

cc: @am11

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @JulieLeeMSFT, @BrzVlad, @janvorli, @kg
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 changes CoreCLR interpreter resume-after-catch handling to use native C++ exception unwinding instead of the previous libunwind/manual unwind path, adding resume-after-catch handlers at native/managed boundaries and removing stored interpreter stack-pointer state.

Changes:

  • Adds ResumeAfterCatchException rethrow helpers and install/uninstall macros for native/managed boundary handling.
  • Updates interpreter, EH, QCall, PInvoke, prestub, VSD, and allocation helper paths to use the new propagation model.
  • Removes interpreter-frame saved SP plumbing and adjusts Unix UM entry prestub personalities.

Reviewed changes

Copilot reviewed 21 out of 21 changed files in this pull request and generated 3 comments.

Show a summary per file
FileDescription
src/coreclr/vm/virtualcallstub.cppWraps VSD resolve workers with resume-after-catch handlers.
src/coreclr/vm/riscv64/asmhelpers.SChanges UM entry prestub personality to NoHandler.
src/coreclr/vm/qcall.hAdds resume-after-catch handling around QCalls.
src/coreclr/vm/prestub.cppAdds handlers around prestub and interpreted-method execution.
src/coreclr/vm/loongarch64/asmhelpers.SChanges UM entry prestub personality to NoHandler.
src/coreclr/vm/jithelpers.cppWraps throw/rethrow helpers with context-based resume handling.
src/coreclr/vm/interpexec.hRemoves obsolete saved-SP comment.
src/coreclr/vm/interpexec.cppRemoves saved-SP tracking and restores coop mode in resume-after-catch catch block.
src/coreclr/vm/i386/umthunkstub.SChanges UM entry prestub personality to NoHandler.
src/coreclr/vm/gchelpers.cppWraps failed allocation helper with resume-after-catch handling.
src/coreclr/vm/frames.hRemoves interpreter-frame saved SP field/accessors.
src/coreclr/vm/frames.cppStops passing saved interpreter SP to floating-point register update.
src/coreclr/vm/exceptmacros.hDefines new resume-after-catch handler macros.
src/coreclr/vm/exceptionhandling.hDeclares resume-after-catch rethrow helper.
src/coreclr/vm/exceptionhandling.cppImplements managed-frame skipping rethrow helpers and wraps hardware EH path.
src/coreclr/vm/excep.cppGeneralizes native-frame propagation path and removes old resume-after-catch unwind helper.
src/coreclr/vm/eetwain.cppSimplifies interpreter resume-after-catch to throw directly.
src/coreclr/vm/dllimport.cppWraps PInvoke import worker with resume-after-catch handling.
src/coreclr/vm/arm64/stubs.cppMakes arm64 inlined-call-frame interpreter check null-safe.
src/coreclr/vm/arm64/asmhelpers.SChanges UM entry prestub personality to NoHandler.
src/coreclr/vm/amd64/umthunkstub.SChanges UM entry prestub personality to NoHandler.

Comment threadsrc/coreclr/vm/exceptionhandling.cpp Outdated
Comment threadsrc/coreclr/vm/amd64/umthunkstub.S
Comment threadsrc/coreclr/vm/exceptionhandling.cpp Outdated
@janvorli

Copy link
Copy Markdown
MemberAuthor

The change was created / tested on macOS arm64. There seem to be some issues on other targets that I need to address.

This changes the way resume after catch in interpreted code works.
It removes the need to use libunwind and uses C++ exception handling
to unwind the stack.
This is basically the same way as we use for WASM, except for some
extra handling of cases when the ResumeAfterCatchException would
flow into managed frames. In those cases, we skip the managed frames
using the explicit frames.
CopilotAI review requested due to automatic review settings June 2, 2026 23:55

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

Comment threadsrc/coreclr/vm/interpexec.cpp
Comment threadsrc/coreclr/vm/exceptionhandling.cpp
CopilotAI review requested due to automatic review settings June 3, 2026 17:20
CopilotAI review requested due to automatic review settings June 8, 2026 19:59

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

Comment threadsrc/coreclr/vm/exceptmacros.h
Comment threadsrc/coreclr/vm/interpexec.cpp Outdated
@janvorli
janvorli merged commit 4a1d144 into dotnet:mainJun 9, 2026
130 checks passed
@janvorli
janvorli deleted the resume-after-catch-via-native-eh branch June 9, 2026 09:20
@clamp03clamp03 mentioned this pull request Jun 10, 2026
@github-actionsgithub-actionsBot mentioned this pull request Jun 10, 2026
BrzVlad added a commit that referenced this pull request Jun 12, 2026
Fixes regressions after #128728
where C++ throw fails to excecute because it encounters JIT frames. This
failed with `terminate called after throwing an instance of
'ResumeAfterCatchException'` on several interpreter libraries tests in
interp mode 1.
When EH needs to resume execution in the interpreter following a catch,
it throws this exception which needs to propagate all the way to the
interpreter execution loop. At managed to native boundaries we need to
catch this exception and rethrow it below the jitted frames.
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 17, 2026
janvorli pushed a commit that referenced this pull request Jul 8, 2026
This reverts the workaround previously required for the arm32
environment.
It is now safe to restore the original behavior, thanks to the native
exception handling improvements implemented in PR #128728.
---------
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
This changes the way resume after catch in interpreted code works. It
removes the need to use libunwind and uses C++ exception handling to
unwind the stack.
This is basically the same way as we use for WASM, except for some extra
handling of cases when the ResumeAfterCatchException would flow into
managed frames. In those cases, we skip the managed frames using the
explicit frames.
---------
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
Fixes regressions after #128728
where C++ throw fails to excecute because it encounters JIT frames. This
failed with `terminate called after throwing an instance of
'ResumeAfterCatchException'` on several interpreter libraries tests in
interp mode 1.
When EH needs to resume execution in the interpreter following a catch,
it throws this exception which needs to propagate all the way to the
interpreter execution loop. At managed to native boundaries we need to
catch this exception and rethrow it below the jitted frames.
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
This reverts the workaround previously required for the arm32
environment.
It is now safe to restore the original behavior, thanks to the native
exception handling improvements implemented in PR #128728.
---------
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 18, 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.

5 participants

@janvorli@am11@BrzVlad@jkotas
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Resume after catch for interpreter via native EH by janvorli · Pull Request #128728 · dotnet/runtime · GitHub
Skip to content

Resume after catch for interpreter via native EH - #128728

Merged
janvorli merged 12 commits into
dotnet:mainfrom
janvorli:resume-after-catch-via-native-eh
Jun 9, 2026
Merged

Resume after catch for interpreter via native EH#128728
janvorli merged 12 commits into
dotnet:mainfrom
janvorli:resume-after-catch-via-native-eh

Conversation

@janvorli

Copy link
Copy Markdown
Member

This changes the way resume after catch in interpreted code works. It removes the need to use libunwind and uses C++ exception handling to unwind the stack.

This is basically the same way as we use for WASM, except for some extra handling of cases when the ResumeAfterCatchException would flow into managed frames. In those cases, we skip the managed frames using the explicit frames.

@janvorlijanvorli self-assigned this May 28, 2026
CopilotAI review requested due to automatic review settings May 28, 2026 21:08
@janvorli
janvorli requested review from BrzVlad and kg as code ownersMay 28, 2026 21:08
@janvorli

Copy link
Copy Markdown
MemberAuthor

cc: @am11

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @JulieLeeMSFT, @BrzVlad, @janvorli, @kg
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 changes CoreCLR interpreter resume-after-catch handling to use native C++ exception unwinding instead of the previous libunwind/manual unwind path, adding resume-after-catch handlers at native/managed boundaries and removing stored interpreter stack-pointer state.

Changes:

  • Adds ResumeAfterCatchException rethrow helpers and install/uninstall macros for native/managed boundary handling.
  • Updates interpreter, EH, QCall, PInvoke, prestub, VSD, and allocation helper paths to use the new propagation model.
  • Removes interpreter-frame saved SP plumbing and adjusts Unix UM entry prestub personalities.

Reviewed changes

Copilot reviewed 21 out of 21 changed files in this pull request and generated 3 comments.

Show a summary per file
FileDescription
src/coreclr/vm/virtualcallstub.cppWraps VSD resolve workers with resume-after-catch handlers.
src/coreclr/vm/riscv64/asmhelpers.SChanges UM entry prestub personality to NoHandler.
src/coreclr/vm/qcall.hAdds resume-after-catch handling around QCalls.
src/coreclr/vm/prestub.cppAdds handlers around prestub and interpreted-method execution.
src/coreclr/vm/loongarch64/asmhelpers.SChanges UM entry prestub personality to NoHandler.
src/coreclr/vm/jithelpers.cppWraps throw/rethrow helpers with context-based resume handling.
src/coreclr/vm/interpexec.hRemoves obsolete saved-SP comment.
src/coreclr/vm/interpexec.cppRemoves saved-SP tracking and restores coop mode in resume-after-catch catch block.
src/coreclr/vm/i386/umthunkstub.SChanges UM entry prestub personality to NoHandler.
src/coreclr/vm/gchelpers.cppWraps failed allocation helper with resume-after-catch handling.
src/coreclr/vm/frames.hRemoves interpreter-frame saved SP field/accessors.
src/coreclr/vm/frames.cppStops passing saved interpreter SP to floating-point register update.
src/coreclr/vm/exceptmacros.hDefines new resume-after-catch handler macros.
src/coreclr/vm/exceptionhandling.hDeclares resume-after-catch rethrow helper.
src/coreclr/vm/exceptionhandling.cppImplements managed-frame skipping rethrow helpers and wraps hardware EH path.
src/coreclr/vm/excep.cppGeneralizes native-frame propagation path and removes old resume-after-catch unwind helper.
src/coreclr/vm/eetwain.cppSimplifies interpreter resume-after-catch to throw directly.
src/coreclr/vm/dllimport.cppWraps PInvoke import worker with resume-after-catch handling.
src/coreclr/vm/arm64/stubs.cppMakes arm64 inlined-call-frame interpreter check null-safe.
src/coreclr/vm/arm64/asmhelpers.SChanges UM entry prestub personality to NoHandler.
src/coreclr/vm/amd64/umthunkstub.SChanges UM entry prestub personality to NoHandler.

Comment threadsrc/coreclr/vm/exceptionhandling.cpp Outdated
Comment threadsrc/coreclr/vm/amd64/umthunkstub.S
Comment threadsrc/coreclr/vm/exceptionhandling.cpp Outdated
@janvorli

Copy link
Copy Markdown
MemberAuthor

The change was created / tested on macOS arm64. There seem to be some issues on other targets that I need to address.

This changes the way resume after catch in interpreted code works.
It removes the need to use libunwind and uses C++ exception handling
to unwind the stack.
This is basically the same way as we use for WASM, except for some
extra handling of cases when the ResumeAfterCatchException would
flow into managed frames. In those cases, we skip the managed frames
using the explicit frames.
CopilotAI review requested due to automatic review settings June 2, 2026 23:55

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

Comment threadsrc/coreclr/vm/interpexec.cpp
Comment threadsrc/coreclr/vm/exceptionhandling.cpp
CopilotAI review requested due to automatic review settings June 3, 2026 17:20
CopilotAI review requested due to automatic review settings June 8, 2026 19:59

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

Comment threadsrc/coreclr/vm/exceptmacros.h
Comment threadsrc/coreclr/vm/interpexec.cpp Outdated
@janvorli
janvorli merged commit 4a1d144 into dotnet:mainJun 9, 2026
130 checks passed
@janvorli
janvorli deleted the resume-after-catch-via-native-eh branch June 9, 2026 09:20
@clamp03clamp03 mentioned this pull request Jun 10, 2026
@github-actionsgithub-actionsBot mentioned this pull request Jun 10, 2026
BrzVlad added a commit that referenced this pull request Jun 12, 2026
Fixes regressions after #128728
where C++ throw fails to excecute because it encounters JIT frames. This
failed with `terminate called after throwing an instance of
'ResumeAfterCatchException'` on several interpreter libraries tests in
interp mode 1.
When EH needs to resume execution in the interpreter following a catch,
it throws this exception which needs to propagate all the way to the
interpreter execution loop. At managed to native boundaries we need to
catch this exception and rethrow it below the jitted frames.
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 17, 2026
janvorli pushed a commit that referenced this pull request Jul 8, 2026
This reverts the workaround previously required for the arm32
environment.
It is now safe to restore the original behavior, thanks to the native
exception handling improvements implemented in PR #128728.
---------
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
This changes the way resume after catch in interpreted code works. It
removes the need to use libunwind and uses C++ exception handling to
unwind the stack.
This is basically the same way as we use for WASM, except for some extra
handling of cases when the ResumeAfterCatchException would flow into
managed frames. In those cases, we skip the managed frames using the
explicit frames.
---------
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
Fixes regressions after #128728
where C++ throw fails to excecute because it encounters JIT frames. This
failed with `terminate called after throwing an instance of
'ResumeAfterCatchException'` on several interpreter libraries tests in
interp mode 1.
When EH needs to resume execution in the interpreter following a catch,
it throws this exception which needs to propagate all the way to the
interpreter execution loop. At managed to native boundaries we need to
catch this exception and rethrow it below the jitted frames.
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
This reverts the workaround previously required for the arm32
environment.
It is now safe to restore the original behavior, thanks to the native
exception handling improvements implemented in PR #128728.
---------
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 18, 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.

5 participants

@janvorli@am11@BrzVlad@jkotas
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Resume after catch for interpreter via native EH by janvorli · Pull Request #128728 · dotnet/runtime · GitHub
Skip to content

Resume after catch for interpreter via native EH - #128728

Merged
janvorli merged 12 commits into
dotnet:mainfrom
janvorli:resume-after-catch-via-native-eh
Jun 9, 2026
Merged

Resume after catch for interpreter via native EH#128728
janvorli merged 12 commits into
dotnet:mainfrom
janvorli:resume-after-catch-via-native-eh

Conversation

@janvorli

Copy link
Copy Markdown
Member

This changes the way resume after catch in interpreted code works. It removes the need to use libunwind and uses C++ exception handling to unwind the stack.

This is basically the same way as we use for WASM, except for some extra handling of cases when the ResumeAfterCatchException would flow into managed frames. In those cases, we skip the managed frames using the explicit frames.

@janvorlijanvorli self-assigned this May 28, 2026
CopilotAI review requested due to automatic review settings May 28, 2026 21:08
@janvorli
janvorli requested review from BrzVlad and kg as code ownersMay 28, 2026 21:08
@janvorli

Copy link
Copy Markdown
MemberAuthor

cc: @am11

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @JulieLeeMSFT, @BrzVlad, @janvorli, @kg
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 changes CoreCLR interpreter resume-after-catch handling to use native C++ exception unwinding instead of the previous libunwind/manual unwind path, adding resume-after-catch handlers at native/managed boundaries and removing stored interpreter stack-pointer state.

Changes:

  • Adds ResumeAfterCatchException rethrow helpers and install/uninstall macros for native/managed boundary handling.
  • Updates interpreter, EH, QCall, PInvoke, prestub, VSD, and allocation helper paths to use the new propagation model.
  • Removes interpreter-frame saved SP plumbing and adjusts Unix UM entry prestub personalities.

Reviewed changes

Copilot reviewed 21 out of 21 changed files in this pull request and generated 3 comments.

Show a summary per file
FileDescription
src/coreclr/vm/virtualcallstub.cppWraps VSD resolve workers with resume-after-catch handlers.
src/coreclr/vm/riscv64/asmhelpers.SChanges UM entry prestub personality to NoHandler.
src/coreclr/vm/qcall.hAdds resume-after-catch handling around QCalls.
src/coreclr/vm/prestub.cppAdds handlers around prestub and interpreted-method execution.
src/coreclr/vm/loongarch64/asmhelpers.SChanges UM entry prestub personality to NoHandler.
src/coreclr/vm/jithelpers.cppWraps throw/rethrow helpers with context-based resume handling.
src/coreclr/vm/interpexec.hRemoves obsolete saved-SP comment.
src/coreclr/vm/interpexec.cppRemoves saved-SP tracking and restores coop mode in resume-after-catch catch block.
src/coreclr/vm/i386/umthunkstub.SChanges UM entry prestub personality to NoHandler.
src/coreclr/vm/gchelpers.cppWraps failed allocation helper with resume-after-catch handling.
src/coreclr/vm/frames.hRemoves interpreter-frame saved SP field/accessors.
src/coreclr/vm/frames.cppStops passing saved interpreter SP to floating-point register update.
src/coreclr/vm/exceptmacros.hDefines new resume-after-catch handler macros.
src/coreclr/vm/exceptionhandling.hDeclares resume-after-catch rethrow helper.
src/coreclr/vm/exceptionhandling.cppImplements managed-frame skipping rethrow helpers and wraps hardware EH path.
src/coreclr/vm/excep.cppGeneralizes native-frame propagation path and removes old resume-after-catch unwind helper.
src/coreclr/vm/eetwain.cppSimplifies interpreter resume-after-catch to throw directly.
src/coreclr/vm/dllimport.cppWraps PInvoke import worker with resume-after-catch handling.
src/coreclr/vm/arm64/stubs.cppMakes arm64 inlined-call-frame interpreter check null-safe.
src/coreclr/vm/arm64/asmhelpers.SChanges UM entry prestub personality to NoHandler.
src/coreclr/vm/amd64/umthunkstub.SChanges UM entry prestub personality to NoHandler.

Comment threadsrc/coreclr/vm/exceptionhandling.cpp Outdated
Comment threadsrc/coreclr/vm/amd64/umthunkstub.S
Comment threadsrc/coreclr/vm/exceptionhandling.cpp Outdated
@janvorli

Copy link
Copy Markdown
MemberAuthor

The change was created / tested on macOS arm64. There seem to be some issues on other targets that I need to address.

This changes the way resume after catch in interpreted code works.
It removes the need to use libunwind and uses C++ exception handling
to unwind the stack.
This is basically the same way as we use for WASM, except for some
extra handling of cases when the ResumeAfterCatchException would
flow into managed frames. In those cases, we skip the managed frames
using the explicit frames.
CopilotAI review requested due to automatic review settings June 2, 2026 23:55

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

Comment threadsrc/coreclr/vm/interpexec.cpp
Comment threadsrc/coreclr/vm/exceptionhandling.cpp
CopilotAI review requested due to automatic review settings June 3, 2026 17:20
CopilotAI review requested due to automatic review settings June 8, 2026 19:59

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

Comment threadsrc/coreclr/vm/exceptmacros.h
Comment threadsrc/coreclr/vm/interpexec.cpp Outdated
@janvorli
janvorli merged commit 4a1d144 into dotnet:mainJun 9, 2026
130 checks passed
@janvorli
janvorli deleted the resume-after-catch-via-native-eh branch June 9, 2026 09:20
@clamp03clamp03 mentioned this pull request Jun 10, 2026
@github-actionsgithub-actionsBot mentioned this pull request Jun 10, 2026
BrzVlad added a commit that referenced this pull request Jun 12, 2026
Fixes regressions after #128728
where C++ throw fails to excecute because it encounters JIT frames. This
failed with `terminate called after throwing an instance of
'ResumeAfterCatchException'` on several interpreter libraries tests in
interp mode 1.
When EH needs to resume execution in the interpreter following a catch,
it throws this exception which needs to propagate all the way to the
interpreter execution loop. At managed to native boundaries we need to
catch this exception and rethrow it below the jitted frames.
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 17, 2026
janvorli pushed a commit that referenced this pull request Jul 8, 2026
This reverts the workaround previously required for the arm32
environment.
It is now safe to restore the original behavior, thanks to the native
exception handling improvements implemented in PR #128728.
---------
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
This changes the way resume after catch in interpreted code works. It
removes the need to use libunwind and uses C++ exception handling to
unwind the stack.
This is basically the same way as we use for WASM, except for some extra
handling of cases when the ResumeAfterCatchException would flow into
managed frames. In those cases, we skip the managed frames using the
explicit frames.
---------
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
Fixes regressions after #128728
where C++ throw fails to excecute because it encounters JIT frames. This
failed with `terminate called after throwing an instance of
'ResumeAfterCatchException'` on several interpreter libraries tests in
interp mode 1.
When EH needs to resume execution in the interpreter following a catch,
it throws this exception which needs to propagate all the way to the
interpreter execution loop. At managed to native boundaries we need to
catch this exception and rethrow it below the jitted frames.
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
This reverts the workaround previously required for the arm32
environment.
It is now safe to restore the original behavior, thanks to the native
exception handling improvements implemented in PR #128728.
---------
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 18, 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.

5 participants

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

Resume after catch for interpreter via native EH - #128728

Merged
janvorli merged 12 commits into
dotnet:mainfrom
janvorli:resume-after-catch-via-native-eh
Jun 9, 2026
Merged

Resume after catch for interpreter via native EH#128728
janvorli merged 12 commits into
dotnet:mainfrom
janvorli:resume-after-catch-via-native-eh

Conversation

@janvorli

Copy link
Copy Markdown
Member

This changes the way resume after catch in interpreted code works. It removes the need to use libunwind and uses C++ exception handling to unwind the stack.

This is basically the same way as we use for WASM, except for some extra handling of cases when the ResumeAfterCatchException would flow into managed frames. In those cases, we skip the managed frames using the explicit frames.

@janvorlijanvorli self-assigned this May 28, 2026
CopilotAI review requested due to automatic review settings May 28, 2026 21:08
@janvorli
janvorli requested review from BrzVlad and kg as code ownersMay 28, 2026 21:08
@janvorli

Copy link
Copy Markdown
MemberAuthor

cc: @am11

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @JulieLeeMSFT, @BrzVlad, @janvorli, @kg
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 changes CoreCLR interpreter resume-after-catch handling to use native C++ exception unwinding instead of the previous libunwind/manual unwind path, adding resume-after-catch handlers at native/managed boundaries and removing stored interpreter stack-pointer state.

Changes:

  • Adds ResumeAfterCatchException rethrow helpers and install/uninstall macros for native/managed boundary handling.
  • Updates interpreter, EH, QCall, PInvoke, prestub, VSD, and allocation helper paths to use the new propagation model.
  • Removes interpreter-frame saved SP plumbing and adjusts Unix UM entry prestub personalities.

Reviewed changes

Copilot reviewed 21 out of 21 changed files in this pull request and generated 3 comments.

Show a summary per file
FileDescription
src/coreclr/vm/virtualcallstub.cppWraps VSD resolve workers with resume-after-catch handlers.
src/coreclr/vm/riscv64/asmhelpers.SChanges UM entry prestub personality to NoHandler.
src/coreclr/vm/qcall.hAdds resume-after-catch handling around QCalls.
src/coreclr/vm/prestub.cppAdds handlers around prestub and interpreted-method execution.
src/coreclr/vm/loongarch64/asmhelpers.SChanges UM entry prestub personality to NoHandler.
src/coreclr/vm/jithelpers.cppWraps throw/rethrow helpers with context-based resume handling.
src/coreclr/vm/interpexec.hRemoves obsolete saved-SP comment.
src/coreclr/vm/interpexec.cppRemoves saved-SP tracking and restores coop mode in resume-after-catch catch block.
src/coreclr/vm/i386/umthunkstub.SChanges UM entry prestub personality to NoHandler.
src/coreclr/vm/gchelpers.cppWraps failed allocation helper with resume-after-catch handling.
src/coreclr/vm/frames.hRemoves interpreter-frame saved SP field/accessors.
src/coreclr/vm/frames.cppStops passing saved interpreter SP to floating-point register update.
src/coreclr/vm/exceptmacros.hDefines new resume-after-catch handler macros.
src/coreclr/vm/exceptionhandling.hDeclares resume-after-catch rethrow helper.
src/coreclr/vm/exceptionhandling.cppImplements managed-frame skipping rethrow helpers and wraps hardware EH path.
src/coreclr/vm/excep.cppGeneralizes native-frame propagation path and removes old resume-after-catch unwind helper.
src/coreclr/vm/eetwain.cppSimplifies interpreter resume-after-catch to throw directly.
src/coreclr/vm/dllimport.cppWraps PInvoke import worker with resume-after-catch handling.
src/coreclr/vm/arm64/stubs.cppMakes arm64 inlined-call-frame interpreter check null-safe.
src/coreclr/vm/arm64/asmhelpers.SChanges UM entry prestub personality to NoHandler.
src/coreclr/vm/amd64/umthunkstub.SChanges UM entry prestub personality to NoHandler.

Comment threadsrc/coreclr/vm/exceptionhandling.cpp Outdated
Comment threadsrc/coreclr/vm/amd64/umthunkstub.S
Comment threadsrc/coreclr/vm/exceptionhandling.cpp Outdated
@janvorli

Copy link
Copy Markdown
MemberAuthor

The change was created / tested on macOS arm64. There seem to be some issues on other targets that I need to address.

This changes the way resume after catch in interpreted code works.
It removes the need to use libunwind and uses C++ exception handling
to unwind the stack.
This is basically the same way as we use for WASM, except for some
extra handling of cases when the ResumeAfterCatchException would
flow into managed frames. In those cases, we skip the managed frames
using the explicit frames.
CopilotAI review requested due to automatic review settings June 2, 2026 23:55

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

Comment threadsrc/coreclr/vm/interpexec.cpp
Comment threadsrc/coreclr/vm/exceptionhandling.cpp
CopilotAI review requested due to automatic review settings June 3, 2026 17:20
CopilotAI review requested due to automatic review settings June 8, 2026 19:59

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

Comment threadsrc/coreclr/vm/exceptmacros.h
Comment threadsrc/coreclr/vm/interpexec.cpp Outdated
@janvorli
janvorli merged commit 4a1d144 into dotnet:mainJun 9, 2026
130 checks passed
@janvorli
janvorli deleted the resume-after-catch-via-native-eh branch June 9, 2026 09:20
@clamp03clamp03 mentioned this pull request Jun 10, 2026
@github-actionsgithub-actionsBot mentioned this pull request Jun 10, 2026
BrzVlad added a commit that referenced this pull request Jun 12, 2026
Fixes regressions after #128728
where C++ throw fails to excecute because it encounters JIT frames. This
failed with `terminate called after throwing an instance of
'ResumeAfterCatchException'` on several interpreter libraries tests in
interp mode 1.
When EH needs to resume execution in the interpreter following a catch,
it throws this exception which needs to propagate all the way to the
interpreter execution loop. At managed to native boundaries we need to
catch this exception and rethrow it below the jitted frames.
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-preview6 milestone Jun 17, 2026
janvorli pushed a commit that referenced this pull request Jul 8, 2026
This reverts the workaround previously required for the arm32
environment.
It is now safe to restore the original behavior, thanks to the native
exception handling improvements implemented in PR #128728.
---------
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
This changes the way resume after catch in interpreted code works. It
removes the need to use libunwind and uses C++ exception handling to
unwind the stack.
This is basically the same way as we use for WASM, except for some extra
handling of cases when the ResumeAfterCatchException would flow into
managed frames. In those cases, we skip the managed frames using the
explicit frames.
---------
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
Fixes regressions after #128728
where C++ throw fails to excecute because it encounters JIT frames. This
failed with `terminate called after throwing an instance of
'ResumeAfterCatchException'` on several interpreter libraries tests in
interp mode 1.
When EH needs to resume execution in the interpreter following a catch,
it throws this exception which needs to propagate all the way to the
interpreter execution loop. At managed to native boundaries we need to
catch this exception and rethrow it below the jitted frames.
eiriktsarpalis pushed a commit that referenced this pull request Jul 15, 2026
This reverts the workaround previously required for the arm32
environment.
It is now safe to restore the original behavior, thanks to the native
exception handling improvements implemented in PR #128728.
---------
Co-authored-by: Jan Kotas <jkotas@microsoft.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 18, 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.

5 participants

@janvorli@am11@BrzVlad@jkotas