Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
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;
}
Exemplo n.º 5
0
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;
}