diff options
author | Sergey Ignatov <sergign60@mail.ru> | 2017-06-29 19:54:03 +0300 |
---|---|---|
committer | Sergey Ignatov <sergign60@mail.ru> | 2017-07-14 12:55:13 +0300 |
commit | dc1947eecba98563f8d9ca258271dd110b331238 (patch) | |
tree | f1c8596528be41fdf57defa5c5f35c697c21120d /src/jit/codegenlegacy.cpp | |
parent | 23a09c98aa2cace8616f360ee393837b1701b7f8 (diff) | |
download | coreclr-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.cpp | 52 |
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, |