It should be easy to measure total compile times.
[WebKit-https.git] / Source / JavaScriptCore / dfg / DFGPlan.h
1 /*
2  * Copyright (C) 2013-2015 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 "CompilationResult.h"
30 #include "DFGCompilationKey.h"
31 #include "DFGCompilationMode.h"
32 #include "DFGDesiredIdentifiers.h"
33 #include "DFGDesiredTransitions.h"
34 #include "DFGDesiredWatchpoints.h"
35 #include "DFGDesiredWeakReferences.h"
36 #include "DFGDesiredWriteBarriers.h"
37 #include "DFGFinalizer.h"
38 #include "DeferredCompilationCallback.h"
39 #include "Operands.h"
40 #include "ProfilerCompilation.h"
41 #include <wtf/HashMap.h>
42 #include <wtf/ThreadSafeRefCounted.h>
43 #include <wtf/text/CString.h>
44
45 namespace JSC {
46
47 class CodeBlock;
48 class CodeBlockSet;
49 class SlotVisitor;
50
51 namespace DFG {
52
53 class LongLivedState;
54 class ThreadData;
55
56 #if ENABLE(DFG_JIT)
57
58 struct Plan : public ThreadSafeRefCounted<Plan> {
59     Plan(
60         PassRefPtr<CodeBlock> codeBlockToCompile, CodeBlock* profiledDFGCodeBlock,
61         CompilationMode, unsigned osrEntryBytecodeIndex,
62         const Operands<JSValue>& mustHandleValues);
63     ~Plan();
64
65     void compileInThread(LongLivedState&, ThreadData*);
66     
67     CompilationResult finalizeWithoutNotifyingCallback();
68     void finalizeAndNotifyCallback();
69     
70     void notifyCompiling();
71     void notifyCompiled();
72     void notifyReady();
73     
74     CompilationKey key();
75     
76     void checkLivenessAndVisitChildren(SlotVisitor&, CodeBlockSet&);
77     bool isKnownToBeLiveDuringGC();
78     void cancel();
79     
80     VM& vm;
81     RefPtr<CodeBlock> codeBlock;
82     RefPtr<CodeBlock> profiledDFGCodeBlock;
83     CompilationMode mode;
84     const unsigned osrEntryBytecodeIndex;
85     Operands<JSValue> mustHandleValues;
86     
87     ThreadData* threadData;
88
89     RefPtr<Profiler::Compilation> compilation;
90
91     std::unique_ptr<Finalizer> finalizer;
92     
93     RefPtr<InlineCallFrameSet> inlineCallFrames;
94     DesiredWatchpoints watchpoints;
95     DesiredIdentifiers identifiers;
96     DesiredWeakReferences weakReferences;
97     DesiredWriteBarriers writeBarriers;
98     DesiredTransitions transitions;
99     
100     bool willTryToTierUp;
101
102     enum Stage { Preparing, Compiling, Compiled, Ready, Cancelled };
103     Stage stage;
104
105     RefPtr<DeferredCompilationCallback> callback;
106
107     JS_EXPORT_PRIVATE static HashMap<CString, double> compileTimeStats();
108
109 private:
110     bool computeCompileTimes() const;
111     bool reportCompileTimes() const;
112     
113     enum CompilationPath { FailPath, DFGPath, FTLPath, CancelPath };
114     CompilationPath compileInThreadImpl(LongLivedState&);
115     
116     bool isStillValid();
117     void reallyAdd(CommonData*);
118
119     double m_timeBeforeFTL;
120 };
121
122 #else // ENABLE(DFG_JIT)
123
124 class Plan : public RefCounted<Plan> {
125     // Dummy class to allow !ENABLE(DFG_JIT) to build.
126 public:
127     static HashMap<CString, double> compileTimeStats() { return HashMap<CString, double>(); }
128 };
129
130 #endif // ENABLE(DFG_JIT)
131
132 } } // namespace JSC::DFG
133
134 #endif // DFGPlan_h
135