Skip to content

Commit 81138d7

Browse files
committed
Remove HMF from IL_Throw/IL_ThrowExact/IL_Rethrow
1 parent 4352c7a commit 81138d7

File tree

6 files changed

+60
-55
lines changed

6 files changed

+60
-55
lines changed

src/coreclr/debug/runtimeinfo/datadescriptor.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -677,13 +677,11 @@ CDAC_TYPE_FIELD(InlinedCallFrame, /*pointer*/, CallerReturnAddress, offsetof(Inl
677677
CDAC_TYPE_FIELD(InlinedCallFrame, /*pointer*/, CalleeSavedFP, offsetof(InlinedCallFrame, m_pCalleeSavedFP))
678678
CDAC_TYPE_END(InlinedCallFrame)
679679

680-
#ifdef FEATURE_EH_FUNCLETS
681680
CDAC_TYPE_BEGIN(SoftwareExceptionFrame)
682681
CDAC_TYPE_SIZE(sizeof(SoftwareExceptionFrame))
683682
CDAC_TYPE_FIELD(SoftwareExceptionFrame, /*T_CONTEXT*/, TargetContext, cdac_data<SoftwareExceptionFrame>::TargetContext)
684683
CDAC_TYPE_FIELD(SoftwareExceptionFrame, /*pointer*/, ReturnAddress, cdac_data<SoftwareExceptionFrame>::ReturnAddress)
685684
CDAC_TYPE_END(SoftwareExceptionFrame)
686-
#endif // FEATURE_EH_FUNCLETS
687685

688686
CDAC_TYPE_BEGIN(FramedMethodFrame)
689687
CDAC_TYPE_SIZE(sizeof(FramedMethodFrame))

src/coreclr/vm/FrameTypes.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,7 @@ FRAME_TYPE_NAME(ResumableFrame)
1414
FRAME_TYPE_NAME(RedirectedThreadFrame)
1515
#endif // FEATURE_HIJACK
1616
FRAME_TYPE_NAME(FaultingExceptionFrame)
17-
#ifdef FEATURE_EH_FUNCLETS
1817
FRAME_TYPE_NAME(SoftwareExceptionFrame)
19-
#endif // FEATURE_EH_FUNCLETS
2018
#ifdef DEBUGGING_SUPPORTED
2119
FRAME_TYPE_NAME(FuncEvalFrame)
2220
#endif // DEBUGGING_SUPPORTED

src/coreclr/vm/excep.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11315,12 +11315,11 @@ MethodDesc * GetUserMethodForILStub(Thread * pThread, UINT_PTR uStubSP, MethodDe
1131511315
}
1131611316

1131711317

11318-
#ifdef FEATURE_EH_FUNCLETS
11319-
1132011318
void SoftwareExceptionFrame::UpdateRegDisplay_Impl(const PREGDISPLAY pRD, bool updateFloats)
1132111319
{
1132211320
LIMITED_METHOD_DAC_CONTRACT;
1132311321

11322+
#ifdef FEATURE_EH_FUNCLETS
1132411323
#define CALLEE_SAVED_REGISTER(regname) pRD->pCurrentContext->regname = *dac_cast<PTR_SIZE_T>((TADDR)m_ContextPointers.regname);
1132511324
ENUM_CALLEE_SAVED_REGISTERS();
1132611325
#undef CALLEE_SAVED_REGISTER
@@ -11341,6 +11340,16 @@ void SoftwareExceptionFrame::UpdateRegDisplay_Impl(const PREGDISPLAY pRD, bool u
1134111340

1134211341
pRD->IsCallerContextValid = FALSE;
1134311342
pRD->IsCallerSPValid = FALSE; // Don't add usage of this field. This is only temporary.
11343+
#elif defined(TARGET_X86)
11344+
#define CALLEE_SAVED_REGISTER(regname) pRD->Set##regname##Location(m_ContextPointers.regname);
11345+
ENUM_CALLEE_SAVED_REGISTERS();
11346+
#undef CALLEE_SAVED_REGISTER
11347+
11348+
pRD->ControlPC = ::GetIP(&m_Context);
11349+
pRD->SP = ::GetSP(&m_Context);
11350+
#else // FEATURE_EH_FUNCLETS
11351+
PORTABILITY_ASSERT("SoftwareExceptionFrame::UpdateRegDisplay_Impl");
11352+
#endif // FEATURE_EH_FUNCLETS
1134411353
}
1134511354

1134611355
#ifndef DACCESS_COMPILE
@@ -11421,4 +11430,3 @@ void SoftwareExceptionFrame::InitAndLink(Thread *pThread)
1142111430
}
1142211431

1142311432
#endif // DACCESS_COMPILE
11424-
#endif // FEATURE_EH_FUNCLETS

src/coreclr/vm/frames.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1035,8 +1035,6 @@ struct cdac_data<FaultingExceptionFrame>
10351035
#endif // FEATURE_EH_FUNCLETS
10361036
};
10371037

1038-
#ifdef FEATURE_EH_FUNCLETS
1039-
10401038
typedef DPTR(class SoftwareExceptionFrame) PTR_SoftwareExceptionFrame;
10411039

10421040
class SoftwareExceptionFrame : public Frame
@@ -1108,7 +1106,6 @@ struct cdac_data<SoftwareExceptionFrame>
11081106
static constexpr size_t TargetContext = offsetof(SoftwareExceptionFrame, m_Context);
11091107
static constexpr size_t ReturnAddress = offsetof(SoftwareExceptionFrame, m_ReturnAddress);
11101108
};
1111-
#endif // FEATURE_EH_FUNCLETS
11121109

