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/ast.h" | 9 #include "src/ast/ast.h" |
10 #include "src/bailout-reason.h" | 10 #include "src/bailout-reason.h" |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 kInliningEnabled = 1 << 11, | 60 kInliningEnabled = 1 << 11, |
61 kTypingEnabled = 1 << 12, | 61 kTypingEnabled = 1 << 12, |
62 kDisableFutureOptimization = 1 << 13, | 62 kDisableFutureOptimization = 1 << 13, |
63 kSplittingEnabled = 1 << 14, | 63 kSplittingEnabled = 1 << 14, |
64 kDeoptimizationEnabled = 1 << 16, | 64 kDeoptimizationEnabled = 1 << 16, |
65 kSourcePositionsEnabled = 1 << 17, | 65 kSourcePositionsEnabled = 1 << 17, |
66 kFirstCompile = 1 << 18, | 66 kFirstCompile = 1 << 18, |
67 }; | 67 }; |
68 | 68 |
69 explicit CompilationInfo(ParseInfo* parse_info); | 69 explicit CompilationInfo(ParseInfo* parse_info); |
70 CompilationInfo(CodeStub* stub, Isolate* isolate, Zone* zone); | 70 CompilationInfo(const char* debug_name, Isolate* isolate, Zone* zone, |
71 CompilationInfo(const char* debug_name, Isolate* isolate, Zone* zone); | 71 Code::Flags code_flags = Code::ComputeFlags(Code::STUB)); |
72 virtual ~CompilationInfo(); | 72 virtual ~CompilationInfo(); |
73 | 73 |
74 ParseInfo* parse_info() const { return parse_info_; } | 74 ParseInfo* parse_info() const { return parse_info_; } |
75 | 75 |
76 // ----------------------------------------------------------- | 76 // ----------------------------------------------------------- |
77 // TODO(titzer): inline and delete accessors of ParseInfo | 77 // TODO(titzer): inline and delete accessors of ParseInfo |
78 // ----------------------------------------------------------- | 78 // ----------------------------------------------------------- |
79 Handle<Script> script() const; | 79 Handle<Script> script() const; |
80 bool is_eval() const; | 80 bool is_eval() const; |
81 bool is_native() const; | 81 bool is_native() const; |
82 bool is_module() const; | 82 bool is_module() const; |
83 LanguageMode language_mode() const; | 83 LanguageMode language_mode() const; |
84 Handle<JSFunction> closure() const; | 84 Handle<JSFunction> closure() const; |
85 FunctionLiteral* literal() const; | 85 FunctionLiteral* literal() const; |
86 Scope* scope() const; | 86 Scope* scope() const; |
87 Handle<Context> context() const; | 87 Handle<Context> context() const; |
88 Handle<SharedFunctionInfo> shared_info() const; | 88 Handle<SharedFunctionInfo> shared_info() const; |
89 bool has_shared_info() const; | 89 bool has_shared_info() const; |
90 bool has_context() const; | 90 bool has_context() const; |
91 bool has_literal() const; | 91 bool has_literal() const; |
92 bool has_scope() const; | 92 bool has_scope() const; |
93 // ----------------------------------------------------------- | 93 // ----------------------------------------------------------- |
94 | 94 |
95 Isolate* isolate() const { | 95 Isolate* isolate() const { |
96 return isolate_; | 96 return isolate_; |
97 } | 97 } |
98 Zone* zone() { return zone_; } | 98 Zone* zone() { return zone_; } |
99 bool is_osr() const { return !osr_ast_id_.IsNone(); } | 99 bool is_osr() const { return !osr_ast_id_.IsNone(); } |
100 Handle<Code> code() const { return code_; } | 100 Handle<Code> code() const { return code_; } |
101 CodeStub* code_stub() const { return code_stub_; } | 101 Code::Flags code_flags() const { return code_flags_; } |
102 BailoutId osr_ast_id() const { return osr_ast_id_; } | 102 BailoutId osr_ast_id() const { return osr_ast_id_; } |
103 Handle<Code> unoptimized_code() const { return unoptimized_code_; } | 103 Handle<Code> unoptimized_code() const { return unoptimized_code_; } |
104 int opt_count() const { return opt_count_; } | 104 int opt_count() const { return opt_count_; } |
105 int num_parameters() const; | 105 int num_parameters() const; |
106 int num_parameters_including_this() const; | 106 int num_parameters_including_this() const; |
107 bool is_this_defined() const; | 107 bool is_this_defined() const; |
108 int num_heap_slots() const; | 108 int num_heap_slots() const; |
109 | 109 |
110 void set_parameter_count(int parameter_count) { | 110 void set_parameter_count(int parameter_count) { |
111 DCHECK(IsStub()); | 111 DCHECK(IsStub()); |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
205 | 205 |
206 void MarkAsCompiled() { SetFlag(kFirstCompile, false); } | 206 void MarkAsCompiled() { SetFlag(kFirstCompile, false); } |
207 | 207 |
208 bool is_first_compile() const { return GetFlag(kFirstCompile); } | 208 bool is_first_compile() const { return GetFlag(kFirstCompile); } |
209 | 209 |
210 bool GeneratePreagedPrologue() const { | 210 bool GeneratePreagedPrologue() const { |
211 // Generate a pre-aged prologue if we are optimizing for size, which | 211 // Generate a pre-aged prologue if we are optimizing for size, which |
212 // will make code flushing more aggressive. Only apply to Code::FUNCTION, | 212 // will make code flushing more aggressive. Only apply to Code::FUNCTION, |
213 // since StaticMarkingVisitor::IsFlushable only flushes proper functions. | 213 // since StaticMarkingVisitor::IsFlushable only flushes proper functions. |
214 return FLAG_optimize_for_size && FLAG_age_code && !will_serialize() && | 214 return FLAG_optimize_for_size && FLAG_age_code && !will_serialize() && |
215 !is_debug() && output_code_kind_ == Code::FUNCTION; | 215 !is_debug() && output_code_kind() == Code::FUNCTION; |
216 } | 216 } |
217 | 217 |
218 void EnsureFeedbackVector(); | 218 void EnsureFeedbackVector(); |
219 Handle<TypeFeedbackVector> feedback_vector() const { | 219 Handle<TypeFeedbackVector> feedback_vector() const { |
220 return feedback_vector_; | 220 return feedback_vector_; |
221 } | 221 } |
222 void SetCode(Handle<Code> code) { code_ = code; } | 222 void SetCode(Handle<Code> code) { code_ = code; } |
223 | 223 |
224 void SetBytecodeArray(Handle<BytecodeArray> bytecode_array) { | 224 void SetBytecodeArray(Handle<BytecodeArray> bytecode_array) { |
225 bytecode_array_ = bytecode_array; | 225 bytecode_array_ = bytecode_array; |
(...skipping 20 matching lines...) Expand all Loading... |
246 | 246 |
247 // Accessors for the different compilation modes. | 247 // Accessors for the different compilation modes. |
248 bool IsOptimizing() const { return mode_ == OPTIMIZE; } | 248 bool IsOptimizing() const { return mode_ == OPTIMIZE; } |
249 bool IsStub() const { return mode_ == STUB; } | 249 bool IsStub() const { return mode_ == STUB; } |
250 void SetOptimizing(BailoutId osr_ast_id, Handle<Code> unoptimized) { | 250 void SetOptimizing(BailoutId osr_ast_id, Handle<Code> unoptimized) { |
251 DCHECK(has_shared_info()); | 251 DCHECK(has_shared_info()); |
252 SetMode(OPTIMIZE); | 252 SetMode(OPTIMIZE); |
253 osr_ast_id_ = osr_ast_id; | 253 osr_ast_id_ = osr_ast_id; |
254 unoptimized_code_ = unoptimized; | 254 unoptimized_code_ = unoptimized; |
255 optimization_id_ = isolate()->NextOptimizationId(); | 255 optimization_id_ = isolate()->NextOptimizationId(); |
256 set_output_code_kind(Code::OPTIMIZED_FUNCTION); | 256 code_flags_ = |
| 257 Code::KindField::update(code_flags_, Code::OPTIMIZED_FUNCTION); |
257 } | 258 } |
258 | 259 |
259 // Deoptimization support. | 260 // Deoptimization support. |
260 bool HasDeoptimizationSupport() const { | 261 bool HasDeoptimizationSupport() const { |
261 return GetFlag(kDeoptimizationSupport); | 262 return GetFlag(kDeoptimizationSupport); |
262 } | 263 } |
263 void EnableDeoptimizationSupport() { | 264 void EnableDeoptimizationSupport() { |
264 DCHECK_EQ(BASE, mode_); | 265 DCHECK_EQ(BASE, mode_); |
265 SetFlag(kDeoptimizationSupport); | 266 SetFlag(kDeoptimizationSupport); |
266 } | 267 } |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
355 InlinedFunctionList const& inlined_functions() const { | 356 InlinedFunctionList const& inlined_functions() const { |
356 return inlined_functions_; | 357 return inlined_functions_; |
357 } | 358 } |
358 | 359 |
359 void AddInlinedFunction(Handle<SharedFunctionInfo> inlined_function) { | 360 void AddInlinedFunction(Handle<SharedFunctionInfo> inlined_function) { |
360 inlined_functions_.push_back(InlinedFunctionHolder(inlined_function)); | 361 inlined_functions_.push_back(InlinedFunctionHolder(inlined_function)); |
361 } | 362 } |
362 | 363 |
363 base::SmartArrayPointer<char> GetDebugName() const; | 364 base::SmartArrayPointer<char> GetDebugName() const; |
364 | 365 |
365 Code::Kind output_code_kind() const { return output_code_kind_; } | 366 Code::Kind output_code_kind() const { |
366 | 367 return Code::ExtractKindFromFlags(code_flags_); |
367 void set_output_code_kind(Code::Kind kind) { output_code_kind_ = kind; } | 368 } |
368 | 369 |
369 protected: | 370 protected: |
370 ParseInfo* parse_info_; | 371 ParseInfo* parse_info_; |
371 | 372 |
372 void DisableFutureOptimization() { | 373 void DisableFutureOptimization() { |
373 if (GetFlag(kDisableFutureOptimization) && has_shared_info()) { | 374 if (GetFlag(kDisableFutureOptimization) && has_shared_info()) { |
374 shared_info()->DisableOptimization(bailout_reason()); | 375 shared_info()->DisableOptimization(bailout_reason()); |
375 } | 376 } |
376 } | 377 } |
377 | 378 |
378 private: | 379 private: |
379 // Compilation mode. | 380 // Compilation mode. |
380 // BASE is generated by the full codegen, optionally prepared for bailouts. | 381 // BASE is generated by the full codegen, optionally prepared for bailouts. |
381 // OPTIMIZE is optimized code generated by the Hydrogen-based backend. | 382 // OPTIMIZE is optimized code generated by the Hydrogen-based backend. |
382 enum Mode { | 383 enum Mode { |
383 BASE, | 384 BASE, |
384 OPTIMIZE, | 385 OPTIMIZE, |
385 STUB | 386 STUB |
386 }; | 387 }; |
387 | 388 |
388 CompilationInfo(ParseInfo* parse_info, CodeStub* code_stub, | 389 CompilationInfo(ParseInfo* parse_info, const char* debug_name, |
389 const char* debug_name, Mode mode, Isolate* isolate, | 390 Code::Flags code_flags, Mode mode, Isolate* isolate, |
390 Zone* zone); | 391 Zone* zone); |
391 | 392 |
392 Isolate* isolate_; | 393 Isolate* isolate_; |
393 | 394 |
394 void SetMode(Mode mode) { | 395 void SetMode(Mode mode) { |
395 mode_ = mode; | 396 mode_ = mode; |
396 } | 397 } |
397 | 398 |
398 void SetFlag(Flag flag) { flags_ |= flag; } | 399 void SetFlag(Flag flag) { flags_ |= flag; } |
399 | 400 |
400 void SetFlag(Flag flag, bool value) { | 401 void SetFlag(Flag flag, bool value) { |
401 flags_ = value ? flags_ | flag : flags_ & ~flag; | 402 flags_ = value ? flags_ | flag : flags_ & ~flag; |
402 } | 403 } |
403 | 404 |
404 bool GetFlag(Flag flag) const { return (flags_ & flag) != 0; } | 405 bool GetFlag(Flag flag) const { return (flags_ & flag) != 0; } |
405 | 406 |
406 unsigned flags_; | 407 unsigned flags_; |
407 | 408 |
408 Code::Kind output_code_kind_; | 409 Code::Flags code_flags_; |
409 | 410 |
410 // For compiled stubs, the stub object | |
411 CodeStub* code_stub_; | |
412 // The compiled code. | 411 // The compiled code. |
413 Handle<Code> code_; | 412 Handle<Code> code_; |
414 | 413 |
415 // Used by codegen, ultimately kept rooted by the SharedFunctionInfo. | 414 // Used by codegen, ultimately kept rooted by the SharedFunctionInfo. |
416 Handle<TypeFeedbackVector> feedback_vector_; | 415 Handle<TypeFeedbackVector> feedback_vector_; |
417 | 416 |
418 // Compilation mode flag and whether deoptimization is allowed. | 417 // Compilation mode flag and whether deoptimization is allowed. |
419 Mode mode_; | 418 Mode mode_; |
420 BailoutId osr_ast_id_; | 419 BailoutId osr_ast_id_; |
421 // The unoptimized code we patched for OSR may not be the shared code | 420 // The unoptimized code we patched for OSR may not be the shared code |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
658 size_t info_zone_start_allocation_size_; | 657 size_t info_zone_start_allocation_size_; |
659 base::ElapsedTimer timer_; | 658 base::ElapsedTimer timer_; |
660 | 659 |
661 DISALLOW_COPY_AND_ASSIGN(CompilationPhase); | 660 DISALLOW_COPY_AND_ASSIGN(CompilationPhase); |
662 }; | 661 }; |
663 | 662 |
664 } // namespace internal | 663 } // namespace internal |
665 } // namespace v8 | 664 } // namespace v8 |
666 | 665 |
667 #endif // V8_COMPILER_H_ | 666 #endif // V8_COMPILER_H_ |
OLD | NEW |