Ignore:
Timestamp:
Jun 20, 2012, 10:48:23 AM (13 years ago)
Author:
[email protected]
Message:

DFG should be able to print disassembly interleaved with the IR
https://bugs.webkit.org/show_bug.cgi?id=89551

Reviewed by Geoffrey Garen.

  • CMakeLists.txt:
  • GNUmakefile.list.am:
  • JavaScriptCore.xcodeproj/project.pbxproj:
  • Target.pri:
  • assembler/ARMv7Assembler.h:

(JSC::ARMv7Assembler::labelIgnoringWatchpoints):
(ARMv7Assembler):

  • assembler/AbstractMacroAssembler.h:

(AbstractMacroAssembler):
(JSC::AbstractMacroAssembler::labelIgnoringWatchpoints):

  • assembler/X86Assembler.h:

(X86Assembler):
(JSC::X86Assembler::labelIgnoringWatchpoints):

  • dfg/DFGCommon.h:

(JSC::DFG::shouldShowDisassembly):
(DFG):

  • dfg/DFGDisassembler.cpp: Added.

(DFG):
(JSC::DFG::Disassembler::Disassembler):
(JSC::DFG::Disassembler::dump):
(JSC::DFG::Disassembler::dumpDisassembly):

  • dfg/DFGDisassembler.h: Added.

(DFG):
(Disassembler):
(JSC::DFG::Disassembler::setStartOfCode):
(JSC::DFG::Disassembler::setForBlock):
(JSC::DFG::Disassembler::setForNode):
(JSC::DFG::Disassembler::setEndOfMainPath):
(JSC::DFG::Disassembler::setEndOfCode):

  • dfg/DFGDriver.cpp:

(JSC::DFG::compile):

  • dfg/DFGGraph.cpp:

(JSC::DFG::Graph::dumpCodeOrigin):
(JSC::DFG::Graph::amountOfNodeWhiteSpace):
(DFG):
(JSC::DFG::Graph::printNodeWhiteSpace):
(JSC::DFG::Graph::dump):
(JSC::DFG::Graph::dumpBlockHeader):

  • dfg/DFGGraph.h:
  • dfg/DFGJITCompiler.cpp:

(JSC::DFG::JITCompiler::JITCompiler):
(DFG):
(JSC::DFG::JITCompiler::compile):
(JSC::DFG::JITCompiler::compileFunction):

  • dfg/DFGJITCompiler.h:

(JITCompiler):
(JSC::DFG::JITCompiler::setStartOfCode):
(JSC::DFG::JITCompiler::setForBlock):
(JSC::DFG::JITCompiler::setForNode):
(JSC::DFG::JITCompiler::setEndOfMainPath):
(JSC::DFG::JITCompiler::setEndOfCode):

  • dfg/DFGNode.h:

(Node):
(JSC::DFG::Node::willHaveCodeGen):

  • dfg/DFGNodeFlags.cpp:

(JSC::DFG::nodeFlagsAsString):

  • dfg/DFGSpeculativeJIT.cpp:

(JSC::DFG::SpeculativeJIT::compile):

  • dfg/DFGSpeculativeJIT.h:

(SpeculativeJIT):

  • runtime/Options.cpp:

(Options):
(JSC::Options::initializeOptions):

  • runtime/Options.h:

