We should support CreateThis in the FTL
[WebKit-https.git] / Source / JavaScriptCore / dfg / DFGPlan.h
1 /*
2  * Copyright (C) 2013-2018 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 #pragma once
27
28 #include "CompilationResult.h"
29 #include "DFGCompilationKey.h"
30 #include "DFGCompilationMode.h"
31 #include "DFGDesiredIdentifiers.h"
32 #include "DFGDesiredTransitions.h"
33 #include "DFGDesiredWatchpoints.h"
34 #include "DFGDesiredWeakReferences.h"
35 #include "DFGFinalizer.h"
36 #include "DeferredCompilationCallback.h"
37 #include "Operands.h"
38 #include "ProfilerCompilation.h"
39 #include "RecordedStatuses.h"
40 #include <wtf/HashMap.h>
41 #include <wtf/ThreadSafeRefCounted.h>
42
43 namespace JSC {
44
45 class CodeBlock;
46 class SlotVisitor;
47
48 namespace DFG {
49
50 class ThreadData;
51
52 #if ENABLE(DFG_JIT)
53
54 struct Plan : public ThreadSafeRefCounted<Plan> {
55     Plan(
56         CodeBlock* codeBlockToCompile, CodeBlock* profiledDFGCodeBlock,
57         CompilationMode, unsigned osrEntryBytecodeIndex,
58         const Operands<JSValue>& mustHandleValues);
59     ~Plan();
60
61     void compileInThread(ThreadData*);
62     
63     CompilationResult finalizeWithoutNotifyingCallback();
64     void finalizeAndNotifyCallback();
65     
66     void notifyCompiling();
67     void notifyReady();
68     
69     CompilationKey key();
70     
71     void markCodeBlocks(SlotVisitor&);
72     template<typename Func>
73     void iterateCodeBlocksForGC(const Func&);
74     void checkLivenessAndVisitChildren(SlotVisitor&);
75     bool isKnownToBeLiveDuringGC();
76     void finalizeInGC();
77     void cancel();
78
79     bool canTierUpAndOSREnter() const { return !tierUpAndOSREnterBytecodes.isEmpty(); }
80     
81     void cleanMustHandleValuesIfNecessary();
82     
83     // Warning: pretty much all of the pointer fields in this object get nulled by cancel(). So, if
84     // you're writing code that is callable on the cancel path, be sure to null check everything!
85     
86     VM* vm;
87
88     // These can be raw pointers because we visit them during every GC in checkLivenessAndVisitChildren.
89     CodeBlock* codeBlock;
90     CodeBlock* profiledDFGCodeBlock;
91
92     CompilationMode mode;
93     const unsigned osrEntryBytecodeIndex;
94     Operands<JSValue> mustHandleValues;
95     bool mustHandleValuesMayIncludeGarbage { true };
96     Lock mustHandleValueCleaningLock;
97     
98     ThreadData* threadData;
99
100     RefPtr<Profiler::Compilation> compilation;
101
102     std::unique_ptr<Finalizer> finalizer;
103     
104     RefPtr<InlineCallFrameSet> inlineCallFrames;
105     DesiredWatchpoints watchpoints;
106     DesiredIdentifiers identifiers;
107     DesiredWeakReferences weakReferences;
108     DesiredTransitions transitions;
109     RecordedStatuses recordedStatuses;
110     
111     bool willTryToTierUp { false };
112
113     HashMap<unsigned, Vector<unsigned>> tierUpInLoopHierarchy;
114     Vector<unsigned> tierUpAndOSREnterBytecodes;
115
116     enum Stage { Preparing, Compiling, Ready, Cancelled };
117     Stage stage;
118
119     RefPtr<DeferredCompilationCallback> callback;
120
121 private:
122     bool computeCompileTimes() const;
123     bool reportCompileTimes() const;
124     
125     enum CompilationPath { FailPath, DFGPath, FTLPath, CancelPath };
126     CompilationPath compileInThreadImpl();
127     
128     bool isStillValid();
129     void reallyAdd(CommonData*);
130
131     MonotonicTime m_timeBeforeFTL;
132 };
133
134 #endif // ENABLE(DFG_JIT)
135
136 } } // namespace JSC::DFG