Skip to content

Commit a205e51

Browse files
committed
Remove HMF from IL_Throw/IL_ThrowExact/IL_Rethrow
1 parent cec44d6 commit a205e51

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
@@ -1320,11 +1320,11 @@ HCIMPLEND
13201320

13211321
/*************************************************************/
13221322

1323-
#if defined(TARGET_X86) && defined(FEATURE_EH_FUNCLETS)
1323+
#if defined(TARGET_X86)
13241324
EXTERN_C FCDECL1(void, IL_Throw, Object* obj);
1325-
EXTERN_C HCIMPL2(void, IL_Throw_x86, Object* obj, TransitionBlock* transitionBlock)
1325+
EXTERN_C FCIMPL2(void, IL_Throw_x86, Object* obj, TransitionBlock* transitionBlock)
13261326
#else
1327-
HCIMPL1(void, IL_Throw, Object* obj)
1327+
FCIMPL1(void, IL_Throw, Object* obj)
13281328
#endif
13291329
{
13301330
FCALL_CONTRACT;
@@ -1336,8 +1336,6 @@ HCIMPL1(void, IL_Throw, Object* obj)
13361336

13371337
OBJECTREF oref = ObjectToOBJECTREF(obj);
13381338

1339-
#ifdef FEATURE_EH_FUNCLETS
1340-
13411339
Thread *pThread = GetThread();
13421340

13431341
SoftwareExceptionFrame exceptionFrame;
@@ -1350,6 +1348,7 @@ HCIMPL1(void, IL_Throw, Object* obj)
13501348

13511349
FC_CAN_TRIGGER_GC();
13521350

1351+
#ifdef FEATURE_EH_FUNCLETS
13531352
if (oref == 0)
13541353
DispatchManagedException(kNullReferenceException);
13551354
else
@@ -1377,15 +1376,12 @@ HCIMPL1(void, IL_Throw, Object* obj)
13771376
}
13781377

13791378
DispatchManagedException(oref, exceptionFrame.GetContext());
1380-
FC_CAN_TRIGGER_GC_END();
1381-
UNREACHABLE();
1382-
#endif // FEATURE_EH_FUNCLETS
1383-
1384-
HELPER_METHOD_FRAME_BEGIN_ATTRIB_NOPOLL(Frame::FRAME_ATTR_EXCEPTION); // Set up a frame
1379+
#else // FEATURE_EH_FUNCLETS
1380+
INSTALL_MANAGED_EXCEPTION_DISPATCHER;
1381+
INSTALL_UNWIND_AND_CONTINUE_HANDLER;
13851382

13861383
#if defined(_DEBUG) && defined(TARGET_X86)
1387-
__helperframe.EnsureInit(NULL);
1388-
g_ExceptionEIP = (LPVOID)__helperframe.GetReturnAddress();
1384+
g_ExceptionEIP = transitionBlock->m_ReturnAddress;
13891385
#endif // defined(_DEBUG) && defined(TARGET_X86)
13901386

13911387
if (oref == 0)
@@ -1416,24 +1412,28 @@ HCIMPL1(void, IL_Throw, Object* obj)
14161412

14171413
RaiseTheExceptionInternalOnly(oref, FALSE);
14181414

1419-
HELPER_METHOD_FRAME_END();
1415+
UNINSTALL_UNWIND_AND_CONTINUE_HANDLER;
1416+
UNINSTALL_MANAGED_EXCEPTION_DISPATCHER;
1417+
#endif // FEATURE_EH_FUNCLETS
1418+
1419+
FC_CAN_TRIGGER_GC_END();
1420+
UNREACHABLE();
14201421
}
1421-
HCIMPLEND
1422+
FCIMPLEND
14221423

14231424
/*************************************************************/
14241425