(Options):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/dfg/DFGGraph.cpp

    r120499 r120834  
    9090}
    9191
    92 void Graph::dumpCodeOrigin(NodeIndex prevNodeIndex, NodeIndex nodeIndex)
     92void Graph::dumpCodeOrigin(const char* prefix, NodeIndex prevNodeIndex, NodeIndex nodeIndex)
    9393{
    9494    if (prevNodeIndex == NoNode)
     
    113113    // Print the pops.
    114114    for (unsigned i = previousInlineStack.size(); i-- > indexOfDivergence;) {
     115        dataLog("%s", prefix);
    115116        printWhiteSpace(i * 2);
    116117        dataLog("<-- %p\n", previousInlineStack[i].inlineCallFrame->executable.get());
     
    119120    // Print the pushes.
    120121    for (unsigned i = indexOfDivergence; i < currentInlineStack.size(); ++i) {
     122        dataLog("%s", prefix);
    121123        printWhiteSpace(i * 2);
    122124        dataLog("--> %p\n", currentInlineStack[i].inlineCallFrame->executable.get());
     
    124126}
    125127
    126 void Graph::dump(NodeIndex nodeIndex)
     128int Graph::amountOfNodeWhiteSpace(Node& node)
     129{
     130    return (node.codeOrigin.inlineDepth() - 1) * 2;
     131}
     132
     133void Graph::printNodeWhiteSpace(Node& node)
     134{
     135    printWhiteSpace(amountOfNodeWhiteSpace(node));
     136}
     137
     138void Graph::dump(const char* prefix, NodeIndex nodeIndex)
    127139{
    128140    Node& node = at(nodeIndex);
     
    135147        --refCount;
    136148   
    137     printWhiteSpace((node.codeOrigin.inlineDepth() - 1) * 2);
     149    dataLog("%s", prefix);
     150    printNodeWhiteSpace(node);
    138151
    139152    // Example/explanation of dataflow dump output
     
    289302}
    290303
     304void Graph::dumpBlockHeader(const char* prefix, BlockIndex blockIndex, PhiNodeDumpMode phiNodeDumpMode)
     305{
     306    BasicBlock* block = m_blocks[blockIndex].get();
     307
     308    dataLog("%sBlock #%u (bc#%u): %s%s\n", prefix, (int)blockIndex, block->bytecodeBegin, block->isReachable ? "" : " (skipped)", block->isOSRTarget ? " (OSR target)" : "");
     309    dataLog("%s  Predecessors:", prefix);
     310    for (size_t i = 0; i < block->m_predecessors.size(); ++i)
     311        dataLog(" #%u", block->m_predecessors[i]);
     312    dataLog("\n");
     313    if (m_dominators.isValid()) {
     314        dataLog("%s  Dominated by:", prefix);
     315        for (size_t i = 0; i < m_blocks.size(); ++i) {
     316            if (!m_dominators.dominates(i, blockIndex))
     317                continue;
     318            dataLog(" #%lu", static_cast<unsigned long>(i));
     319        }
     320        dataLog("\n");
     321        dataLog("%s  Dominates:", prefix);
     322        for (size_t i = 0; i < m_blocks.size(); ++i) {
     323            if (!m_dominators.dominates(blockIndex, i))
     324                continue;
     325            dataLog(" #%lu", static_cast<unsigned long>(i));
     326        }
     327        dataLog("\n");
     328    }
     329    dataLog("%s  Phi Nodes:", prefix);
     330    unsigned count = 0;
     331    for (size_t i = 0; i < block->phis.size(); ++i) {
     332        NodeIndex phiNodeIndex = block->phis[i];
     333        Node& phiNode = at(phiNodeIndex);
     334        if (!phiNode.shouldGenerate() && phiNodeDumpMode == DumpLivePhisOnly)
     335            continue;
     336        if (!((++count) % 4))
     337            dataLog("\n%s      ", prefix);
     338        dataLog(" @%u->(", phiNodeIndex);
     339        if (phiNode.child1()) {
     340            dataLog("@%u", phiNode.child1().index());
     341            if (phiNode.child2()) {
     342                dataLog(", @%u", phiNode.child2().index());
     343                if (phiNode.child3())
     344                    dataLog(", @%u", phiNode.child3().index());
     345            }
     346        }
     347        dataLog(")%s", i + 1 < block->phis.size() ? "," : "");
     348    }
     349    dataLog("\n");
     350}
     351
    291352void Graph::dump()
    292353{
     
    296357        if (!block)
    297358            continue;
    298         dataLog("Block #%u (bc#%u): %s%s\n", (int)b, block->bytecodeBegin, block->isReachable ? "" : " (skipped)", block->isOSRTarget ? " (OSR target)" : "");
    299         dataLog("  Predecessors:");
    300         for (size_t i = 0; i < block->m_predecessors.size(); ++i)
    301             dataLog(" #%u", block->m_predecessors[i]);
    302         dataLog("\n");
    303         if (m_dominators.isValid()) {
    304             dataLog("  Dominated by:");
    305             for (size_t i = 0; i < m_blocks.size(); ++i) {
    306                 if (!m_dominators.dominates(i, b))
    307                     continue;
    308                 dataLog(" #%lu", static_cast<unsigned long>(i));
    309             }
    310             dataLog("\n");
    311             dataLog("  Dominates:");
    312             for (size_t i = 0; i < m_blocks.size(); ++i) {
    313                 if (!m_dominators.dominates(b, i))
    314                     continue;
    315                 dataLog(" #%lu", static_cast<unsigned long>(i));
    316             }
    317             dataLog("\n");
    318         }
    319         dataLog("  Phi Nodes:\n");
    320         for (size_t i = 0; i < block->phis.size(); ++i) {
    321             dumpCodeOrigin(lastNodeIndex, block->phis[i]);
    322             dump(block->phis[i]);
    323             lastNodeIndex = block->phis[i];
    324         }
     359        dumpBlockHeader("", b, DumpAllPhis);
    325360        dataLog("  vars before: ");
    326361        if (block->cfaHasVisited)
     
    333368        dataLog("\n");
    334369        for (size_t i = 0; i < block->size(); ++i) {
    335             dumpCodeOrigin(lastNodeIndex, block->at(i));
    336             dump(block->at(i));
     370            dumpCodeOrigin("", lastNodeIndex, block->at(i));
     371            dump("", block->at(i));
    337372            lastNodeIndex = block->at(i);
    338373        }
Note: See TracChangeset for help on using the changeset viewer.