From 625331680e813f53b6a30a48533b1b0e1fc8c8f0 Mon Sep 17 00:00:00 2001 From: Brett Simmers Date: Tue, 7 Jun 2016 10:39:20 -0700 Subject: [PATCH] Move some JIT data members to more appropriate places Summary: The TCA -> TransID map has been moved from MCGenerator to ProfData, since it's used for PGO. Also turn it into a folly::AHM so it can be concurrently accessed without having to grab a lock. This increases the amount of memory that's freed when we delete ProfData. Move the SrcDB from Translator to MCGenerator. All the other translation metadata is owned by mcg so this makes more sense. While I was doing this, I cleaned up a couple related things: - Remove getSrcRec() and inline its contents into the one legit caller. It was being called by a bunch of other places that have no business creating SrcRecs. Those calls have been replaced with calls to find(). If the SrcRec doesn't already exist at those points, it's a bug. - Move registerFallBackJump() from SrcRec to vasm-internal.cpp, the only place it's used. Reviewed By: ottoni Differential Revision: D3388774 fbshipit-source-id: 5a6e7c38a90c3bccdc640c920c6924aa437dd56d --- hphp/runtime/vm/jit/cg-meta.cpp | 6 ++-- hphp/runtime/vm/jit/inlining-decider.cpp | 4 +-- hphp/runtime/vm/jit/mc-generator.cpp | 60 +++++++++++++++----------------- hphp/runtime/vm/jit/mc-generator.h | 17 ++++----- hphp/runtime/vm/jit/prof-data.cpp | 7 ++++ hphp/runtime/vm/jit/prof-data.h | 31 +++++++++++++++++ hphp/runtime/vm/jit/recycle-tc.cpp | 10 ++---- hphp/runtime/vm/jit/region-selection.cpp | 3 +- hphp/runtime/vm/jit/regionize-func.cpp | 3 +- hphp/runtime/vm/jit/relocation.cpp | 8 ++--- hphp/runtime/vm/jit/srcdb.cpp | 10 ------ hphp/runtime/vm/jit/srcdb.h | 3 +- hphp/runtime/vm/jit/trans-cfg.cpp | 11 +++--- hphp/runtime/vm/jit/trans-cfg.h | 1 - hphp/runtime/vm/jit/translator-inl.h | 19 ---------- hphp/runtime/vm/jit/translator.h | 23 +----------- hphp/runtime/vm/jit/vasm-internal.cpp | 17 ++++++--- 17 files changed, 110 insertions(+), 123 deletions(-) diff --git a/hphp/runtime/vm/jit/cg-meta.cpp b/hphp/runtime/vm/jit/cg-meta.cpp index 331ea07f816..106eb0e07bc 100644 --- a/hphp/runtime/vm/jit/cg-meta.cpp +++ b/hphp/runtime/vm/jit/cg-meta.cpp @@ -56,8 +56,10 @@ void CGMeta::process_only( } catches.clear(); - for (auto const& elm : jmpTransIDs) { - mcg->jmpToTransIDMap()[elm.first] = elm.second; + if (auto profData = jit::profData()) { + for (auto const& elm : jmpTransIDs) { + profData->setJmpTransID(elm.first, elm.second); + } } jmpTransIDs.clear(); diff --git a/hphp/runtime/vm/jit/inlining-decider.cpp b/hphp/runtime/vm/jit/inlining-decider.cpp index 4674d48a025..56833a53f42 100644 --- a/hphp/runtime/vm/jit/inlining-decider.cpp +++ b/hphp/runtime/vm/jit/inlining-decider.cpp @@ -608,8 +608,8 @@ RegionDescPtr selectCalleeCFG(const Func* callee, const int numArgs, return nullptr; } - TransCFG cfg(callee->getFuncId(), profData, mcg->tx().getSrcDB(), - mcg->jmpToTransIDMap(), true /* inlining */); + TransCFG cfg(callee->getFuncId(), profData, mcg->srcDB(), + true /* inlining */); HotTransContext ctx; ctx.tid = dvID; diff --git a/hphp/runtime/vm/jit/mc-generator.cpp b/hphp/runtime/vm/jit/mc-generator.cpp index 3f9d83f6a10..9d11e319350 100644 --- a/hphp/runtime/vm/jit/mc-generator.cpp +++ b/hphp/runtime/vm/jit/mc-generator.cpp @@ -267,7 +267,7 @@ void MCGenerator::invalidateFuncProfSrcKeys(const Func* func) { } TransResult MCGenerator::retranslate(const TransArgs& args) { - auto sr = m_tx.getSrcDB().find(args.sk); + auto sr = m_srcDB.find(args.sk); always_assert(sr); bool locked = sr->tryLock(); SCOPE_EXIT { @@ -412,7 +412,7 @@ TCA MCGenerator::findTranslation(const TransArgs& args) const { return nullptr; } - if (auto const sr = m_tx.getSrcDB().find(sk)) { + if (auto const sr = m_srcDB.find(sk)) { if (auto const tca = sr->getTopTranslation()) { SKTRACE(2, sk, "getTranslation: found %p\n", tca); return tca; @@ -434,7 +434,7 @@ TransResult MCGenerator::getTranslation(const TransArgs& args) { } int MCGenerator::numTranslations(SrcKey sk) const { - if (const SrcRec* sr = m_tx.getSrcDB().find(sk)) { + if (const SrcRec* sr = m_srcDB.find(sk)) { return sr->translations().size(); } return 0; @@ -547,7 +547,7 @@ TransResult MCGenerator::createTranslation(const TransArgs& args) { if (!createSrcRec(sk)) return nullptr; - auto sr = m_tx.getSrcDB().find(sk); + auto sr = m_srcDB.find(sk); always_assert(sr); if (auto const tca = sr->getTopTranslation()) { @@ -561,15 +561,7 @@ TransResult MCGenerator::createTranslation(const TransArgs& args) { } bool MCGenerator::createSrcRec(SrcKey sk) { - if (m_tx.getSrcDB().find(sk)) return true; - - LeaseHolder writer{Translator::WriteLease()}; - if (!writer.canWrite()) return false; - - if (m_tx.getSrcDB().find(sk)) { - // Someone created it between our check above and getting the write lease. - return true; - } + if (m_srcDB.find(sk)) return true; auto const srcRecSPOff = sk.resumed() ? folly::none : folly::make_optional(liveSpOff()); @@ -606,7 +598,12 @@ bool MCGenerator::createSrcRec(SrcKey sk) { } SKTRACE(1, sk, "inserting anchor translation for (%p,%d) at %p\n", sk.unit(), sk.offset(), req); - SrcRec* sr = m_tx.getSrcRec(sk); + + always_assert(m_srcDB.find(sk) == nullptr); + auto const sr = m_srcDB.insert(sk); + if (RuntimeOption::EvalEnableReusableTC) { + recordFuncSrcRec(sk.func(), sr); + } sr->setFuncInfo(sk.func()); sr->setAnchorTranslation(req); @@ -637,7 +634,7 @@ bool MCGenerator::createSrcRec(SrcKey sk) { TCA MCGenerator::lookupTranslation(SrcKey sk) const { - if (SrcRec* sr = m_tx.getSrcDB().find(sk)) { + if (auto const sr = m_srcDB.find(sk)) { return sr->getTopTranslation(); } return nullptr; @@ -718,11 +715,11 @@ TransResult MCGenerator::translate(TransArgs args) { Timer timer(Timer::mcg_translate); - assertx(m_tx.getSrcDB().find(args.sk)); - auto& srcRec = *m_tx.getSrcRec(args.sk); + auto const srcRec = m_srcDB.find(args.sk); + always_assert(srcRec); - args.region = reachedTranslationLimit(args.sk, srcRec) ? nullptr - : prepareRegion(args); + args.region = reachedTranslationLimit(args.sk, *srcRec) ? nullptr + : prepareRegion(args); TransEnv env{args}; env.initSpOffset = args.region ? args.region->entry()->initialSpOffset() : liveSpOff(); @@ -1136,7 +1133,8 @@ MCGenerator::bindJmp(TCA toSmash, SrcKey destSk, ServiceRequest req, LeaseHolder writer(Translator::WriteLease()); if (!writer.canWrite()) return tDest; - SrcRec* sr = m_tx.getSrcRec(destSk); + auto const sr = m_srcDB.find(destSk); + always_assert(sr); // The top translation may have changed while we waited for the write lease, // so read it again. If it was replaced with a new translation, then bind to // the new one. If it was invalidated, then don't bind the jump. @@ -1757,8 +1755,9 @@ TCA MCGenerator::finishTranslation(TransEnv env) { } } - auto& srcRec = *m_tx.getSrcRec(args.sk); - recordRelocationMetaData(sk, srcRec, loc, fixups); + auto const srcRec = m_srcDB.find(args.sk); + always_assert(srcRec); + recordRelocationMetaData(sk, *srcRec, loc, fixups); recordGdbTranslation(sk, sk.func(), code.main(), loc.mainStart(), false, false); recordGdbTranslation(sk, sk.func(), code.cold(), loc.coldStart(), @@ -1784,7 +1783,7 @@ TCA MCGenerator::finishTranslation(TransEnv env) { // metadata is not yet visible. TRACE(1, "newTranslation: %p sk: (func %d, bcOff %d)\n", loc.mainStart(), sk.funcID(), sk.offset()); - srcRec.newTranslation(loc, inProgressTailBranches); + srcRec->newTranslation(loc, inProgressTailBranches); TRACE(1, "mcg: %zd-byte tracelet\n", (ssize_t)loc.mainSize()); if (Trace::moduleEnabledRelease(Trace::tcspace, 1)) { @@ -1961,13 +1960,12 @@ bool MCGenerator::addDbgGuards(const Unit* unit) { // Doc says even find _could_ invalidate iterator, in pactice it should // be very rare, so go with it now. CGMeta fixups; - for (SrcDB::const_iterator it = m_tx.getSrcDB().begin(); - it != m_tx.getSrcDB().end(); ++it) { - SrcKey const sk = SrcKey::fromAtomicInt(it->first); + for (auto& pair : m_srcDB) { + SrcKey const sk = SrcKey::fromAtomicInt(pair.first); // We may have a SrcKey to a deleted function. NB: this may miss a // race with deleting a Func. See task #2826313. if (!Func::isFuncIdValid(sk.funcID())) continue; - SrcRec* sr = it->second; + SrcRec* sr = pair.second; if (sr->unitMd5() == unit->md5() && !sr->hasDebuggerGuard() && m_tx.isSrcKeyInBL(sk)) { @@ -1987,7 +1985,7 @@ bool MCGenerator::addDbgGuards(const Unit* unit) { bool MCGenerator::addDbgGuard(const Func* func, Offset offset, bool resumed) { SrcKey sk(func, offset, resumed); { - if (SrcRec* sr = m_tx.getSrcDB().find(sk)) { + if (SrcRec* sr = m_srcDB.find(sk)) { if (sr->hasDebuggerGuard()) { return true; } @@ -2005,7 +2003,7 @@ bool MCGenerator::addDbgGuard(const Func* func, Offset offset, bool resumed) { BlockingLeaseHolder writer(Translator::WriteLease()); CGMeta fixups; - if (SrcRec* sr = m_tx.getSrcDB().find(sk)) { + if (SrcRec* sr = m_srcDB.find(sk)) { auto code = m_code.view(); addDbgGuardImpl(sk, sr, code.main(), code.data(), fixups); } @@ -2104,8 +2102,8 @@ void MCGenerator::invalidateSrcKey(SrcKey sk) { * Reroute existing translations for SrcKey to an as-yet indeterminate * new one. */ - SrcRec* sr = m_tx.getSrcDB().find(sk); - assertx(sr); + auto const sr = m_srcDB.find(sk); + always_assert(sr); /* * Since previous translations aren't reachable from here, we know we * just created some garbage in the TC. We currently have no mechanism diff --git a/hphp/runtime/vm/jit/mc-generator.h b/hphp/runtime/vm/jit/mc-generator.h index 18911ea1aab..a1a8742992c 100644 --- a/hphp/runtime/vm/jit/mc-generator.h +++ b/hphp/runtime/vm/jit/mc-generator.h @@ -60,7 +60,6 @@ extern MCGenerator* mcg; const TCA kInvalidCatchTrace = TCA(-1); using CatchTraceMap = TreadHashMap; -using TCATransIDMap = hphp_hash_map; /////////////////////////////////////////////////////////////////////////////// @@ -169,7 +168,6 @@ struct MCGenerator { CodeCache& code() { return m_code; } const UniqueStubs& ustubs() const { return m_ustubs; } Translator& tx() { return m_tx; } - TCATransIDMap& jmpToTransIDMap() { return m_jmpToTransID; } CatchTraceMap& catchTraceMap() { return m_catchTraceMap; } FixupMap& fixupMap() { return m_fixupMap; } Debug::DebugInfo* debugInfo() { return &m_debugInfo; } @@ -196,6 +194,13 @@ struct MCGenerator { bool freeRequestStub(TCA stub); /* + * Get the SrcDB. + */ + const SrcDB& srcDB() const { + return m_srcDB; + } + + /* * Emit checks for (and hooks into) an attached debugger in front of each * translation in `unit' or for `SrcKey{func, offset, resumed}'. */ @@ -332,10 +337,6 @@ private: bool shouldTranslate(const Func*, TransKind) const; bool shouldTranslateNoSizeLimit(const Func*) const; - TCA getTopTranslation(SrcKey sk) { - return m_tx.getSrcRec(sk)->getTopTranslation(); - } - void syncWork(); TCA findTranslation(const TransArgs& args) const; @@ -381,12 +382,12 @@ private: // Data members. private: + SrcDB m_srcDB; + CodeCache m_code; UniqueStubs m_ustubs; Translator m_tx; - // Map from jump addresses to the ID of translation containing them. - TCATransIDMap m_jmpToTransID; // Number of translations made so far. uint64_t m_numTrans; diff --git a/hphp/runtime/vm/jit/prof-data.cpp b/hphp/runtime/vm/jit/prof-data.cpp index af52417ae0d..9ee91c6622d 100644 --- a/hphp/runtime/vm/jit/prof-data.cpp +++ b/hphp/runtime/vm/jit/prof-data.cpp @@ -70,6 +70,7 @@ ProfData::ProfData() , m_optimizedSKs(kFuncCountHint) , m_proflogueDB(kFuncCountHint) , m_dvFuncletDB(kFuncCountHint) + , m_jmpToTransID(kFuncCountHint) , m_blockEndOffsets(kFuncCountHint) {} @@ -183,6 +184,9 @@ ProfCounters s_persistentCounters{0}; struct ProfDataTreadmillDeleter { void operator()() { s_persistentCounters = data->takeCounters(); + if (RuntimeOption::ServerExecutionMode()) { + Logger::Info("Deleting JIT ProfData"); + } } std::unique_ptr data; @@ -214,6 +218,9 @@ void discardProfData() { s_profData.exchange(nullptr, std::memory_order_relaxed) }; if (data != nullptr) { + if (RuntimeOption::ServerExecutionMode()) { + Logger::Info("Putting JIT ProfData on Treadmill"); + } Treadmill::enqueue(ProfDataTreadmillDeleter{std::move(data)}); } } diff --git a/hphp/runtime/vm/jit/prof-data.h b/hphp/runtime/vm/jit/prof-data.h index dfc89f4ddc6..c0870b6dece 100644 --- a/hphp/runtime/vm/jit/prof-data.h +++ b/hphp/runtime/vm/jit/prof-data.h @@ -438,6 +438,32 @@ struct ProfData { */ void maybeResetCounters(); + /* + * Set the TransID for the translation owning the jmp at the given address. + */ + void setJmpTransID(TCA jmp, TransID id) { + m_jmpToTransID.emplace(jmp, id).first->second = id; + } + + /* + * Forget the TransID for the translation owning the jmp at the given address. + */ + void clearJmpTransID(TCA jmp) { + auto const it = m_jmpToTransID.find(jmp); + if (it == m_jmpToTransID.end()) return; + it->second = kInvalidTransID; + } + + /* + * Look up the TransID for the translation owning the jmp at the given + * address, returning kInvalidTransID if it can't be found or has been + * forgotten. + */ + TransID jmpTransID(TCA jmp) const { + auto const it = m_jmpToTransID.find(jmp); + return it == m_jmpToTransID.end() ? kInvalidTransID : it->second; + } + private: struct PrologueID { FuncId func; @@ -490,6 +516,11 @@ private: std::unordered_map m_funcProfTrans; /* + * Map from jump addresses to the ID of the translation containing them. + */ + folly::AtomicHashMap m_jmpToTransID; + + /* * Cache for Func -> block end offsets. Values in this map are never modified * after insertion so no locking is necessary for lookups. */ diff --git a/hphp/runtime/vm/jit/recycle-tc.cpp b/hphp/runtime/vm/jit/recycle-tc.cpp index 36980a68485..f4d2d3177a5 100644 --- a/hphp/runtime/vm/jit/recycle-tc.cpp +++ b/hphp/runtime/vm/jit/recycle-tc.cpp @@ -92,15 +92,11 @@ void clearProfCaller(TCA toSmash, const Func* func, int numArgs, */ void clearTCMaps(TCA start, TCA end) { auto& catchMap = mcg->catchTraceMap(); - auto& jmpMap = mcg->jmpToTransIDMap(); + auto const profData = jit::profData(); while (start < end) { x64::DecodedInstruction di (start); - if (di.isBranch()) { - auto it = jmpMap.find(start); - if (it != jmpMap.end()) { - ITRACE(1, "Erasing JMP @ {}\n", start); - jmpMap.erase(it); - } + if (profData && di.isBranch()) { + profData->clearJmpTransID(start); } if (auto* ct = catchMap.find(start)) { // We mark nothrow with a nullptr, which will assert during unwinding, diff --git a/hphp/runtime/vm/jit/region-selection.cpp b/hphp/runtime/vm/jit/region-selection.cpp index 6860b7ebf08..ed46d5ea6f9 100644 --- a/hphp/runtime/vm/jit/region-selection.cpp +++ b/hphp/runtime/vm/jit/region-selection.cpp @@ -776,8 +776,7 @@ RegionDescPtr selectHotRegion(TransID transId, assertx(profData); auto const& func = *profData->transRec(transId)->func(); FuncId funcId = func.getFuncId(); - TransCFG cfg(funcId, profData, mcg->tx().getSrcDB(), - mcg->jmpToTransIDMap()); + TransCFG cfg(funcId, profData, mcg->srcDB()); assertx(regionMode() != RegionMode::Method); RegionDescPtr region; HotTransContext ctx; diff --git a/hphp/runtime/vm/jit/regionize-func.cpp b/hphp/runtime/vm/jit/regionize-func.cpp index 4d074d6e414..2977241c1c8 100644 --- a/hphp/runtime/vm/jit/regionize-func.cpp +++ b/hphp/runtime/vm/jit/regionize-func.cpp @@ -278,8 +278,7 @@ RegionVec regionizeFunc(const Func* func, MCGenerator* mcg, auto const funcId = func->getFuncId(); auto const profData = jit::profData(); - TransCFG cfg(funcId, profData, mcg->tx().getSrcDB(), - mcg->jmpToTransIDMap()); + TransCFG cfg(funcId, profData, mcg->srcDB()); if (Trace::moduleEnabled(HPHP::Trace::pgo, 5)) { auto dotFileName = folly::to( diff --git a/hphp/runtime/vm/jit/relocation.cpp b/hphp/runtime/vm/jit/relocation.cpp index bce4bcb6221..ae8f74a5c99 100644 --- a/hphp/runtime/vm/jit/relocation.cpp +++ b/hphp/runtime/vm/jit/relocation.cpp @@ -43,10 +43,10 @@ namespace HPHP { namespace jit { struct TransRelocInfo { TransRelocInfo() {} - TransRelocInfo(TransRelocInfo&& other) = default; - TransRelocInfo& operator=(TransRelocInfo&& other) = default; + TransRelocInfo(TransRelocInfo&&) = default; + TransRelocInfo& operator=(TransRelocInfo&&) = default; TransRelocInfo(const TransRelocInfo&) = delete; - TransRelocInfo& operator=(const TransRelocInfo& other) = delete; + TransRelocInfo& operator=(const TransRelocInfo&) = delete; SrcKey sk; int argNum; TCA start; @@ -519,7 +519,7 @@ void relocate(std::vector& relocs, CodeBlock& dest, // Since we can now execute the relocated code, its ok to start fixing these // things now. - for (auto& it : mcg->tx().getSrcDB()) { + for (auto& it : mcg->srcDB()) { it.second->relocate(rel); } diff --git a/hphp/runtime/vm/jit/srcdb.cpp b/hphp/runtime/vm/jit/srcdb.cpp index 854628a4bc9..0127a6996e2 100644 --- a/hphp/runtime/vm/jit/srcdb.cpp +++ b/hphp/runtime/vm/jit/srcdb.cpp @@ -156,16 +156,6 @@ void SrcRec::chainFrom(IncomingBranch br) { } } -void SrcRec::registerFallbackJump(TCA from, ConditionCode cc, - CGMeta& fixups) { - auto incoming = cc < 0 ? IncomingBranch::jmpFrom(from) - : IncomingBranch::jccFrom(from); - - // We'll need to know the location of this jump later so we can - // patch it to new translations added to the chain. - fixups.inProgressTailJumps.push_back(incoming); -} - void SrcRec::newTranslation(TransLoc loc, GrowableVector& tailBranches) { // When translation punts due to hitting limit, will generate one diff --git a/hphp/runtime/vm/jit/srcdb.h b/hphp/runtime/vm/jit/srcdb.h index 345e0147dd7..1a6497dead9 100644 --- a/hphp/runtime/vm/jit/srcdb.h +++ b/hphp/runtime/vm/jit/srcdb.h @@ -180,7 +180,6 @@ struct SrcRec { */ void setFuncInfo(const Func* f); void chainFrom(IncomingBranch br); - void registerFallbackJump(TCA from, ConditionCode cc, CGMeta& fixups); TCA getFallbackTranslation() const; void newTranslation(TransLoc newStart, GrowableVector& inProgressTailBranches); @@ -298,7 +297,7 @@ struct SrcDB { ////////////////////////////////////////////////////////////////////////////// SrcRec* find(SrcKey sk) const { - SrcRec* const* p = m_map.find(sk.toAtomicInt()); + auto const p = m_map.find(sk.toAtomicInt()); return p ? *p : 0; } diff --git a/hphp/runtime/vm/jit/trans-cfg.cpp b/hphp/runtime/vm/jit/trans-cfg.cpp index eec9f787bdc..91708ff7bc8 100644 --- a/hphp/runtime/vm/jit/trans-cfg.cpp +++ b/hphp/runtime/vm/jit/trans-cfg.cpp @@ -28,8 +28,7 @@ TRACE_SET_MOD(pgo); static TransIDSet findPredTrans(TransID dstID, const ProfData* profData, - const SrcDB& srcDB, - const TCATransIDMap& jmpToTransID) { + const SrcDB& srcDB) { auto const dstRec = profData->transRec(dstID); auto const dstSK = dstRec->srcKey(); const SrcRec* dstSR = srcDB.find(dstSK); @@ -37,10 +36,9 @@ static TransIDSet findPredTrans(TransID dstID, TransIDSet predSet; for (auto& inBr : dstSR->incomingBranches()) { - auto src = jmpToTransID.find(inBr.toSmash()); - if (src == jmpToTransID.end()) continue; + auto const srcID = profData->jmpTransID(inBr.toSmash()); + if (srcID == kInvalidTransID) continue; - auto const srcID = src->second; auto const srcRec = profData->transRec(srcID); if (!srcRec || !srcRec->isProfile()) continue; @@ -93,7 +91,6 @@ static bool inferredArcWeight(const TransCFG::ArcPtrVec& arcVec, TransCFG::TransCFG(FuncId funcId, const ProfData* profData, const SrcDB& srcDB, - const TCATransIDMap& jmpToTransID, bool inlining /* = false */) { assertx(profData); @@ -115,7 +112,7 @@ TransCFG::TransCFG(FuncId funcId, auto const dstSK = rec->srcKey(); auto const dstBlock = rec->region()->entry(); FTRACE(5, "TransCFG: adding incoming arcs in dstId = {}\n", dstId); - TransIDSet predIDs = findPredTrans(dstId, profData, srcDB, jmpToTransID); + TransIDSet predIDs = findPredTrans(dstId, profData, srcDB); for (auto predId : predIDs) { if (hasNode(predId)) { auto const predRec = profData->transRec(predId); diff --git a/hphp/runtime/vm/jit/trans-cfg.h b/hphp/runtime/vm/jit/trans-cfg.h index b49af27426a..413db7a60b3 100644 --- a/hphp/runtime/vm/jit/trans-cfg.h +++ b/hphp/runtime/vm/jit/trans-cfg.h @@ -79,7 +79,6 @@ struct TransCFG { TransCFG(FuncId funcId, const ProfData* profData, const SrcDB& srcDB, - const TCATransIDMap& jmpToTransID, bool inlining = false); const std::vector& nodes() const { return m_transIds; } diff --git a/hphp/runtime/vm/jit/translator-inl.h b/hphp/runtime/vm/jit/translator-inl.h index 248b20c0147..b0f9ce36f55 100644 --- a/hphp/runtime/vm/jit/translator-inl.h +++ b/hphp/runtime/vm/jit/translator-inl.h @@ -19,25 +19,6 @@ #endif namespace HPHP { namespace jit { -/////////////////////////////////////////////////////////////////////////////// -// Translator accessors. - -inline const SrcDB& Translator::getSrcDB() const { - return m_srcDB; -} - -inline SrcRec* Translator::getSrcRec(SrcKey sk) { - // XXX: Add a insert-or-find primitive to THM. - if (SrcRec* r = m_srcDB.find(sk)) return r; - assertx(s_writeLease.amOwner()); - - auto rec = m_srcDB.insert(sk); - if (RuntimeOption::EvalEnableReusableTC) { - recordFuncSrcRec(sk.func(), rec); - } - - return rec; -} /////////////////////////////////////////////////////////////////////////////// // TransDB. diff --git a/hphp/runtime/vm/jit/translator.h b/hphp/runtime/vm/jit/translator.h index d471fa9dead..c2dc8f85569 100644 --- a/hphp/runtime/vm/jit/translator.h +++ b/hphp/runtime/vm/jit/translator.h @@ -27,7 +27,6 @@ #include "hphp/runtime/vm/jit/prof-src-key.h" #include "hphp/runtime/vm/jit/recycle-tc.h" #include "hphp/runtime/vm/jit/region-selection.h" -#include "hphp/runtime/vm/jit/srcdb.h" #include "hphp/runtime/vm/jit/trans-rec.h" #include "hphp/runtime/vm/jit/type.h" #include "hphp/runtime/vm/jit/types.h" @@ -62,7 +61,7 @@ struct NormalizedInstruction; struct ProfData; namespace irgen { struct IRGS; } -static const uint32_t transCountersPerChunk = 1024 * 1024 / 8; +constexpr uint32_t transCountersPerChunk = 1024 * 1024 / 8; /////////////////////////////////////////////////////////////////////////////// @@ -163,24 +162,6 @@ struct Translator { Translator(); ///////////////////////////////////////////////////////////////////////////// - // Accessors. - - /* - * Get the SrcDB. - * - * This is the one true SrcDB, since Translator is used as a singleton. - */ - const SrcDB& getSrcDB() const; - - /* - * Get the SrcRec for `sk'. - * - * If no SrcRec exists, insert one into the SrcDB. - */ - SrcRec* getSrcRec(SrcKey sk); - - - ///////////////////////////////////////////////////////////////////////////// // Translation DB. // // We maintain mappings from TCAs and TransIDs to translation information, @@ -275,8 +256,6 @@ struct Translator { private: int64_t m_createdTime; - SrcDB m_srcDB; - // Translation DB. typedef std::map TransDB; TransDB m_transDB; diff --git a/hphp/runtime/vm/jit/vasm-internal.cpp b/hphp/runtime/vm/jit/vasm-internal.cpp index 189617d8ddb..31c6f427969 100644 --- a/hphp/runtime/vm/jit/vasm-internal.cpp +++ b/hphp/runtime/vm/jit/vasm-internal.cpp @@ -163,6 +163,13 @@ static void setJmpTransID(Venv& env, TCA jmp) { ); } +static void registerFallbackJump(Venv& env, TCA jmp, ConditionCode cc) { + auto const incoming = cc == CC_None ? IncomingBranch::jmpFrom(jmp) + : IncomingBranch::jccFrom(jmp); + + env.meta.inProgressTailJumps.push_back(incoming); +} + bool emit(Venv& env, const bindjmp& i) { auto const jmp = emitSmashableJmp(*env.cb, env.meta, env.cb->frontier()); env.stubs.push_back({jmp, nullptr, i}); @@ -188,7 +195,7 @@ bool emit(Venv& env, const bindaddr& i) { bool emit(Venv& env, const fallback& i) { auto const jmp = emitSmashableJmp(*env.cb, env.meta, env.cb->frontier()); env.stubs.push_back({jmp, nullptr, i}); - mcg->tx().getSrcRec(i.target)->registerFallbackJump(jmp, CC_None, env.meta); + registerFallbackJump(env, jmp, CC_None); return true; } @@ -196,7 +203,7 @@ bool emit(Venv& env, const fallbackcc& i) { auto const jcc = emitSmashableJcc(*env.cb, env.meta, env.cb->frontier(), i.cc); env.stubs.push_back({nullptr, jcc, i}); - mcg->tx().getSrcRec(i.target)->registerFallbackJump(jcc, i.cc, env.meta); + registerFallbackJump(env, jcc, i.cc); return true; } @@ -243,7 +250,8 @@ void emit_svcreq_stub(Venv& env, const Venv::SvcReqPatch& p) { { auto const& i = p.svcreq.fallback_; assertx(p.jmp && !p.jcc); - auto const srcrec = mcg->tx().getSrcRec(i.target); + auto const srcrec = mcg->srcDB().find(i.target); + always_assert(srcrec); stub = i.trflags.packed ? svcreq::emit_retranslate_stub(frozen, env.text.data(), i.spOff, i.target, i.trflags) @@ -254,7 +262,8 @@ void emit_svcreq_stub(Venv& env, const Venv::SvcReqPatch& p) { { auto const& i = p.svcreq.fallbackcc_; assertx(!p.jmp && p.jcc); - auto const srcrec = mcg->tx().getSrcRec(i.target); + auto const srcrec = mcg->srcDB().find(i.target); + always_assert(srcrec); stub = i.trflags.packed ? svcreq::emit_retranslate_stub(frozen, env.text.data(), i.spOff, i.target, i.trflags) -- 2.11.4.GIT