748fc26afc95e4c9449358aab2d0094356418c0a
[WebKit-https.git] / Source / JavaScriptCore / jit / JITDisassembler.cpp
1 /*
2  * Copyright (C) 2012 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 #include "config.h"
27 #include "JITDisassembler.h"
28
29 #if ENABLE(JIT)
30
31 #include "CodeBlock.h"
32 #include "JIT.h"
33
34 namespace JSC {
35
36 JITDisassembler::JITDisassembler(CodeBlock *codeBlock)
37     : m_codeBlock(codeBlock)
38     , m_labelForBytecodeIndexInMainPath(codeBlock->instructionCount())
39     , m_labelForBytecodeIndexInSlowPath(codeBlock->instructionCount())
40 {
41 }
42
43 JITDisassembler::~JITDisassembler()
44 {
45 }
46
47 void JITDisassembler::dump(LinkBuffer& linkBuffer)
48 {
49     dataLog("Baseline JIT code for CodeBlock %p, instruction count = %u:\n", m_codeBlock, m_codeBlock->instructionCount());
50     dataLog("    Code at [%p, %p):\n", linkBuffer.debugAddress(), static_cast<char*>(linkBuffer.debugAddress()) + linkBuffer.debugSize());
51     dumpDisassembly(linkBuffer, m_startOfCode, m_labelForBytecodeIndexInMainPath[0]);
52     
53     MacroAssembler::Label firstSlowLabel;
54     for (unsigned i = 0; i < m_labelForBytecodeIndexInSlowPath.size(); ++i) {
55         if (m_labelForBytecodeIndexInSlowPath[i].isSet()) {
56             firstSlowLabel = m_labelForBytecodeIndexInSlowPath[i];
57             break;
58         }
59     }
60     dumpForInstructions(linkBuffer, "    ", m_labelForBytecodeIndexInMainPath, firstSlowLabel.isSet() ? firstSlowLabel : m_endOfSlowPath);
61     dataLog("    (End Of Main Path)\n");
62     dumpForInstructions(linkBuffer, "    (S) ", m_labelForBytecodeIndexInSlowPath, m_endOfSlowPath);
63     dataLog("    (End Of Slow Path)\n");
64
65     dumpDisassembly(linkBuffer, m_endOfSlowPath, m_endOfCode);
66 }
67
68 void JITDisassembler::dumpForInstructions(LinkBuffer& linkBuffer, const char* prefix, Vector<MacroAssembler::Label>& labels, MacroAssembler::Label endLabel)
69 {
70     for (unsigned i = 0 ; i < labels.size();) {
71         if (!labels[i].isSet()) {
72             i++;
73             continue;
74         }
75         dataLog("%s", prefix);
76         m_codeBlock->dump(i);
77         for (unsigned nextIndex = i + 1; ; nextIndex++) {
78             if (nextIndex >= labels.size()) {
79                 dumpDisassembly(linkBuffer, labels[i], endLabel);
80                 return;
81             }
82             if (labels[nextIndex].isSet()) {
83                 dumpDisassembly(linkBuffer, labels[i], labels[nextIndex]);
84                 i = nextIndex;
85                 break;
86             }
87         }
88     }
89 }
90
91 void JITDisassembler::dumpDisassembly(LinkBuffer& linkBuffer, MacroAssembler::Label from, MacroAssembler::Label to)
92 {
93     CodeLocationLabel fromLocation = linkBuffer.locationOf(from);
94     CodeLocationLabel toLocation = linkBuffer.locationOf(to);
95     disassemble(fromLocation, bitwise_cast<uintptr_t>(toLocation.executableAddress()) - bitwise_cast<uintptr_t>(fromLocation.executableAddress()), "        ", WTF::dataFile());
96 }
97
98 } // namespace JSC
99
100 #endif // ENABLE(JIT)
101