7d56d3e1d7f2cdb524153a3b8a415b0c82e21c53
[WebKit-https.git] / Source / JavaScriptCore / dfg / DFGPlan.h
1 /*
2  * Copyright (C) 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 DFGPlan_h
27 #define DFGPlan_h
28
29 #include <wtf/Platform.h>
30
31 #include "CompilationResult.h"
32 #include "DFGDesiredIdentifiers.h"
33 #include "DFGDesiredStructureChains.h"
34 #include "DFGDesiredTransitions.h"
35 #include "DFGDesiredWatchpoints.h"
36 #include "DFGDesiredWeakReferences.h"
37 #include "DFGDesiredWriteBarriers.h"
38 #include "DFGFinalizer.h"
39 #include "Operands.h"
40 #include "ProfilerCompilation.h"
41 #include <wtf/ThreadSafeRefCounted.h>
42
43 namespace JSC {
44
45 class CodeBlock;
46
47 namespace DFG {
48
49 class LongLivedState;
50
51 enum CompileMode { CompileFunction, CompileOther };
52
53 #if ENABLE(DFG_JIT)
54
55 struct Plan : public ThreadSafeRefCounted<Plan> {
56     Plan(
57         CompileMode compileMode, PassRefPtr<CodeBlock> codeBlock,
58         unsigned osrEntryBytecodeIndex, unsigned numVarsWithValues);
59     ~Plan();
60     
61     void compileInThread(LongLivedState&);
62     
63     CompilationResult finalize(RefPtr<JSC::JITCode>& jitCode, MacroAssemblerCodePtr* jitCodeWithArityCheck);
64     
65     CodeBlock* key();
66     
67     const CompileMode compileMode;
68     VM& vm;
69     RefPtr<CodeBlock> codeBlock;
70     const unsigned osrEntryBytecodeIndex;
71     const unsigned numVarsWithValues;
72     Operands<JSValue> mustHandleValues;
73
74     RefPtr<Profiler::Compilation> compilation;
75
76     OwnPtr<Finalizer> finalizer;
77     
78     DesiredWatchpoints watchpoints;
79     DesiredIdentifiers identifiers;
80     DesiredStructureChains chains;
81     DesiredWeakReferences weakReferences;
82     DesiredWriteBarriers writeBarriers;
83     DesiredTransitions transitions;
84
85     double beforeFTL;
86     
87     bool isCompiled;
88
89 private:
90     enum CompilationPath { FailPath, DFGPath, FTLPath };
91     CompilationPath compileInThreadImpl(LongLivedState&);
92     
93     bool isStillValid();
94     void reallyAdd(CommonData*);
95 };
96
97 #else // ENABLE(DFG_JIT)
98
99 class Plan : public RefCounted<Plan> {
100     // Dummy class to allow !ENABLE(DFG_JIT) to build.
101 };
102
103 #endif // ENABLE(DFG_JIT)
104
105 } } // namespace JSC::DFG
106
107 #endif // DFGPlan_h
108