Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(589)

Side by Side Diff: src/compiler.h

Issue 2399463008: Create multiple compilation jobs for ignition if compiling multiple literals (Closed)
Patch Set: updates Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_COMPILER_H_ 5 #ifndef V8_COMPILER_H_
6 #define V8_COMPILER_H_ 6 #define V8_COMPILER_H_
7 7
8 #include <memory> 8 #include <memory>
9 #include <vector>
9 10
10 #include "src/allocation.h" 11 #include "src/allocation.h"
11 #include "src/bailout-reason.h" 12 #include "src/bailout-reason.h"
12 #include "src/contexts.h" 13 #include "src/contexts.h"
13 #include "src/isolate.h" 14 #include "src/isolate.h"
14 #include "src/zone/zone.h" 15 #include "src/zone/zone.h"
15 16
16 namespace v8 { 17 namespace v8 {
17 namespace internal { 18 namespace internal {
18 19
19 // Forward declarations. 20 // Forward declarations.
20 class CompilationInfo; 21 class CompilationInfo;
21 class CompilationJob; 22 class CompilationJob;
22 class JavaScriptFrame; 23 class JavaScriptFrame;
23 class ParseInfo; 24 class ParseInfo;
24 class ScriptData; 25 class ScriptData;
25 26
27 // Used by indicate whether Compiler::GetSharedFunctionInfo should trigger a
28 // compilation.
29 enum class ShouldCompile { kIfNecessary, kNever };
30
26 // The V8 compiler API. 31 // The V8 compiler API.
27 // 32 //
28 // This is the central hub for dispatching to the various compilers within V8. 33 // This is the central hub for dispatching to the various compilers within V8.
29 // Logic for which compiler to choose and how to wire compilation results into 34 // Logic for which compiler to choose and how to wire compilation results into
30 // the object heap should be kept inside this class. 35 // the object heap should be kept inside this class.
31 // 36 //
32 // General strategy: Scripts are translated into anonymous functions w/o 37 // General strategy: Scripts are translated into anonymous functions w/o
33 // parameters which then can be executed. If the source code contains other 38 // parameters which then can be executed. If the source code contains other
34 // functions, they might be compiled and allocated as part of the compilation 39 // functions, they might be compiled and allocated as part of the compilation
35 // of the source code or deferred for lazy compilation at a later point. 40 // of the source code or deferred for lazy compilation at a later point.
36 class Compiler : public AllStatic { 41 class Compiler : public AllStatic {
37 public: 42 public:
38 enum ClearExceptionFlag { KEEP_EXCEPTION, CLEAR_EXCEPTION }; 43 enum ClearExceptionFlag { KEEP_EXCEPTION, CLEAR_EXCEPTION };
39 enum ConcurrencyMode { NOT_CONCURRENT, CONCURRENT }; 44 enum ConcurrencyMode { NOT_CONCURRENT, CONCURRENT };
40 enum CompilationTier { INTERPRETED, BASELINE, OPTIMIZED }; 45 enum CompilationTier { INTERPRETED, BASELINE, OPTIMIZED };
41 46
42 // =========================================================================== 47 // ===========================================================================
43 // The following family of methods ensures a given function is compiled. The 48 // The following family of methods ensures a given function is compiled. The
44 // general contract is that failures will be reported by returning {false}, 49 // general contract is that failures will be reported by returning {false},
45 // whereas successful compilation ensures the {is_compiled} predicate on the 50 // whereas successful compilation ensures the {is_compiled} predicate on the
46 // given function holds (except for live-edit, which compiles the world). 51 // given function holds (except for live-edit, which compiles the world).
47 52
48 static bool Compile(Handle<JSFunction> function, ClearExceptionFlag flag); 53 static bool Compile(Handle<JSFunction> function, ClearExceptionFlag flag);
49 static bool CompileBaseline(Handle<JSFunction> function); 54 static bool CompileBaseline(Handle<JSFunction> function);
50 static bool CompileOptimized(Handle<JSFunction> function, ConcurrencyMode); 55 static bool CompileOptimized(Handle<JSFunction> function, ConcurrencyMode);
51 static bool CompileDebugCode(Handle<JSFunction> function); 56 static bool CompileDebugCode(Handle<JSFunction> function);
52 static bool CompileDebugCode(Handle<SharedFunctionInfo> shared); 57 static bool CompileDebugCode(Handle<SharedFunctionInfo> shared);
53 static MaybeHandle<JSArray> CompileForLiveEdit(Handle<Script> script); 58 static MaybeHandle<JSArray> CompileForLiveEdit(Handle<Script> script);
54 59
55 // Prepare a compilation job for unoptimized code. Requires ParseAndAnalyse. 60 // Prepare a series of compilation jobs for unoptimized code. Requires
56 static CompilationJob* PrepareUnoptimizedCompilationJob( 61 // ParseAndAnalyse.
57 CompilationInfo* info); 62 static std::vector<std::unique_ptr<CompilationJob>>
63 PrepareUnoptimizedCompilationJobs(CompilationInfo* info);
58 64
59 // Generate and install code from previously queued compilation job. 65 // Generate and install code from previously queued compilation job.
60 static bool FinalizeCompilationJob(CompilationJob* job); 66 static bool FinalizeCompilationJob(CompilationJob* job);
61 67
62 // Give the compiler a chance to perform low-latency initialization tasks of 68 // Give the compiler a chance to perform low-latency initialization tasks of
63 // the given {function} on its instantiation. Note that only the runtime will 69 // the given {function} on its instantiation. Note that only the runtime will
64 // offer this chance, optimized closure instantiation will not call this. 70 // offer this chance, optimized closure instantiation will not call this.
65 static void PostInstantiation(Handle<JSFunction> function, PretenureFlag); 71 static void PostInstantiation(Handle<JSFunction> function, PretenureFlag);
66 72
67 // Parser::Parse, then Compiler::Analyze. 73 // Parser::Parse, then Compiler::Analyze.
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 Handle<Object> source_map_url, Handle<Context> context, 113 Handle<Object> source_map_url, Handle<Context> context,
108 v8::Extension* extension, ScriptData** cached_data, 114 v8::Extension* extension, ScriptData** cached_data,
109 ScriptCompiler::CompileOptions compile_options, 115 ScriptCompiler::CompileOptions compile_options,
110 NativesFlag is_natives_code, bool is_module); 116 NativesFlag is_natives_code, bool is_module);
111 117
112 // Create a shared function info object for a Script that has already been 118 // Create a shared function info object for a Script that has already been
113 // parsed while the script was being loaded from a streamed source. 119 // parsed while the script was being loaded from a streamed source.
114 static Handle<SharedFunctionInfo> GetSharedFunctionInfoForStreamedScript( 120 static Handle<SharedFunctionInfo> GetSharedFunctionInfoForStreamedScript(
115 Handle<Script> script, ParseInfo* info, int source_length); 121 Handle<Script> script, ParseInfo* info, int source_length);
116 122
117 // Create a shared function info object (the code may be lazily compiled). 123 // Create a shared function info object (the code may be lazily compiled if
124 // |should_compile| is kIfNecessary).
118 static Handle<SharedFunctionInfo> GetSharedFunctionInfo( 125 static Handle<SharedFunctionInfo> GetSharedFunctionInfo(
119 FunctionLiteral* node, Handle<Script> script, CompilationInfo* outer); 126 FunctionLiteral* node, Handle<Script> script, CompilationInfo* outer,
127 ShouldCompile should_compile = ShouldCompile::kIfNecessary);
120 128
121 // Create a shared function info object for a native function literal. 129 // Create a shared function info object for a native function literal.
122 static Handle<SharedFunctionInfo> GetSharedFunctionInfoForNative( 130 static Handle<SharedFunctionInfo> GetSharedFunctionInfoForNative(
123 v8::Extension* extension, Handle<String> name); 131 v8::Extension* extension, Handle<String> name);
124 132
125 // =========================================================================== 133 // ===========================================================================
126 // The following family of methods provides support for OSR. Code generated 134 // The following family of methods provides support for OSR. Code generated
127 // for entry via OSR might not be suitable for normal entry, hence will be 135 // for entry via OSR might not be suitable for normal entry, hence will be
128 // returned directly to the caller. 136 // returned directly to the caller.
129 // 137 //
(...skipping 22 matching lines...) Expand all
152 enum class State { 160 enum class State {
153 kReadyToPrepare, 161 kReadyToPrepare,
154 kReadyToExecute, 162 kReadyToExecute,
155 kReadyToFinalize, 163 kReadyToFinalize,
156 kSucceeded, 164 kSucceeded,
157 kFailed, 165 kFailed,
158 }; 166 };
159 167
160 CompilationJob(Isolate* isolate, CompilationInfo* info, 168 CompilationJob(Isolate* isolate, CompilationInfo* info,
161 const char* compiler_name, 169 const char* compiler_name,
162 State initial_state = State::kReadyToPrepare) 170 State initial_state = State::kReadyToPrepare);
163 : info_(info), 171 virtual ~CompilationJob();
164 compiler_name_(compiler_name),
165 state_(initial_state),
166 stack_limit_(isolate->stack_guard()->real_climit()) {}
167 virtual ~CompilationJob() {}
168 172
169 // Prepare the compile job. Must be called on the main thread. 173 // Prepare the compile job. Must be called on the main thread.
170 MUST_USE_RESULT Status PrepareJob(); 174 MUST_USE_RESULT Status PrepareJob();
171 175
172 // Executes the compile job. Can be called on a background thread if 176 // Executes the compile job. Can be called on a background thread if
173 // can_execute_on_background_thread() returns true. 177 // can_execute_on_background_thread() returns true.
174 MUST_USE_RESULT Status ExecuteJob(); 178 MUST_USE_RESULT Status ExecuteJob();
175 179
176 // Finalizes the compile job. Must be called on the main thread. 180 // Finalizes the compile job. Must be called on the main thread.
177 MUST_USE_RESULT Status FinalizeJob(); 181 MUST_USE_RESULT Status FinalizeJob();
(...skipping 11 matching lines...) Expand all
189 193
190 virtual bool can_execute_on_background_thread() const { return true; } 194 virtual bool can_execute_on_background_thread() const { return true; }
191 195
192 void set_stack_limit(uintptr_t stack_limit) { stack_limit_ = stack_limit; } 196 void set_stack_limit(uintptr_t stack_limit) { stack_limit_ = stack_limit; }
193 uintptr_t stack_limit() const { return stack_limit_; } 197 uintptr_t stack_limit() const { return stack_limit_; }
194 198
195 State state() const { return state_; } 199 State state() const { return state_; }
196 CompilationInfo* info() const { return info_; } 200 CompilationInfo* info() const { return info_; }
197 Isolate* isolate() const; 201 Isolate* isolate() const;
198 202
203 // Destroy the CompilationInfo, its ParseInfo, and its zone at the end of
204 // this CompilationJob's lifetime.
205 void TakeOwnershipOfCompilationInfo();
206
199 protected: 207 protected:
200 // Overridden by the actual implementation. 208 // Overridden by the actual implementation.
201 virtual Status PrepareJobImpl() = 0; 209 virtual Status PrepareJobImpl() = 0;
202 virtual Status ExecuteJobImpl() = 0; 210 virtual Status ExecuteJobImpl() = 0;
203 virtual Status FinalizeJobImpl() = 0; 211 virtual Status FinalizeJobImpl() = 0;
204 212
205 // Registers weak object to optimized code dependencies. 213 // Registers weak object to optimized code dependencies.
206 // TODO(turbofan): Move this to pipeline.cc once Crankshaft dies. 214 // TODO(turbofan): Move this to pipeline.cc once Crankshaft dies.
207 void RegisterWeakObjectsInOptimizedCode(Handle<Code> code); 215 void RegisterWeakObjectsInOptimizedCode(Handle<Code> code);
208 216
209 private: 217 private:
218 // The following unique_ptr are used only for lifetime management and might
219 // be empty.
220 std::unique_ptr<Zone> zone_;
221 std::unique_ptr<ParseInfo> parse_info_;
222 std::unique_ptr<CompilationInfo> compilation_info_;
223
210 CompilationInfo* info_; 224 CompilationInfo* info_;
211 base::TimeDelta time_taken_to_prepare_; 225 base::TimeDelta time_taken_to_prepare_;
212 base::TimeDelta time_taken_to_execute_; 226 base::TimeDelta time_taken_to_execute_;
213 base::TimeDelta time_taken_to_finalize_; 227 base::TimeDelta time_taken_to_finalize_;
214 const char* compiler_name_; 228 const char* compiler_name_;
215 State state_; 229 State state_;
216 uintptr_t stack_limit_; 230 uintptr_t stack_limit_;
217 231
218 MUST_USE_RESULT Status UpdateState(Status status, State next_state) { 232 MUST_USE_RESULT Status UpdateState(Status status, State next_state) {
219 if (status == SUCCEEDED) { 233 if (status == SUCCEEDED) {
220 state_ = next_state; 234 state_ = next_state;
221 } else { 235 } else {
222 state_ = State::kFailed; 236 state_ = State::kFailed;
223 } 237 }
224 return status; 238 return status;
225 } 239 }
240
241 DISALLOW_COPY_AND_ASSIGN(CompilationJob);
226 }; 242 };
227 243
228 } // namespace internal 244 } // namespace internal
229 } // namespace v8 245 } // namespace v8
230 246
231 #endif // V8_COMPILER_H_ 247 #endif // V8_COMPILER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698