11131110
//-----------------------------------------------------------------------
11141111
// Frame for debugger function evaluation

src/coreclr/vm/i386/asmhelpers.asm

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -90,11 +90,9 @@ EXTERN g_chained_lookup_miss_counter:DWORD
9090
EXTERN g_dispatch_cache_chain_success_counter:DWORD
9191
endif
9292

93-
ifdef FEATURE_EH_FUNCLETS
9493
EXTERN @IL_Throw_x86@8:PROC
9594
EXTERN @IL_ThrowExact_x86@8:PROC
9695
EXTERN @IL_Rethrow_x86@4:PROC
97-
endif ; FEATURE_EH_FUNCLETS
9896

9997
UNREFERENCED macro arg
10098
local unref
@@ -1894,7 +1892,6 @@ _BackPatchWorkerAsmStub@0 proc public
18941892
ret
18951893
_BackPatchWorkerAsmStub@0 endp
18961894

1897-
ifdef FEATURE_EH_FUNCLETS
18981895
;==========================================================================
18991896
; Capture a transition block with register values and call the IL_Throw
19001897
; implementation written in C.
@@ -1942,6 +1939,5 @@ FASTCALL_FUNC IL_Rethrow, 0
19421939
STUB_EPILOG
19431940
ret 4
19441941
FASTCALL_ENDFUNC IL_Rethrow
1945-
endif ; FEATURE_EH_FUNCLETS
19461942

19471943
end

src/coreclr/vm/jithelpers.cpp

Lines changed: 49 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1225,11 +1225,11 @@ HCIMPLEND
12251225

12261226
/*************************************************************/
12271227

1228-
#if defined(TARGET_X86) && defined(FEATURE_EH_FUNCLETS)
1228+
#if defined(TARGET_X86)
12291229
EXTERN_C FCDECL1(void, IL_Throw, Object* obj);
1230-
EXTERN_C HCIMPL2(void, IL_Throw_x86, Object* obj, TransitionBlock* transitionBlock)
1230+
EXTERN_C FCIMPL2(void, IL_Throw_x86, Object* obj, TransitionBlock* transitionBlock)
12311231
#else
1232-
HCIMPL1(void, IL_Throw, Object* obj)
1232+
FCIMPL1(void, IL_Throw, Object* obj)
12331233
#endif
12341234
{
12351235
FCALL_CONTRACT;
@@ -1241,8 +1241,6 @@ HCIMPL1(void, IL_Throw, Object* obj)
12411241

12421242
OBJECTREF oref = ObjectToOBJECTREF(obj);
12431243

1244-
#ifdef FEATURE_EH_FUNCLETS
1245-
12461244
Thread *pThread = GetThread();
12471245

12481246
SoftwareExceptionFrame exceptionFrame;
@@ -1255,6 +1253,7 @@ HCIMPL1(void, IL_Throw, Object* obj)
12551253

12561254
FC_CAN_TRIGGER_GC();
12571255

1256+
#ifdef FEATURE_EH_FUNCLETS
12581257
if (oref == 0)
12591258
DispatchManagedException(kNullReferenceException);
12601259
else
@@ -1282,15 +1281,12 @@ HCIMPL1(void, IL_Throw, Object* obj)
12821281
}
12831282

