void SrcRec::patchIncomingBranches(TCA newStart) { if (hasDebuggerGuard()) { // We have a debugger guard, so all jumps to us funnel through // this. Just smash m_dbgBranchGuardSrc. TRACE(1, "smashing m_dbgBranchGuardSrc @%p\n", m_dbgBranchGuardSrc.get()); smashJmp(m_dbgBranchGuardSrc, newStart); return; } TRACE(1, "%zd incoming branches to rechain\n", m_incomingBranches.size()); for (auto &br : m_incomingBranches) { TRACE(1, "SrcRec(%p)::newTranslation rechaining @%p -> %p\n", this, br.toSmash(), newStart); br.patch(newStart); } }
void SrcRec::patchIncomingBranches(TCA newStart) { if (hasDebuggerGuard()) { // We have a debugger guard, so all jumps to us funnel through // this. Just smash m_dbgBranchGuardSrc. TRACE(1, "smashing m_dbgBranchGuardSrc @%p\n", m_dbgBranchGuardSrc); JIT::smashJmp(m_dbgBranchGuardSrc, newStart); return; } TRACE(1, "%zd incoming branches to rechain\n", m_incomingBranches.size()); auto& change = m_incomingBranches; for (unsigned i = 0; i < change.size(); ++i) { TRACE(1, "SrcRec(%p)::newTranslation rechaining @%p -> %p\n", this, change[i].toSmash(), newStart); patch(change[i], newStart); } }
void SrcRec::patchIncomingBranches(Asm& a, Asm &astubs, TCA newStart) { if (hasDebuggerGuard()) { // We have a debugger guard, so all jumps to us funnel through // this. Just smash m_dbgBranchGuardSrc. TRACE(1, "smashing m_dbgBranchGuardSrc @%p\n", m_dbgBranchGuardSrc); TranslatorX64::smashJmp(a, m_dbgBranchGuardSrc, newStart); return; } TRACE(1, "%zd incoming branches to rechain\n", m_incomingBranches.size()); vector<IncomingBranch>& change = m_incomingBranches; for (unsigned i = 0; i < change.size(); ++i) { TRACE(1, "SrcRec(%p)::newTranslation rechaining @%p -> %p\n", this, change[i].m_src, newStart); Asm *as = change[i].m_type == IncomingBranch::ADDR ? NULL : &Asm::Choose(a, astubs, change[i].m_src); patch(as, change[i], newStart); } }