-
Couldn't load subscription status.
- Fork 5.2k
Port NativeAOT exception handling to CoreCLR #88034
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
janvorli
merged 5 commits into
dotnet:main
from
janvorli:port-nativeaot-eh-to-coreclr-final-2
Aug 24, 2023
Merged
Changes from all commits
Commits
Show all changes
5 commits
Select commit
Hold shift + click to select a range
7dfebb0
Port NativeAOT exception handling to CoreCLR
janvorli 278ba85
Remove Rhp prefix from the native helpers
janvorli 28f603b
Fix handling of exceptions from JIT
janvorli c4f2147
Update UNINSTALL_UNWIND_AND_CONTINUE_HANDLER usage
janvorli dafc94d
Rename INSTALL_UNWIND_AND_CONTINUE_HANDLER_NO_PROBE
janvorli File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
213 changes: 213 additions & 0 deletions
213
src/coreclr/System.Private.CoreLib/src/System/Runtime/ExceptionServices/AsmOffsets.cs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,213 @@ | ||
| // Licensed to the .NET Foundation under one or more agreements. | ||
| // The .NET Foundation licenses this file to you under the MIT license. | ||
|
|
||
| // NOTE: This file is included also during native runtime compilation by the C++ compiler for verification purposes. | ||
| // The static asserts at the end are compiled only when this file is included in native build by c++ compiler. They | ||
| // provide compile time verification that all the sizes and offsets match between the managed and native code. | ||
|
|
||
| #if !__cplusplus | ||
| internal static | ||
| #endif | ||
| class AsmOffsets | ||
| { | ||
|
|
||
| // Offsets / sizes that are different in Release / Debug builds | ||
| #if DEBUG | ||
| // Debug build offsets | ||
| #if TARGET_AMD64 | ||
| #if TARGET_UNIX | ||
| public const int SIZEOF__REGDISPLAY = 0x1a90; | ||
| public const int OFFSETOF__REGDISPLAY__SP = 0x1a78; | ||
| public const int OFFSETOF__REGDISPLAY__ControlPC = 0x1a80; | ||
| #else // TARGET_UNIX | ||
| public const int SIZEOF__REGDISPLAY = 0xbf0; | ||
| public const int OFFSETOF__REGDISPLAY__SP = 0xbd8; | ||
| public const int OFFSETOF__REGDISPLAY__ControlPC = 0xbe0; | ||
| #endif // TARGET_UNIX | ||
| #elif TARGET_ARM64 | ||
| public const int SIZEOF__REGDISPLAY = 0x940; | ||
| public const int OFFSETOF__REGDISPLAY__SP = 0x898; | ||
| public const int OFFSETOF__REGDISPLAY__ControlPC = 0x8a0; | ||
| #elif TARGET_ARM | ||
| public const int SIZEOF__REGDISPLAY = 0x410; | ||
| public const int OFFSETOF__REGDISPLAY__SP = 0x3ec; | ||
| public const int OFFSETOF__REGDISPLAY__ControlPC = 0x3f0; | ||
| #elif TARGET_X86 | ||
| public const int SIZEOF__REGDISPLAY = 0x5fc; | ||
| public const int OFFSETOF__REGDISPLAY__SP = 0x5f0; | ||
| public const int OFFSETOF__REGDISPLAY__ControlPC = 0x5f4; | ||
| #elif TARGET_RISCV64 | ||
| public const int SIZEOF__REGDISPLAY = 0x6C0; | ||
| public const int OFFSETOF__REGDISPLAY__SP = 0x628; | ||
| public const int OFFSETOF__REGDISPLAY__ControlPC = 0x630; | ||
| #elif TARGET_LOONGARCH64 | ||
| public const int SIZEOF__REGDISPLAY = 0x6C0; | ||
| public const int OFFSETOF__REGDISPLAY__SP = 0x628; | ||
| public const int OFFSETOF__REGDISPLAY__ControlPC = 0x630; | ||
| #endif | ||
|
|
||
| #if TARGET_64BIT | ||
| public const int OFFSETOF__REGDISPLAY__m_pCurrentContext = 0x8; | ||
| public const int SIZEOF__StackFrameIterator = 0x370; | ||
| public const int OFFSETOF__StackFrameIterator__m_isRuntimeWrappedExceptions = 0x352; | ||
| public const int OFFSETOF__StackFrameIterator__m_AdjustedControlPC = 0x368; | ||
| #else // TARGET_64BIT | ||
| public const int OFFSETOF__REGDISPLAY__m_pCurrentContext = 0x4; | ||
| public const int SIZEOF__StackFrameIterator = 0x2d8; | ||
| public const int OFFSETOF__StackFrameIterator__m_isRuntimeWrappedExceptions = 0x2c2; | ||
| public const int OFFSETOF__StackFrameIterator__m_AdjustedControlPC = 0x2d0; | ||
| #endif // TARGET_64BIT | ||
|
|
||
| #else // DEBUG | ||
| // Release build offsets | ||
| #if TARGET_AMD64 | ||
| #if TARGET_UNIX | ||
| public const int SIZEOF__REGDISPLAY = 0x1a80; | ||
| public const int OFFSETOF__REGDISPLAY__SP = 0x1a70; | ||
| public const int OFFSETOF__REGDISPLAY__ControlPC = 0x1a78; | ||
| #else // TARGET_UNIX | ||
| public const int SIZEOF__REGDISPLAY = 0xbe0; | ||
| public const int OFFSETOF__REGDISPLAY__SP = 0xbd0; | ||
| public const int OFFSETOF__REGDISPLAY__ControlPC = 0xbd8; | ||
| #endif // TARGET_UNIX | ||
| #elif TARGET_ARM64 | ||
| public const int SIZEOF__REGDISPLAY = 0x930; | ||
| public const int OFFSETOF__REGDISPLAY__SP = 0x890; | ||
| public const int OFFSETOF__REGDISPLAY__ControlPC = 0x898; | ||
| #elif TARGET_ARM | ||
| public const int SIZEOF__REGDISPLAY = 0x408; | ||
| public const int OFFSETOF__REGDISPLAY__SP = 0x3e8; | ||
| public const int OFFSETOF__REGDISPLAY__ControlPC = 0x3ec; | ||
| #elif TARGET_X86 | ||
| public const int SIZEOF__REGDISPLAY = 0x5f8; | ||
| public const int OFFSETOF__REGDISPLAY__SP = 0x5ec; | ||
| public const int OFFSETOF__REGDISPLAY__ControlPC = 0x5f0; | ||
| #elif TARGET_RISCV64 | ||
| public const int SIZEOF__REGDISPLAY = 0x6B0; | ||
| public const int OFFSETOF__REGDISPLAY__SP = 0x620; | ||
| public const int OFFSETOF__REGDISPLAY__ControlPC = 0x628; | ||
| #elif TARGET_LOONGARCH64 | ||
| public const int SIZEOF__REGDISPLAY = 0x6B0; | ||
| public const int OFFSETOF__REGDISPLAY__SP = 0x620; | ||
| public const int OFFSETOF__REGDISPLAY__ControlPC = 0x628; | ||
| #endif | ||
|
|
||
| #if TARGET_64BIT | ||
| public const int OFFSETOF__REGDISPLAY__m_pCurrentContext = 0x8; | ||
| public const int SIZEOF__StackFrameIterator = 0x370; | ||
| public const int OFFSETOF__StackFrameIterator__m_isRuntimeWrappedExceptions = 0x34a; | ||
| public const int OFFSETOF__StackFrameIterator__m_AdjustedControlPC = 0x360; | ||
| #else // TARGET_64BIT | ||
| public const int OFFSETOF__REGDISPLAY__m_pCurrentContext = 0x4; | ||
| public const int SIZEOF__StackFrameIterator = 0x2d0; | ||
| public const int OFFSETOF__StackFrameIterator__m_isRuntimeWrappedExceptions = 0x2ba; | ||
| public const int OFFSETOF__StackFrameIterator__m_AdjustedControlPC = 0x2c8; | ||
| #endif // TARGET_64BIT | ||
|
|
||
| #endif // DEBUG | ||
|
|
||
| #if TARGET_AMD64 | ||
| #if TARGET_UNIX | ||
| public const int SIZEOF__PAL_LIMITED_CONTEXT = 0xc20; | ||
| #else // TARGET_UNIX | ||
| public const int SIZEOF__PAL_LIMITED_CONTEXT = 0x4d0; | ||
| #endif // TARGET_UNIx | ||
| #elif TARGET_ARM64 | ||
| public const int SIZEOF__PAL_LIMITED_CONTEXT = 0x390; | ||
| #elif TARGET_ARM | ||
| public const int SIZEOF__PAL_LIMITED_CONTEXT = 0x1a0; | ||
| #elif TARGET_X86 | ||
| public const int SIZEOF__PAL_LIMITED_CONTEXT = 0x2cc; | ||
| #elif TARGET_RISCV64 | ||
| public const int SIZEOF__PAL_LIMITED_CONTEXT = 0x220; | ||
| #elif TARGET_LOONGARCH64 | ||
| public const int SIZEOF__PAL_LIMITED_CONTEXT = 0x220; | ||
| #endif | ||
|
|
||
| #if TARGET_AMD64 | ||
| public const int OFFSETOF__PAL_LIMITED_CONTEXT__IP = 0xf8; | ||
| public const int OFFSETOF__PAL_LIMITED_CONTEXT__FP = 0xa0; | ||
| #elif TARGET_ARM64 | ||
| public const int OFFSETOF__PAL_LIMITED_CONTEXT__IP = 0x108; | ||
| public const int OFFSETOF__PAL_LIMITED_CONTEXT__FP = 0xf0; | ||
| #elif TARGET_ARM | ||
| public const int OFFSETOF__PAL_LIMITED_CONTEXT__IP = 0x40; | ||
| public const int OFFSETOF__PAL_LIMITED_CONTEXT__FP = 0x30; | ||
| #elif TARGET_X86 | ||
| public const int OFFSETOF__PAL_LIMITED_CONTEXT__IP = 0xb8; | ||
| public const int OFFSETOF__PAL_LIMITED_CONTEXT__FP = 0xb4; | ||
| #elif TARGET_RISCV64 | ||
| public const int OFFSETOF__PAL_LIMITED_CONTEXT__IP = 0x108; | ||
| public const int OFFSETOF__PAL_LIMITED_CONTEXT__FP = 0x48; | ||
| #elif TARGET_LOONGARCH64 | ||
| public const int OFFSETOF__PAL_LIMITED_CONTEXT__IP = 0x108; | ||
| public const int OFFSETOF__PAL_LIMITED_CONTEXT__FP = 0x48; | ||
| #endif | ||
|
|
||
| // Offsets / sizes that are different in 64 / 32 bit mode | ||
|
|
||
| #if TARGET_64BIT | ||
| public const int SIZEOF__EHEnum = 0x20; | ||
| public const int OFFSETOF__StackFrameIterator__m_pRegDisplay = 0x228; | ||
| public const int OFFSETOF__ExInfo__m_pPrevExInfo = 0; | ||
| public const int OFFSETOF__ExInfo__m_pExContext = 8; | ||
| public const int OFFSETOF__ExInfo__m_exception = 0x10; | ||
| public const int OFFSETOF__ExInfo__m_kind = 0x18; | ||
| public const int OFFSETOF__ExInfo__m_passNumber = 0x19; | ||
| public const int OFFSETOF__ExInfo__m_idxCurClause = 0x1c; | ||
| public const int OFFSETOF__ExInfo__m_frameIter = 0x20; | ||
| public const int OFFSETOF__ExInfo__m_notifyDebuggerSP = OFFSETOF__ExInfo__m_frameIter + SIZEOF__StackFrameIterator; | ||
| #else // TARGET_64BIT | ||
| public const int SIZEOF__EHEnum = 0x10; | ||
| public const int OFFSETOF__StackFrameIterator__m_pRegDisplay = 0x218; | ||
| public const int OFFSETOF__ExInfo__m_pPrevExInfo = 0; | ||
| public const int OFFSETOF__ExInfo__m_pExContext = 4; | ||
| public const int OFFSETOF__ExInfo__m_exception = 8; | ||
| public const int OFFSETOF__ExInfo__m_kind = 0xC; | ||
| public const int OFFSETOF__ExInfo__m_passNumber = 0xD; | ||
| public const int OFFSETOF__ExInfo__m_idxCurClause = 0x10; | ||
| public const int OFFSETOF__ExInfo__m_frameIter = 0x18; | ||
| public const int OFFSETOF__ExInfo__m_notifyDebuggerSP = OFFSETOF__ExInfo__m_frameIter + SIZEOF__StackFrameIterator; | ||
| #endif // TARGET_64BIT | ||
|
|
||
| #if __cplusplus | ||
| static_assert_no_msg(sizeof(CONTEXT) == AsmOffsets::SIZEOF__PAL_LIMITED_CONTEXT); | ||
| #if TARGET_AMD64 | ||
| static_assert_no_msg(offsetof(CONTEXT, Rip) == AsmOffsets::OFFSETOF__PAL_LIMITED_CONTEXT__IP); | ||
| static_assert_no_msg(offsetof(CONTEXT, Rbp) == AsmOffsets::OFFSETOF__PAL_LIMITED_CONTEXT__FP); | ||
| #elif TARGET_ARM64 | ||
| static_assert_no_msg(offsetof(CONTEXT, Pc) == AsmOffsets::OFFSETOF__PAL_LIMITED_CONTEXT__IP); | ||
| static_assert_no_msg(offsetof(CONTEXT, Fp) == AsmOffsets::OFFSETOF__PAL_LIMITED_CONTEXT__FP); | ||
| #elif TARGET_ARM | ||
| static_assert_no_msg(offsetof(CONTEXT, Pc) == AsmOffsets::OFFSETOF__PAL_LIMITED_CONTEXT__IP); | ||
| static_assert_no_msg(offsetof(CONTEXT, R11) == AsmOffsets::OFFSETOF__PAL_LIMITED_CONTEXT__FP); | ||
| #elif TARGET_X86 | ||
| static_assert_no_msg(offsetof(CONTEXT, Eip) == AsmOffsets::OFFSETOF__PAL_LIMITED_CONTEXT__IP); | ||
| static_assert_no_msg(offsetof(CONTEXT, Ebp) == AsmOffsets::OFFSETOF__PAL_LIMITED_CONTEXT__FP); | ||
| #elif TARGET_RISCV64 | ||
| static_assert_no_msg(offsetof(CONTEXT, Pc) == AsmOffsets::OFFSETOF__PAL_LIMITED_CONTEXT__IP); | ||
| static_assert_no_msg(offsetof(CONTEXT, Fp) == AsmOffsets::OFFSETOF__PAL_LIMITED_CONTEXT__FP); | ||
| #endif | ||
| static_assert_no_msg(sizeof(REGDISPLAY) == AsmOffsets::SIZEOF__REGDISPLAY); | ||
| static_assert_no_msg(offsetof(REGDISPLAY, SP) == AsmOffsets::OFFSETOF__REGDISPLAY__SP); | ||
| static_assert_no_msg(offsetof(REGDISPLAY, ControlPC) == AsmOffsets::OFFSETOF__REGDISPLAY__ControlPC); | ||
| static_assert_no_msg(offsetof(REGDISPLAY, pCurrentContext) == AsmOffsets::OFFSETOF__REGDISPLAY__m_pCurrentContext); | ||
| static_assert_no_msg(sizeof(StackFrameIterator) == AsmOffsets::SIZEOF__StackFrameIterator); | ||
| static_assert_no_msg(offsetof(StackFrameIterator, m_crawl) + offsetof(CrawlFrame, pRD) == OFFSETOF__StackFrameIterator__m_pRegDisplay); | ||
| static_assert_no_msg(offsetof(StackFrameIterator, m_isRuntimeWrappedExceptions) == OFFSETOF__StackFrameIterator__m_isRuntimeWrappedExceptions); | ||
| static_assert_no_msg(offsetof(StackFrameIterator, m_AdjustedControlPC) == OFFSETOF__StackFrameIterator__m_AdjustedControlPC); | ||
| static_assert_no_msg(sizeof(ExtendedEHClauseEnumerator) == AsmOffsets::SIZEOF__EHEnum); | ||
| static_assert_no_msg(offsetof(ExInfo, m_pPrevExInfo) == OFFSETOF__ExInfo__m_pPrevExInfo); | ||
| static_assert_no_msg(offsetof(ExInfo, m_pExContext) == OFFSETOF__ExInfo__m_pExContext); | ||
| static_assert_no_msg(offsetof(ExInfo, m_exception) == OFFSETOF__ExInfo__m_exception); | ||
| static_assert_no_msg(offsetof(ExInfo, m_kind) == OFFSETOF__ExInfo__m_kind); | ||
| static_assert_no_msg(offsetof(ExInfo, m_passNumber) == OFFSETOF__ExInfo__m_passNumber); | ||
| static_assert_no_msg(offsetof(ExInfo, m_idxCurClause) == OFFSETOF__ExInfo__m_idxCurClause); | ||
| static_assert_no_msg(offsetof(ExInfo, m_frameIter) == OFFSETOF__ExInfo__m_frameIter); | ||
| static_assert_no_msg(offsetof(ExInfo, m_notifyDebuggerSP) == OFFSETOF__ExInfo__m_notifyDebuggerSP); | ||
| #endif | ||
|
|
||
| } | ||
| #if __cplusplus | ||
| ; | ||
| #endif |
48 changes: 48 additions & 0 deletions
48
src/coreclr/System.Private.CoreLib/src/System/Runtime/ExceptionServices/InternalCalls.cs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,48 @@ | ||
| // Licensed to the .NET Foundation under one or more agreements. | ||
| // The .NET Foundation licenses this file to you under the MIT license. | ||
|
|
||
| // | ||
| // This is where we group together all the internal calls. | ||
| // | ||
|
|
||
| using System.Runtime.InteropServices; | ||
| using System.Runtime.CompilerServices; | ||
|
|
||
| namespace System.Runtime.ExceptionServices | ||
| { | ||
| internal static partial class InternalCalls | ||
| { | ||
| [LibraryImport(RuntimeHelpers.QCall, EntryPoint = "SfiInit")] | ||
| [return: MarshalAs(UnmanagedType.Bool)] | ||
| internal static unsafe partial bool RhpSfiInit(ref StackFrameIterator pThis, void* pStackwalkCtx, [MarshalAs(UnmanagedType.Bool)] bool instructionFault); | ||
|
|
||
| [LibraryImport(RuntimeHelpers.QCall, EntryPoint = "SfiNext")] | ||
| [return: MarshalAs(UnmanagedType.Bool)] | ||
| internal static unsafe partial bool RhpSfiNext(ref StackFrameIterator pThis, uint* uExCollideClauseIdx, bool* fUnwoundReversePInvoke); | ||
|
|
||
| #pragma warning disable CS8500 | ||
| [LibraryImport(RuntimeHelpers.QCall, EntryPoint = "CallCatchFunclet")] | ||
| internal static unsafe partial IntPtr RhpCallCatchFunclet( | ||
| ObjectHandleOnStack exceptionObj, byte* pHandlerIP, void* pvRegDisplay, EH.ExInfo* exInfo); | ||
|
|
||
| [LibraryImport(RuntimeHelpers.QCall, EntryPoint = "CallFinallyFunclet")] | ||
| internal static unsafe partial void RhpCallFinallyFunclet(byte* pHandlerIP, void* pvRegDisplay, EH.ExInfo* exInfo); | ||
|
|
||
| [LibraryImport(RuntimeHelpers.QCall, EntryPoint = "CallFilterFunclet")] | ||
| [return: MarshalAs(UnmanagedType.Bool)] | ||
| internal static unsafe partial bool RhpCallFilterFunclet( | ||
| ObjectHandleOnStack exceptionObj, byte* pFilterIP, void* pvRegDisplay); | ||
|
|
||
| [LibraryImport(RuntimeHelpers.QCall, EntryPoint = "AppendExceptionStackFrame")] | ||
| internal static unsafe partial void RhpAppendExceptionStackFrame(ObjectHandleOnStack exceptionObj, IntPtr ip, UIntPtr sp, int flags, EH.ExInfo* exInfo); | ||
| #pragma warning restore CS8500 | ||
|
|
||
| [LibraryImport(RuntimeHelpers.QCall, EntryPoint = "EHEnumInitFromStackFrameIterator")] | ||
| [return: MarshalAs(UnmanagedType.Bool)] | ||
| internal static unsafe partial bool RhpEHEnumInitFromStackFrameIterator(ref StackFrameIterator pFrameIter, byte** pMethodStartAddress, void* pEHEnum); | ||
|
|
||
| [LibraryImport(RuntimeHelpers.QCall, EntryPoint = "EHEnumNext")] | ||
| [return: MarshalAs(UnmanagedType.Bool)] | ||
| internal static unsafe partial bool RhpEHEnumNext(void* pEHEnum, void* pEHClause); | ||
| } | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.