Skip to content

Commit e901a03

Browse files
authored
JIT: Add a type for call emission parameters (#114542)
1 parent 0fa747a commit e901a03

20 files changed

+628
-1170
lines changed

src/coreclr/jit/codegen.h

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,8 @@ class CodeGen final : public CodeGenInterface
212212
public:
213213
void genSpillVar(GenTree* tree);
214214

215+
void genEmitCallWithCurrentGC(EmitCallParams& callParams);
216+
215217
protected:
216218
void genEmitHelperCall(unsigned helper, int argSize, emitAttr retSize, regNumber callTarget = REG_NA);
217219

@@ -549,32 +551,6 @@ class CodeGen final : public CodeGenInterface
549551
void genProfilingLeaveCallback(unsigned helper);
550552
#endif // PROFILING_SUPPORTED
551553

552-
// clang-format off
553-
void genEmitCall(int callType,
554-
CORINFO_METHOD_HANDLE methHnd,
555-
INDEBUG_LDISASM_COMMA(CORINFO_SIG_INFO* sigInfo)
556-
void* addr
557-
X86_ARG(int argSize),
558-
emitAttr retSize
559-
MULTIREG_HAS_SECOND_GC_RET_ONLY_ARG(emitAttr secondRetSize),
560-
const DebugInfo& di,
561-
regNumber base,
562-
bool isJump,
563-
bool noSafePoint = false);
564-
// clang-format on
565-
566-
// clang-format off
567-
void genEmitCallIndir(int callType,
568-
CORINFO_METHOD_HANDLE methHnd,
569-
INDEBUG_LDISASM_COMMA(CORINFO_SIG_INFO* sigInfo)
570-
GenTreeIndir* indir
571-
X86_ARG(int argSize),
572-
emitAttr retSize
573-
MULTIREG_HAS_SECOND_GC_RET_ONLY_ARG(emitAttr secondRetSize),
574-
const DebugInfo& di,
575-
bool isJump);
576-
// clang-format on
577-
578554
//
579555
// Epilog functions
580556
//

src/coreclr/jit/codegenarm.cpp

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1619,6 +1619,12 @@ void CodeGen::genEmitHelperCall(unsigned helper, int argSize, emitAttr retSize,
16191619
addr = compiler->compGetHelperFtn((CorInfoHelpFunc)helper, (void**)&pAddr);
16201620
}
16211621

1622+
EmitCallParams params;
1623+
1624+
params.methHnd = compiler->eeFindHelper(helper);
1625+
params.argSize = argSize;
1626+
params.retSize = retSize;
1627+
16221628
if (!addr || !validImmForBL((ssize_t)addr))
16231629
{
16241630
if (callTargetReg == REG_NA)
@@ -1639,23 +1645,14 @@ void CodeGen::genEmitHelperCall(unsigned helper, int argSize, emitAttr retSize,
16391645
regSet.verifyRegUsed(callTargetReg);
16401646
}
16411647

1642-
GetEmitter()->emitIns_Call(emitter::EC_INDIR_R, compiler->eeFindHelper(helper),
1643-
INDEBUG_LDISASM_COMMA(nullptr) NULL, // addr
1644-
argSize, retSize, gcInfo.gcVarPtrSetCur, gcInfo.gcRegGCrefSetCur,
1645-
gcInfo.gcRegByrefSetCur, DebugInfo(),
1646-
callTargetReg, // ireg
1647-
REG_NA, 0, 0, // xreg, xmul, disp
1648-
false // isJump
1649-
);
1648+
params.callType = EC_INDIR_R;
1649+
params.ireg = callTargetReg;
1650+
genEmitCallWithCurrentGC(params);
16501651
}
16511652
else
16521653
{
1653-
GetEmitter()->emitIns_Call(emitter::EC_FUNC_TOKEN, compiler->eeFindHelper(helper),
1654-
INDEBUG_LDISASM_COMMA(nullptr) addr, argSize, retSize, gcInfo.gcVarPtrSetCur,
1655-
gcInfo.gcRegGCrefSetCur, gcInfo.gcRegByrefSetCur, DebugInfo(), REG_NA, REG_NA, 0,
1656-
0, /* ilOffset, ireg, xreg, xmul, disp */
1657-
false /* isJump */
1658-
);
1654+
params.callType = EC_FUNC_TOKEN;
1655+
genEmitCallWithCurrentGC(params);
16591656
}
16601657

16611658
regSet.verifyRegistersUsed(RBM_CALLEE_TRASH);

src/coreclr/jit/codegenarm64.cpp

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5317,14 +5317,14 @@ bool CodeGen::IsSaveFpLrWithAllCalleeSavedRegisters() const
53175317

53185318
void CodeGen::genEmitHelperCall(unsigned helper, int argSize, emitAttr retSize, regNumber callTargetReg /*= REG_NA */)
53195319
{
5320-
void* addr = nullptr;
53215320
void* pAddr = nullptr;
53225321

5323-
emitter::EmitCallType callType = emitter::EC_FUNC_TOKEN;
5324-
addr = compiler->compGetHelperFtn((CorInfoHelpFunc)helper, &pAddr);
5325-
regNumber callTarget = REG_NA;
5322+
EmitCallParams params;
5323+
params.callType = EC_FUNC_TOKEN;
5324+
params.addr = compiler->compGetHelperFtn((CorInfoHelpFunc)helper, &pAddr);
5325+
regMaskTP killSet = compiler->compHelperCallKillSet((CorInfoHelpFunc)helper);
53265326

5327-
if (addr == nullptr)
5327+
if (params.addr == nullptr)
53285328
{
53295329
// This is call to a runtime helper.
53305330
// adrp x, [reloc:rel page addr]
@@ -5340,37 +5340,33 @@ void CodeGen::genEmitHelperCall(unsigned helper, int argSize, emitAttr retSize,
53405340
}
53415341

53425342
regMaskTP callTargetMask = genRegMask(callTargetReg);
5343-
regMaskTP callKillSet = compiler->compHelperCallKillSet((CorInfoHelpFunc)helper);
53445343

5345-
// assert that all registers in callTargetMask are in the callKillSet
5346-
noway_assert((callTargetMask & callKillSet) == callTargetMask);
5347-
5348-
callTarget = callTargetReg;
5344+
noway_assert((callTargetMask & killSet) == callTargetMask);
53495345

53505346
if (compiler->opts.compReloc)
53515347
{
53525348
// adrp + add with relocations will be emitted
5353-
GetEmitter()->emitIns_R_AI(INS_adrp, EA_PTR_DSP_RELOC, callTarget,
5349+
GetEmitter()->emitIns_R_AI(INS_adrp, EA_PTR_DSP_RELOC, callTargetReg,
53545350
(ssize_t)pAddr DEBUGARG((size_t)compiler->eeFindHelper(helper))
53555351
DEBUGARG(GTF_ICON_METHOD_HDL));
53565352
}
53575353
else
53585354
{
5359-
instGen_Set_Reg_To_Imm(EA_PTRSIZE, callTarget, (ssize_t)addr);
5355+
instGen_Set_Reg_To_Imm(EA_PTRSIZE, callTargetReg, (ssize_t)pAddr);
53605356
}
5361-
GetEmitter()->emitIns_R_R(INS_ldr, EA_PTRSIZE, callTarget, callTarget);
5362-
callType = emitter::EC_INDIR_R;
5357+
GetEmitter()->emitIns_R_R(INS_ldr, EA_PTRSIZE, callTargetReg, callTargetReg);
5358+
5359+
params.callType = EC_INDIR_R;
5360+
params.ireg = callTargetReg;
53635361
}
53645362

5365-
GetEmitter()->emitIns_Call(callType, compiler->eeFindHelper(helper), INDEBUG_LDISASM_COMMA(nullptr) addr, argSize,
5366-
retSize, EA_UNKNOWN, gcInfo.gcVarPtrSetCur, gcInfo.gcRegGCrefSetCur,
5367-
gcInfo.gcRegByrefSetCur, DebugInfo(), callTarget, /* ireg */
5368-
REG_NA, 0, 0, /* xreg, xmul, disp */
5369-
false /* isJump */
5370-
);
5363+
params.methHnd = compiler->eeFindHelper(helper);
5364+
params.argSize = argSize;
5365+
params.retSize = retSize;
5366+
5367+
genEmitCallWithCurrentGC(params);
53715368

5372-
regMaskTP killMask = compiler->compHelperCallKillSet((CorInfoHelpFunc)helper);
5373-
regSet.verifyRegistersUsed(killMask);
5369+
regSet.verifyRegistersUsed(killSet);
53745370
}
53755371

53765372
#ifdef FEATURE_SIMD

0 commit comments

Comments
 (0)