diff options
author | Scott Mosier <smosier@microsoft.com> | 2016-06-15 01:58:38 +0300 |
---|---|---|
committer | Scott Mosier <smosier@microsoft.com> | 2016-06-15 01:58:38 +0300 |
commit | a0124b03284c2f790a36d1e671c72a6a186b7a7a (patch) | |
tree | d0cd5e970391825ee453ccf553df5b204772f919 /src/Native/Runtime/ICodeManager.h | |
parent | 1c852985291c3828c169264408f81bbe1fd9c4c7 (diff) |
ICodeManager refactoring to support separated funclets
Today, we assume that funclets are separate methods, in the sense that they get unique unwind information, but that's where the separation ends. They are still tightly coupled to their "parent method" in other ways. One of those couplings is the fact that they must be laid out contiguously with the parent method. These changes update the EH dispatcher and the ICodeManager abstraction to allow for funclets to be disconnected from their parent method. This mostly falls into the category of using addresses instead of offsets when referring to handlers and when handling the special case of "remapping" a hardware fault location to a safe point in an associated handler.
[tfs-changeset: 1612757]
Diffstat (limited to 'src/Native/Runtime/ICodeManager.h')
-rw-r--r-- | src/Native/Runtime/ICodeManager.h | 13 |
1 files changed, 5 insertions, 8 deletions
diff --git a/src/Native/Runtime/ICodeManager.h b/src/Native/Runtime/ICodeManager.h index c3be1bcd9..e9c5cc9aa 100644 --- a/src/Native/Runtime/ICodeManager.h +++ b/src/Native/Runtime/ICodeManager.h @@ -61,8 +61,8 @@ struct EHClause EHClauseKind m_clauseKind; UInt32 m_tryStartOffset; UInt32 m_tryEndOffset; - UInt32 m_filterOffset; - UInt32 m_handlerOffset; + UInt8* m_filterAddress; + UInt8* m_handlerAddress; void* m_pTargetType; }; @@ -81,8 +81,7 @@ class ICodeManager { public: virtual bool FindMethodInfo(PTR_VOID ControlPC, - MethodInfo * pMethodInfoOut, - UInt32 * pCodeOffset) = 0; + MethodInfo * pMethodInfoOut) = 0; virtual bool IsFunclet(MethodInfo * pMethodInfo) = 0; @@ -90,12 +89,11 @@ public: REGDISPLAY * pRegisterSet) = 0; virtual void EnumGcRefs(MethodInfo * pMethodInfo, - UInt32 codeOffset, + PTR_VOID safePointAddress, REGDISPLAY * pRegisterSet, GCEnumContext * hCallback) = 0; virtual bool UnwindStackFrame(MethodInfo * pMethodInfo, - UInt32 codeOffset, REGDISPLAY * pRegisterSet, // in/out PTR_VOID * ppPreviousTransitionFrame) = 0; // out @@ -103,14 +101,13 @@ public: REGDISPLAY * pRegisterSet) = 0; virtual bool GetReturnAddressHijackInfo(MethodInfo * pMethodInfo, - UInt32 codeOffset, REGDISPLAY * pRegisterSet, // in PTR_PTR_VOID * ppvRetAddrLocation, // out GCRefKind * pRetValueKind) = 0; // out virtual void UnsynchronizedHijackMethodLoops(MethodInfo * pMethodInfo) = 0; - virtual void RemapHardwareFaultToGCSafePoint(MethodInfo * pMethodInfo, UInt32 * pCodeOffset) = 0; + virtual PTR_VOID RemapHardwareFaultToGCSafePoint(MethodInfo * pMethodInfo, PTR_VOID controlPC) = 0; virtual bool EHEnumInit(MethodInfo * pMethodInfo, PTR_VOID * pMethodStartAddress, EHEnumState * pEHEnumState) = 0; |