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 #include <memory> | 8 #include <memory> |
9 | 9 |
10 #include "src/asmjs/asm-js.h" | 10 #include "src/asmjs/asm-js.h" |
(...skipping 640 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
651 bool passes_turbo_filter = shared->PassesFilter(FLAG_turbo_filter); | 651 bool passes_turbo_filter = shared->PassesFilter(FLAG_turbo_filter); |
652 | 652 |
653 return is_turbofanable_asm || is_unsupported_by_crankshaft_but_turbofanable || | 653 return is_turbofanable_asm || is_unsupported_by_crankshaft_but_turbofanable || |
654 passes_turbo_filter; | 654 passes_turbo_filter; |
655 } | 655 } |
656 | 656 |
657 bool GetOptimizedCodeNow(CompilationJob* job) { | 657 bool GetOptimizedCodeNow(CompilationJob* job) { |
658 CompilationInfo* info = job->info(); | 658 CompilationInfo* info = job->info(); |
659 Isolate* isolate = info->isolate(); | 659 Isolate* isolate = info->isolate(); |
660 | 660 |
| 661 // All handles below this point will be canonicalized. |
| 662 CanonicalHandleScope canonical(isolate); |
| 663 |
661 // Parsing is not required when optimizing from existing bytecode. | 664 // Parsing is not required when optimizing from existing bytecode. |
662 if (!info->is_optimizing_from_bytecode()) { | 665 if (!info->is_optimizing_from_bytecode()) { |
663 if (!Compiler::ParseAndAnalyze(info->parse_info())) return false; | 666 if (!Compiler::ParseAndAnalyze(info->parse_info())) return false; |
664 EnsureFeedbackMetadata(info); | 667 EnsureFeedbackMetadata(info); |
665 } | 668 } |
666 | 669 |
667 JSFunction::EnsureLiterals(info->closure()); | 670 JSFunction::EnsureLiterals(info->closure()); |
668 | 671 |
| 672 // Reopen handles in the new CompilationHandleScope. |
| 673 info->ReopenHandlesInNewHandleScope(); |
| 674 info->parse_info()->ReopenHandlesInNewHandleScope(); |
| 675 |
669 TimerEventScope<TimerEventRecompileSynchronous> timer(isolate); | 676 TimerEventScope<TimerEventRecompileSynchronous> timer(isolate); |
670 RuntimeCallTimerScope runtimeTimer(isolate, | 677 RuntimeCallTimerScope runtimeTimer(isolate, |
671 &RuntimeCallStats::RecompileSynchronous); | 678 &RuntimeCallStats::RecompileSynchronous); |
672 TRACE_EVENT_RUNTIME_CALL_STATS_TRACING_SCOPED( | 679 TRACE_EVENT_RUNTIME_CALL_STATS_TRACING_SCOPED( |
673 isolate, &tracing::TraceEventStatsTable::RecompileSynchronous); | 680 isolate, &tracing::TraceEventStatsTable::RecompileSynchronous); |
674 | 681 |
675 if (job->PrepareJob() != CompilationJob::SUCCEEDED || | 682 if (job->PrepareJob() != CompilationJob::SUCCEEDED || |
676 job->ExecuteJob() != CompilationJob::SUCCEEDED || | 683 job->ExecuteJob() != CompilationJob::SUCCEEDED || |
677 job->FinalizeJob() != CompilationJob::SUCCEEDED) { | 684 job->FinalizeJob() != CompilationJob::SUCCEEDED) { |
678 if (FLAG_trace_opt) { | 685 if (FLAG_trace_opt) { |
(...skipping 27 matching lines...) Expand all Loading... |
706 | 713 |
707 if (isolate->heap()->HighMemoryPressure()) { | 714 if (isolate->heap()->HighMemoryPressure()) { |
708 if (FLAG_trace_concurrent_recompilation) { | 715 if (FLAG_trace_concurrent_recompilation) { |
709 PrintF(" ** High memory pressure, will retry optimizing "); | 716 PrintF(" ** High memory pressure, will retry optimizing "); |
710 info->closure()->ShortPrint(); | 717 info->closure()->ShortPrint(); |
711 PrintF(" later.\n"); | 718 PrintF(" later.\n"); |
712 } | 719 } |
713 return false; | 720 return false; |
714 } | 721 } |
715 | 722 |
716 // All handles below this point will be allocated in a deferred handle scope | 723 // All handles below this point will be canonicalized and allocated in a |
717 // that is detached and handed off to the background thread when we return. | 724 // deferred handle scope that is detached and handed off to the background |
| 725 // thread when we return. |
718 CompilationHandleScope handle_scope(info); | 726 CompilationHandleScope handle_scope(info); |
| 727 CanonicalHandleScope canonical(isolate); |
719 | 728 |
720 // Parsing is not required when optimizing from existing bytecode. | 729 // Parsing is not required when optimizing from existing bytecode. |
721 if (!info->is_optimizing_from_bytecode()) { | 730 if (!info->is_optimizing_from_bytecode()) { |
722 if (!Compiler::ParseAndAnalyze(info->parse_info())) return false; | 731 if (!Compiler::ParseAndAnalyze(info->parse_info())) return false; |
723 EnsureFeedbackMetadata(info); | 732 EnsureFeedbackMetadata(info); |
724 } | 733 } |
725 | 734 |
726 JSFunction::EnsureLiterals(info->closure()); | 735 JSFunction::EnsureLiterals(info->closure()); |
727 | 736 |
728 // Reopen handles in the new CompilationHandleScope. | 737 // Reopen handles in the new CompilationHandleScope. |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
801 } | 810 } |
802 | 811 |
803 // Limit the number of times we try to optimize functions. | 812 // Limit the number of times we try to optimize functions. |
804 const int kMaxOptCount = | 813 const int kMaxOptCount = |
805 FLAG_deopt_every_n_times == 0 ? FLAG_max_opt_count : 1000; | 814 FLAG_deopt_every_n_times == 0 ? FLAG_max_opt_count : 1000; |
806 if (info->shared_info()->opt_count() > kMaxOptCount) { | 815 if (info->shared_info()->opt_count() > kMaxOptCount) { |
807 info->AbortOptimization(kOptimizedTooManyTimes); | 816 info->AbortOptimization(kOptimizedTooManyTimes); |
808 return MaybeHandle<Code>(); | 817 return MaybeHandle<Code>(); |
809 } | 818 } |
810 | 819 |
811 CanonicalHandleScope canonical(isolate); | |
812 TimerEventScope<TimerEventOptimizeCode> optimize_code_timer(isolate); | 820 TimerEventScope<TimerEventOptimizeCode> optimize_code_timer(isolate); |
813 RuntimeCallTimerScope runtimeTimer(isolate, &RuntimeCallStats::OptimizeCode); | 821 RuntimeCallTimerScope runtimeTimer(isolate, &RuntimeCallStats::OptimizeCode); |
814 TRACE_EVENT_RUNTIME_CALL_STATS_TRACING_SCOPED( | 822 TRACE_EVENT_RUNTIME_CALL_STATS_TRACING_SCOPED( |
815 isolate, &tracing::TraceEventStatsTable::OptimizeCode); | 823 isolate, &tracing::TraceEventStatsTable::OptimizeCode); |
816 | 824 |
817 // TurboFan can optimize directly from existing bytecode. | 825 // TurboFan can optimize directly from existing bytecode. |
818 if (FLAG_turbo_from_bytecode && use_turbofan && ShouldUseIgnition(info)) { | 826 if (FLAG_turbo_from_bytecode && use_turbofan && ShouldUseIgnition(info)) { |
819 if (!Compiler::EnsureBytecode(info)) { | 827 if (!Compiler::EnsureBytecode(info)) { |
820 if (isolate->has_pending_exception()) isolate->clear_pending_exception(); | 828 if (isolate->has_pending_exception()) isolate->clear_pending_exception(); |
821 return MaybeHandle<Code>(); | 829 return MaybeHandle<Code>(); |
(...skipping 1155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1977 DCHECK(shared->is_compiled()); | 1985 DCHECK(shared->is_compiled()); |
1978 function->set_literals(cached.literals); | 1986 function->set_literals(cached.literals); |
1979 } else if (shared->is_compiled()) { | 1987 } else if (shared->is_compiled()) { |
1980 // TODO(mvstanton): pass pretenure flag to EnsureLiterals. | 1988 // TODO(mvstanton): pass pretenure flag to EnsureLiterals. |
1981 JSFunction::EnsureLiterals(function); | 1989 JSFunction::EnsureLiterals(function); |
1982 } | 1990 } |
1983 } | 1991 } |
1984 | 1992 |
1985 } // namespace internal | 1993 } // namespace internal |
1986 } // namespace v8 | 1994 } // namespace v8 |
OLD | NEW |