Skip to content

Commit d57b9d6

Browse files
authored
Remove HMF from IL_Throw/IL_ThrowExact/IL_Rethrow (#115253)
1 parent 6a3747b commit d57b9d6

File tree

6 files changed

+57
-46
lines changed

6 files changed

+57
-46
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: 46 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1225,7 +1225,7 @@ 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);
12301230
EXTERN_C HCIMPL2(void, IL_Throw_x86, Object* obj, TransitionBlock* transitionBlock)
12311231
#else
@@ -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+
#elif defined(TARGET_X86)
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 = (PVOID)transitionBlock->m_ReturnAddress;
12941290
#endif // defined(_DEBUG) && defined(TARGET_X86)
12951291

12961292
if (oref == 0)
@@ -1321,13 +1317,20 @@ 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+
#else // FEATURE_EH_FUNCLETS
1323+
PORTABILITY_ASSERT("IL_Throw");
1324+
#endif // FEATURE_EH_FUNCLETS
1325+
1326+
FC_CAN_TRIGGER_GC_END();
1327+
UNREACHABLE();
13251328
}
13261329
HCIMPLEND
13271330

13281331
/*************************************************************/
13291332

1330-
#if defined(TARGET_X86) && defined(FEATURE_EH_FUNCLETS)
1333+
#if defined(TARGET_X86)
13311334
EXTERN_C FCDECL0(void, IL_Rethrow);
13321335
EXTERN_C HCIMPL1(void, IL_Rethrow_x86, TransitionBlock* transitionBlock)
13331336
#else
@@ -1338,7 +1341,6 @@ HCIMPL0(void, IL_Rethrow)
13381341

13391342
FC_GC_POLL_NOT_NEEDED(); // throws always open up for GC
13401343

1341-
#ifdef FEATURE_EH_FUNCLETS
13421344
Thread *pThread = GetThread();
13431345

13441346
SoftwareExceptionFrame exceptionFrame;
@@ -1349,12 +1351,13 @@ HCIMPL0(void, IL_Rethrow)
13491351
#endif
13501352
exceptionFrame.InitAndLink(pThread);
13511353

1354+
FC_CAN_TRIGGER_GC();
1355+
1356+
#ifdef FEATURE_EH_FUNCLETS
13521357
ExInfo *pActiveExInfo = (ExInfo*)pThread->GetExceptionState()->GetCurrentExceptionTracker();
13531358

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

1356-
FC_CAN_TRIGGER_GC();
1357-
13581361
GCPROTECT_BEGIN(exInfo.m_exception);
13591362
PREPARE_NONVIRTUAL_CALLSITE(METHOD__EH__RH_RETHROW);
13601363
DECLARE_ARGHOLDER_ARRAY(args, 2);
@@ -1367,12 +1370,9 @@ HCIMPL0(void, IL_Rethrow)
13671370
//Ex.RhRethrow(ref ExInfo activeExInfo, ref ExInfo exInfo)
13681371
CALL_MANAGED_METHOD_NORET(args)
13691372
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
1373+
#elif defined(TARGET_X86)
1374+
INSTALL_MANAGED_EXCEPTION_DISPATCHER;
1375+
INSTALL_UNWIND_AND_CONTINUE_HANDLER;
13761376

13771377
OBJECTREF throwable = GetThread()->GetThrowable();
13781378
if (throwable != NULL)
@@ -1386,11 +1386,18 @@ HCIMPL0(void, IL_Rethrow)
13861386
RealCOMPlusThrow(kInvalidProgramException, (UINT)IDS_EE_RETHROW_NOT_ALLOWED);
13871387
}
13881388

1389-
HELPER_METHOD_FRAME_END();
1389+
UNINSTALL_UNWIND_AND_CONTINUE_HANDLER;
1390+
UNINSTALL_MANAGED_EXCEPTION_DISPATCHER;
1391+
#else // FEATURE_EH_FUNCLETS
1392+
PORTABILITY_ASSERT("IL_Rethrow");
1393+
#endif // FEATURE_EH_FUNCLETS
1394+
1395+
FC_CAN_TRIGGER_GC_END();
1396+
UNREACHABLE();
13901397
}
13911398
HCIMPLEND
13921399

1393-
#if defined(TARGET_X86) && defined(FEATURE_EH_FUNCLETS)
1400+
#if defined(TARGET_X86)
13941401
EXTERN_C FCDECL1(void, IL_ThrowExact, Object* obj);
13951402
EXTERN_C HCIMPL2(void, IL_ThrowExact_x86, Object* obj, TransitionBlock* transitionBlock)
13961403
#else
@@ -1407,7 +1414,6 @@ HCIMPL1(void, IL_ThrowExact, Object* obj)
14071414
OBJECTREF oref = ObjectToOBJECTREF(obj);
14081415
GetThread()->GetExceptionState()->SetRaisingForeignException();
14091416

1410-
#ifdef FEATURE_EH_FUNCLETS
14111417
Thread *pThread = GetThread();
14121418

14131419
SoftwareExceptionFrame exceptionFrame;
@@ -1419,19 +1425,27 @@ HCIMPL1(void, IL_ThrowExact, Object* obj)
14191425
exceptionFrame.InitAndLink(pThread);
14201426

14211427
FC_CAN_TRIGGER_GC();
1428+
1429+
#ifdef FEATURE_EH_FUNCLETS
14221430
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
1431+
#elif defined(TARGET_X86)
1432+
INSTALL_MANAGED_EXCEPTION_DISPATCHER;
1433+
INSTALL_UNWIND_AND_CONTINUE_HANDLER;
1434+
14271435
#if defined(_DEBUG) && defined(TARGET_X86)
1428-
__helperframe.EnsureInit(NULL);
1429-
g_ExceptionEIP = (LPVOID)__helperframe.GetReturnAddress();
1436+
g_ExceptionEIP = (PVOID)transitionBlock->m_ReturnAddress;
14301437
#endif // defined(_DEBUG) && defined(TARGET_X86)
14311438

14321439
RaiseTheExceptionInternalOnly(oref, FALSE);
1433-
HELPER_METHOD_FRAME_END();
1434-
#endif
1440+
1441+
UNINSTALL_UNWIND_AND_CONTINUE_HANDLER;
1442+
UNINSTALL_MANAGED_EXCEPTION_DISPATCHER;
1443+
#else // FEATURE_EH_FUNCLETS
1444+
PORTABILITY_ASSERT("IL_ThrowExact");
1445+
#endif // FEATURE_EH_FUNCLETS
1446+
1447+
FC_CAN_TRIGGER_GC_END();
1448+
UNREACHABLE();
14351449
}
14361450
HCIMPLEND
14371451

0 commit comments

Comments
 (0)