]> git.saurik.com Git - apple/javascriptcore.git/blame_incremental - jit/JITDriver.h
JavaScriptCore-1097.3.tar.gz
[apple/javascriptcore.git] / jit / JITDriver.h
... / ...
CommitLineData
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#ifndef JITDriver_h
27#define JITDriver_h
28
29#include <wtf/Platform.h>
30
31#if ENABLE(JIT)
32
33#include "BytecodeGenerator.h"
34#include "DFGDriver.h"
35#include "JIT.h"
36#include "LLIntEntrypoints.h"
37
38namespace JSC {
39
40template<typename CodeBlockType>
41inline bool jitCompileIfAppropriate(JSGlobalData& globalData, OwnPtr<CodeBlockType>& codeBlock, JITCode& jitCode, JITCode::JITType jitType, JITCompilationEffort effort)
42{
43 if (jitType == codeBlock->getJITType())
44 return true;
45
46 if (!globalData.canUseJIT())
47 return true;
48
49 codeBlock->unlinkIncomingCalls();
50
51 JITCode oldJITCode = jitCode;
52
53 bool dfgCompiled = false;
54 if (jitType == JITCode::DFGJIT)
55 dfgCompiled = DFG::tryCompile(globalData, codeBlock.get(), jitCode);
56 if (dfgCompiled) {
57 if (codeBlock->alternative())
58 codeBlock->alternative()->unlinkIncomingCalls();
59 } else {
60 if (codeBlock->alternative()) {
61 codeBlock = static_pointer_cast<CodeBlockType>(codeBlock->releaseAlternative());
62 jitCode = oldJITCode;
63 return false;
64 }
65 jitCode = JIT::compile(&globalData, codeBlock.get(), effort);
66 if (!jitCode) {
67 jitCode = oldJITCode;
68 return false;
69 }
70 }
71 codeBlock->setJITCode(jitCode, MacroAssemblerCodePtr());
72
73 return true;
74}
75
76inline bool jitCompileFunctionIfAppropriate(JSGlobalData& globalData, OwnPtr<FunctionCodeBlock>& codeBlock, JITCode& jitCode, MacroAssemblerCodePtr& jitCodeWithArityCheck, SharedSymbolTable*& symbolTable, JITCode::JITType jitType, JITCompilationEffort effort)
77{
78 if (jitType == codeBlock->getJITType())
79 return true;
80
81 if (!globalData.canUseJIT())
82 return true;
83
84 codeBlock->unlinkIncomingCalls();
85
86 JITCode oldJITCode = jitCode;
87 MacroAssemblerCodePtr oldJITCodeWithArityCheck = jitCodeWithArityCheck;
88
89 bool dfgCompiled = false;
90 if (jitType == JITCode::DFGJIT)
91 dfgCompiled = DFG::tryCompileFunction(globalData, codeBlock.get(), jitCode, jitCodeWithArityCheck);
92 if (dfgCompiled) {
93 if (codeBlock->alternative())
94 codeBlock->alternative()->unlinkIncomingCalls();
95 } else {
96 if (codeBlock->alternative()) {
97 codeBlock = static_pointer_cast<FunctionCodeBlock>(codeBlock->releaseAlternative());
98 symbolTable = codeBlock->sharedSymbolTable();
99 jitCode = oldJITCode;
100 jitCodeWithArityCheck = oldJITCodeWithArityCheck;
101 return false;
102 }
103 jitCode = JIT::compile(&globalData, codeBlock.get(), effort, &jitCodeWithArityCheck);
104 if (!jitCode) {
105 jitCode = oldJITCode;
106 jitCodeWithArityCheck = oldJITCodeWithArityCheck;
107 return false;
108 }
109 }
110 codeBlock->setJITCode(jitCode, jitCodeWithArityCheck);
111
112 return true;
113}
114
115} // namespace JSC
116
117#endif // ENABLE(JIT)
118
119#endif // JITDriver_h
120