void recordRelocationMetaData(SrcKey sk, SrcRec& srcRec, const TransLoc& loc, CGMeta& fixups) { if (!RuntimeOption::EvalPerfRelocate) return; recordPerfRelocMap(loc.mainStart(), loc.mainEnd(), loc.coldCodeStart(), loc.coldEnd(), sk, -1, srcRec.tailFallbackJumps(), fixups); }
void reclaimTranslation(TransLoc loc) { BlockingLeaseHolder writer(Translator::WriteLease()); ITRACE(1, "Reclaiming translation M[{}, {}] C[{}, {}] F[{}, {}]\n", loc.mainStart(), loc.mainEnd(), loc.coldStart(), loc.coldEnd(), loc.frozenStart(), loc.frozenEnd()); Trace::Indent _i; auto& cache = mcg->code(); cache.blockFor(loc.mainStart()).free(loc.mainStart(), loc.mainSize()); cache.blockFor(loc.coldStart()).free(loc.coldStart(), loc.coldSize()); if (loc.coldStart() != loc.frozenStart()) { cache.blockFor(loc.frozenStart()).free(loc.frozenStart(), loc.frozenSize()); } for (auto it = s_smashedBranches.begin(); it != s_smashedBranches.end();) { auto br = it++; if (loc.contains(br->first)) { ITRACE(1, "Erasing smashed branch @ {} from SrcRec addr={}\n", br->first, (void*)br->second); br->second->removeIncomingBranch(br->first); s_smashedBranches.erase(br); } } // Erase meta-data about these regions of the TC { ITRACE(1, "Clearing translation meta-data\n"); Trace::Indent _i; clearTCMaps(loc.mainStart(), loc.mainEnd()); clearTCMaps(loc.coldCodeStart(), loc.coldEnd()); clearTCMaps(loc.frozenCodeStart(), loc.frozenEnd()); } if (debug) { // Ensure no one calls into the function ITRACE(1, "Overwriting function\n"); auto clearBlock = [] (CodeBlock& cb) { X64Assembler a {cb}; while (cb.available() >= 2) a.ud2(); if (cb.available() > 0) a.int3(); always_assert(!cb.available()); }; CodeBlock main, cold, frozen; main.init(loc.mainStart(), loc.mainSize(), "Dead Main"); cold.init(loc.coldStart(), loc.coldSize(), "Dead Cold"); frozen.init(loc.frozenStart(), loc.frozenSize(), "Dead Frozen"); clearBlock(main); clearBlock(cold); clearBlock(frozen); } }