IRUnit::IRUnit(Offset initialBcOffset) : m_nextBlockId(0) , m_nextOpndId(0) , m_nextInstId(0) , m_bcOff(initialBcOffset) , m_entry(defBlock()) { }
IRUnit::IRUnit(TransContext context) : m_context(context) { // Setup m_entry after property initialization, since it depends on // the value of m_defHint. // For Optimize translations, the entry block's profCount is // adjusted later in translateRegion. m_entry = defBlock(); m_startNanos = HPHP::Timer::GetThreadCPUTimeNanos(); }
Block* makeExitSlow(IRGS& env) { auto const exit = defBlock(env, Block::Hint::Unlikely); BlockPusher bp(*env.irb, makeMarker(env, bcOff(env)), exit); interpOne(env, *env.currentNormalizedInstruction); // If it changes the PC, InterpOneCF will get us to the new location. if (!opcodeChangesPC(env.currentNormalizedInstruction->op())) { gen(env, Jmp, makeExit(env, nextBcOff(env))); } return exit; }
Block* makeExitOpt(IRGS& env, TransID transId) { assertx(!isInlining(env)); auto const targetBcOff = bcOff(env); auto const exit = defBlock(env, Block::Hint::Unlikely); BlockPusher blockPusher(*env.irb, makeMarker(env, targetBcOff), exit); auto const data = ReqRetranslateOptData { transId, SrcKey { curSrcKey(env), targetBcOff }, bcSPOffset(env) }; gen(env, ReqRetranslateOpt, data, sp(env), fp(env)); return exit; }
IRUnit::IRUnit(TransContext context) : m_context(context) , m_entry(defBlock()) {}