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; }
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; }