diff --git a/src/coreclr/jit/codegen.h b/src/coreclr/jit/codegen.h index 1fc303b4162b3d..52758f8ba3c78f 100644 --- a/src/coreclr/jit/codegen.h +++ b/src/coreclr/jit/codegen.h @@ -342,8 +342,11 @@ class CodeGen final : public CodeGenInterface // Prolog functions and data (there are a few exceptions for more generally used things) // - void genEstablishFramePointer(int delta, bool reportUnwindData); - void genHomeRegisterParams(regNumber initReg, bool* initRegStillZeroed); + void genEstablishFramePointer(int delta, bool reportUnwindData); + void genHomeRegisterParams(regNumber initReg, bool* initRegStillZeroed); +#ifdef TARGET_WASM + void genHomeRegisterParamsOutsideProlog(); +#endif regMaskTP genGetParameterHomingTempRegisterCandidates(); var_types genParamStackType(LclVarDsc* dsc, const ABIPassingSegment& seg); diff --git a/src/coreclr/jit/codegenarm.cpp b/src/coreclr/jit/codegenarm.cpp index 2bae2090b07035..78e1a2348dda30 100644 --- a/src/coreclr/jit/codegenarm.cpp +++ b/src/coreclr/jit/codegenarm.cpp @@ -1634,7 +1634,7 @@ void CodeGen::genEmitHelperCall(unsigned helper, int argSize, emitAttr retSize, // void CodeGen::genProfilingEnterCallback(regNumber initReg, bool* pInitRegZeroed) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); // Give profiler a chance to back out of hooking this method if (!m_compiler->compIsProfilerHookNeeded()) @@ -1802,7 +1802,7 @@ void CodeGen::genOSRHandleTier0CalleeSavedRegistersAndFrame() // void CodeGen::genEstablishFramePointer(int delta, bool reportUnwindData) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); assert(arm_Valid_Imm_For_Add_SP(delta)); GetEmitter()->emitIns_R_R_I(INS_add, EA_PTRSIZE, REG_FPBASE, REG_SPBASE, delta); @@ -1836,7 +1836,7 @@ void CodeGen::genEstablishFramePointer(int delta, bool reportUnwindData) // void CodeGen::genAllocLclFrame(unsigned frameSize, regNumber initReg, bool* pInitRegZeroed, regMaskTP maskArgRegsLiveIn) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); if (frameSize == 0) { @@ -1937,7 +1937,7 @@ void CodeGen::genPopFltRegs(regMaskTP regMask) // void CodeGen::genFreeLclFrame(unsigned frameSize, /* IN OUT */ bool* pUnwindStarted) { - assert(GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); + assert(m_compiler->compGeneratingEpilog); if (frameSize == 0) return; @@ -2046,7 +2046,7 @@ void CodeGen::genMov32RelocatableImmediate(emitAttr size, BYTE* addr, regNumber */ regMaskTP CodeGen::genStackAllocRegisterMask(unsigned frameSize, regMaskTP maskCalleeSavedFloat) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog() || GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); + assert(m_compiler->compGeneratingProlog || m_compiler->compGeneratingEpilog); // We can't do this optimization with callee saved floating point registers because // the stack would be allocated in a wrong spot. @@ -2135,7 +2135,7 @@ void CodeGen::instGen_MemoryBarrier(BarrierKind barrierKind) bool CodeGen::genCanUsePopToReturn(regMaskTP maskPopRegsInt, bool jmpEpilog) { - assert(GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); + assert(m_compiler->compGeneratingEpilog); if (!jmpEpilog && regSet.rsMaskPreSpillRegs(true) == RBM_NONE) return true; @@ -2145,7 +2145,7 @@ bool CodeGen::genCanUsePopToReturn(regMaskTP maskPopRegsInt, bool jmpEpilog) void CodeGen::genPopCalleeSavedRegisters(bool jmpEpilog) { - assert(GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); + assert(m_compiler->compGeneratingEpilog); regMaskTP maskPopRegs = regSet.rsGetModifiedCalleeSavedRegsMask(); regMaskTP maskPopRegsFloat = maskPopRegs & RBM_ALLFLOAT; @@ -2256,6 +2256,8 @@ void CodeGen::genFuncletProlog(BasicBlock* block) assert(block != NULL); assert(m_compiler->bbIsFuncletBeg(block)); + ScopedSetVariable _setGeneratingProlog(&m_compiler->compGeneratingProlog, true); + gcInfo.gcResetForBB(); m_compiler->unwindBegProlog(); @@ -2316,6 +2318,8 @@ void CodeGen::genFuncletEpilog(BasicBlock* /* block */) printf("*************** In genFuncletEpilog()\n"); #endif + ScopedSetVariable _setGeneratingEpilog(&m_compiler->compGeneratingEpilog, true); + // Just as for the main function, we delay starting the unwind codes until we have // an instruction which we know needs an unwind code. This is to support code like // this: @@ -2449,7 +2453,7 @@ void CodeGen::genCaptureFuncletPrologEpilogInfo() // void CodeGen::genZeroInitFrameUsingBlockInit(int untrLclHi, int untrLclLo, regNumber initReg, bool* pInitRegZeroed) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); assert(genUseBlockInit); assert(untrLclHi > untrLclLo); diff --git a/src/coreclr/jit/codegenarm64.cpp b/src/coreclr/jit/codegenarm64.cpp index f5ac76f6c50067..e1a5c44c6fc943 100644 --- a/src/coreclr/jit/codegenarm64.cpp +++ b/src/coreclr/jit/codegenarm64.cpp @@ -34,7 +34,7 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX void CodeGen::genPopCalleeSavedRegistersAndFreeLclFrame(bool jmpEpilog) { - assert(GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); + assert(m_compiler->compGeneratingEpilog); regMaskTP rsRestoreRegs = regSet.rsGetModifiedCalleeSavedRegsMask(); @@ -1387,6 +1387,8 @@ void CodeGen::genFuncletProlog(BasicBlock* block) assert(block != NULL); assert(m_compiler->bbIsFuncletBeg(block)); + ScopedSetVariable _setGeneratingProlog(&m_compiler->compGeneratingProlog, true); + gcInfo.gcResetForBB(); m_compiler->unwindBegProlog(); @@ -1551,6 +1553,8 @@ void CodeGen::genFuncletEpilog(BasicBlock* /* block */) printf("*************** In genFuncletEpilog()\n"); #endif + ScopedSetVariable _setGeneratingEpilog(&m_compiler->compGeneratingEpilog, true); + bool unwindStarted = false; if (!unwindStarted) @@ -1879,7 +1883,7 @@ void CodeGen::genCaptureFuncletPrologEpilogInfo() // void CodeGen::genZeroInitFrameUsingBlockInit(int untrLclHi, int untrLclLo, regNumber initReg, bool* pInitRegZeroed) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); assert(genUseBlockInit); assert(untrLclHi > untrLclLo); @@ -5407,7 +5411,7 @@ void CodeGen::genStoreLclTypeSimd12(GenTreeLclVarCommon* treeNode) // void CodeGen::genOSRHandleTier0CalleeSavedRegistersAndFrame() { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); assert(m_compiler->opts.IsOSR()); assert(m_compiler->funCurrentFunc()->funKind == FuncKind::FUNC_ROOT); @@ -5513,7 +5517,7 @@ void CodeGen::genOSRHandleTier0CalleeSavedRegistersAndFrame() // void CodeGen::genProfilingEnterCallback(regNumber initReg, bool* pInitRegZeroed) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); if (!m_compiler->compIsProfilerHookNeeded()) { @@ -5601,7 +5605,7 @@ void CodeGen::genProfilingLeaveCallback(unsigned helper) // void CodeGen::genEstablishFramePointer(int delta, bool reportUnwindData) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); if (delta == 0) { @@ -5643,7 +5647,7 @@ void CodeGen::genEstablishFramePointer(int delta, bool reportUnwindData) // void CodeGen::genAllocLclFrame(unsigned frameSize, regNumber initReg, bool* pInitRegZeroed, regMaskTP maskArgRegsLiveIn) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); if (frameSize == 0) { diff --git a/src/coreclr/jit/codegenarmarch.cpp b/src/coreclr/jit/codegenarmarch.cpp index e4af6c54e94d23..e9dcc3d455a0c3 100644 --- a/src/coreclr/jit/codegenarmarch.cpp +++ b/src/coreclr/jit/codegenarmarch.cpp @@ -584,7 +584,7 @@ void CodeGen::genCodeForTreeNode(GenTree* treeNode) // void CodeGen::genSetGSSecurityCookie(regNumber initReg, bool* pInitRegZeroed) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); if (!m_compiler->getNeedsGSSecurityCookie()) { @@ -4378,7 +4378,7 @@ void CodeGen::genSIMDSplitReturn(GenTree* src, const ReturnTypeDesc* retTypeDesc // void CodeGen::genPushCalleeSavedRegisters(regNumber initReg, bool* pInitRegZeroed) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); #ifdef TARGET_ARM64 // Probe large frames now, if necessary, since genPushCalleeSavedRegisters() will allocate the frame. Note that @@ -5013,6 +5013,8 @@ void CodeGen::genFnEpilog(BasicBlock* block) printf("*************** In genFnEpilog()\n"); #endif // DEBUG + ScopedSetVariable _setGeneratingEpilog(&m_compiler->compGeneratingEpilog, true); + VarSetOps::Assign(m_compiler, gcInfo.gcVarPtrSetCur, GetEmitter()->emitInitGCrefVars); gcInfo.gcRegGCrefSetCur = GetEmitter()->emitInitGCrefRegs; gcInfo.gcRegByrefSetCur = GetEmitter()->emitInitByrefRegs; diff --git a/src/coreclr/jit/codegencommon.cpp b/src/coreclr/jit/codegencommon.cpp index 5451fe563541ba..b93a07677c19d3 100644 --- a/src/coreclr/jit/codegencommon.cpp +++ b/src/coreclr/jit/codegencommon.cpp @@ -3682,7 +3682,7 @@ void CodeGen::genEnregisterIncomingStackArgs() // assert(!m_compiler->opts.IsOSR()); - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); unsigned varNum = 0; @@ -3790,7 +3790,7 @@ void CodeGen::genEnregisterIncomingStackArgs() */ void CodeGen::genCheckUseBlockInit() { - assert(!GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(!m_compiler->compGeneratingProlog); unsigned initStkLclCnt = 0; // The number of int-sized stack local variables that need to be initialized (variables // larger than int count for more than 1). @@ -4027,7 +4027,7 @@ void CodeGen::genCheckUseBlockInit() */ void CodeGen::genZeroInitFltRegs(const regMaskTP& initFltRegs, const regMaskTP& initDblRegs, const regNumber& initReg) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); // The first float/double reg that is initialized to 0. So they can be used to // initialize the remaining registers. @@ -4154,7 +4154,7 @@ regNumber CodeGen::genGetZeroReg(regNumber initReg, bool* pInitRegZeroed) // 'false' if initReg was set to a non-zero value, and left unchanged if initReg was not touched. void CodeGen::genZeroInitFrame(int untrLclHi, int untrLclLo, regNumber initReg, bool* pInitRegZeroed) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); if (genUseBlockInit) { @@ -4597,7 +4597,7 @@ void CodeGen::genHomeStackPartOfSplitParameter(regNumber initReg, bool* initRegS void CodeGen::genReportGenericContextArg(regNumber initReg, bool* pInitRegZeroed) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); const bool reportArg = m_compiler->lvaReportParamTypeArg(); @@ -5139,6 +5139,7 @@ void CodeGen::genFinalizeFrame() */ void CodeGen::genFnProlog() { + ScopedSetVariable _setGeneratingProlog(&m_compiler->compGeneratingProlog, true); m_compiler->funSetCurrentFunc(0); diff --git a/src/coreclr/jit/codegenlinear.cpp b/src/coreclr/jit/codegenlinear.cpp index 49f67585225024..fdd1d3263b9968 100644 --- a/src/coreclr/jit/codegenlinear.cpp +++ b/src/coreclr/jit/codegenlinear.cpp @@ -460,9 +460,19 @@ void CodeGen::genCodeForBlock(BasicBlock* block) } #endif +#ifdef TARGET_WASM + // genHomeRegisterParams can generate arbitrary amounts of code on Wasm, so + // we have moved it out of the prolog to the first basic block in order to + // work around the restriction that the prolog can only be one insGroup. + if (block->IsFirst()) + { + genHomeRegisterParamsOutsideProlog(); + } +#endif + #ifndef TARGET_WASM // TODO-WASM: enable genPoisonFrame // Emit poisoning into the init BB that comes right after prolog. - // We cannot emit this code in the prolog as it might use a helper call that kills argument regs. + // We cannot emit this code in the prolog as it might make the prolog too large. if (m_compiler->compShouldPoisonFrame() && block->IsFirst()) { genPoisonFrame(newLiveRegSet); diff --git a/src/coreclr/jit/codegenloongarch64.cpp b/src/coreclr/jit/codegenloongarch64.cpp index aa84d692dbe7ed..869b121bb1a9a4 100644 --- a/src/coreclr/jit/codegenloongarch64.cpp +++ b/src/coreclr/jit/codegenloongarch64.cpp @@ -339,7 +339,7 @@ void CodeGen::genRestoreCalleeSavedRegistersHelp(regMaskTP regsToRestoreMask, // void CodeGen::genOSRHandleTier0CalleeSavedRegistersAndFrame() { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); assert(m_compiler->opts.IsOSR()); assert(m_compiler->funCurrentFunc()->funKind == FuncKind::FUNC_ROOT); @@ -445,6 +445,8 @@ void CodeGen::genFuncletProlog(BasicBlock* block) assert(block != NULL); assert(m_compiler->bbIsFuncletBeg(block)); + ScopedSetVariable _setGeneratingProlog(&m_compiler->compGeneratingProlog, true); + gcInfo.gcResetForBB(); m_compiler->unwindBegProlog(); @@ -520,6 +522,8 @@ void CodeGen::genFuncletEpilog(BasicBlock* /* block */) } #endif + ScopedSetVariable _setGeneratingEpilog(&m_compiler->compGeneratingEpilog, true); + m_compiler->unwindBegEpilog(); int frameSize = genFuncletInfo.fiSpDelta; @@ -622,6 +626,8 @@ void CodeGen::genFnEpilog(BasicBlock* block) } #endif // DEBUG + ScopedSetVariable _setGeneratingEpilog(&m_compiler->compGeneratingEpilog, true); + VarSetOps::Assign(m_compiler, gcInfo.gcVarPtrSetCur, GetEmitter()->emitInitGCrefVars); gcInfo.gcRegGCrefSetCur = GetEmitter()->emitInitGCrefRegs; gcInfo.gcRegByrefSetCur = GetEmitter()->emitInitByrefRegs; @@ -4320,7 +4326,7 @@ void CodeGen::genCodeForTreeNode(GenTree* treeNode) // void CodeGen::genSetGSSecurityCookie(regNumber initReg, bool* pInitRegZeroed) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); if (!m_compiler->getNeedsGSSecurityCookie()) { @@ -6135,7 +6141,7 @@ void CodeGen::genLeaInstruction(GenTreeAddrMode* lea) void CodeGen::genEstablishFramePointer(int delta, bool reportUnwindData) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); if (delta == 0) { @@ -6168,7 +6174,7 @@ void CodeGen::genEstablishFramePointer(int delta, bool reportUnwindData) // void CodeGen::genAllocLclFrame(unsigned frameSize, regNumber initReg, bool* pInitRegZeroed, regMaskTP maskArgRegsLiveIn) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); if (frameSize == 0) { @@ -6520,7 +6526,7 @@ void CodeGen::instGen_MemoryBarrier(BarrierKind barrierKind) */ void CodeGen::genPushCalleeSavedRegisters(regNumber initReg, bool* pInitRegZeroed) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); regMaskTP rsPushRegs = regSet.rsGetModifiedCalleeSavedRegsMask(); @@ -6643,7 +6649,7 @@ void CodeGen::genPushCalleeSavedRegisters(regNumber initReg, bool* pInitRegZeroe void CodeGen::genPopCalleeSavedRegisters(bool jmpEpilog) { - assert(GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); + assert(m_compiler->compGeneratingEpilog); regMaskTP regsToRestoreMask = regSet.rsGetModifiedCalleeSavedRegsMask(); @@ -6753,7 +6759,7 @@ void CodeGen::genPopCalleeSavedRegisters(bool jmpEpilog) // void CodeGen::genProfilingEnterCallback(regNumber initReg, bool* pInitRegZeroed) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); if (!m_compiler->compIsProfilerHookNeeded()) { diff --git a/src/coreclr/jit/codegenriscv64.cpp b/src/coreclr/jit/codegenriscv64.cpp index 0f3c8c5e912001..723cd94da507c4 100644 --- a/src/coreclr/jit/codegenriscv64.cpp +++ b/src/coreclr/jit/codegenriscv64.cpp @@ -329,7 +329,7 @@ void CodeGen::genRestoreCalleeSavedRegistersHelp(regMaskTP regsToRestoreMask, // void CodeGen::genOSRHandleTier0CalleeSavedRegistersAndFrame() { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); assert(m_compiler->opts.IsOSR()); assert(m_compiler->funCurrentFunc()->funKind == FuncKind::FUNC_ROOT); @@ -432,6 +432,8 @@ void CodeGen::genFuncletProlog(BasicBlock* block) assert(block != NULL); assert(m_compiler->bbIsFuncletBeg(block)); + ScopedSetVariable _setGeneratingProlog(&m_compiler->compGeneratingProlog, true); + gcInfo.gcResetForBB(); m_compiler->unwindBegProlog(); @@ -508,6 +510,8 @@ void CodeGen::genFuncletEpilog(BasicBlock* /* block */) } #endif + ScopedSetVariable _setGeneratingEpilog(&m_compiler->compGeneratingEpilog, true); + m_compiler->unwindBegEpilog(); int frameSize = genFuncletInfo.fiSpDelta; @@ -609,6 +613,8 @@ void CodeGen::genFnEpilog(BasicBlock* block) } #endif // DEBUG + ScopedSetVariable _setGeneratingEpilog(&m_compiler->compGeneratingEpilog, true); + VarSetOps::Assign(m_compiler, gcInfo.gcVarPtrSetCur, GetEmitter()->emitInitGCrefVars); gcInfo.gcRegGCrefSetCur = GetEmitter()->emitInitGCrefRegs; gcInfo.gcRegByrefSetCur = GetEmitter()->emitInitByrefRegs; @@ -4125,7 +4131,7 @@ void CodeGen::genCodeForTreeNode(GenTree* treeNode) // void CodeGen::genSetGSSecurityCookie(regNumber initReg, bool* pInitRegZeroed) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); if (!m_compiler->getNeedsGSSecurityCookie()) { @@ -5989,7 +5995,7 @@ void CodeGen::genCodeForSlliUw(GenTreeOp* tree) // void CodeGen::genEstablishFramePointer(int delta, bool reportUnwindData) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); assert(emitter::isValidSimm12(delta)); GetEmitter()->emitIns_R_R_I(INS_addi, EA_PTRSIZE, REG_FPBASE, REG_SPBASE, delta); @@ -6217,7 +6223,7 @@ void CodeGen::instGen_MemoryBarrier(BarrierKind barrierKind) */ void CodeGen::genPushCalleeSavedRegisters(regNumber initReg, bool* pInitRegZeroed) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); regMaskTP rsPushRegs = regSet.rsGetModifiedCalleeSavedRegsMask(); @@ -6344,7 +6350,7 @@ void CodeGen::genPushCalleeSavedRegisters(regNumber initReg, bool* pInitRegZeroe void CodeGen::genPopCalleeSavedRegisters(bool jmpEpilog) { - assert(GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); + assert(m_compiler->compGeneratingEpilog); regMaskTP regsToRestoreMask = regSet.rsGetModifiedCalleeSavedRegsMask(); @@ -6454,7 +6460,7 @@ void CodeGen::genPopCalleeSavedRegisters(bool jmpEpilog) // void CodeGen::genProfilingEnterCallback(regNumber initReg, bool* pInitRegZeroed) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); if (!m_compiler->compIsProfilerHookNeeded()) { diff --git a/src/coreclr/jit/codegenwasm.cpp b/src/coreclr/jit/codegenwasm.cpp index ba5d414bff3c21..03386420966faf 100644 --- a/src/coreclr/jit/codegenwasm.cpp +++ b/src/coreclr/jit/codegenwasm.cpp @@ -150,7 +150,7 @@ void CodeGen::genPushCalleeSavedRegisters(regNumber initReg, bool* pInitRegZeroe // void CodeGen::genAllocLclFrame(unsigned frameSize, regNumber initReg, bool* pInitRegZeroed, regMaskTP maskArgRegsLiveIn) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); regNumber spReg = GetStackPointerReg(m_compiler->funCurrentFuncIdx()); if (spReg == REG_NA) { @@ -223,7 +223,7 @@ void CodeGen::genEnregisterOSRArgsAndLocals(regNumber initReg, bool* pInitRegZer // void CodeGen::genZeroInitFrame(int untrLclHi, int untrLclLo, regNumber initReg, bool* pInitRegZeroed) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); if (!genUseBlockInit) { // Nothing to zero (genCheckUseBlockInit forces block-init for any non-empty range on wasm). @@ -270,6 +270,22 @@ void CodeGen::genOSRHandleTier0CalleeSavedRegistersAndFrame() //------------------------------------------------------------------------ // genHomeRegisterParams: place register arguments into their RA-assigned locations. // +// We can't actually do this task here because the prolog will overflow. Instead, we +// do this later on and inject all the relevant code into the first basic block. +// See genHomeRegisterParamsOutsideProlog, below. +// +// Arguments: +// initReg - Unused +// initRegStillZeroed - Unused +// +void CodeGen::genHomeRegisterParams(regNumber initReg, bool* initRegStillZeroed) +{ + // Intentionally empty +} + +//------------------------------------------------------------------------ +// genHomeRegisterParamsOutsideProlog: place register arguments into their RA-assigned locations. +// // For the WASM RA, we have a much simplified (compared to LSRA) contract of: // - If an argument is live on entry in a set of registers, then the RA will // assign those registers to that argument on entry. @@ -278,14 +294,9 @@ void CodeGen::genOSRHandleTier0CalleeSavedRegistersAndFrame() // The main motivation for this (along with the obvious CQ implications) is // obviating the need to adapt the general "RegGraph"-based algorithm to // !HAS_FIXED_REGISTER_SET constraints (no reg masks). -// -// Arguments: -// initReg - Unused -// initRegStillZeroed - Unused -// -void CodeGen::genHomeRegisterParams(regNumber initReg, bool* initRegStillZeroed) +void CodeGen::genHomeRegisterParamsOutsideProlog() { - JITDUMP("*************** In genHomeRegisterParams()\n"); + JITDUMP("*************** In genHomeRegisterParamsOutsideProlog()\n"); auto spillParam = [this](unsigned lclNum, unsigned offset, unsigned paramLclNum, const ABIPassingSegment& segment) { assert(segment.IsPassedInRegister()); @@ -360,7 +371,7 @@ void CodeGen::genHomeRegisterParams(regNumber initReg, bool* initRegStillZeroed) // void CodeGen::genReportGenericContextArg(regNumber initReg, bool* pInitRegZeroed) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); const bool reportArg = m_compiler->lvaReportParamTypeArg(); const bool reportThis = m_compiler->lvaKeepAliveAndReportThis(); @@ -393,6 +404,8 @@ void CodeGen::genFnEpilog(BasicBlock* block) } #endif // DEBUG + ScopedSetVariable _setGeneratingEpilog(&m_compiler->compGeneratingEpilog, true); + #ifdef DEBUG if (m_compiler->opts.dspCode) printf("\n__epilog:\n"); @@ -491,6 +504,8 @@ void CodeGen::genFuncletProlog(BasicBlock* block) // void CodeGen::genFuncletEpilog(BasicBlock* block) { + ScopedSetVariable _setGeneratingEpilog(&m_compiler->compGeneratingEpilog, true); + if (block->IsLast() || m_compiler->bbIsFuncletBeg(block->Next())) { instGen(INS_end); diff --git a/src/coreclr/jit/codegenxarch.cpp b/src/coreclr/jit/codegenxarch.cpp index 5308e680efa374..b68d1f572eaa66 100644 --- a/src/coreclr/jit/codegenxarch.cpp +++ b/src/coreclr/jit/codegenxarch.cpp @@ -36,7 +36,7 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX // void CodeGen::genSetGSSecurityCookie(regNumber initReg, bool* pInitRegZeroed) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); if (!m_compiler->getNeedsGSSecurityCookie()) { @@ -2326,7 +2326,7 @@ void CodeGen::genMultiRegStoreToSIMDLocal(GenTreeLclVar* lclNode) // void CodeGen::genEstablishFramePointer(int delta, bool reportUnwindData) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); if (delta == 0) { @@ -2360,7 +2360,7 @@ void CodeGen::genEstablishFramePointer(int delta, bool reportUnwindData) // void CodeGen::genAllocLclFrame(unsigned frameSize, regNumber initReg, bool* pInitRegZeroed, regMaskTP maskArgRegsLiveIn) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); if (frameSize == 0) { @@ -4055,7 +4055,7 @@ void CodeGen::genClearStackVec3ArgUpperBits() } #endif - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); unsigned varNum = 0; @@ -9455,7 +9455,7 @@ void CodeGen::genAmd64EmitterUnitTestsCTEST() // void CodeGen::genProfilingEnterCallback(regNumber initReg, bool* pInitRegZeroed) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); // Give profiler a chance to back out of hooking this method if (!m_compiler->compIsProfilerHookNeeded()) @@ -9598,7 +9598,7 @@ void CodeGen::genProfilingLeaveCallback(unsigned helper) // void CodeGen::genProfilingEnterCallback(regNumber initReg, bool* pInitRegZeroed) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); // Give profiler a chance to back out of hooking this method if (!m_compiler->compIsProfilerHookNeeded()) @@ -9903,7 +9903,7 @@ void CodeGen::genProfilingLeaveCallback(unsigned helper) // void CodeGen::genOSRHandleTier0CalleeSavedRegistersAndFrame() { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); assert(m_compiler->opts.IsOSR()); assert(m_compiler->funCurrentFunc()->funKind == FuncKind::FUNC_ROOT); @@ -9980,7 +9980,7 @@ void CodeGen::genOSRSaveRemainingCalleeSavedRegisters() { // We should be generating the prolog of an OSR root frame. // - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); assert(m_compiler->opts.IsOSR()); assert(m_compiler->funCurrentFunc()->funKind == FuncKind::FUNC_ROOT); @@ -10062,7 +10062,7 @@ void CodeGen::genOSRHandleTier0CalleeSavedRegistersAndFrame() // void CodeGen::genPushCalleeSavedRegisters(regNumber initReg, bool* pInitRegZeroed) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); #if DEBUG // OSR root frames must handle this differently. See @@ -10206,7 +10206,7 @@ void CodeGen::genPushCalleeSavedRegistersFromMaskAPX(regMaskTP rsPushRegs) void CodeGen::genPopCalleeSavedRegisters(bool jmpEpilog) { - assert(GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); + assert(m_compiler->compGeneratingEpilog); #ifdef TARGET_AMD64 @@ -10397,6 +10397,8 @@ void CodeGen::genFnEpilog(BasicBlock* block) } #endif + ScopedSetVariable _setGeneratingEpilog(&m_compiler->compGeneratingEpilog, true); + VarSetOps::Assign(m_compiler, gcInfo.gcVarPtrSetCur, GetEmitter()->emitInitGCrefVars); gcInfo.gcRegGCrefSetCur = GetEmitter()->emitInitGCrefRegs; gcInfo.gcRegByrefSetCur = GetEmitter()->emitInitByrefRegs; @@ -10866,6 +10868,8 @@ void CodeGen::genFuncletProlog(BasicBlock* block) assert(m_compiler->bbIsFuncletBeg(block)); assert(isFramePointerUsed()); + ScopedSetVariable _setGeneratingProlog(&m_compiler->compGeneratingProlog, true); + gcInfo.gcResetForBB(); m_compiler->unwindBegProlog(); @@ -10910,6 +10914,8 @@ void CodeGen::genFuncletEpilog(BasicBlock* /* block */) } #endif + ScopedSetVariable _setGeneratingEpilog(&m_compiler->compGeneratingEpilog, true); + genClearAvxStateInEpilog(); inst_RV_IV(INS_add, REG_SPBASE, genFuncletInfo.fiSpDelta, EA_PTRSIZE); @@ -10997,6 +11003,8 @@ void CodeGen::genFuncletProlog(BasicBlock* block) } #endif + ScopedSetVariable _setGeneratingProlog(&m_compiler->compGeneratingProlog, true); + gcInfo.gcResetForBB(); m_compiler->unwindBegProlog(); @@ -11033,6 +11041,8 @@ void CodeGen::genFuncletEpilog(BasicBlock* /* block */) } #endif + ScopedSetVariable _setGeneratingEpilog(&m_compiler->compGeneratingEpilog, true); + genClearAvxStateInEpilog(); #ifdef UNIX_X86_ABI @@ -11073,7 +11083,7 @@ void CodeGen::genCaptureFuncletPrologEpilogInfo() // void CodeGen::genZeroInitFrameUsingBlockInit(int untrLclHi, int untrLclLo, regNumber initReg, bool* pInitRegZeroed) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); assert(genUseBlockInit); assert(untrLclHi > untrLclLo); diff --git a/src/coreclr/jit/compiler.h b/src/coreclr/jit/compiler.h index 9c6c4f826b726c..5977508f16df97 100644 --- a/src/coreclr/jit/compiler.h +++ b/src/coreclr/jit/compiler.h @@ -10950,6 +10950,8 @@ class Compiler bool compRegAllocDone = false; bool compRationalIRForm = false; + bool compGeneratingProlog = false; + bool compGeneratingEpilog = false; bool compGeneratingUnwindProlog = false; bool compGeneratingUnwindEpilog = false; diff --git a/src/coreclr/jit/emit.cpp b/src/coreclr/jit/emit.cpp index d9f4c9c7e68436..d80cba4cb00e6c 100644 --- a/src/coreclr/jit/emit.cpp +++ b/src/coreclr/jit/emit.cpp @@ -2012,10 +2012,16 @@ void emitter::emitCheckIGList() void emitter::emitBegProlog() { + assert(m_compiler->compGeneratingProlog); + #if EMIT_TRACK_STACK_DEPTH + /* Don't measure stack depth inside the prolog, it's misleading */ + emitCntStackDepth = 0; + assert(emitCurStackLvl == 0); + #endif emitNoGCRequestCount = 1; @@ -2039,13 +2045,12 @@ void emitter::emitBegProlog() /***************************************************************************** * * Mark the code offset of the current location as the end of the prolog, - * so it can be used later to compute the actual size of the prolog for - * GCInfo purposes. We may still generate more code into "prolog" IGs. + * so it can be used later to compute the actual size of the prolog. */ void emitter::emitMarkPrologEnd() { - assert(emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); emitPrologEndPos.CaptureLocation(this); } @@ -2056,7 +2061,7 @@ void emitter::emitMarkPrologEnd() void emitter::emitEndProlog() { - assert(emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); emitNoGCRequestCount = 0; emitNoGCIG = false; @@ -2361,16 +2366,6 @@ void emitter::emitFinishPrologEpilogGeneration() emitCurIG = nullptr; } -bool emitter::emitGeneratingPrologOrFuncletProlog() const -{ - return emitIGisInProlog(emitCurIG) || emitIGisInFuncletProlog(emitCurIG); -} - -bool emitter::emitGeneratingEpilogOrFuncletEpilog() const -{ - return emitIGisInEpilog(emitCurIG) || emitIGisInFuncletEpilog(emitCurIG); -} - /***************************************************************************** * * Common code for prolog / epilog beginning. Convert the placeholder group to actual code IG, @@ -2617,7 +2612,7 @@ bool emitter::emitHasEpilogEnd() void emitter::emitStartExitSeq() { - assert(emitGeneratingEpilogOrFuncletEpilog()); + assert(m_compiler->compGeneratingEpilog); emitExitSeqBegLoc.CaptureLocation(this); } @@ -2636,7 +2631,7 @@ void emitter::emitStartExitSeq() void emitter::emitSetFrameRangeGCRs(int offsLo, int offsHi) { - assert(emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); assert(offsHi > offsLo); #ifdef DEBUG @@ -9929,7 +9924,6 @@ void emitter::emitInitIG(insGroup* ig) sure we act the same in non-DEBUG builds. */ - ig->igData = nullptr; ig->igSize = 0; ig->igGCregs = RBM_NONE; ig->igInsCnt = 0; @@ -9947,6 +9941,8 @@ void emitter::emitInitIG(insGroup* ig) // Explicitly call init, since IGs don't actually have a constructor. ig->igBlocks.jitstd::list::init(m_compiler->getAllocator(CMK_DebugOnly)); #endif + + ig->igData = nullptr; } /***************************************************************************** diff --git a/src/coreclr/jit/emit.h b/src/coreclr/jit/emit.h index 5c19c4f806bfb8..64306e35cd8a24 100644 --- a/src/coreclr/jit/emit.h +++ b/src/coreclr/jit/emit.h @@ -3893,7 +3893,6 @@ class emitter debugPrevGCrefRegs = RBM_NONE; debugPrevByrefRegs = RBM_NONE; #endif - emitCurIG = nullptr; } }; diff --git a/src/coreclr/jit/emitpub.h b/src/coreclr/jit/emitpub.h index 124e1c0c776c94..cda3839c43341a 100644 --- a/src/coreclr/jit/emitpub.h +++ b/src/coreclr/jit/emitpub.h @@ -58,9 +58,6 @@ void emitGeneratePrologEpilog(); void emitStartPrologEpilogGeneration(); void emitFinishPrologEpilogGeneration(); -bool emitGeneratingPrologOrFuncletProlog() const; -bool emitGeneratingEpilogOrFuncletEpilog() const; - /************************************************************************/ /* Record a code position and later convert it to offset */ /************************************************************************/ diff --git a/src/coreclr/jit/emitriscv64.cpp b/src/coreclr/jit/emitriscv64.cpp index a08286154511c7..6ecd43185f330b 100644 --- a/src/coreclr/jit/emitriscv64.cpp +++ b/src/coreclr/jit/emitriscv64.cpp @@ -1010,7 +1010,7 @@ bool emitter::tryEmitCompressedIns_R_R_R( instruction ins, emitAttr attr, regNumber rd, regNumber rs1, regNumber rs2, insOpts opt) { // TODO-RISCV64-RVC: Disable this early return once compresed instructions are allowed in prolog / epilog - if (emitGeneratingPrologOrFuncletProlog() || emitGeneratingEpilogOrFuncletEpilog()) + if (m_compiler->compGeneratingProlog || m_compiler->compGeneratingEpilog) { return false; } @@ -1634,7 +1634,7 @@ int emitter::emitLoadImmediate(emitAttr size, regNumber reg, ssize_t imm) int insCountLimit = prefMaxInsCount; // If we are currently generating prolog / epilog, we are currently not inside a method block, therefore, we should // not use the emitDataConst + emitIns_R_C combination. - if (emitGeneratingPrologOrFuncletProlog() || emitGeneratingEpilogOrFuncletEpilog()) + if (m_compiler->compGeneratingProlog || m_compiler->compGeneratingEpilog) { insCountLimit = absMaxInsCount; } @@ -1861,7 +1861,7 @@ int emitter::emitLoadImmediate(emitAttr size, regNumber reg, ssize_t imm) { if (doEmit) { - assert(!emitGeneratingPrologOrFuncletProlog() && !emitGeneratingEpilogOrFuncletEpilog()); + assert(!m_compiler->compGeneratingProlog && !m_compiler->compGeneratingEpilog); auto constAddr = emitDataConst(&originalImm, sizeof(long), sizeof(long), TYP_LONG); emitIns_R_C(INS_ld, EA_PTRSIZE, reg, REG_NA, m_compiler->eeFindJitDataOffs(constAddr)); } diff --git a/src/coreclr/jit/emitxarch.cpp b/src/coreclr/jit/emitxarch.cpp index 2d8b9328edcbb8..90eee967367021 100644 --- a/src/coreclr/jit/emitxarch.cpp +++ b/src/coreclr/jit/emitxarch.cpp @@ -6205,7 +6205,7 @@ void emitter::spillIntArgRegsToShadowSlots() instrDesc* id; UNATIVE_OFFSET sz; - assert(emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); for (argNum = 0; argNum < MAX_REG_ARG; ++argNum) { diff --git a/src/coreclr/jit/regset.cpp b/src/coreclr/jit/regset.cpp index 1b6cdf532072d2..2fcd275641bf46 100644 --- a/src/coreclr/jit/regset.cpp +++ b/src/coreclr/jit/regset.cpp @@ -144,9 +144,8 @@ void RegSet::rsSetRegsModified(regMaskTP mask DEBUGARG(bool suppressDump)) // code generation isn't actually adding to set of modified registers. // Frame layout is only affected by callee-saved registers, so only ensure that callee-saved // registers aren't modified after final frame layout. - assert((m_compiler->lvaDoneFrameLayout < Compiler::FINAL_FRAME_LAYOUT) || - m_compiler->GetEmitter()->emitGeneratingPrologOrFuncletProlog() || - m_compiler->GetEmitter()->emitGeneratingEpilogOrFuncletEpilog() || + assert((m_compiler->lvaDoneFrameLayout < Compiler::FINAL_FRAME_LAYOUT) || m_compiler->compGeneratingProlog || + m_compiler->compGeneratingEpilog || (((rsModifiedRegsMask | mask) & RBM_CALLEE_SAVED) == (rsModifiedRegsMask & RBM_CALLEE_SAVED))); #ifdef DEBUG @@ -174,9 +173,8 @@ void RegSet::rsRemoveRegsModified(regMaskTP mask) assert(rsModifiedRegsMaskInitialized); // See comment in rsSetRegsModified(). - assert((m_compiler->lvaDoneFrameLayout < Compiler::FINAL_FRAME_LAYOUT) || - m_compiler->GetEmitter()->emitGeneratingPrologOrFuncletProlog() || - m_compiler->GetEmitter()->emitGeneratingEpilogOrFuncletEpilog() || + assert((m_compiler->lvaDoneFrameLayout < Compiler::FINAL_FRAME_LAYOUT) || m_compiler->compGeneratingProlog || + m_compiler->compGeneratingEpilog || (((rsModifiedRegsMask & ~mask) & RBM_CALLEE_SAVED) == (rsModifiedRegsMask & RBM_CALLEE_SAVED))); #ifdef DEBUG diff --git a/src/coreclr/jit/scopeinfo.cpp b/src/coreclr/jit/scopeinfo.cpp index deb4bed05b6a00..a336b8d3872a02 100644 --- a/src/coreclr/jit/scopeinfo.cpp +++ b/src/coreclr/jit/scopeinfo.cpp @@ -1689,7 +1689,7 @@ NATIVE_OFFSET CodeGen::psiGetVarStackOffset(const LclVarDsc* lclVarDsc) const // void CodeGen::psiBegProlog() { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); m_compiler->compResetScopeLists(); @@ -1775,7 +1775,7 @@ void CodeGen::psiBegProlog() // void CodeGen::psiEndProlog() { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(m_compiler->compGeneratingProlog); varLiveKeeper->psiClosePrologVariableRanges(); } diff --git a/src/coreclr/jit/unwind.cpp b/src/coreclr/jit/unwind.cpp index 34124abe667547..2453fcfc2c954b 100644 --- a/src/coreclr/jit/unwind.cpp +++ b/src/coreclr/jit/unwind.cpp @@ -133,7 +133,7 @@ void Compiler::createCfiCode(FuncInfoDsc* func, UNATIVE_OFFSET codeOffset, UCHAR void Compiler::unwindPushPopCFI(regNumber reg) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(compGeneratingProlog); FuncInfoDsc* func = funCurrentFunc(); UNATIVE_OFFSET cbProlog = unwindGetCurrentOffset(func); @@ -182,7 +182,7 @@ typedef jitstd::vector CFICodeVector; void Compiler::unwindBegPrologCFI() { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(compGeneratingProlog); FuncInfoDsc* func = funCurrentFunc(); @@ -234,10 +234,10 @@ void Compiler::unwindPushPopMaskCFI(regMaskTP regMask, bool isFloat) void Compiler::unwindAllocStackCFI(unsigned size) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(compGeneratingProlog); FuncInfoDsc* func = funCurrentFunc(); UNATIVE_OFFSET cbProlog = 0; - if (GetEmitter()->emitGeneratingPrologOrFuncletProlog()) + if (compGeneratingProlog) { cbProlog = unwindGetCurrentOffset(func); } @@ -253,7 +253,7 @@ void Compiler::unwindAllocStackCFI(unsigned size) // void Compiler::unwindSetFrameRegCFI(regNumber reg, unsigned offset) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(compGeneratingProlog); FuncInfoDsc* func = funCurrentFunc(); UNATIVE_OFFSET cbProlog = unwindGetCurrentOffset(func); @@ -425,7 +425,7 @@ void Compiler::DumpCfiInfo(bool isHotCode, // UNATIVE_OFFSET Compiler::unwindGetCurrentOffset(FuncInfoDsc* func) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(compGeneratingProlog); emitLocation* loc = func->startLoc; insGroup* ig = (loc != nullptr) ? loc->GetIG() : nullptr; assert((ig == nullptr) || (loc->GetInsOffset() == 0)); diff --git a/src/coreclr/jit/unwindamd64.cpp b/src/coreclr/jit/unwindamd64.cpp index 92519f02b91284..87577ee390d853 100644 --- a/src/coreclr/jit/unwindamd64.cpp +++ b/src/coreclr/jit/unwindamd64.cpp @@ -150,7 +150,7 @@ void Compiler::unwindBegProlog() void Compiler::unwindBegPrologWindows() { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(compGeneratingProlog); FuncInfoDsc* func = funCurrentFunc(); @@ -178,7 +178,7 @@ void Compiler::unwindBegPrologWindows() // void Compiler::unwindEndProlog() { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(compGeneratingProlog); assert(compGeneratingUnwindProlog); compGeneratingUnwindProlog = false; } @@ -189,7 +189,7 @@ void Compiler::unwindEndProlog() // void Compiler::unwindBegEpilog() { - assert(GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); + assert(compGeneratingEpilog); assert(!compGeneratingUnwindEpilog); compGeneratingUnwindEpilog = true; } @@ -200,7 +200,7 @@ void Compiler::unwindBegEpilog() // void Compiler::unwindEndEpilog() { - assert(GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); + assert(compGeneratingEpilog); assert(compGeneratingUnwindEpilog); compGeneratingUnwindEpilog = false; } @@ -248,7 +248,7 @@ void Compiler::unwindPush2(regNumber reg1, regNumber reg2) void Compiler::unwindPushWindows(regNumber reg) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(compGeneratingProlog); FuncInfoDsc* func = funCurrentFunc(); @@ -320,7 +320,7 @@ void Compiler::unwindAllocStack(unsigned size) void Compiler::unwindAllocStackWindows(unsigned size) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(compGeneratingProlog); FuncInfoDsc* func = funCurrentFunc(); @@ -381,7 +381,7 @@ void Compiler::unwindSetFrameReg(regNumber reg, unsigned offset) void Compiler::unwindSetFrameRegWindows(regNumber reg, unsigned offset) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(compGeneratingProlog); FuncInfoDsc* func = funCurrentFunc(); @@ -447,7 +447,7 @@ void Compiler::unwindSaveReg(regNumber reg, unsigned offset) void Compiler::unwindSaveRegWindows(regNumber reg, unsigned offset) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(compGeneratingProlog); FuncInfoDsc* func = funCurrentFunc(); @@ -507,7 +507,7 @@ void Compiler::unwindSaveRegWindows(regNumber reg, unsigned offset) #ifdef UNIX_AMD64_ABI void Compiler::unwindSaveRegCFI(regNumber reg, unsigned offset) { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(compGeneratingProlog); if (RBM_CALLEE_SAVED & genRegMask(reg)) { @@ -695,8 +695,8 @@ void DumpUnwindInfo(bool isHotCode, // void Compiler::unwindReserve() { - assert(!GetEmitter()->emitGeneratingPrologOrFuncletProlog()); - assert(!GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); + assert(!compGeneratingProlog); + assert(!compGeneratingEpilog); for (FuncInfoDsc* const func : Funcs()) { @@ -806,8 +806,8 @@ void Compiler::unwindReserveFuncHelper(FuncInfoDsc* func, bool isHotCode) // void Compiler::unwindEmit(void* pHotCode, void* pColdCode) { - assert(!GetEmitter()->emitGeneratingPrologOrFuncletProlog()); - assert(!GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); + assert(!compGeneratingProlog); + assert(!compGeneratingEpilog); for (FuncInfoDsc* const func : Funcs()) { diff --git a/src/coreclr/jit/unwindarm64.cpp b/src/coreclr/jit/unwindarm64.cpp index af6aab195fd296..620438ec644e5a 100644 --- a/src/coreclr/jit/unwindarm64.cpp +++ b/src/coreclr/jit/unwindarm64.cpp @@ -235,7 +235,7 @@ void Compiler::unwindAllocStack(unsigned size) #if defined(FEATURE_CFI_SUPPORT) if (generateCFIUnwindCodes()) { - if (GetEmitter()->emitGeneratingPrologOrFuncletProlog()) + if (compGeneratingProlog) { unwindAllocStackCFI(size); } @@ -279,7 +279,7 @@ void Compiler::unwindSetFrameReg(regNumber reg, unsigned offset) #if defined(FEATURE_CFI_SUPPORT) if (generateCFIUnwindCodes()) { - if (GetEmitter()->emitGeneratingPrologOrFuncletProlog()) + if (compGeneratingProlog) { unwindSetFrameRegCFI(reg, offset); } @@ -351,7 +351,7 @@ void Compiler::unwindSaveRegPair(regNumber reg1, regNumber reg2, int offset) #if defined(FEATURE_CFI_SUPPORT) if (generateCFIUnwindCodes()) { - if (GetEmitter()->emitGeneratingPrologOrFuncletProlog()) + if (compGeneratingProlog) { FuncInfoDsc* func = funCurrentFunc(); UNATIVE_OFFSET cbProlog = unwindGetCurrentOffset(func); @@ -433,7 +433,7 @@ void Compiler::unwindSaveRegPairPreindexed(regNumber reg1, regNumber reg2, int o #if defined(FEATURE_CFI_SUPPORT) if (generateCFIUnwindCodes()) { - if (GetEmitter()->emitGeneratingPrologOrFuncletProlog()) + if (compGeneratingProlog) { FuncInfoDsc* func = funCurrentFunc(); UNATIVE_OFFSET cbProlog = unwindGetCurrentOffset(func); @@ -522,7 +522,7 @@ void Compiler::unwindSaveReg(regNumber reg, int offset) #if defined(FEATURE_CFI_SUPPORT) if (generateCFIUnwindCodes()) { - if (GetEmitter()->emitGeneratingPrologOrFuncletProlog()) + if (compGeneratingProlog) { FuncInfoDsc* func = funCurrentFunc(); UNATIVE_OFFSET cbProlog = unwindGetCurrentOffset(func); @@ -576,7 +576,7 @@ void Compiler::unwindSaveRegPreindexed(regNumber reg, int offset) #if defined(FEATURE_CFI_SUPPORT) if (generateCFIUnwindCodes()) { - if (GetEmitter()->emitGeneratingPrologOrFuncletProlog()) + if (compGeneratingProlog) { FuncInfoDsc* func = funCurrentFunc(); UNATIVE_OFFSET cbProlog = unwindGetCurrentOffset(func); @@ -645,7 +645,7 @@ void Compiler::unwindPacSignLR() if (generateCFIUnwindCodes()) { // Emit NEGATE_RA_STATE opcode in prologs. - if (!GetEmitter()->emitGeneratingPrologOrFuncletProlog()) + if (!compGeneratingProlog) { return; } diff --git a/src/coreclr/jit/unwindarmarch.cpp b/src/coreclr/jit/unwindarmarch.cpp index bec6ed64b6f68f..3c9b87476c5a8c 100644 --- a/src/coreclr/jit/unwindarmarch.cpp +++ b/src/coreclr/jit/unwindarmarch.cpp @@ -137,7 +137,7 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX void Compiler::unwindBegProlog() { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(compGeneratingProlog); assert(!compGeneratingUnwindProlog); compGeneratingUnwindProlog = true; @@ -166,14 +166,14 @@ void Compiler::unwindBegProlog() void Compiler::unwindEndProlog() { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(compGeneratingProlog); assert(compGeneratingUnwindProlog); compGeneratingUnwindProlog = false; } void Compiler::unwindBegEpilog() { - assert(GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); + assert(compGeneratingEpilog); assert(!compGeneratingUnwindEpilog); compGeneratingUnwindEpilog = true; @@ -189,7 +189,7 @@ void Compiler::unwindBegEpilog() void Compiler::unwindEndEpilog() { - assert(GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); + assert(compGeneratingEpilog); assert(compGeneratingUnwindEpilog); compGeneratingUnwindEpilog = false; } @@ -398,7 +398,7 @@ void Compiler::unwindAllocStack(unsigned size) #if defined(FEATURE_CFI_SUPPORT) if (generateCFIUnwindCodes()) { - if (GetEmitter()->emitGeneratingPrologOrFuncletProlog()) + if (compGeneratingProlog) { unwindAllocStackCFI(size); } @@ -452,7 +452,7 @@ void Compiler::unwindSetFrameReg(regNumber reg, unsigned offset) #if defined(FEATURE_CFI_SUPPORT) if (generateCFIUnwindCodes()) { - if (GetEmitter()->emitGeneratingPrologOrFuncletProlog()) + if (compGeneratingProlog) { unwindSetFrameRegCFI(reg, offset); } @@ -549,8 +549,8 @@ void Compiler::unwindPadding() // all its funclets. void Compiler::unwindReserve() { - assert(!GetEmitter()->emitGeneratingPrologOrFuncletProlog()); - assert(!GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); + assert(!compGeneratingProlog); + assert(!compGeneratingEpilog); for (FuncInfoDsc* const func : Funcs()) { diff --git a/src/coreclr/jit/unwindloongarch64.cpp b/src/coreclr/jit/unwindloongarch64.cpp index b39f294cb3b5f9..e03a66cffc4040 100644 --- a/src/coreclr/jit/unwindloongarch64.cpp +++ b/src/coreclr/jit/unwindloongarch64.cpp @@ -235,7 +235,7 @@ void Compiler::unwindAllocStack(unsigned size) #if defined(FEATURE_CFI_SUPPORT) if (generateCFIUnwindCodes()) { - if (GetEmitter()->emitGeneratingPrologOrFuncletProlog()) + if (compGeneratingProlog) { unwindAllocStackCFI(size); } @@ -278,7 +278,7 @@ void Compiler::unwindSetFrameReg(regNumber reg, unsigned offset) #if defined(FEATURE_CFI_SUPPORT) if (generateCFIUnwindCodes()) { - if (GetEmitter()->emitGeneratingPrologOrFuncletProlog()) + if (compGeneratingProlog) { unwindSetFrameRegCFI(reg, offset); } @@ -346,7 +346,7 @@ void Compiler::unwindSaveReg(regNumber reg, int offset) #if defined(FEATURE_CFI_SUPPORT) if (generateCFIUnwindCodes()) { - if (GetEmitter()->emitGeneratingPrologOrFuncletProlog()) + if (compGeneratingProlog) { FuncInfoDsc* func = funCurrentFunc(); UNATIVE_OFFSET cbProlog = unwindGetCurrentOffset(func); @@ -890,7 +890,7 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX void Compiler::unwindBegProlog() { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(compGeneratingProlog); assert(!compGeneratingUnwindProlog); compGeneratingUnwindProlog = true; @@ -919,14 +919,14 @@ void Compiler::unwindBegProlog() void Compiler::unwindEndProlog() { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(compGeneratingProlog); assert(compGeneratingUnwindProlog); compGeneratingUnwindProlog = false; } void Compiler::unwindBegEpilog() { - assert(GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); + assert(compGeneratingEpilog); assert(!compGeneratingUnwindEpilog); compGeneratingUnwindEpilog = true; @@ -942,7 +942,7 @@ void Compiler::unwindBegEpilog() void Compiler::unwindEndEpilog() { - assert(GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); + assert(compGeneratingEpilog); assert(compGeneratingUnwindEpilog); compGeneratingUnwindEpilog = false; } @@ -967,8 +967,8 @@ void Compiler::unwindPadding() // all its funclets. void Compiler::unwindReserve() { - assert(!GetEmitter()->emitGeneratingPrologOrFuncletProlog()); - assert(!GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); + assert(!compGeneratingProlog); + assert(!compGeneratingEpilog); for (FuncInfoDsc* const func : Funcs()) { diff --git a/src/coreclr/jit/unwindriscv64.cpp b/src/coreclr/jit/unwindriscv64.cpp index 669cef02ce19fb..6ac86921ad72c1 100644 --- a/src/coreclr/jit/unwindriscv64.cpp +++ b/src/coreclr/jit/unwindriscv64.cpp @@ -47,7 +47,7 @@ void Compiler::unwindAllocStack(unsigned size) #if defined(FEATURE_CFI_SUPPORT) if (generateCFIUnwindCodes()) { - if (GetEmitter()->emitGeneratingPrologOrFuncletProlog()) + if (compGeneratingProlog) { unwindAllocStackCFI(size); } @@ -90,7 +90,7 @@ void Compiler::unwindSetFrameReg(regNumber reg, unsigned offset) #if defined(FEATURE_CFI_SUPPORT) if (generateCFIUnwindCodes()) { - if (GetEmitter()->emitGeneratingPrologOrFuncletProlog()) + if (compGeneratingProlog) { unwindSetFrameRegCFI(reg, offset); } @@ -158,7 +158,7 @@ void Compiler::unwindSaveReg(regNumber reg, int offset) #if defined(FEATURE_CFI_SUPPORT) if (generateCFIUnwindCodes()) { - if (GetEmitter()->emitGeneratingPrologOrFuncletProlog()) + if (compGeneratingProlog) { FuncInfoDsc* func = funCurrentFunc(); UNATIVE_OFFSET cbProlog = unwindGetCurrentOffset(func); @@ -702,7 +702,7 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX void Compiler::unwindBegProlog() { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(compGeneratingProlog); assert(!compGeneratingUnwindProlog); compGeneratingUnwindProlog = true; @@ -731,14 +731,14 @@ void Compiler::unwindBegProlog() void Compiler::unwindEndProlog() { - assert(GetEmitter()->emitGeneratingPrologOrFuncletProlog()); + assert(compGeneratingProlog); assert(compGeneratingUnwindProlog); compGeneratingUnwindProlog = false; } void Compiler::unwindBegEpilog() { - assert(GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); + assert(compGeneratingEpilog); assert(!compGeneratingUnwindEpilog); compGeneratingUnwindEpilog = true; @@ -754,7 +754,7 @@ void Compiler::unwindBegEpilog() void Compiler::unwindEndEpilog() { - assert(GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); + assert(compGeneratingEpilog); assert(compGeneratingUnwindEpilog); compGeneratingUnwindEpilog = false; } @@ -779,8 +779,8 @@ void Compiler::unwindPadding() // all its funclets. void Compiler::unwindReserve() { - assert(!GetEmitter()->emitGeneratingPrologOrFuncletProlog()); - assert(!GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); + assert(!compGeneratingProlog); + assert(!compGeneratingEpilog); for (FuncInfoDsc* const func : Funcs()) { diff --git a/src/coreclr/jit/unwindwasm.cpp b/src/coreclr/jit/unwindwasm.cpp index 51b310b581068a..5e08bcc583fa2d 100644 --- a/src/coreclr/jit/unwindwasm.cpp +++ b/src/coreclr/jit/unwindwasm.cpp @@ -40,8 +40,8 @@ void Compiler::unwindAllocStack(unsigned size) // void Compiler::unwindReserve() { - assert(!GetEmitter()->emitGeneratingPrologOrFuncletProlog()); - assert(!GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); + assert(!compGeneratingProlog); + assert(!compGeneratingEpilog); for (FuncInfoDsc* const func : Funcs()) { @@ -76,8 +76,8 @@ void Compiler::unwindReserveFunc(FuncInfoDsc* func) // void Compiler::unwindEmit(void* pHotCode, void* pColdCode) { - assert(!GetEmitter()->emitGeneratingPrologOrFuncletProlog()); - assert(!GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); + assert(!compGeneratingProlog); + assert(!compGeneratingEpilog); for (FuncInfoDsc* const func : Funcs()) { diff --git a/src/coreclr/jit/unwindx86.cpp b/src/coreclr/jit/unwindx86.cpp index 511bfc2797e961..8b4e3842f6b852 100644 --- a/src/coreclr/jit/unwindx86.cpp +++ b/src/coreclr/jit/unwindx86.cpp @@ -70,8 +70,8 @@ void Compiler::unwindSaveReg(regNumber reg, unsigned offset) // void Compiler::unwindReserve() { - assert(!GetEmitter()->emitGeneratingPrologOrFuncletProlog()); - assert(!GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); + assert(!compGeneratingProlog); + assert(!compGeneratingEpilog); for (FuncInfoDsc* const func : Funcs()) { @@ -88,8 +88,8 @@ void Compiler::unwindReserve() // void Compiler::unwindEmit(void* pHotCode, void* pColdCode) { - assert(!GetEmitter()->emitGeneratingPrologOrFuncletProlog()); - assert(!GetEmitter()->emitGeneratingEpilogOrFuncletEpilog()); + assert(!compGeneratingProlog); + assert(!compGeneratingEpilog); for (FuncInfoDsc* const func : Funcs()) {