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 #include "src/compiler.h" | 5 #include "src/compiler.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "src/ast-numbering.h" | 9 #include "src/ast-numbering.h" |
10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
107 // Compiling for the snapshot typically results in different code than | 107 // Compiling for the snapshot typically results in different code than |
108 // compiling later on. This means that code recompiled with deoptimization | 108 // compiling later on. This means that code recompiled with deoptimization |
109 // support won't be "equivalent" (as defined by SharedFunctionInfo:: | 109 // support won't be "equivalent" (as defined by SharedFunctionInfo:: |
110 // EnableDeoptimizationSupport), so it will replace the old code and all | 110 // EnableDeoptimizationSupport), so it will replace the old code and all |
111 // its type feedback. To avoid this, always compile functions in the snapshot | 111 // its type feedback. To avoid this, always compile functions in the snapshot |
112 // with deoptimization support. | 112 // with deoptimization support. |
113 if (isolate_->serializer_enabled()) EnableDeoptimizationSupport(); | 113 if (isolate_->serializer_enabled()) EnableDeoptimizationSupport(); |
114 | 114 |
115 if (isolate_->debug()->is_active()) MarkAsDebug(); | 115 if (isolate_->debug()->is_active()) MarkAsDebug(); |
116 if (FLAG_context_specialization) MarkAsContextSpecializing(); | 116 if (FLAG_context_specialization) MarkAsContextSpecializing(); |
117 if (FLAG_turbo_deoptimization) MarkAsDeoptimizationEnabled(); | |
118 if (FLAG_turbo_inlining) MarkAsInliningEnabled(); | 117 if (FLAG_turbo_inlining) MarkAsInliningEnabled(); |
119 if (FLAG_turbo_source_positions) MarkAsSourcePositionsEnabled(); | 118 if (FLAG_turbo_source_positions) MarkAsSourcePositionsEnabled(); |
120 if (FLAG_turbo_splitting) MarkAsSplittingEnabled(); | 119 if (FLAG_turbo_splitting) MarkAsSplittingEnabled(); |
121 if (FLAG_turbo_types) MarkAsTypingEnabled(); | 120 if (FLAG_turbo_types) MarkAsTypingEnabled(); |
122 | 121 |
123 if (has_shared_info() && shared_info()->is_compiled()) { | 122 if (has_shared_info() && shared_info()->is_compiled()) { |
124 // We should initialize the CompilationInfo feedback vector from the | 123 // We should initialize the CompilationInfo feedback vector from the |
125 // passed in shared info, rather than creating a new one. | 124 // passed in shared info, rather than creating a new one. |
126 feedback_vector_ = Handle<TypeFeedbackVector>( | 125 feedback_vector_ = Handle<TypeFeedbackVector>( |
127 shared_info()->feedback_vector(), parse_info->isolate()); | 126 shared_info()->feedback_vector(), parse_info->isolate()); |
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
386 if (info()->is_osr()) os << " OSR"; | 385 if (info()->is_osr()) os << " OSR"; |
387 os << "]" << std::endl; | 386 os << "]" << std::endl; |
388 } | 387 } |
389 | 388 |
390 if (info()->shared_info()->asm_function()) { | 389 if (info()->shared_info()->asm_function()) { |
391 info()->MarkAsContextSpecializing(); | 390 info()->MarkAsContextSpecializing(); |
392 } else if (FLAG_turbo_type_feedback) { | 391 } else if (FLAG_turbo_type_feedback) { |
393 info()->MarkAsTypeFeedbackEnabled(); | 392 info()->MarkAsTypeFeedbackEnabled(); |
394 info()->EnsureFeedbackVector(); | 393 info()->EnsureFeedbackVector(); |
395 } | 394 } |
| 395 if (!info()->shared_info()->asm_function() || |
| 396 FLAG_turbo_asm_deoptimization) { |
| 397 info()->MarkAsDeoptimizationEnabled(); |
| 398 } |
396 | 399 |
397 Timer t(this, &time_taken_to_create_graph_); | 400 Timer t(this, &time_taken_to_create_graph_); |
398 compiler::Pipeline pipeline(info()); | 401 compiler::Pipeline pipeline(info()); |
399 pipeline.GenerateCode(); | 402 pipeline.GenerateCode(); |
400 if (!info()->code().is_null()) { | 403 if (!info()->code().is_null()) { |
401 return SetLastStatus(SUCCEEDED); | 404 return SetLastStatus(SUCCEEDED); |
402 } | 405 } |
403 } | 406 } |
404 | 407 |
405 if (!isolate()->use_crankshaft()) { | 408 if (!isolate()->use_crankshaft()) { |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
495 | 498 |
496 return SetLastStatus(BAILED_OUT); | 499 return SetLastStatus(BAILED_OUT); |
497 } | 500 } |
498 | 501 |
499 | 502 |
500 OptimizedCompileJob::Status OptimizedCompileJob::GenerateCode() { | 503 OptimizedCompileJob::Status OptimizedCompileJob::GenerateCode() { |
501 DCHECK(last_status() == SUCCEEDED); | 504 DCHECK(last_status() == SUCCEEDED); |
502 // TODO(turbofan): Currently everything is done in the first phase. | 505 // TODO(turbofan): Currently everything is done in the first phase. |
503 if (!info()->code().is_null()) { | 506 if (!info()->code().is_null()) { |
504 info()->dependencies()->Commit(info()->code()); | 507 info()->dependencies()->Commit(info()->code()); |
505 if (FLAG_turbo_deoptimization) { | 508 if (info()->is_deoptimization_enabled()) { |
506 info()->parse_info()->context()->native_context()->AddOptimizedCode( | 509 info()->parse_info()->context()->native_context()->AddOptimizedCode( |
507 *info()->code()); | 510 *info()->code()); |
508 } | 511 } |
509 RecordOptimizationStats(); | 512 RecordOptimizationStats(); |
510 return last_status(); | 513 return last_status(); |
511 } | 514 } |
512 | 515 |
513 DCHECK(!info()->dependencies()->HasAborted()); | 516 DCHECK(!info()->dependencies()->HasAborted()); |
514 DisallowCodeDependencyChange no_dependency_change; | 517 DisallowCodeDependencyChange no_dependency_change; |
515 DisallowJavascriptExecution no_js(isolate()); | 518 DisallowJavascriptExecution no_js(isolate()); |
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
841 | 844 |
842 | 845 |
843 MaybeHandle<Code> Compiler::GetLazyCode(Handle<JSFunction> function) { | 846 MaybeHandle<Code> Compiler::GetLazyCode(Handle<JSFunction> function) { |
844 Isolate* isolate = function->GetIsolate(); | 847 Isolate* isolate = function->GetIsolate(); |
845 DCHECK(!isolate->has_pending_exception()); | 848 DCHECK(!isolate->has_pending_exception()); |
846 DCHECK(!function->is_compiled()); | 849 DCHECK(!function->is_compiled()); |
847 AggregatedHistogramTimerScope timer(isolate->counters()->compile_lazy()); | 850 AggregatedHistogramTimerScope timer(isolate->counters()->compile_lazy()); |
848 // If the debugger is active, do not compile with turbofan unless we can | 851 // If the debugger is active, do not compile with turbofan unless we can |
849 // deopt from turbofan code. | 852 // deopt from turbofan code. |
850 if (FLAG_turbo_asm && function->shared()->asm_function() && | 853 if (FLAG_turbo_asm && function->shared()->asm_function() && |
851 (FLAG_turbo_deoptimization || !isolate->debug()->is_active()) && | 854 (FLAG_turbo_asm_deoptimization || !isolate->debug()->is_active()) && |
852 !FLAG_turbo_osr) { | 855 !FLAG_turbo_osr) { |
853 CompilationInfoWithZone info(function); | 856 CompilationInfoWithZone info(function); |
854 | 857 |
855 VMState<COMPILER> state(isolate); | 858 VMState<COMPILER> state(isolate); |
856 PostponeInterruptsScope postpone(isolate); | 859 PostponeInterruptsScope postpone(isolate); |
857 | 860 |
858 info.SetOptimizing(BailoutId::None(), handle(function->shared()->code())); | 861 info.SetOptimizing(BailoutId::None(), handle(function->shared()->code())); |
859 | 862 |
860 if (GetOptimizedCodeNow(&info)) { | 863 if (GetOptimizedCodeNow(&info)) { |
861 DCHECK(function->shared()->is_compiled()); | 864 DCHECK(function->shared()->is_compiled()); |
(...skipping 699 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1561 } | 1564 } |
1562 | 1565 |
1563 | 1566 |
1564 #if DEBUG | 1567 #if DEBUG |
1565 void CompilationInfo::PrintAstForTesting() { | 1568 void CompilationInfo::PrintAstForTesting() { |
1566 PrintF("--- Source from AST ---\n%s\n", | 1569 PrintF("--- Source from AST ---\n%s\n", |
1567 PrettyPrinter(isolate(), zone()).PrintProgram(function())); | 1570 PrettyPrinter(isolate(), zone()).PrintProgram(function())); |
1568 } | 1571 } |
1569 #endif | 1572 #endif |
1570 } } // namespace v8::internal | 1573 } } // namespace v8::internal |
OLD | NEW |