示例#1
0
TransID ProfData::addTransProfile(const Tracelet&       tracelet,
                                  Offset                initSpOffset,
                                  const PostConditions& pconds) {
  TransID transId   = m_numTrans++;
  Offset  lastBcOff = tracelet.m_instrStream.last->source.offset();
  auto       region = selectTraceletLegacy(initSpOffset, tracelet);

  assert(region);
  DEBUG_ONLY size_t nBlocks = region->blocks.size();
  assert(nBlocks == 1 || (nBlocks > 1 && region->blocks[0]->inlinedCallee()));

  region->blocks.back()->setPostConditions(pconds);
  m_transRecs.emplace_back(new ProfTransRec(transId, TransProfile, lastBcOff,
                                            tracelet.m_sk, region));

  // If the translation corresponds to a DV Funclet, then add an entry
  // into dvFuncletDB.
  const Func* func = tracelet.m_sk.func();
  FuncId    funcId = func->getFuncId();
  Offset  bcOffset = tracelet.m_sk.offset();
  if (func->isDVEntry(bcOffset)) {
    int nParams = func->getDVEntryNumParams(bcOffset);
    // Normal DV funclets don't have type guards, and thus have a
    // single translation.  However, some special functions written
    // in hhas (e.g. array_map) have complex DV funclets that get
    // retranslated for different types.  For those functions,
    // m_dvFuncletDB keeps the TransID for their first translation.
    if (m_dvFuncletDB.get(funcId, nParams) == InvalidID) {
      m_dvFuncletDB.add(funcId, nParams, transId);
    }
  }
  return transId;
}
RegionDescPtr selectRegion(const RegionContext& context,
                           const Transl::Tracelet* t) {
    auto const mode = regionMode();

    FTRACE(1,
           "Select region: mode={} context:\n{}",
           static_cast<int>(mode), show(context)
          );

    auto region = [&] {
        try {
            switch (mode) {
            case RegionMode::None:
                return RegionDescPtr{nullptr};
            case RegionMode::OneBC:
                return selectOneBC(context);
            case RegionMode::Method:
                return selectMethod(context);
            case RegionMode::Tracelet:
                return selectTracelet(context, 0);
            case RegionMode::Legacy:
                always_assert(t);
                return selectTraceletLegacy(*t);
            case RegionMode::HotBlock:
            case RegionMode::HotTrace:
                always_assert(0 &&
                              "unsupported region mode");
            }
            not_reached();
        } catch (const std::exception& e) {
            FTRACE(1, "region selector threw: {}\n", e.what());
            return RegionDescPtr{nullptr};
        }
    }();

    if (region) {
        FTRACE(3, "{}", show(*region));
    } else {
        FTRACE(1, "no region selectable; using tracelet compiler\n");
    }

    return region;
}
示例#3
0
RegionDescPtr selectRegion(const RegionContext& context,
                           const Tracelet* t,
                           TransKind kind) {
  auto const mode = regionMode();

  FTRACE(1,
    "Select region: mode={} context:\n{}",
    static_cast<int>(mode), show(context)
  );

  auto region = [&]{
    try {
      switch (mode) {
        case RegionMode::None:
          return RegionDescPtr{nullptr};
        case RegionMode::Method:
          return selectMethod(context);
        case RegionMode::Tracelet:
          return selectTracelet(context, 0, kind == TransKind::Profile);
        case RegionMode::Legacy:
          always_assert(t);
          return selectTraceletLegacy(context.spOffset, *t);
      }
      not_reached();
    } catch (const std::exception& e) {
      FTRACE(1, "region selector threw: {}\n", e.what());
      return RegionDescPtr{nullptr};
    }
  }();

  if (region) {
    FTRACE(3, "{}", show(*region));
  } else {
    FTRACE(1, "no region selectable; using tracelet compiler\n");
  }

  return region;
}