CodeBlock compilation and installation should be simplified and rationalized
[WebKit-https.git] / Source / JavaScriptCore / llint / LLIntEntrypoints.cpp
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 #include "config.h"
27 #include "LLIntEntrypoints.h"
28
29 #if ENABLE(LLINT)
30
31 #include "CodeBlock.h"
32 #include "JITCode.h"
33 #include "JSObject.h"
34 #include "LLIntThunks.h"
35 #include "LowLevelInterpreter.h"
36 #include "VM.h"
37
38
39 namespace JSC { namespace LLInt {
40
41 void setFunctionEntrypoint(VM& vm, FunctionCodeBlock* codeBlock)
42 {
43     CodeSpecializationKind kind = codeBlock->specializationKind();
44     
45     if (!vm.canUseJIT()) {
46         if (kind == CodeForCall) {
47             codeBlock->setJITCode(
48                 adoptRef(new DirectJITCode(MacroAssemblerCodeRef::createLLIntCodeRef(llint_function_for_call_prologue), JITCode::InterpreterThunk)),
49                 MacroAssemblerCodePtr::createLLIntCodePtr(llint_function_for_call_arity_check));
50             return;
51         }
52
53         ASSERT(kind == CodeForConstruct);
54         codeBlock->setJITCode(
55             adoptRef(new DirectJITCode(MacroAssemblerCodeRef::createLLIntCodeRef(llint_function_for_construct_prologue), JITCode::InterpreterThunk)),
56             MacroAssemblerCodePtr::createLLIntCodePtr(llint_function_for_construct_arity_check));
57         return;
58     }
59     
60 #if ENABLE(JIT)
61     if (kind == CodeForCall) {
62         codeBlock->setJITCode(
63             adoptRef(new DirectJITCode(vm.getCTIStub(functionForCallEntryThunkGenerator), JITCode::InterpreterThunk)),
64             vm.getCTIStub(functionForCallArityCheckThunkGenerator).code());
65         return;
66     }
67
68     ASSERT(kind == CodeForConstruct);
69     codeBlock->setJITCode(
70         adoptRef(new DirectJITCode(vm.getCTIStub(functionForConstructEntryThunkGenerator), JITCode::InterpreterThunk)),
71         vm.getCTIStub(functionForConstructArityCheckThunkGenerator).code());
72 #endif // ENABLE(JIT)
73 }
74
75 void setEvalEntrypoint(VM& vm, EvalCodeBlock* codeBlock)
76 {
77     if (!vm.canUseJIT()) {
78         codeBlock->setJITCode(
79             adoptRef(new DirectJITCode(MacroAssemblerCodeRef::createLLIntCodeRef(llint_eval_prologue), JITCode::InterpreterThunk)),
80             MacroAssemblerCodePtr());
81         return;
82     }
83 #if ENABLE(JIT)
84     codeBlock->setJITCode(
85         adoptRef(new DirectJITCode(vm.getCTIStub(evalEntryThunkGenerator), JITCode::InterpreterThunk)),
86         MacroAssemblerCodePtr());
87 #endif
88 }
89
90 void setProgramEntrypoint(VM& vm, ProgramCodeBlock* codeBlock)
91 {
92     if (!vm.canUseJIT()) {
93         codeBlock->setJITCode(
94             adoptRef(new DirectJITCode(MacroAssemblerCodeRef::createLLIntCodeRef(llint_program_prologue), JITCode::InterpreterThunk)),
95             MacroAssemblerCodePtr());
96         return;
97     }
98 #if ENABLE(JIT)
99     codeBlock->setJITCode(
100         adoptRef(new DirectJITCode(vm.getCTIStub(programEntryThunkGenerator), JITCode::InterpreterThunk)),
101         MacroAssemblerCodePtr());
102 #endif
103 }
104
105 } } // namespace JSC::LLInt
106
107 #endif // ENABLE(LLINT)