OLD | NEW |
---|---|
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 "src/allocation.h" | 8 #include "src/allocation.h" |
9 #include "src/ast.h" | 9 #include "src/ast.h" |
10 #include "src/bailout-reason.h" | 10 #include "src/bailout-reason.h" |
11 #include "src/compilation-dependencies.h" | 11 #include "src/compilation-dependencies.h" |
12 #include "src/interpreter/bytecodes.h" | |
12 #include "src/signature.h" | 13 #include "src/signature.h" |
13 #include "src/zone.h" | 14 #include "src/zone.h" |
14 | 15 |
15 namespace v8 { | 16 namespace v8 { |
16 namespace internal { | 17 namespace internal { |
17 | 18 |
18 class AstValueFactory; | 19 class AstValueFactory; |
19 class HydrogenCodeStub; | 20 class HydrogenCodeStub; |
20 class JavaScriptFrame; | 21 class JavaScriptFrame; |
21 class ParseInfo; | 22 class ParseInfo; |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
128 kDisableFutureOptimization = 1 << 12, | 129 kDisableFutureOptimization = 1 << 12, |
129 kSplittingEnabled = 1 << 13, | 130 kSplittingEnabled = 1 << 13, |
130 kTypeFeedbackEnabled = 1 << 14, | 131 kTypeFeedbackEnabled = 1 << 14, |
131 kDeoptimizationEnabled = 1 << 15, | 132 kDeoptimizationEnabled = 1 << 15, |
132 kSourcePositionsEnabled = 1 << 16, | 133 kSourcePositionsEnabled = 1 << 16, |
133 kFirstCompile = 1 << 17, | 134 kFirstCompile = 1 << 17, |
134 }; | 135 }; |
135 | 136 |
136 explicit CompilationInfo(ParseInfo* parse_info); | 137 explicit CompilationInfo(ParseInfo* parse_info); |
137 CompilationInfo(CodeStub* stub, Isolate* isolate, Zone* zone); | 138 CompilationInfo(CodeStub* stub, Isolate* isolate, Zone* zone); |
139 CompilationInfo(interpreter::Bytecode bytecode, Isolate* isolate, Zone* zone); | |
138 virtual ~CompilationInfo(); | 140 virtual ~CompilationInfo(); |
139 | 141 |
140 ParseInfo* parse_info() const { return parse_info_; } | 142 ParseInfo* parse_info() const { return parse_info_; } |
141 | 143 |
142 // ----------------------------------------------------------- | 144 // ----------------------------------------------------------- |
143 // TODO(titzer): inline and delete accessors of ParseInfo | 145 // TODO(titzer): inline and delete accessors of ParseInfo |
144 // ----------------------------------------------------------- | 146 // ----------------------------------------------------------- |
145 Handle<Script> script() const; | 147 Handle<Script> script() const; |
146 bool is_eval() const; | 148 bool is_eval() const; |
147 bool is_native() const; | 149 bool is_native() const; |
(...skipping 11 matching lines...) Expand all Loading... | |
159 bool has_scope() const; | 161 bool has_scope() const; |
160 // ----------------------------------------------------------- | 162 // ----------------------------------------------------------- |
161 | 163 |
162 Isolate* isolate() const { | 164 Isolate* isolate() const { |
163 return isolate_; | 165 return isolate_; |
164 } | 166 } |
165 Zone* zone() { return zone_; } | 167 Zone* zone() { return zone_; } |
166 bool is_osr() const { return !osr_ast_id_.IsNone(); } | 168 bool is_osr() const { return !osr_ast_id_.IsNone(); } |
167 Handle<Code> code() const { return code_; } | 169 Handle<Code> code() const { return code_; } |
168 CodeStub* code_stub() const { return code_stub_; } | 170 CodeStub* code_stub() const { return code_stub_; } |
171 interpreter::Bytecode bytecode() const { return bytecode_; } | |
169 BailoutId osr_ast_id() const { return osr_ast_id_; } | 172 BailoutId osr_ast_id() const { return osr_ast_id_; } |
170 Handle<Code> unoptimized_code() const { return unoptimized_code_; } | 173 Handle<Code> unoptimized_code() const { return unoptimized_code_; } |
171 int opt_count() const { return opt_count_; } | 174 int opt_count() const { return opt_count_; } |
172 int num_parameters() const; | 175 int num_parameters() const; |
173 int num_parameters_including_this() const; | 176 int num_parameters_including_this() const; |
174 bool is_this_defined() const; | 177 bool is_this_defined() const; |
175 int num_heap_slots() const; | 178 int num_heap_slots() const; |
176 Code::Flags flags() const; | 179 Code::Flags flags() const; |
177 | 180 |
178 void set_parameter_count(int parameter_count) { | 181 void set_parameter_count(int parameter_count) { |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
288 } | 291 } |
289 | 292 |
290 GlobalObject* global_object() const { | 293 GlobalObject* global_object() const { |
291 return has_global_object() ? closure()->context()->global_object() : NULL; | 294 return has_global_object() ? closure()->context()->global_object() : NULL; |
292 } | 295 } |
293 | 296 |
294 // Accessors for the different compilation modes. | 297 // Accessors for the different compilation modes. |
295 bool IsOptimizing() const { return mode_ == OPTIMIZE; } | 298 bool IsOptimizing() const { return mode_ == OPTIMIZE; } |
296 bool IsOptimizable() const { return mode_ == BASE; } | 299 bool IsOptimizable() const { return mode_ == BASE; } |
297 bool IsStub() const { return mode_ == STUB; } | 300 bool IsStub() const { return mode_ == STUB; } |
301 bool IsBytecodeHandler() const { return mode_ == BYTECODE_HANDLER; } | |
298 void SetOptimizing(BailoutId osr_ast_id, Handle<Code> unoptimized) { | 302 void SetOptimizing(BailoutId osr_ast_id, Handle<Code> unoptimized) { |
299 DCHECK(!shared_info().is_null()); | 303 DCHECK(!shared_info().is_null()); |
300 SetMode(OPTIMIZE); | 304 SetMode(OPTIMIZE); |
301 osr_ast_id_ = osr_ast_id; | 305 osr_ast_id_ = osr_ast_id; |
302 unoptimized_code_ = unoptimized; | 306 unoptimized_code_ = unoptimized; |
303 optimization_id_ = isolate()->NextOptimizationId(); | 307 optimization_id_ = isolate()->NextOptimizationId(); |
304 } | 308 } |
305 | 309 |
306 void SetFunctionType(Type::FunctionType* function_type) { | 310 void SetFunctionType(Type::FunctionType* function_type) { |
307 function_type_ = function_type; | 311 function_type_ = function_type; |
308 } | 312 } |
309 Type::FunctionType* function_type() const { return function_type_; } | 313 Type::FunctionType* function_type() const { return function_type_; } |
310 | 314 |
311 void SetStub(CodeStub* code_stub) { | 315 void SetStub(CodeStub* code_stub) { |
312 SetMode(STUB); | 316 SetMode(STUB); |
313 code_stub_ = code_stub; | 317 code_stub_ = code_stub; |
314 } | 318 } |
315 | 319 |
316 // Deoptimization support. | 320 // Deoptimization support. |
317 bool HasDeoptimizationSupport() const { | 321 bool HasDeoptimizationSupport() const { |
318 return GetFlag(kDeoptimizationSupport); | 322 return GetFlag(kDeoptimizationSupport); |
319 } | 323 } |
320 void EnableDeoptimizationSupport() { | 324 void EnableDeoptimizationSupport() { |
321 DCHECK(IsOptimizable()); | 325 DCHECK(IsOptimizable()); |
322 SetFlag(kDeoptimizationSupport); | 326 SetFlag(kDeoptimizationSupport); |
323 } | 327 } |
328 bool ShouldEnsureSpaceForLazyDeopt() { | |
329 return !IsStub() && !IsBytecodeHandler(); | |
330 } | |
324 | 331 |
325 // Determines whether or not to insert a self-optimization header. | 332 // Determines whether or not to insert a self-optimization header. |
326 bool ShouldSelfOptimize(); | 333 bool ShouldSelfOptimize(); |
327 | 334 |
328 void set_deferred_handles(DeferredHandles* deferred_handles) { | 335 void set_deferred_handles(DeferredHandles* deferred_handles) { |
329 DCHECK(deferred_handles_ == NULL); | 336 DCHECK(deferred_handles_ == NULL); |
330 deferred_handles_ = deferred_handles; | 337 deferred_handles_ = deferred_handles; |
331 } | 338 } |
332 | 339 |
333 void ReopenHandlesInNewHandleScope() { | 340 void ReopenHandlesInNewHandleScope() { |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
423 } | 430 } |
424 } | 431 } |
425 | 432 |
426 private: | 433 private: |
427 // Compilation mode. | 434 // Compilation mode. |
428 // BASE is generated by the full codegen, optionally prepared for bailouts. | 435 // BASE is generated by the full codegen, optionally prepared for bailouts. |
429 // OPTIMIZE is optimized code generated by the Hydrogen-based backend. | 436 // OPTIMIZE is optimized code generated by the Hydrogen-based backend. |
430 enum Mode { | 437 enum Mode { |
431 BASE, | 438 BASE, |
432 OPTIMIZE, | 439 OPTIMIZE, |
433 STUB | 440 STUB, |
441 BYTECODE_HANDLER | |
titzer
2015/08/21 13:37:21
Do we really need a new mode? What does it control
rmcilroy
2015/08/21 16:41:05
Removed this mode and replaced it's need with debu
| |
434 }; | 442 }; |
435 | 443 |
436 CompilationInfo(ParseInfo* parse_info, CodeStub* code_stub, Mode mode, | 444 CompilationInfo(ParseInfo* parse_info, CodeStub* code_stub, |
437 Isolate* isolate, Zone* zone); | 445 interpreter::Bytecode bytecode, Mode mode, Isolate* isolate, |
446 Zone* zone); | |
438 | 447 |
439 Isolate* isolate_; | 448 Isolate* isolate_; |
440 | 449 |
441 void SetMode(Mode mode) { | 450 void SetMode(Mode mode) { |
442 mode_ = mode; | 451 mode_ = mode; |
443 } | 452 } |
444 | 453 |
445 void SetFlag(Flag flag) { flags_ |= flag; } | 454 void SetFlag(Flag flag) { flags_ |= flag; } |
446 | 455 |
447 void SetFlag(Flag flag, bool value) { | 456 void SetFlag(Flag flag, bool value) { |
448 flags_ = value ? flags_ | flag : flags_ & ~flag; | 457 flags_ = value ? flags_ | flag : flags_ & ~flag; |
449 } | 458 } |
450 | 459 |
451 bool GetFlag(Flag flag) const { return (flags_ & flag) != 0; } | 460 bool GetFlag(Flag flag) const { return (flags_ & flag) != 0; } |
452 | 461 |
453 unsigned flags_; | 462 unsigned flags_; |
454 | 463 |
455 // For compiled stubs, the stub object | 464 // For compiled stubs, the stub object |
456 CodeStub* code_stub_; | 465 CodeStub* code_stub_; |
466 // For compiled bytecode handlers, the bytecode | |
467 interpreter::Bytecode bytecode_; | |
titzer
2015/08/21 13:37:21
AFAICT this is only used for debugging purposes in
rmcilroy
2015/08/21 16:41:05
Done with GetDebugName as discussed.
| |
457 // The compiled code. | 468 // The compiled code. |
458 Handle<Code> code_; | 469 Handle<Code> code_; |
459 | 470 |
460 // Used by codegen, ultimately kept rooted by the SharedFunctionInfo. | 471 // Used by codegen, ultimately kept rooted by the SharedFunctionInfo. |
461 Handle<TypeFeedbackVector> feedback_vector_; | 472 Handle<TypeFeedbackVector> feedback_vector_; |
462 | 473 |
463 // Compilation mode flag and whether deoptimization is allowed. | 474 // Compilation mode flag and whether deoptimization is allowed. |
464 Mode mode_; | 475 Mode mode_; |
465 BailoutId osr_ast_id_; | 476 BailoutId osr_ast_id_; |
466 // The unoptimized code we patched for OSR may not be the shared code | 477 // The unoptimized code we patched for OSR may not be the shared code |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
701 Zone zone_; | 712 Zone zone_; |
702 size_t info_zone_start_allocation_size_; | 713 size_t info_zone_start_allocation_size_; |
703 base::ElapsedTimer timer_; | 714 base::ElapsedTimer timer_; |
704 | 715 |
705 DISALLOW_COPY_AND_ASSIGN(CompilationPhase); | 716 DISALLOW_COPY_AND_ASSIGN(CompilationPhase); |
706 }; | 717 }; |
707 | 718 |
708 } } // namespace v8::internal | 719 } } // namespace v8::internal |
709 | 720 |
710 #endif // V8_COMPILER_H_ | 721 #endif // V8_COMPILER_H_ |
OLD | NEW |