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}; irgen::emitFuncBodyDispatch(env, dvs); irgen::sealUnit(env); CGMeta fixups; auto vunit = irlower::lowerUnit(env.unit, CodeKind::CrossTrace); auto& main = code.main(); auto const start = main.frontier(); emitVunit(*vunit, env.unit, code, fixups); if (RuntimeOption::EvalPerfRelocate) { GrowableVector<IncomingBranch> ibs; auto& frozen = code.frozen(); tc::recordPerfRelocMap(start, main.frontier(), frozen.frontier(), frozen.frontier(), context.srcKey(), 0, ibs, fixups); } fixups.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, 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); auto vunit = irlower::lowerUnit(env.unit, CodeKind::CrossTrace); emitVunit(*vunit, env.unit, code, fixups); return start; }