1/* 2 * Copyright (C) 2012, 2013 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#ifndef DFGDisassembler_h 27#define DFGDisassembler_h 28 29#if ENABLE(DFG_JIT) 30 31#include "DFGCommon.h" 32#include "DumpContext.h" 33#include "MacroAssembler.h" 34#include "ProfilerCompilation.h" 35#include <wtf/HashMap.h> 36#include <wtf/StringPrintStream.h> 37#include <wtf/Vector.h> 38 39namespace JSC { 40 41class LinkBuffer; 42 43namespace DFG { 44 45class Graph; 46 47class Disassembler { 48 WTF_MAKE_FAST_ALLOCATED; 49public: 50 Disassembler(Graph&); 51 52 void setStartOfCode(MacroAssembler::Label label) { m_startOfCode = label; } 53 void setForBlockIndex(BlockIndex blockIndex, MacroAssembler::Label label) 54 { 55 m_labelForBlockIndex[blockIndex] = label; 56 } 57 void setForNode(Node* node, MacroAssembler::Label label) 58 { 59 ASSERT(label.isSet()); 60 m_labelForNode.add(node, label); 61 } 62 void setEndOfMainPath(MacroAssembler::Label label) 63 { 64 m_endOfMainPath = label; 65 } 66 void setEndOfCode(MacroAssembler::Label label) 67 { 68 m_endOfCode = label; 69 } 70 71 void dump(PrintStream&, LinkBuffer&); 72 void dump(LinkBuffer&); 73 void reportToProfiler(Profiler::Compilation*, LinkBuffer&); 74 75private: 76 void dumpHeader(PrintStream&, LinkBuffer&); 77 78 struct DumpedOp { 79 DumpedOp(CodeOrigin codeOrigin, CString text) 80 : codeOrigin(codeOrigin) 81 , text(text) 82 { 83 } 84 85 CodeOrigin codeOrigin; 86 CString text; 87 }; 88 void append(Vector<DumpedOp>&, StringPrintStream&, CodeOrigin&); 89 Vector<DumpedOp> createDumpList(LinkBuffer&); 90 91 void dumpDisassembly(PrintStream&, const char* prefix, LinkBuffer&, MacroAssembler::Label& previousLabel, MacroAssembler::Label currentLabel, Node* context); 92 93 Graph& m_graph; 94 DumpContext m_dumpContext; 95 MacroAssembler::Label m_startOfCode; 96 Vector<MacroAssembler::Label> m_labelForBlockIndex; 97 HashMap<Node*, MacroAssembler::Label> m_labelForNode; 98 MacroAssembler::Label m_endOfMainPath; 99 MacroAssembler::Label m_endOfCode; 100}; 101 102} } // namespace JSC::DFG 103 104#endif // ENABLE(DFG_JIT) 105 106#endif // DFGDisassembler_h 107