Chromium Code Reviews| 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 437 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 448 if (info->parse_info()->literal()->should_be_used_once_hint()) { | 448 if (info->parse_info()->literal()->should_be_used_once_hint()) { |
| 449 info->code()->MarkToBeExecutedOnce(info->isolate()); | 449 info->code()->MarkToBeExecutedOnce(info->isolate()); |
| 450 } | 450 } |
| 451 InstallUnoptimizedCode(info); | 451 InstallUnoptimizedCode(info); |
| 452 RecordFunctionCompilation(CodeEventListener::FUNCTION_TAG, info); | 452 RecordFunctionCompilation(CodeEventListener::FUNCTION_TAG, info); |
| 453 job->RecordUnoptimizedCompilationStats(); | 453 job->RecordUnoptimizedCompilationStats(); |
| 454 } | 454 } |
| 455 return status; | 455 return status; |
| 456 } | 456 } |
| 457 | 457 |
| 458 void SetSharedFunctionFlagsFromLiteral(FunctionLiteral* literal, | |
| 459 Handle<SharedFunctionInfo> shared_info) { | |
| 460 shared_info->set_ast_node_count(literal->ast_node_count()); | |
| 461 if (literal->dont_optimize_reason() != kNoReason) { | |
| 462 shared_info->DisableOptimization(literal->dont_optimize_reason()); | |
| 463 } | |
| 464 if (literal->flags() & AstProperties::kMustUseIgnitionTurbo) { | |
| 465 shared_info->set_must_use_ignition_turbo(true); | |
| 466 } | |
| 467 } | |
| 468 | |
| 458 bool Renumber(Isolate* isolate, Zone* zone, FunctionLiteral* literal, | 469 bool Renumber(Isolate* isolate, Zone* zone, FunctionLiteral* literal, |
| 459 Handle<SharedFunctionInfo> shared_info, | 470 Handle<SharedFunctionInfo> shared_info, |
| 460 Compiler::EagerInnerFunctionLiterals* eager_literals) { | 471 Compiler::EagerInnerFunctionLiterals* eager_literals) { |
| 461 RuntimeCallTimerScope runtimeTimer(isolate, | 472 RuntimeCallTimerScope runtimeTimer(isolate, |
| 462 &RuntimeCallStats::CompileRenumber); | 473 &RuntimeCallStats::CompileRenumber); |
| 463 if (!AstNumbering::Renumber(isolate->stack_guard()->real_climit(), zone, | 474 if (!AstNumbering::Renumber(isolate->stack_guard()->real_climit(), zone, |
| 464 literal, eager_literals)) { | 475 literal, eager_literals)) { |
| 465 return false; | 476 return false; |
| 466 } | 477 } |
| 478 | |
| 467 if (!shared_info.is_null()) { | 479 if (!shared_info.is_null()) { |
| 468 shared_info->set_ast_node_count(literal->ast_node_count()); | 480 SetSharedFunctionFlagsFromLiteral(literal, shared_info); |
| 469 if (literal->dont_optimize_reason() != kNoReason) { | |
| 470 shared_info->DisableOptimization(literal->dont_optimize_reason()); | |
| 471 } | |
| 472 if (literal->flags() & AstProperties::kMustUseIgnitionTurbo) { | |
| 473 shared_info->set_must_use_ignition_turbo(true); | |
| 474 } | |
| 475 } | 481 } |
| 476 return true; | 482 return true; |
| 477 } | 483 } |
| 478 | 484 |
| 479 bool GenerateUnoptimizedCode(CompilationInfo* info) { | 485 bool GenerateUnoptimizedCode(CompilationInfo* info) { |
| 480 if (UseAsmWasm(info->scope(), info->shared_info(), info->is_debug())) { | 486 if (UseAsmWasm(info->scope(), info->shared_info(), info->is_debug())) { |
| 481 EnsureFeedbackMetadata(info); | 487 EnsureFeedbackMetadata(info); |
| 482 MaybeHandle<FixedArray> wasm_data; | 488 MaybeHandle<FixedArray> wasm_data; |
| 483 wasm_data = AsmJs::CompileAsmViaWasm(info); | 489 wasm_data = AsmJs::CompileAsmViaWasm(info); |
| 484 if (!wasm_data.is_null()) { | 490 if (!wasm_data.is_null()) { |
| 485 info->shared_info()->set_asm_wasm_data(*wasm_data.ToHandleChecked()); | 491 info->shared_info()->set_asm_wasm_data(*wasm_data.ToHandleChecked()); |
| 486 info->SetCode(info->isolate()->builtins()->InstantiateAsmJs()); | 492 info->SetCode(info->isolate()->builtins()->InstantiateAsmJs()); |
| 487 InstallUnoptimizedCode(info); | 493 InstallUnoptimizedCode(info); |
| 488 return true; | 494 return true; |
| 489 } | 495 } |
| 490 } | 496 } |
| 491 | 497 |
| 492 std::unique_ptr<CompilationJob> job(GetUnoptimizedCompilationJob(info)); | 498 std::unique_ptr<CompilationJob> job(GetUnoptimizedCompilationJob(info)); |
| 493 if (job->PrepareJob() != CompilationJob::SUCCEEDED) return false; | 499 if (job->PrepareJob() != CompilationJob::SUCCEEDED) return false; |
| 494 if (job->ExecuteJob() != CompilationJob::SUCCEEDED) return false; | 500 if (job->ExecuteJob() != CompilationJob::SUCCEEDED) return false; |
| 495 if (FinalizeUnoptimizedCompilationJob(job.get()) != | 501 if (FinalizeUnoptimizedCompilationJob(job.get()) != |
| 496 CompilationJob::SUCCEEDED) { | 502 CompilationJob::SUCCEEDED) { |
| 497 return false; | 503 return false; |
| 498 } | 504 } |
| 499 return true; | 505 return true; |
| 500 } | 506 } |
| 501 | 507 |
| 502 bool CompileUnoptimizedInnerFunctionsRecursively( | 508 bool CompileUnoptimizedInnerFunctions( |
| 503 ThreadedList<ThreadedListZoneEntry<FunctionLiteral*>>* literals, | 509 ThreadedList<ThreadedListZoneEntry<FunctionLiteral*>>* literals, |
| 504 CompilationInfo* outer_info) { | 510 CompilationInfo* outer_info) { |
| 505 Isolate* isolate = outer_info->isolate(); | 511 Isolate* isolate = outer_info->isolate(); |
| 506 Handle<Script> script = outer_info->script(); | 512 Handle<Script> script = outer_info->script(); |
| 507 bool is_debug = outer_info->is_debug(); | 513 bool is_debug = outer_info->is_debug(); |
| 508 bool will_serialize = outer_info->will_serialize(); | 514 bool will_serialize = outer_info->will_serialize(); |
| 509 RuntimeCallTimerScope runtimeTimer(isolate, | 515 RuntimeCallTimerScope runtimeTimer(isolate, |
| 510 &RuntimeCallStats::CompileInnerFunction); | 516 &RuntimeCallStats::CompileInnerFunction); |
| 511 | 517 |
| 512 for (auto it : *literals) { | 518 for (auto it : *literals) { |
| 513 FunctionLiteral* literal = it->value(); | 519 FunctionLiteral* literal = it->value(); |
| 514 Handle<SharedFunctionInfo> shared = | 520 Handle<SharedFunctionInfo> shared = |
| 515 Compiler::GetSharedFunctionInfo(literal, script, outer_info); | 521 Compiler::GetSharedFunctionInfo(literal, script, outer_info); |
| 516 if (shared->is_compiled()) continue; | 522 if (shared->is_compiled()) continue; |
| 517 Compiler::EagerInnerFunctionLiterals inner_literals; | 523 |
| 518 if (!Renumber(isolate, outer_info->zone(), literal, shared, | 524 SetSharedFunctionFlagsFromLiteral(literal, shared); |
|
Michael Starzinger
2017/01/19 13:29:22
nit: Please add a brief comment here explaining th
rmcilroy
2017/01/19 17:24:49
Done.
| |
| 519 &inner_literals) || | |
| 520 !CompileUnoptimizedInnerFunctionsRecursively(&inner_literals, | |
| 521 outer_info)) { | |
| 522 if (!isolate->has_pending_exception()) isolate->StackOverflow(); | |
| 523 return false; | |
| 524 } | |
| 525 | 525 |
| 526 // Try to enqueue the eager function on the compiler dispatcher. | 526 // Try to enqueue the eager function on the compiler dispatcher. |
| 527 CompilerDispatcher* dispatcher = isolate->compiler_dispatcher(); | 527 CompilerDispatcher* dispatcher = isolate->compiler_dispatcher(); |
| 528 if (UseCompilerDispatcher(dispatcher, literal->scope(), shared, is_debug, | 528 if (UseCompilerDispatcher(dispatcher, literal->scope(), shared, is_debug, |
| 529 will_serialize) && | 529 will_serialize) && |
| 530 dispatcher->EnqueueAndStep(shared, literal)) { | 530 dispatcher->EnqueueAndStep(shared, literal)) { |
| 531 // If we have successfully queued up the function for compilation on the | 531 // If we have successfully queued up the function for compilation on the |
| 532 // compiler dispatcher then we are done. | 532 // compiler dispatcher then we are done. |
| 533 continue; | 533 continue; |
| 534 } else { | 534 } else { |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 555 } | 555 } |
| 556 return true; | 556 return true; |
| 557 } | 557 } |
| 558 | 558 |
| 559 bool CompileUnoptimizedCode(CompilationInfo* info) { | 559 bool CompileUnoptimizedCode(CompilationInfo* info) { |
| 560 Isolate* isolate = info->isolate(); | 560 Isolate* isolate = info->isolate(); |
| 561 DCHECK(AllowCompilation::IsAllowed(isolate)); | 561 DCHECK(AllowCompilation::IsAllowed(isolate)); |
| 562 | 562 |
| 563 Compiler::EagerInnerFunctionLiterals inner_literals; | 563 Compiler::EagerInnerFunctionLiterals inner_literals; |
| 564 if (!Compiler::Analyze(info->parse_info(), &inner_literals) || | 564 if (!Compiler::Analyze(info->parse_info(), &inner_literals) || |
| 565 !CompileUnoptimizedInnerFunctionsRecursively(&inner_literals, info) || | 565 !CompileUnoptimizedInnerFunctions(&inner_literals, info) || |
| 566 !GenerateUnoptimizedCode(info)) { | 566 !GenerateUnoptimizedCode(info)) { |
| 567 if (!isolate->has_pending_exception()) isolate->StackOverflow(); | 567 if (!isolate->has_pending_exception()) isolate->StackOverflow(); |
| 568 return false; | 568 return false; |
| 569 } | 569 } |
| 570 | 570 |
| 571 // TODO(rmcilroy): Remove this once the enqueued tasks can keep the parsed | 571 // TODO(rmcilroy): Remove this once the enqueued tasks can keep the parsed |
| 572 // zone and handles alive and replace with a check in CompileLazy to finish | 572 // zone and handles alive and replace with a check in CompileLazy to finish |
| 573 // the task itself. | 573 // the task itself. |
| 574 if (isolate->compiler_dispatcher()->IsEnabled() && | 574 if (isolate->compiler_dispatcher()->IsEnabled() && |
| 575 !isolate->compiler_dispatcher()->FinishAllNow()) { | 575 !isolate->compiler_dispatcher()->FinishAllNow()) { |
| (...skipping 1204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1780 } | 1780 } |
| 1781 | 1781 |
| 1782 if (shared->is_compiled()) { | 1782 if (shared->is_compiled()) { |
| 1783 // TODO(mvstanton): pass pretenure flag to EnsureLiterals. | 1783 // TODO(mvstanton): pass pretenure flag to EnsureLiterals. |
| 1784 JSFunction::EnsureLiterals(function); | 1784 JSFunction::EnsureLiterals(function); |
| 1785 } | 1785 } |
| 1786 } | 1786 } |
| 1787 | 1787 |
| 1788 } // namespace internal | 1788 } // namespace internal |
| 1789 } // namespace v8 | 1789 } // namespace v8 |
| OLD | NEW |