void IRTranslator::translateFCall(const NormalizedInstruction& i) { auto const numArgs = i.imm[0].u_IVA; const PC after = m_hhbcTrans.curUnit()->at(i.nextSk().offset()); const Func* srcFunc = m_hhbcTrans.curFunc(); Offset returnBcOffset = srcFunc->unit()->offsetOf(after - srcFunc->base()); /* * If we have a calleeTrace, we're going to see if we should inline * the call. */ if (i.calleeTrace) { if (!i.calleeTrace->m_inliningFailed) { assert(shouldIRInline(m_hhbcTrans.curFunc(), i.funcd, *i.calleeTrace)); m_hhbcTrans.beginInlining(numArgs, i.funcd, returnBcOffset); static const bool shapeStats = Stats::enabledAny() && getenv("HHVM_STATS_INLINESHAPE"); if (shapeStats) { m_hhbcTrans.profileInlineFunctionShape(traceletShape(*i.calleeTrace)); } for (auto* ni = i.calleeTrace->m_instrStream.first; ni; ni = ni->next) { if (isAlwaysNop(ni->op())) { // This might not be necessary---but for now it's preserving // side effects of the call to readMetaData that used to // exist here. ni->noOp = true; } translateInstr(*ni); } return; } static const auto enabled = Stats::enabledAny() && getenv("HHVM_STATS_FAILEDINL"); if (enabled) { m_hhbcTrans.profileFunctionEntry("FailedCandidate"); m_hhbcTrans.profileFailedInlShape(traceletShape(*i.calleeTrace)); } } HHIR_EMIT(FCall, numArgs, returnBcOffset, i.funcd, JIT::callDestroysLocals(i, m_hhbcTrans.curFunc())); }
void IRTranslator::translateFCall(const NormalizedInstruction& i) { auto const numArgs = i.imm[0].u_IVA; const PC after = m_hhbcTrans.curUnit()->at(i.nextSk().offset()); const Func* srcFunc = m_hhbcTrans.curFunc(); Offset returnBcOffset = srcFunc->unit()->offsetOf(after - srcFunc->base()); /* * If we have a calleeTrace, we're going to see if we should inline * the call. */ if (i.calleeTrace) { if (!i.calleeTrace->m_inliningFailed) { assert(shouldIRInline(m_hhbcTrans.curFunc(), i.funcd, *i.calleeTrace)); m_hhbcTrans.beginInlining(numArgs, i.funcd, returnBcOffset); static const bool shapeStats = Stats::enabledAny() && getenv("HHVM_STATS_INLINESHAPE"); if (shapeStats) { m_hhbcTrans.profileInlineFunctionShape(traceletShape(*i.calleeTrace)); } Unit::MetaHandle metaHand; for (auto* ni = i.calleeTrace->m_instrStream.first; ni; ni = ni->next) { readMetaData(metaHand, *ni, m_hhbcTrans, false, MetaMode::Legacy); translateInstr(*ni); } return; } static const auto enabled = Stats::enabledAny() && getenv("HHVM_STATS_FAILEDINL"); if (enabled) { m_hhbcTrans.profileFunctionEntry("FailedCandidate"); m_hhbcTrans.profileFailedInlShape(traceletShape(*i.calleeTrace)); } } HHIR_EMIT(FCall, numArgs, returnBcOffset, i.funcd, JIT::callDestroysLocals(i, m_hhbcTrans.curFunc())); }