12841283
DispatchManagedException(oref, exceptionFrame.GetContext());
1285-
FC_CAN_TRIGGER_GC_END();
1286-
UNREACHABLE();
1287-
#endif // FEATURE_EH_FUNCLETS
1288-
1289-
HELPER_METHOD_FRAME_BEGIN_ATTRIB_NOPOLL(Frame::FRAME_ATTR_EXCEPTION); // Set up a frame
1284+
#else // FEATURE_EH_FUNCLETS
1285+
INSTALL_MANAGED_EXCEPTION_DISPATCHER;
1286+
INSTALL_UNWIND_AND_CONTINUE_HANDLER;
12901287

12911288
#if defined(_DEBUG) && defined(TARGET_X86)
1292-
__helperframe.EnsureInit(NULL);
1293-
g_ExceptionEIP = (LPVOID)__helperframe.GetReturnAddress();
1289+
g_ExceptionEIP = transitionBlock->m_ReturnAddress;
12941290
#endif // defined(_DEBUG) && defined(TARGET_X86)
12951291

12961292
if (oref == 0)
@@ -1321,24 +1317,28 @@ HCIMPL1(void, IL_Throw, Object* obj)
13211317

13221318
RaiseTheExceptionInternalOnly(oref, FALSE);
13231319

1324-
HELPER_METHOD_FRAME_END();
1320+
UNINSTALL_UNWIND_AND_CONTINUE_HANDLER;
1321+
UNINSTALL_MANAGED_EXCEPTION_DISPATCHER;
1322+
#endif // FEATURE_EH_FUNCLETS
1323+
1324+
FC_CAN_TRIGGER_GC_END();
1325+
UNREACHABLE();
13251326
}
1326-
HCIMPLEND
1327+
FCIMPLEND
13271328

13281329
/*************************************************************/
13291330

1330-
#if defined(TARGET_X86) && defined(FEATURE_EH_FUNCLETS)
1331+
#if defined(TARGET_X86)
13311332
EXTERN_C FCDECL0(void, IL_Rethrow);
1332-
EXTERN_C HCIMPL1(void, IL_Rethrow_x86, TransitionBlock* transitionBlock)
1333+
EXTERN_C FCIMPL1(void, IL_Rethrow_x86, TransitionBlock* transitionBlock)
13331334
#else
1334-
HCIMPL0(void, IL_Rethrow)
1335+
FCIMPL0(void, IL_Rethrow)
13351336
#endif
13361337
{
13371338
FCALL_CONTRACT;
13381339

13391340
FC_GC_POLL_NOT_NEEDED(); // throws always open up for GC
13401341

1341-
#ifdef FEATURE_EH_FUNCLETS
13421342
Thread *pThread = GetThread();
13431343

13441344
SoftwareExceptionFrame exceptionFrame;
@@ -1349,12 +1349,13 @@ HCIMPL0(void, IL_Rethrow)
13491349
#endif
13501350
exceptionFrame.InitAndLink(pThread);
13511351

1352+
FC_CAN_TRIGGER_GC();
1353+
1354+
#ifdef FEATURE_EH_FUNCLETS
13521355
ExInfo *pActiveExInfo = (ExInfo*)pThread->GetExceptionState()->GetCurrentExceptionTracker();
13531356

13541357
ExInfo exInfo(pThread, pActiveExInfo->m_ptrs.ExceptionRecord, exceptionFrame.GetContext(), ExKind::None);
13551358

1356-
FC_CAN_TRIGGER_GC();
1357-
13581359
GCPROTECT_BEGIN(exInfo.m_exception);
13591360
PREPARE_NONVIRTUAL_CALLSITE(METHOD__EH__RH_RETHROW);
13601361
DECLARE_ARGHOLDER_ARRAY(args, 2);
@@ -1367,12 +1368,9 @@ HCIMPL0(void, IL_Rethrow)
13671368
//Ex.RhRethrow(ref ExInfo activeExInfo, ref ExInfo exInfo)
13681369
CALL_MANAGED_METHOD_NORET(args)
13691370
GCPROTECT_END();
1370-
1371-
FC_CAN_TRIGGER_GC_END();
1372-
UNREACHABLE();
1373-
#endif
1374-
1375-
HELPER_METHOD_FRAME_BEGIN_ATTRIB_NOPOLL(Frame::FRAME_ATTR_EXCEPTION); // Set up a frame
1371+
#else // FEATURE_EH_FUNCLETS
1372+
INSTALL_MANAGED_EXCEPTION_DISPATCHER;
1373+
INSTALL_UNWIND_AND_CONTINUE_HANDLER;
13761374

13771375
OBJECTREF throwable = GetThread()->GetThrowable();
13781376
if (throwable != NULL)
@@ -1386,15 +1384,20 @@ HCIMPL0(void, IL_Rethrow)
13861384
RealCOMPlusThrow(kInvalidProgramException, (UINT)IDS_EE_RETHROW_NOT_ALLOWED);
13871385
}
13881386

