diff --git a/hphp/runtime/vm/translator/hopt/codegen.cpp b/hphp/runtime/vm/translator/hopt/codegen.cpp index 44903d987..d8d545110 100644 --- a/hphp/runtime/vm/translator/hopt/codegen.cpp +++ b/hphp/runtime/vm/translator/hopt/codegen.cpp @@ -5039,6 +5039,8 @@ void CodeGenerator::cgBlock(Block* block, vector* bcMap) { auto* addr = cgInst(inst); if (m_state.asmInfo && addr) { m_state.asmInfo->instRanges[inst] = TcaRange(addr, m_as.code.frontier); + m_state.asmInfo->asmRanges[block] = + TcaRange(m_state.asmInfo->asmRanges[block].start(), m_as.code.frontier); } } } @@ -5077,6 +5079,9 @@ void cgTrace(Trace* trace, Asm& amain, Asm& astubs, Transl::TranslatorX64* tx64, last->getOpcode() == Jmp_ && last->getTaken() == nextThisAs; CodeGenerator cg(trace, *as, astubs, tx64, state); + if (state.asmInfo) { + state.asmInfo->asmRanges[block] = TcaRange(asmStart, as->code.frontier); + } cg.cgBlock(block, bcMap); Block* next = block->getNext(); if (next && next != nextThisAs) { @@ -5094,6 +5099,10 @@ void cgTrace(Trace* trace, Asm& amain, Asm& astubs, Transl::TranslatorX64* tx64, } } +void CodeGenerator::print() const { + m_curTrace->print(std::cout, m_state.asmInfo); +} + // select instructions for the trace and its exits void genCodeForTrace(Trace* trace, CodeGenerator::Asm& as, diff --git a/hphp/runtime/vm/translator/hopt/codegen.h b/hphp/runtime/vm/translator/hopt/codegen.h index c940da168..2e7a00d71 100644 --- a/hphp/runtime/vm/translator/hopt/codegen.h +++ b/hphp/runtime/vm/translator/hopt/codegen.h @@ -319,6 +319,9 @@ private: asm_label(m_as, done); } + // This is for printing partially-generated traces when debugging + void print() const; + private: Asm& m_as; // current "main" assembler Asm& m_astubs; // assembler for stubs and other cold code.