1425-
#if defined(TARGET_X86) && defined(FEATURE_EH_FUNCLETS)
1426+
#if defined(TARGET_X86)
14261427
EXTERN_C FCDECL0(void, IL_Rethrow);
1427-
EXTERN_C HCIMPL1(void, IL_Rethrow_x86, TransitionBlock* transitionBlock)
1428+
EXTERN_C FCIMPL1(void, IL_Rethrow_x86, TransitionBlock* transitionBlock)
14281429
#else
1429-
HCIMPL0(void, IL_Rethrow)
1430+
FCIMPL0(void, IL_Rethrow)
14301431
#endif
14311432
{
14321433
FCALL_CONTRACT;
14331434

14341435
FC_GC_POLL_NOT_NEEDED(); // throws always open up for GC
14351436

1436-
#ifdef FEATURE_EH_FUNCLETS
14371437
Thread *pThread = GetThread();
14381438

14391439
SoftwareExceptionFrame exceptionFrame;
@@ -1444,12 +1444,13 @@ HCIMPL0(void, IL_Rethrow)
14441444
#endif
14451445
exceptionFrame.InitAndLink(pThread);
14461446

1447+
FC_CAN_TRIGGER_GC();
1448+
1449+
#ifdef FEATURE_EH_FUNCLETS
14471450
ExInfo *pActiveExInfo = (ExInfo*)pThread->GetExceptionState()->GetCurrentExceptionTracker();
14481451

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

1451-
FC_CAN_TRIGGER_GC();
1452-
14531454
GCPROTECT_BEGIN(exInfo.m_exception);
14541455
PREPARE_NONVIRTUAL_CALLSITE(METHOD__EH__RH_RETHROW);
14551456
DECLARE_ARGHOLDER_ARRAY(args, 2);
@@ -1462,12 +1463,9 @@ HCIMPL0(void, IL_Rethrow)
14621463
//Ex.RhRethrow(ref ExInfo activeExInfo, ref ExInfo exInfo)
14631464
CALL_MANAGED_METHOD_NORET(args)
14641465
GCPROTECT_END();
1465-
1466-
FC_CAN_TRIGGER_GC_END();
1467-
UNREACHABLE();
1468-
#endif
1469-
1470-
HELPER_METHOD_FRAME_BEGIN_ATTRIB_NOPOLL(Frame::FRAME_ATTR_EXCEPTION); // Set up a frame
1466+
#else // FEATURE_EH_FUNCLETS
1467+
INSTALL_MANAGED_EXCEPTION_DISPATCHER;
1468+
INSTALL_UNWIND_AND_CONTINUE_HANDLER;
14711469

14721470
OBJECTREF throwable = GetThread()->GetThrowable();
14731471
if (throwable != NULL)
@@ -1481,15 +1479,20 @@ HCIMPL0(void, IL_Rethrow)
14811479
RealCOMPlusThrow(kInvalidProgramException, (UINT)IDS_EE_RETHROW_NOT_ALLOWED);
14821480
}
14831481

1484-
HELPER_METHOD_FRAME_END();
1482+
UNINSTALL_UNWIND_AND_CONTINUE_HANDLER;
1483+
UNINSTALL_MANAGED_EXCEPTION_DISPATCHER;
1484+
#endif // FEATURE_EH_FUNCLETS
1485+
1486+
FC_CAN_TRIGGER_GC_END();
1487+
UNREACHABLE();
14851488
}
1486-
HCIMPLEND
1489+
FCIMPLEND
14871490

1488-
#if defined(TARGET_X86) && defined(FEATURE_EH_FUNCLETS)
1491+
#if defined(TARGET_X86)
14891492
EXTERN_C FCDECL1(void, IL_ThrowExact, Object* obj);
1490-
EXTERN_C HCIMPL2(void, IL_ThrowExact_x86, Object* obj, TransitionBlock* transitionBlock)
1493+
EXTERN_C FCIMPL2(void, IL_ThrowExact_x86, Object* obj, TransitionBlock* transitionBlock)
14911494
#else
1492-
HCIMPL1(void, IL_ThrowExact, Object* obj)
1495+
FCIMPL1(void, IL_ThrowExact, Object* obj)
14931496
#endif
14941497
{
14951498
FCALL_CONTRACT;
@@ -1502,7 +1505,6 @@ HCIMPL1(void, IL_ThrowExact, Object* obj)
15021505
OBJECTREF oref = ObjectToOBJECTREF(obj);
15031506
GetThread()->GetExceptionState()->SetRaisingForeignException();
15041507

1505-
#ifdef FEATURE_EH_FUNCLETS
15061508
Thread *pThread = GetThread();
15071509

15081510
SoftwareExceptionFrame exceptionFrame;
@@ -1514,21 +1516,27 @@ HCIMPL1(void, IL_ThrowExact, Object* obj)
15141516
exceptionFrame.InitAndLink(pThread);
15151517

15161518
FC_CAN_TRIGGER_GC();
1519+
1520+
#ifdef FEATURE_EH_FUNCLETS
15171521
DispatchManagedException(oref, exceptionFrame.GetContext());
1518-
FC_CAN_TRIGGER_GC_END();
1519-
UNREACHABLE();
1520-
#else
1521-
HELPER_METHOD_FRAME_BEGIN_ATTRIB_NOPOLL(Frame::FRAME_ATTR_EXCEPTION); // Set up a frame
1522+
#else // FEATURE_EH_FUNCLETS
1523+
INSTALL_MANAGED_EXCEPTION_DISPATCHER;
1524+
INSTALL_UNWIND_AND_CONTINUE_HANDLER;
1525+
15221526
#if defined(_DEBUG) && defined(TARGET_X86)
1523-
__helperframe.EnsureInit(NULL);
1524-
g_ExceptionEIP = (LPVOID)__helperframe.GetReturnAddress();
1527+
g_ExceptionEIP = transitionBlock->m_ReturnAddress;
15251528
#endif // defined(_DEBUG) && defined(TARGET_X86)
15261529

15271530
RaiseTheExceptionInternalOnly(oref, FALSE);
1528-
HELPER_METHOD_FRAME_END();
1529-
#endif
1531+
1532+
UNINSTALL_UNWIND_AND_CONTINUE_HANDLER;
1533+
UNINSTALL_MANAGED_EXCEPTION_DISPATCHER;
1534+
#endif // FEATURE_EH_FUNCLETS
1535+
1536+
FC_CAN_TRIGGER_GC_END();
1537+
UNREACHABLE();
15301538
}
1531-
HCIMPLEND
1539+
FCIMPLEND
15321540

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

0 commit comments

Comments
 (0)