TCA genFuncBodyDispatch(Func* func, const DVFuncletsVec& dvs, CodeCache::View code) { auto context = prologue_context(kInvalidTransID, TransKind::Live, func, func->base()); IRUnit unit{context}; irgen::IRGS env{unit}; auto& main = code.main(); auto& frozen = code.frozen(); auto const start = main.frontier(); irgen::emitFuncBodyDispatch(env, dvs); irgen::sealUnit(env); CGMeta fixups; irlower::genCode(env.unit, code, fixups, CodeKind::CrossTrace); if (RuntimeOption::EvalPerfRelocate) { GrowableVector<IncomingBranch> ibs; recordPerfRelocMap(start, main.frontier(), frozen.frontier(), frozen.frontier(), SrcKey { func, dvs[0].second, false }, 0, ibs, fixups); } fixups.process(nullptr); return start; }
TCA genCallArrayPrologue(Func* func, const DVFuncletsVec& dvs) { auto context = prologue_context(kInvalidTransID, func, func->base()); IRGS env{context, TransFlags{}}; assertx(mcg->cgFixups().empty()); auto& main = mcg->code.main(); auto& frozen = mcg->code.frozen(); auto const start = main.frontier(); irgen::emitCallArrayPrologue(env, dvs); irgen::sealUnit(env); genCode(env.unit, CodeKind::CrossTrace); if (RuntimeOption::EvalPerfRelocate) { GrowableVector<IncomingBranch> ibs; recordPerfRelocMap(start, main.frontier(), frozen.frontier(), frozen.frontier(), SrcKey { func, dvs[0].second, false }, 0, ibs, mcg->cgFixups()); } mcg->cgFixups().process(nullptr); return start; }
TCA genFuncPrologue(TransID transID, TransKind kind, Func* func, int argc, CodeCache::View code, CGMeta& fixups) { auto context = prologue_context(transID, kind, func, func->getEntryForNumArgs(argc)); IRUnit unit{context}; irgen::IRGS env{unit, nullptr}; irgen::emitFuncPrologue(env, argc, transID); irgen::sealUnit(env); printUnit(2, unit, "After initial prologue generation"); auto vunit = irlower::lowerUnit(env.unit, CodeKind::CrossTrace); emitVunit(*vunit, env.unit, code, fixups); return unit.prologueStart; }
TCA genFuncPrologue(TransID transID, Func* func, int argc) { auto context = prologue_context(transID, func, func->getEntryForNumArgs(argc)); IRGS env{context, TransFlags{}}; auto& cb = mcg->code.main(); // Dump the func guard in the TC before anything else. emitFuncGuard(func, cb); auto const start = cb.frontier(); irgen::emitFuncPrologue(env, argc, transID); irgen::sealUnit(env); genCode(env.unit, CodeKind::CrossTrace); return start; }
TCA genFuncPrologue(TransID transID, TransKind kind, Func* func, int argc, CodeCache::View code, CGMeta& fixups) { auto context = prologue_context(transID, kind, func, func->getEntryForNumArgs(argc)); IRUnit unit{context}; irgen::IRGS env{unit}; auto& cb = code.main(); // Dump the func guard in the TC before anything else. emitFuncGuard(func, cb, fixups); auto const start = cb.frontier(); irgen::emitFuncPrologue(env, argc, transID); irgen::sealUnit(env); irlower::genCode(env.unit, code, fixups, CodeKind::CrossTrace); return start; }