| 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/ast-numbering.h" | 9 #include "src/ast/ast-numbering.h" |
| 10 #include "src/ast/prettyprinter.h" | 10 #include "src/ast/prettyprinter.h" |
| (...skipping 909 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 920 | 920 |
| 921 bool Compiler::ParseAndAnalyze(ParseInfo* info) { | 921 bool Compiler::ParseAndAnalyze(ParseInfo* info) { |
| 922 if (!Parser::ParseStatic(info)) return false; | 922 if (!Parser::ParseStatic(info)) return false; |
| 923 return Compiler::Analyze(info); | 923 return Compiler::Analyze(info); |
| 924 } | 924 } |
| 925 | 925 |
| 926 | 926 |
| 927 static bool GetOptimizedCodeNow(CompilationInfo* info) { | 927 static bool GetOptimizedCodeNow(CompilationInfo* info) { |
| 928 Isolate* isolate = info->isolate(); | 928 Isolate* isolate = info->isolate(); |
| 929 CanonicalHandleScope canonical(isolate); | 929 CanonicalHandleScope canonical(isolate); |
| 930 TimerEventScope<TimerEventOptimizeCode> optimize_code_timer(isolate); |
| 930 | 931 |
| 931 if (!Compiler::ParseAndAnalyze(info->parse_info())) return false; | 932 if (!Compiler::ParseAndAnalyze(info->parse_info())) return false; |
| 932 | 933 |
| 933 TimerEventScope<TimerEventRecompileSynchronous> timer(isolate); | 934 TimerEventScope<TimerEventRecompileSynchronous> timer(isolate); |
| 934 | 935 |
| 935 OptimizedCompileJob job(info); | 936 OptimizedCompileJob job(info); |
| 936 if (job.CreateGraph() != OptimizedCompileJob::SUCCEEDED || | 937 if (job.CreateGraph() != OptimizedCompileJob::SUCCEEDED || |
| 937 job.OptimizeGraph() != OptimizedCompileJob::SUCCEEDED || | 938 job.OptimizeGraph() != OptimizedCompileJob::SUCCEEDED || |
| 938 job.GenerateCode() != OptimizedCompileJob::SUCCEEDED) { | 939 job.GenerateCode() != OptimizedCompileJob::SUCCEEDED) { |
| 939 if (FLAG_trace_opt) { | 940 if (FLAG_trace_opt) { |
| 940 PrintF("[aborted optimizing "); | 941 PrintF("[aborted optimizing "); |
| 941 info->closure()->ShortPrint(); | 942 info->closure()->ShortPrint(); |
| 942 PrintF(" because: %s]\n", GetBailoutReason(info->bailout_reason())); | 943 PrintF(" because: %s]\n", GetBailoutReason(info->bailout_reason())); |
| 943 } | 944 } |
| 944 return false; | 945 return false; |
| 945 } | 946 } |
| 946 | 947 |
| 947 // Success! | 948 // Success! |
| 948 DCHECK(!isolate->has_pending_exception()); | 949 DCHECK(!isolate->has_pending_exception()); |
| 949 InsertCodeIntoOptimizedCodeMap(info); | 950 InsertCodeIntoOptimizedCodeMap(info); |
| 950 RecordFunctionCompilation(Logger::LAZY_COMPILE_TAG, info, | 951 RecordFunctionCompilation(Logger::LAZY_COMPILE_TAG, info, |
| 951 info->shared_info()); | 952 info->shared_info()); |
| 952 return true; | 953 return true; |
| 953 } | 954 } |
| 954 | 955 |
| 955 | 956 |
| 956 static bool GetOptimizedCodeLater(CompilationInfo* info) { | 957 static bool GetOptimizedCodeLater(CompilationInfo* info) { |
| 957 Isolate* isolate = info->isolate(); | 958 Isolate* isolate = info->isolate(); |
| 958 CanonicalHandleScope canonical(isolate); | 959 CanonicalHandleScope canonical(isolate); |
| 960 TimerEventScope<TimerEventOptimizeCode> optimize_code_timer(isolate); |
| 959 | 961 |
| 960 if (!isolate->optimizing_compile_dispatcher()->IsQueueAvailable()) { | 962 if (!isolate->optimizing_compile_dispatcher()->IsQueueAvailable()) { |
| 961 if (FLAG_trace_concurrent_recompilation) { | 963 if (FLAG_trace_concurrent_recompilation) { |
| 962 PrintF(" ** Compilation queue full, will retry optimizing "); | 964 PrintF(" ** Compilation queue full, will retry optimizing "); |
| 963 info->closure()->ShortPrint(); | 965 info->closure()->ShortPrint(); |
| 964 PrintF(" later.\n"); | 966 PrintF(" later.\n"); |
| 965 } | 967 } |
| 966 return false; | 968 return false; |
| 967 } | 969 } |
| 968 | 970 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1006 GetUnoptimizedCodeCommon(&info), | 1008 GetUnoptimizedCodeCommon(&info), |
| 1007 Code); | 1009 Code); |
| 1008 return result; | 1010 return result; |
| 1009 } | 1011 } |
| 1010 | 1012 |
| 1011 | 1013 |
| 1012 MaybeHandle<Code> Compiler::GetLazyCode(Handle<JSFunction> function) { | 1014 MaybeHandle<Code> Compiler::GetLazyCode(Handle<JSFunction> function) { |
| 1013 Isolate* isolate = function->GetIsolate(); | 1015 Isolate* isolate = function->GetIsolate(); |
| 1014 DCHECK(!isolate->has_pending_exception()); | 1016 DCHECK(!isolate->has_pending_exception()); |
| 1015 DCHECK(!function->is_compiled()); | 1017 DCHECK(!function->is_compiled()); |
| 1018 TimerEventScope<TimerEventCompileCode> compile_timer(isolate); |
| 1016 AggregatedHistogramTimerScope timer(isolate->counters()->compile_lazy()); | 1019 AggregatedHistogramTimerScope timer(isolate->counters()->compile_lazy()); |
| 1017 // If the debugger is active, do not compile with turbofan unless we can | 1020 // If the debugger is active, do not compile with turbofan unless we can |
| 1018 // deopt from turbofan code. | 1021 // deopt from turbofan code. |
| 1019 if (FLAG_turbo_asm && function->shared()->asm_function() && | 1022 if (FLAG_turbo_asm && function->shared()->asm_function() && |
| 1020 (FLAG_turbo_asm_deoptimization || !isolate->debug()->is_active()) && | 1023 (FLAG_turbo_asm_deoptimization || !isolate->debug()->is_active()) && |
| 1021 !FLAG_turbo_osr) { | 1024 !FLAG_turbo_osr) { |
| 1022 CompilationInfoWithZone info(function); | 1025 CompilationInfoWithZone info(function); |
| 1023 | 1026 |
| 1024 VMState<COMPILER> state(isolate); | 1027 VMState<COMPILER> state(isolate); |
| 1025 PostponeInterruptsScope postpone(isolate); | 1028 PostponeInterruptsScope postpone(isolate); |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1213 Handle<ScopeInfo> scope_info = | 1216 Handle<ScopeInfo> scope_info = |
| 1214 ScopeInfo::Create(info.isolate(), info.zone(), info.scope()); | 1217 ScopeInfo::Create(info.isolate(), info.zone(), info.scope()); |
| 1215 info.shared_info()->set_scope_info(*scope_info); | 1218 info.shared_info()->set_scope_info(*scope_info); |
| 1216 } | 1219 } |
| 1217 tracker.RecordRootFunctionInfo(info.code()); | 1220 tracker.RecordRootFunctionInfo(info.code()); |
| 1218 } | 1221 } |
| 1219 | 1222 |
| 1220 | 1223 |
| 1221 static Handle<SharedFunctionInfo> CompileToplevel(CompilationInfo* info) { | 1224 static Handle<SharedFunctionInfo> CompileToplevel(CompilationInfo* info) { |
| 1222 Isolate* isolate = info->isolate(); | 1225 Isolate* isolate = info->isolate(); |
| 1226 TimerEventScope<TimerEventCompileCode> timer(isolate); |
| 1223 PostponeInterruptsScope postpone(isolate); | 1227 PostponeInterruptsScope postpone(isolate); |
| 1224 DCHECK(!isolate->native_context().is_null()); | 1228 DCHECK(!isolate->native_context().is_null()); |
| 1225 ParseInfo* parse_info = info->parse_info(); | 1229 ParseInfo* parse_info = info->parse_info(); |
| 1226 Handle<Script> script = parse_info->script(); | 1230 Handle<Script> script = parse_info->script(); |
| 1227 | 1231 |
| 1228 // TODO(svenpanne) Obscure place for this, perhaps move to OnBeforeCompile? | 1232 // TODO(svenpanne) Obscure place for this, perhaps move to OnBeforeCompile? |
| 1229 FixedArray* array = isolate->native_context()->embedder_data(); | 1233 FixedArray* array = isolate->native_context()->embedder_data(); |
| 1230 script->set_context_data(array->get(v8::Context::kDebugIdIndex)); | 1234 script->set_context_data(array->get(v8::Context::kDebugIdIndex)); |
| 1231 | 1235 |
| 1232 isolate->debug()->OnBeforeCompile(script); | 1236 isolate->debug()->OnBeforeCompile(script); |
| (...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1610 bool allow_lazy_without_ctx = literal->AllowsLazyCompilationWithoutContext(); | 1614 bool allow_lazy_without_ctx = literal->AllowsLazyCompilationWithoutContext(); |
| 1611 // Compile eagerly for live edit. When compiling debug code, eagerly compile | 1615 // Compile eagerly for live edit. When compiling debug code, eagerly compile |
| 1612 // unless we can lazily compile without the context. | 1616 // unless we can lazily compile without the context. |
| 1613 bool allow_lazy = literal->AllowsLazyCompilation() && | 1617 bool allow_lazy = literal->AllowsLazyCompilation() && |
| 1614 !LiveEditFunctionTracker::IsActive(isolate) && | 1618 !LiveEditFunctionTracker::IsActive(isolate) && |
| 1615 (!info.is_debug() || allow_lazy_without_ctx); | 1619 (!info.is_debug() || allow_lazy_without_ctx); |
| 1616 | 1620 |
| 1617 bool lazy = FLAG_lazy && allow_lazy && !literal->should_eager_compile(); | 1621 bool lazy = FLAG_lazy && allow_lazy && !literal->should_eager_compile(); |
| 1618 | 1622 |
| 1619 // Generate code | 1623 // Generate code |
| 1624 TimerEventScope<TimerEventCompileCode> timer(isolate); |
| 1620 Handle<ScopeInfo> scope_info; | 1625 Handle<ScopeInfo> scope_info; |
| 1621 if (lazy) { | 1626 if (lazy) { |
| 1622 Handle<Code> code = isolate->builtins()->CompileLazy(); | 1627 Handle<Code> code = isolate->builtins()->CompileLazy(); |
| 1623 info.SetCode(code); | 1628 info.SetCode(code); |
| 1624 // There's no need in theory for a lazy-compiled function to have a type | 1629 // There's no need in theory for a lazy-compiled function to have a type |
| 1625 // feedback vector, but some parts of the system expect all | 1630 // feedback vector, but some parts of the system expect all |
| 1626 // SharedFunctionInfo instances to have one. The size of the vector depends | 1631 // SharedFunctionInfo instances to have one. The size of the vector depends |
| 1627 // on how many feedback-needing nodes are in the tree, and when lazily | 1632 // on how many feedback-needing nodes are in the tree, and when lazily |
| 1628 // parsing we might not know that, if this function was never parsed before. | 1633 // parsing we might not know that, if this function was never parsed before. |
| 1629 // In that case the vector will be replaced the next time MakeCode is | 1634 // In that case the vector will be replaced the next time MakeCode is |
| (...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1868 } | 1873 } |
| 1869 | 1874 |
| 1870 #if DEBUG | 1875 #if DEBUG |
| 1871 void CompilationInfo::PrintAstForTesting() { | 1876 void CompilationInfo::PrintAstForTesting() { |
| 1872 PrintF("--- Source from AST ---\n%s\n", | 1877 PrintF("--- Source from AST ---\n%s\n", |
| 1873 PrettyPrinter(isolate()).PrintProgram(literal())); | 1878 PrettyPrinter(isolate()).PrintProgram(literal())); |
| 1874 } | 1879 } |
| 1875 #endif | 1880 #endif |
| 1876 } // namespace internal | 1881 } // namespace internal |
| 1877 } // namespace v8 | 1882 } // namespace v8 |
| OLD | NEW |