summaryrefslogtreecommitdiff
path: root/src/jit/codegenlegacy.cpp
diff options
context:
space:
mode:
authorSergey Ignatov <sergign60@mail.ru>2017-06-29 19:54:03 +0300
committerSergey Ignatov <sergign60@mail.ru>2017-07-14 12:55:13 +0300
commitdc1947eecba98563f8d9ca258271dd110b331238 (patch)
treef1c8596528be41fdf57defa5c5f35c697c21120d /src/jit/codegenlegacy.cpp
parent23a09c98aa2cace8616f360ee393837b1701b7f8 (diff)
downloadcoreclr-dc1947eecba98563f8d9ca258271dd110b331238.tar.gz
coreclr-dc1947eecba98563f8d9ca258271dd110b331238.tar.bz2
coreclr-dc1947eecba98563f8d9ca258271dd110b331238.zip
[CoreRT armel] refix for PINVOKE calls in CoreRT #12373
Diffstat (limited to 'src/jit/codegenlegacy.cpp')
-rw-r--r--src/jit/codegenlegacy.cpp52
1 files changed, 36 insertions, 16 deletions
diff --git a/src/jit/codegenlegacy.cpp b/src/jit/codegenlegacy.cpp
index 41ab0b73ab..af9d95a5d8 100644
--- a/src/jit/codegenlegacy.cpp
+++ b/src/jit/codegenlegacy.cpp
@@ -19048,16 +19048,32 @@ regMaskTP CodeGen::genCodeForCall(GenTreeCall* call, bool valUsed)
{
noway_assert(callType == CT_USER_FUNC);
- void* pAddr;
- addr = compiler->info.compCompHnd->getAddressOfPInvokeFixup(methHnd, (void**)&pAddr);
- if (addr != NULL)
+ CORINFO_CONST_LOOKUP lookup;
+ compiler->info.compCompHnd->getAddressOfPInvokeTarget(methHnd, &lookup);
+
+ void* addr = lookup.addr;
+
+ assert(addr != NULL);
+
+#if defined(_TARGET_ARM_)
+ // Legacy backend does not handle the `IAT_VALUE` case that does not
+ // fit. It is not reachable currently from any front end so just check
+ // for it via assert.
+ assert(lookup.accessType != IAT_VALUE || arm_Valid_Imm_For_BL((ssize_t)addr));
+#endif
+ if (lookup.accessType == IAT_VALUE || lookup.accessType == IAT_PVALUE)
{
#if CPU_LOAD_STORE_ARCH
// Load the address into a register, indirect it and call through a register
indCallReg = regSet.rsGrabReg(RBM_ALLINT); // Grab an available register to use for the CALL
// indirection
instGen_Set_Reg_To_Imm(EA_HANDLE_CNS_RELOC, indCallReg, (ssize_t)addr);
- getEmitter()->emitIns_R_R_I(INS_ldr, EA_PTRSIZE, indCallReg, indCallReg, 0);
+
+ if (lookup.accessType == IAT_PVALUE)
+ {
+ getEmitter()->emitIns_R_R_I(INS_ldr, EA_PTRSIZE, indCallReg, indCallReg, 0);
+ }
+
regTracker.rsTrackRegTrash(indCallReg);
// Now make the call "call indCallReg"
@@ -19078,13 +19094,14 @@ regMaskTP CodeGen::genCodeForCall(GenTreeCall* call, bool valUsed)
}
else
{
+ assert(lookup.accessType == IAT_PPVALUE);
// Double-indirection. Load the address into a register
// and call indirectly through a register
indCallReg = regSet.rsGrabReg(RBM_ALLINT); // Grab an available register to use for the CALL
// indirection
#if CPU_LOAD_STORE_ARCH
- instGen_Set_Reg_To_Imm(EA_HANDLE_CNS_RELOC, indCallReg, (ssize_t)pAddr);
+ instGen_Set_Reg_To_Imm(EA_HANDLE_CNS_RELOC, indCallReg, (ssize_t)addr);
getEmitter()->emitIns_R_R_I(INS_ldr, EA_PTRSIZE, indCallReg, indCallReg, 0);
getEmitter()->emitIns_R_R_I(INS_ldr, EA_PTRSIZE, indCallReg, indCallReg, 0);
regTracker.rsTrackRegTrash(indCallReg);
@@ -19092,7 +19109,7 @@ regMaskTP CodeGen::genCodeForCall(GenTreeCall* call, bool valUsed)
emitCallType = emitter::EC_INDIR_R;
#else
- getEmitter()->emitIns_R_AI(INS_mov, EA_PTR_DSP_RELOC, indCallReg, (ssize_t)pAddr);
+ getEmitter()->emitIns_R_AI(INS_mov, EA_PTR_DSP_RELOC, indCallReg, (ssize_t)addr);
regTracker.rsTrackRegTrash(indCallReg);
emitCallType = emitter::EC_INDIR_ARD;
@@ -20854,19 +20871,22 @@ GenTreePtr Compiler::fgLegacyPerStatementLocalVarLiveness(GenTreePtr startNode,
// This ensures that the block->bbVarUse will contain
// the FrameRoot local var if is it a tracked variable.
- if (tree->gtCall.IsUnmanaged() || (tree->gtCall.IsTailCall() && info.compCallUnmanaged))
+ if (!opts.ShouldUsePInvokeHelpers())
{
- /* Get the TCB local and mark it as used */
+ if (tree->gtCall.IsUnmanaged() || (tree->gtCall.IsTailCall() && info.compCallUnmanaged))
+ {
+ /* Get the TCB local and mark it as used */
- noway_assert(info.compLvFrameListRoot < lvaCount);
+ noway_assert(info.compLvFrameListRoot < lvaCount);
- LclVarDsc* varDsc = &lvaTable[info.compLvFrameListRoot];
+ LclVarDsc* varDsc = &lvaTable[info.compLvFrameListRoot];
- if (varDsc->lvTracked)
- {
- if (!VarSetOps::IsMember(this, fgCurDefSet, varDsc->lvVarIndex))
+ if (varDsc->lvTracked)
{
- VarSetOps::AddElemD(this, fgCurUseSet, varDsc->lvVarIndex);
+ if (!VarSetOps::IsMember(this, fgCurDefSet, varDsc->lvVarIndex))
+ {
+ VarSetOps::AddElemD(this, fgCurUseSet, varDsc->lvVarIndex);
+ }
}
}
}
@@ -21342,7 +21362,7 @@ regNumber CodeGen::genPInvokeCallProlog(LclVarDsc* frameListRoot,
if (compiler->opts.ShouldUsePInvokeHelpers())
{
regNumber baseReg;
- int adr = compiler->lvaFrameAddress(compiler->lvaInlinedPInvokeFrameVar, true, &baseReg, 0);
+ int adr = compiler->lvaFrameAddress(compiler->lvaInlinedPInvokeFrameVar, false, &baseReg, 0);
getEmitter()->emitIns_R_R_I(INS_add, EA_PTRSIZE, REG_ARG_0, baseReg, adr);
genEmitHelperCall(CORINFO_HELP_JIT_PINVOKE_BEGIN,
@@ -21480,7 +21500,7 @@ void CodeGen::genPInvokeCallEpilog(LclVarDsc* frameListRoot, regMaskTP retVal)
noway_assert(compiler->lvaInlinedPInvokeFrameVar != BAD_VAR_NUM);
regNumber baseReg;
- int adr = compiler->lvaFrameAddress(compiler->lvaInlinedPInvokeFrameVar, true, &baseReg, 0);
+ int adr = compiler->lvaFrameAddress(compiler->lvaInlinedPInvokeFrameVar, false, &baseReg, 0);
getEmitter()->emitIns_R_R_I(INS_add, EA_PTRSIZE, REG_ARG_0, baseReg, adr);
genEmitHelperCall(CORINFO_HELP_JIT_PINVOKE_END,