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 376 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
387 // Use TurboFan for the compilation. | 387 // Use TurboFan for the compilation. |
388 if (FLAG_trace_opt) { | 388 if (FLAG_trace_opt) { |
389 OFStream os(stdout); | 389 OFStream os(stdout); |
390 os << "[compiling method " << Brief(*info()->closure()) | 390 os << "[compiling method " << Brief(*info()->closure()) |
391 << " using TurboFan"; | 391 << " using TurboFan"; |
392 if (info()->is_osr()) os << " OSR"; | 392 if (info()->is_osr()) os << " OSR"; |
393 os << "]" << std::endl; | 393 os << "]" << std::endl; |
394 } | 394 } |
395 | 395 |
396 if (info()->shared_info()->asm_function()) { | 396 if (info()->shared_info()->asm_function()) { |
| 397 if (info()->osr_frame()) info()->MarkAsFrameSpecializing(); |
397 info()->MarkAsContextSpecializing(); | 398 info()->MarkAsContextSpecializing(); |
398 } else if (FLAG_turbo_type_feedback) { | 399 } else if (FLAG_turbo_type_feedback) { |
399 info()->MarkAsTypeFeedbackEnabled(); | 400 info()->MarkAsTypeFeedbackEnabled(); |
400 info()->EnsureFeedbackVector(); | 401 info()->EnsureFeedbackVector(); |
401 } | 402 } |
402 if (!info()->shared_info()->asm_function() || | 403 if (!info()->shared_info()->asm_function() || |
403 FLAG_turbo_asm_deoptimization) { | 404 FLAG_turbo_asm_deoptimization) { |
404 info()->MarkAsDeoptimizationEnabled(); | 405 info()->MarkAsDeoptimizationEnabled(); |
405 } | 406 } |
406 | 407 |
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
705 } | 706 } |
706 return MaybeHandle<Code>(); | 707 return MaybeHandle<Code>(); |
707 } | 708 } |
708 | 709 |
709 | 710 |
710 static void InsertCodeIntoOptimizedCodeMap(CompilationInfo* info) { | 711 static void InsertCodeIntoOptimizedCodeMap(CompilationInfo* info) { |
711 Handle<Code> code = info->code(); | 712 Handle<Code> code = info->code(); |
712 if (code->kind() != Code::OPTIMIZED_FUNCTION) return; // Nothing to do. | 713 if (code->kind() != Code::OPTIMIZED_FUNCTION) return; // Nothing to do. |
713 | 714 |
714 // Context specialization folds-in the context, so no sharing can occur. | 715 // Context specialization folds-in the context, so no sharing can occur. |
715 if (code->is_turbofanned() && info->is_context_specializing()) return; | 716 if (info->is_context_specializing()) return; |
| 717 // Frame specialization implies context specialization. |
| 718 DCHECK(!info->is_frame_specializing()); |
716 | 719 |
717 // Do not cache bound functions. | 720 // Do not cache bound functions. |
718 Handle<JSFunction> function = info->closure(); | 721 Handle<JSFunction> function = info->closure(); |
719 if (function->shared()->bound()) return; | 722 if (function->shared()->bound()) return; |
720 | 723 |
721 // Cache optimized context-specific code. | 724 // Cache optimized context-specific code. |
722 if (FLAG_cache_optimized_code) { | 725 if (FLAG_cache_optimized_code) { |
723 Handle<SharedFunctionInfo> shared(function->shared()); | 726 Handle<SharedFunctionInfo> shared(function->shared()); |
724 Handle<FixedArray> literals(function->literals()); | 727 Handle<FixedArray> literals(function->literals()); |
725 Handle<Context> native_context(function->context()->native_context()); | 728 Handle<Context> native_context(function->context()->native_context()); |
(...skipping 736 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1462 existing->set_scope_info(*scope_info); | 1465 existing->set_scope_info(*scope_info); |
1463 existing->set_feedback_vector(*info.feedback_vector()); | 1466 existing->set_feedback_vector(*info.feedback_vector()); |
1464 } | 1467 } |
1465 return existing; | 1468 return existing; |
1466 } | 1469 } |
1467 | 1470 |
1468 | 1471 |
1469 MaybeHandle<Code> Compiler::GetOptimizedCode(Handle<JSFunction> function, | 1472 MaybeHandle<Code> Compiler::GetOptimizedCode(Handle<JSFunction> function, |
1470 Handle<Code> current_code, | 1473 Handle<Code> current_code, |
1471 ConcurrencyMode mode, | 1474 ConcurrencyMode mode, |
1472 BailoutId osr_ast_id) { | 1475 BailoutId osr_ast_id, |
| 1476 JavaScriptFrame* osr_frame) { |
1473 Handle<Code> cached_code; | 1477 Handle<Code> cached_code; |
1474 if (GetCodeFromOptimizedCodeMap( | 1478 if (GetCodeFromOptimizedCodeMap( |
1475 function, osr_ast_id).ToHandle(&cached_code)) { | 1479 function, osr_ast_id).ToHandle(&cached_code)) { |
1476 if (FLAG_trace_opt) { | 1480 if (FLAG_trace_opt) { |
1477 PrintF("[found optimized code for "); | 1481 PrintF("[found optimized code for "); |
1478 function->ShortPrint(); | 1482 function->ShortPrint(); |
1479 if (!osr_ast_id.IsNone()) { | 1483 if (!osr_ast_id.IsNone()) { |
1480 PrintF(" at OSR AST id %d", osr_ast_id.ToInt()); | 1484 PrintF(" at OSR AST id %d", osr_ast_id.ToInt()); |
1481 } | 1485 } |
1482 PrintF("]\n"); | 1486 PrintF("]\n"); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1520 PostponeInterruptsScope postpone(isolate); | 1524 PostponeInterruptsScope postpone(isolate); |
1521 | 1525 |
1522 info->SetOptimizing(osr_ast_id, current_code); | 1526 info->SetOptimizing(osr_ast_id, current_code); |
1523 | 1527 |
1524 if (mode == CONCURRENT) { | 1528 if (mode == CONCURRENT) { |
1525 if (GetOptimizedCodeLater(info.get())) { | 1529 if (GetOptimizedCodeLater(info.get())) { |
1526 info.Detach(); // The background recompile job owns this now. | 1530 info.Detach(); // The background recompile job owns this now. |
1527 return isolate->builtins()->InOptimizationQueue(); | 1531 return isolate->builtins()->InOptimizationQueue(); |
1528 } | 1532 } |
1529 } else { | 1533 } else { |
| 1534 info->set_osr_frame(osr_frame); |
1530 if (GetOptimizedCodeNow(info.get())) return info->code(); | 1535 if (GetOptimizedCodeNow(info.get())) return info->code(); |
1531 } | 1536 } |
1532 | 1537 |
1533 if (isolate->has_pending_exception()) isolate->clear_pending_exception(); | 1538 if (isolate->has_pending_exception()) isolate->clear_pending_exception(); |
1534 return MaybeHandle<Code>(); | 1539 return MaybeHandle<Code>(); |
1535 } | 1540 } |
1536 | 1541 |
1537 | 1542 |
1538 Handle<Code> Compiler::GetConcurrentlyOptimizedCode(OptimizedCompileJob* job) { | 1543 Handle<Code> Compiler::GetConcurrentlyOptimizedCode(OptimizedCompileJob* job) { |
1539 // Take ownership of compilation info. Deleting compilation info | 1544 // Take ownership of compilation info. Deleting compilation info |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1626 | 1631 |
1627 | 1632 |
1628 #if DEBUG | 1633 #if DEBUG |
1629 void CompilationInfo::PrintAstForTesting() { | 1634 void CompilationInfo::PrintAstForTesting() { |
1630 PrintF("--- Source from AST ---\n%s\n", | 1635 PrintF("--- Source from AST ---\n%s\n", |
1631 PrettyPrinter(isolate(), zone()).PrintProgram(function())); | 1636 PrettyPrinter(isolate(), zone()).PrintProgram(function())); |
1632 } | 1637 } |
1633 #endif | 1638 #endif |
1634 } // namespace internal | 1639 } // namespace internal |
1635 } // namespace v8 | 1640 } // namespace v8 |
OLD | NEW |