1389-
HELPER_METHOD_FRAME_END();
1387+
UNINSTALL_UNWIND_AND_CONTINUE_HANDLER;
1388+
UNINSTALL_MANAGED_EXCEPTION_DISPATCHER;
1389+
#endif // FEATURE_EH_FUNCLETS
1390+
1391+
FC_CAN_TRIGGER_GC_END();
1392+
UNREACHABLE();
13901393
}
1391-
HCIMPLEND
1394+
FCIMPLEND
13921395

1393-
#if defined(TARGET_X86) && defined(FEATURE_EH_FUNCLETS)
1396+
#if defined(TARGET_X86)
13941397
EXTERN_C FCDECL1(void, IL_ThrowExact, Object* obj);
1395-
EXTERN_C HCIMPL2(void, IL_ThrowExact_x86, Object* obj, TransitionBlock* transitionBlock)
1398+
EXTERN_C FCIMPL2(void, IL_ThrowExact_x86, Object* obj, TransitionBlock* transitionBlock)
13961399
#else
1397-
HCIMPL1(void, IL_ThrowExact, Object* obj)
1400+
FCIMPL1(void, IL_ThrowExact, Object* obj)
13981401
#endif
13991402
{
14001403
FCALL_CONTRACT;
@@ -1407,7 +1410,6 @@ HCIMPL1(void, IL_ThrowExact, Object* obj)
14071410
OBJECTREF oref = ObjectToOBJECTREF(obj);
14081411
GetThread()->GetExceptionState()->SetRaisingForeignException();
14091412

1410-
#ifdef FEATURE_EH_FUNCLETS
14111413
Thread *pThread = GetThread();
14121414

14131415
SoftwareExceptionFrame exceptionFrame;
@@ -1419,21 +1421,27 @@ HCIMPL1(void, IL_ThrowExact, Object* obj)
14191421
exceptionFrame.InitAndLink(pThread);
14201422

14211423
FC_CAN_TRIGGER_GC();
1424+
1425+
#ifdef FEATURE_EH_FUNCLETS
14221426
DispatchManagedException(oref, exceptionFrame.GetContext());
1423-
FC_CAN_TRIGGER_GC_END();
1424-
UNREACHABLE();
1425-
#else
1426-
HELPER_METHOD_FRAME_BEGIN_ATTRIB_NOPOLL(Frame::FRAME_ATTR_EXCEPTION); // Set up a frame
1427+
#else // FEATURE_EH_FUNCLETS
1428+
INSTALL_MANAGED_EXCEPTION_DISPATCHER;
1429+
INSTALL_UNWIND_AND_CONTINUE_HANDLER;
1430+
14271431
#if defined(_DEBUG) && defined(TARGET_X86)
1428-
__helperframe.EnsureInit(NULL);
1429-
g_ExceptionEIP = (LPVOID)__helperframe.GetReturnAddress();
1432+
g_ExceptionEIP = transitionBlock->m_ReturnAddress;
14301433
#endif // defined(_DEBUG) && defined(TARGET_X86)
14311434

14321435
RaiseTheExceptionInternalOnly(oref, FALSE);
1433-
HELPER_METHOD_FRAME_END();
1434-
#endif
1436+
1437+
UNINSTALL_UNWIND_AND_CONTINUE_HANDLER;
1438+
UNINSTALL_MANAGED_EXCEPTION_DISPATCHER;
1439+
#endif // FEATURE_EH_FUNCLETS
1440+
1441+
FC_CAN_TRIGGER_GC_END();
1442+
UNREACHABLE();
14351443
}
1436-
HCIMPLEND
1444+
FCIMPLEND
14371445

14381446
#ifndef STATUS_STACK_BUFFER_OVERRUN // Not defined yet in CESDK includes
14391447
# define STATUS_STACK_BUFFER_OVERRUN ((NTSTATUS)0xC0000409L)

0 commit comments

Comments
 (0)