OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/compiler.h" | 5 #include "vm/compiler.h" |
6 | 6 |
7 #include "vm/assembler.h" | 7 #include "vm/assembler.h" |
8 | 8 |
9 #include "vm/ast_printer.h" | 9 #include "vm/ast_printer.h" |
10 #include "vm/block_scheduler.h" | 10 #include "vm/block_scheduler.h" |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
197 return new (zone) DartCompilationPipeline(); | 197 return new (zone) DartCompilationPipeline(); |
198 } | 198 } |
199 } | 199 } |
200 | 200 |
201 | 201 |
202 // Compile a function. Should call only if the function has not been compiled. | 202 // Compile a function. Should call only if the function has not been compiled. |
203 // Arg0: function object. | 203 // Arg0: function object. |
204 DEFINE_RUNTIME_ENTRY(CompileFunction, 1) { | 204 DEFINE_RUNTIME_ENTRY(CompileFunction, 1) { |
205 const Function& function = Function::CheckedHandle(arguments.ArgAt(0)); | 205 const Function& function = Function::CheckedHandle(arguments.ArgAt(0)); |
206 ASSERT(!function.HasCode()); | 206 ASSERT(!function.HasCode()); |
207 const Error& error = | 207 const Object& result = |
208 Error::Handle(Compiler::CompileFunction(thread, function)); | 208 Object::Handle(Compiler::CompileFunction(thread, function)); |
209 if (!error.IsNull()) { | 209 if (result.IsError()) { |
210 if (error.IsLanguageError()) { | 210 if (result.IsLanguageError()) { |
211 Exceptions::ThrowCompileTimeError(LanguageError::Cast(error)); | 211 Exceptions::ThrowCompileTimeError(LanguageError::Cast(result)); |
212 UNREACHABLE(); | 212 UNREACHABLE(); |
213 } | 213 } |
214 Exceptions::PropagateError(error); | 214 Exceptions::PropagateError(Error::Cast(result)); |
215 } | 215 } |
216 } | 216 } |
217 | 217 |
218 | 218 |
219 bool Compiler::CanOptimizeFunction(Thread* thread, const Function& function) { | 219 bool Compiler::CanOptimizeFunction(Thread* thread, const Function& function) { |
220 if (FLAG_support_debugger) { | 220 if (FLAG_support_debugger) { |
221 Isolate* isolate = thread->isolate(); | 221 Isolate* isolate = thread->isolate(); |
222 if (isolate->debugger()->IsStepping() || | 222 if (isolate->debugger()->IsStepping() || |
223 isolate->debugger()->HasBreakpoint(function, thread->zone())) { | 223 isolate->debugger()->HasBreakpoint(function, thread->zone())) { |
224 // We cannot set breakpoints and single step in optimized code, | 224 // We cannot set breakpoints and single step in optimized code, |
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
489 CompileParsedFunctionHelper(ParsedFunction* parsed_function, | 489 CompileParsedFunctionHelper(ParsedFunction* parsed_function, |
490 bool optimized, | 490 bool optimized, |
491 intptr_t osr_id) | 491 intptr_t osr_id) |
492 : parsed_function_(parsed_function), | 492 : parsed_function_(parsed_function), |
493 optimized_(optimized), | 493 optimized_(optimized), |
494 osr_id_(osr_id), | 494 osr_id_(osr_id), |
495 thread_(Thread::Current()), | 495 thread_(Thread::Current()), |
496 loading_invalidation_gen_at_start_( | 496 loading_invalidation_gen_at_start_( |
497 isolate()->loading_invalidation_gen()) {} | 497 isolate()->loading_invalidation_gen()) {} |
498 | 498 |
499 bool Compile(CompilationPipeline* pipeline); | 499 RawCode* Compile(CompilationPipeline* pipeline); |
500 | 500 |
501 private: | 501 private: |
502 ParsedFunction* parsed_function() const { return parsed_function_; } | 502 ParsedFunction* parsed_function() const { return parsed_function_; } |
503 bool optimized() const { return optimized_; } | 503 bool optimized() const { return optimized_; } |
504 intptr_t osr_id() const { return osr_id_; } | 504 intptr_t osr_id() const { return osr_id_; } |
505 Thread* thread() const { return thread_; } | 505 Thread* thread() const { return thread_; } |
506 Isolate* isolate() const { return thread_->isolate(); } | 506 Isolate* isolate() const { return thread_->isolate(); } |
507 intptr_t loading_invalidation_gen_at_start() const { | 507 intptr_t loading_invalidation_gen_at_start() const { |
508 return loading_invalidation_gen_at_start_; | 508 return loading_invalidation_gen_at_start_; |
509 } | 509 } |
510 void FinalizeCompilation(Assembler* assembler, | 510 RawCode* FinalizeCompilation(Assembler* assembler, |
511 FlowGraphCompiler* graph_compiler, | 511 FlowGraphCompiler* graph_compiler, |
512 FlowGraph* flow_graph); | 512 FlowGraph* flow_graph); |
513 void CheckIfBackgroundCompilerIsBeingStopped(); | 513 void CheckIfBackgroundCompilerIsBeingStopped(); |
514 | 514 |
515 ParsedFunction* parsed_function_; | 515 ParsedFunction* parsed_function_; |
516 const bool optimized_; | 516 const bool optimized_; |
517 const intptr_t osr_id_; | 517 const intptr_t osr_id_; |
518 Thread* const thread_; | 518 Thread* const thread_; |
519 const intptr_t loading_invalidation_gen_at_start_; | 519 const intptr_t loading_invalidation_gen_at_start_; |
520 | 520 |
521 DISALLOW_COPY_AND_ASSIGN(CompileParsedFunctionHelper); | 521 DISALLOW_COPY_AND_ASSIGN(CompileParsedFunctionHelper); |
522 }; | 522 }; |
523 | 523 |
524 | 524 |
525 void CompileParsedFunctionHelper::FinalizeCompilation( | 525 RawCode* CompileParsedFunctionHelper::FinalizeCompilation( |
526 Assembler* assembler, | 526 Assembler* assembler, |
527 FlowGraphCompiler* graph_compiler, | 527 FlowGraphCompiler* graph_compiler, |
528 FlowGraph* flow_graph) { | 528 FlowGraph* flow_graph) { |
529 ASSERT(!FLAG_precompiled_mode); | 529 ASSERT(!FLAG_precompiled_mode); |
530 const Function& function = parsed_function()->function(); | 530 const Function& function = parsed_function()->function(); |
531 Zone* const zone = thread()->zone(); | 531 Zone* const zone = thread()->zone(); |
532 | 532 |
533 CSTAT_TIMER_SCOPE(thread(), codefinalizer_timer); | 533 CSTAT_TIMER_SCOPE(thread(), codefinalizer_timer); |
534 // CreateDeoptInfo uses the object pool and needs to be done before | 534 // CreateDeoptInfo uses the object pool and needs to be done before |
535 // FinalizeCode. | 535 // FinalizeCode. |
536 const Array& deopt_info_array = | 536 const Array& deopt_info_array = |
537 Array::Handle(zone, graph_compiler->CreateDeoptInfo(assembler)); | 537 Array::Handle(zone, graph_compiler->CreateDeoptInfo(assembler)); |
538 INC_STAT(thread(), total_code_size, | 538 INC_STAT(thread(), total_code_size, |
539 deopt_info_array.Length() * sizeof(uword)); | 539 deopt_info_array.Length() * sizeof(uword)); |
540 // Allocates instruction object. Since this occurs only at safepoint, | 540 // Allocates instruction object. Since this occurs only at safepoint, |
541 // there can be no concurrent access to the instruction page. | 541 // there can be no concurrent access to the instruction page. |
542 const Code& code = | 542 Code& code = |
543 Code::Handle(Code::FinalizeCode(function, assembler, optimized())); | 543 Code::Handle(Code::FinalizeCode(function, assembler, optimized())); |
544 code.set_is_optimized(optimized()); | 544 code.set_is_optimized(optimized()); |
545 code.set_owner(function); | 545 code.set_owner(function); |
546 #if !defined(PRODUCT) | 546 #if !defined(PRODUCT) |
547 if (FLAG_support_debugger) { | 547 if (FLAG_support_debugger) { |
548 ZoneGrowableArray<TokenPosition>* await_token_positions = | 548 ZoneGrowableArray<TokenPosition>* await_token_positions = |
549 flow_graph->await_token_positions(); | 549 flow_graph->await_token_positions(); |
550 if (await_token_positions != NULL) { | 550 if (await_token_positions != NULL) { |
551 Smi& token_pos_value = Smi::Handle(zone); | 551 Smi& token_pos_value = Smi::Handle(zone); |
552 if (await_token_positions->length() > 0) { | 552 if (await_token_positions->length() > 0) { |
(...skipping 28 matching lines...) Expand all Loading... |
581 code.set_deopt_info_array(deopt_info_array); | 581 code.set_deopt_info_array(deopt_info_array); |
582 | 582 |
583 graph_compiler->FinalizeStackMaps(code); | 583 graph_compiler->FinalizeStackMaps(code); |
584 graph_compiler->FinalizeVarDescriptors(code); | 584 graph_compiler->FinalizeVarDescriptors(code); |
585 graph_compiler->FinalizeExceptionHandlers(code); | 585 graph_compiler->FinalizeExceptionHandlers(code); |
586 graph_compiler->FinalizeCatchEntryStateMap(code); | 586 graph_compiler->FinalizeCatchEntryStateMap(code); |
587 graph_compiler->FinalizeStaticCallTargetsTable(code); | 587 graph_compiler->FinalizeStaticCallTargetsTable(code); |
588 graph_compiler->FinalizeCodeSourceMap(code); | 588 graph_compiler->FinalizeCodeSourceMap(code); |
589 | 589 |
590 if (optimized()) { | 590 if (optimized()) { |
591 bool code_was_installed = false; | |
592 // Installs code while at safepoint. | 591 // Installs code while at safepoint. |
593 if (thread()->IsMutatorThread()) { | 592 if (thread()->IsMutatorThread()) { |
594 const bool is_osr = osr_id() != Compiler::kNoOSRDeoptId; | 593 const bool is_osr = osr_id() != Compiler::kNoOSRDeoptId; |
595 function.InstallOptimizedCode(code, is_osr); | 594 if (!is_osr) { |
596 code_was_installed = true; | 595 function.InstallOptimizedCode(code); |
| 596 } |
| 597 ASSERT(code.owner() == function.raw()); |
597 } else { | 598 } else { |
598 // Background compilation. | 599 // Background compilation. |
599 // Before installing code check generation counts if the code may | 600 // Before installing code check generation counts if the code may |
600 // have become invalid. | 601 // have become invalid. |
601 const bool trace_compiler = | 602 const bool trace_compiler = |
602 FLAG_trace_compiler || FLAG_trace_optimizing_compiler; | 603 FLAG_trace_compiler || FLAG_trace_optimizing_compiler; |
603 bool code_is_valid = true; | 604 bool code_is_valid = true; |
604 if (!flow_graph->parsed_function().guarded_fields()->is_empty()) { | 605 if (!flow_graph->parsed_function().guarded_fields()->is_empty()) { |
605 const ZoneGrowableArray<const Field*>& guarded_fields = | 606 const ZoneGrowableArray<const Field*>& guarded_fields = |
606 *flow_graph->parsed_function().guarded_fields(); | 607 *flow_graph->parsed_function().guarded_fields(); |
(...skipping 23 matching lines...) Expand all Loading... |
630 code_is_valid = false; | 631 code_is_valid = false; |
631 if (trace_compiler) { | 632 if (trace_compiler) { |
632 THR_Print("--> FAIL: Class hierarchy has new subclasses."); | 633 THR_Print("--> FAIL: Class hierarchy has new subclasses."); |
633 } | 634 } |
634 } | 635 } |
635 | 636 |
636 // Setting breakpoints at runtime could make a function non-optimizable. | 637 // Setting breakpoints at runtime could make a function non-optimizable. |
637 if (code_is_valid && Compiler::CanOptimizeFunction(thread(), function)) { | 638 if (code_is_valid && Compiler::CanOptimizeFunction(thread(), function)) { |
638 const bool is_osr = osr_id() != Compiler::kNoOSRDeoptId; | 639 const bool is_osr = osr_id() != Compiler::kNoOSRDeoptId; |
639 ASSERT(!is_osr); // OSR is not compiled in background. | 640 ASSERT(!is_osr); // OSR is not compiled in background. |
640 function.InstallOptimizedCode(code, is_osr); | 641 function.InstallOptimizedCode(code); |
641 code_was_installed = true; | 642 } else { |
| 643 code = Code::null(); |
642 } | 644 } |
643 if (function.usage_counter() < 0) { | 645 if (function.usage_counter() < 0) { |
644 // Reset to 0 so that it can be recompiled if needed. | 646 // Reset to 0 so that it can be recompiled if needed. |
645 if (code_is_valid) { | 647 if (code_is_valid) { |
646 function.set_usage_counter(0); | 648 function.set_usage_counter(0); |
647 } else { | 649 } else { |
648 // Trigger another optimization pass soon. | 650 // Trigger another optimization pass soon. |
649 function.set_usage_counter(FLAG_optimization_counter_threshold - 100); | 651 function.set_usage_counter(FLAG_optimization_counter_threshold - 100); |
650 } | 652 } |
651 } | 653 } |
652 } | 654 } |
653 | 655 |
654 if (code_was_installed) { | 656 if (!code.IsNull()) { |
655 // The generated code was compiled under certain assumptions about | 657 // The generated code was compiled under certain assumptions about |
656 // class hierarchy and field types. Register these dependencies | 658 // class hierarchy and field types. Register these dependencies |
657 // to ensure that the code will be deoptimized if they are violated. | 659 // to ensure that the code will be deoptimized if they are violated. |
658 thread()->cha()->RegisterDependencies(code); | 660 thread()->cha()->RegisterDependencies(code); |
659 | 661 |
660 const ZoneGrowableArray<const Field*>& guarded_fields = | 662 const ZoneGrowableArray<const Field*>& guarded_fields = |
661 *flow_graph->parsed_function().guarded_fields(); | 663 *flow_graph->parsed_function().guarded_fields(); |
662 Field& field = Field::Handle(); | 664 Field& field = Field::Handle(); |
663 for (intptr_t i = 0; i < guarded_fields.length(); i++) { | 665 for (intptr_t i = 0; i < guarded_fields.length(); i++) { |
664 field = guarded_fields[i]->Original(); | 666 field = guarded_fields[i]->Original(); |
(...skipping 10 matching lines...) Expand all Loading... |
675 function.AttachCode(code); | 677 function.AttachCode(code); |
676 } | 678 } |
677 if (parsed_function()->HasDeferredPrefixes()) { | 679 if (parsed_function()->HasDeferredPrefixes()) { |
678 ASSERT(!FLAG_load_deferred_eagerly); | 680 ASSERT(!FLAG_load_deferred_eagerly); |
679 ZoneGrowableArray<const LibraryPrefix*>* prefixes = | 681 ZoneGrowableArray<const LibraryPrefix*>* prefixes = |
680 parsed_function()->deferred_prefixes(); | 682 parsed_function()->deferred_prefixes(); |
681 for (intptr_t i = 0; i < prefixes->length(); i++) { | 683 for (intptr_t i = 0; i < prefixes->length(); i++) { |
682 (*prefixes)[i]->RegisterDependentCode(code); | 684 (*prefixes)[i]->RegisterDependentCode(code); |
683 } | 685 } |
684 } | 686 } |
| 687 return code.raw(); |
685 } | 688 } |
686 | 689 |
687 | 690 |
688 void CompileParsedFunctionHelper::CheckIfBackgroundCompilerIsBeingStopped() { | 691 void CompileParsedFunctionHelper::CheckIfBackgroundCompilerIsBeingStopped() { |
689 ASSERT(Compiler::IsBackgroundCompilation()); | 692 ASSERT(Compiler::IsBackgroundCompilation()); |
690 if (!isolate()->background_compiler()->is_running()) { | 693 if (!isolate()->background_compiler()->is_running()) { |
691 // The background compiler is being stopped. | 694 // The background compiler is being stopped. |
692 Compiler::AbortBackgroundCompilation( | 695 Compiler::AbortBackgroundCompilation( |
693 Thread::kNoDeoptId, "Background compilation is being stopped"); | 696 Thread::kNoDeoptId, "Background compilation is being stopped"); |
694 } | 697 } |
695 } | 698 } |
696 | 699 |
697 | 700 |
698 // Return false if bailed out. | 701 // Return null if bailed out. |
699 // If optimized_result_code is not NULL then it is caller's responsibility | 702 // If optimized_result_code is not NULL then it is caller's responsibility |
700 // to install code. | 703 // to install code. |
701 bool CompileParsedFunctionHelper::Compile(CompilationPipeline* pipeline) { | 704 RawCode* CompileParsedFunctionHelper::Compile(CompilationPipeline* pipeline) { |
702 ASSERT(!FLAG_precompiled_mode); | 705 ASSERT(!FLAG_precompiled_mode); |
703 const Function& function = parsed_function()->function(); | 706 const Function& function = parsed_function()->function(); |
704 if (optimized() && !function.IsOptimizable()) { | 707 if (optimized() && !function.IsOptimizable()) { |
705 return false; | 708 return Code::null(); |
706 } | 709 } |
707 bool is_compiled = false; | |
708 Zone* const zone = thread()->zone(); | 710 Zone* const zone = thread()->zone(); |
709 NOT_IN_PRODUCT(TimelineStream* compiler_timeline = | 711 NOT_IN_PRODUCT(TimelineStream* compiler_timeline = |
710 Timeline::GetCompilerStream()); | 712 Timeline::GetCompilerStream()); |
711 CSTAT_TIMER_SCOPE(thread(), codegen_timer); | 713 CSTAT_TIMER_SCOPE(thread(), codegen_timer); |
712 HANDLESCOPE(thread()); | 714 HANDLESCOPE(thread()); |
713 | 715 |
714 // We may reattempt compilation if the function needs to be assembled using | 716 // We may reattempt compilation if the function needs to be assembled using |
715 // far branches on ARM and MIPS. In the else branch of the setjmp call, | 717 // far branches on ARM and MIPS. In the else branch of the setjmp call, |
716 // done is set to false, and use_far_branches is set to true if there is a | 718 // done is set to false, and use_far_branches is set to true if there is a |
717 // longjmp from the ARM or MIPS assemblers. In all other paths through this | 719 // longjmp from the ARM or MIPS assemblers. In all other paths through this |
718 // while loop, done is set to true. use_far_branches is always false on ia32 | 720 // while loop, done is set to true. use_far_branches is always false on ia32 |
719 // and x64. | 721 // and x64. |
720 volatile bool done = false; | 722 volatile bool done = false; |
721 // volatile because the variable may be clobbered by a longjmp. | 723 // volatile because the variable may be clobbered by a longjmp. |
722 volatile bool use_far_branches = false; | 724 volatile bool use_far_branches = false; |
723 const bool use_speculative_inlining = false; | 725 const bool use_speculative_inlining = false; |
724 | 726 |
| 727 Code* volatile result = &Code::ZoneHandle(zone); |
725 while (!done) { | 728 while (!done) { |
| 729 *result = Code::null(); |
726 const intptr_t prev_deopt_id = thread()->deopt_id(); | 730 const intptr_t prev_deopt_id = thread()->deopt_id(); |
727 thread()->set_deopt_id(0); | 731 thread()->set_deopt_id(0); |
728 LongJumpScope jump; | 732 LongJumpScope jump; |
729 const intptr_t val = setjmp(*jump.Set()); | 733 if (setjmp(*jump.Set()) == 0) { |
730 if (val == 0) { | |
731 FlowGraph* flow_graph = NULL; | 734 FlowGraph* flow_graph = NULL; |
732 | 735 |
733 // Class hierarchy analysis is registered with the thread in the | 736 // Class hierarchy analysis is registered with the thread in the |
734 // constructor and unregisters itself upon destruction. | 737 // constructor and unregisters itself upon destruction. |
735 CHA cha(thread()); | 738 CHA cha(thread()); |
736 | 739 |
737 // TimerScope needs an isolate to be properly terminated in case of a | 740 // TimerScope needs an isolate to be properly terminated in case of a |
738 // LongJump. | 741 // LongJump. |
739 { | 742 { |
740 CSTAT_TIMER_SCOPE(thread(), graphbuilder_timer); | 743 CSTAT_TIMER_SCOPE(thread(), graphbuilder_timer); |
(...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1128 CSTAT_TIMER_SCOPE(thread(), graphcompiler_timer); | 1131 CSTAT_TIMER_SCOPE(thread(), graphcompiler_timer); |
1129 NOT_IN_PRODUCT(TimelineDurationScope tds(thread(), compiler_timeline, | 1132 NOT_IN_PRODUCT(TimelineDurationScope tds(thread(), compiler_timeline, |
1130 "CompileGraph")); | 1133 "CompileGraph")); |
1131 graph_compiler.CompileGraph(); | 1134 graph_compiler.CompileGraph(); |
1132 pipeline->FinalizeCompilation(flow_graph); | 1135 pipeline->FinalizeCompilation(flow_graph); |
1133 } | 1136 } |
1134 { | 1137 { |
1135 NOT_IN_PRODUCT(TimelineDurationScope tds(thread(), compiler_timeline, | 1138 NOT_IN_PRODUCT(TimelineDurationScope tds(thread(), compiler_timeline, |
1136 "FinalizeCompilation")); | 1139 "FinalizeCompilation")); |
1137 if (thread()->IsMutatorThread()) { | 1140 if (thread()->IsMutatorThread()) { |
1138 FinalizeCompilation(&assembler, &graph_compiler, flow_graph); | 1141 *result = |
| 1142 FinalizeCompilation(&assembler, &graph_compiler, flow_graph); |
1139 } else { | 1143 } else { |
1140 // This part of compilation must be at a safepoint. | 1144 // This part of compilation must be at a safepoint. |
1141 // Stop mutator thread before creating the instruction object and | 1145 // Stop mutator thread before creating the instruction object and |
1142 // installing code. | 1146 // installing code. |
1143 // Mutator thread may not run code while we are creating the | 1147 // Mutator thread may not run code while we are creating the |
1144 // instruction object, since the creation of instruction object | 1148 // instruction object, since the creation of instruction object |
1145 // changes code page access permissions (makes them temporary not | 1149 // changes code page access permissions (makes them temporary not |
1146 // executable). | 1150 // executable). |
1147 { | 1151 { |
1148 CheckIfBackgroundCompilerIsBeingStopped(); | 1152 CheckIfBackgroundCompilerIsBeingStopped(); |
1149 SafepointOperationScope safepoint_scope(thread()); | 1153 SafepointOperationScope safepoint_scope(thread()); |
1150 // Do not Garbage collect during this stage and instead allow the | 1154 // Do not Garbage collect during this stage and instead allow the |
1151 // heap to grow. | 1155 // heap to grow. |
1152 NoHeapGrowthControlScope no_growth_control; | 1156 NoHeapGrowthControlScope no_growth_control; |
1153 CheckIfBackgroundCompilerIsBeingStopped(); | 1157 CheckIfBackgroundCompilerIsBeingStopped(); |
1154 FinalizeCompilation(&assembler, &graph_compiler, flow_graph); | 1158 *result = |
| 1159 FinalizeCompilation(&assembler, &graph_compiler, flow_graph); |
1155 } | 1160 } |
1156 // TODO(srdjan): Enable this and remove the one from | 1161 // TODO(srdjan): Enable this and remove the one from |
1157 // 'BackgroundCompiler::CompileOptimized' once cause of time-outs | 1162 // 'BackgroundCompiler::CompileOptimized' once cause of time-outs |
1158 // is resolved. | 1163 // is resolved. |
1159 // if (isolate()->heap()->NeedsGarbageCollection()) { | 1164 // if (isolate()->heap()->NeedsGarbageCollection()) { |
1160 // isolate()->heap()->CollectAllGarbage(); | 1165 // isolate()->heap()->CollectAllGarbage(); |
1161 // } | 1166 // } |
1162 } | 1167 } |
1163 } | 1168 } |
1164 // Exit the loop and the function with the correct result value. | 1169 // Exit the loop and the function with the correct result value. |
1165 is_compiled = true; | |
1166 done = true; | 1170 done = true; |
1167 } else { | 1171 } else { |
1168 // We bailed out or we encountered an error. | 1172 // We bailed out or we encountered an error. |
1169 const Error& error = Error::Handle(thread()->sticky_error()); | 1173 const Error& error = Error::Handle(thread()->sticky_error()); |
1170 | 1174 |
1171 if (error.raw() == Object::branch_offset_error().raw()) { | 1175 if (error.raw() == Object::branch_offset_error().raw()) { |
1172 // Compilation failed due to an out of range branch offset in the | 1176 // Compilation failed due to an out of range branch offset in the |
1173 // assembler. We try again (done = false) with far branches enabled. | 1177 // assembler. We try again (done = false) with far branches enabled. |
1174 done = false; | 1178 done = false; |
1175 ASSERT(!use_far_branches); | 1179 ASSERT(!use_far_branches); |
1176 use_far_branches = true; | 1180 use_far_branches = true; |
1177 } else if (error.raw() == Object::speculative_inlining_error().raw()) { | 1181 } else if (error.raw() == Object::speculative_inlining_error().raw()) { |
1178 // Can only happen with precompilation. | 1182 // Can only happen with precompilation. |
1179 UNREACHABLE(); | 1183 UNREACHABLE(); |
1180 } else { | 1184 } else { |
1181 // If the error isn't due to an out of range branch offset, we don't | 1185 // If the error isn't due to an out of range branch offset, we don't |
1182 // try again (done = true), and indicate that we did not finish | 1186 // try again (done = true). |
1183 // compiling (is_compiled = false). | |
1184 if (FLAG_trace_bailout) { | 1187 if (FLAG_trace_bailout) { |
1185 THR_Print("%s\n", error.ToErrorCString()); | 1188 THR_Print("%s\n", error.ToErrorCString()); |
1186 } | 1189 } |
1187 done = true; | 1190 done = true; |
1188 } | 1191 } |
1189 | 1192 |
1190 // If is is not a background compilation, clear the error if it was not a | 1193 // If is is not a background compilation, clear the error if it was not a |
1191 // real error, but just a bailout. If we're it a background compilation | 1194 // real error, but just a bailout. If we're it a background compilation |
1192 // this will be dealt with in the caller. | 1195 // this will be dealt with in the caller. |
1193 if (!Compiler::IsBackgroundCompilation() && error.IsLanguageError() && | 1196 if (!Compiler::IsBackgroundCompilation() && error.IsLanguageError() && |
1194 (LanguageError::Cast(error).kind() == Report::kBailout)) { | 1197 (LanguageError::Cast(error).kind() == Report::kBailout)) { |
1195 thread()->clear_sticky_error(); | 1198 thread()->clear_sticky_error(); |
1196 } | 1199 } |
1197 is_compiled = false; | |
1198 } | 1200 } |
1199 // Reset global isolate state. | 1201 // Reset global isolate state. |
1200 thread()->set_deopt_id(prev_deopt_id); | 1202 thread()->set_deopt_id(prev_deopt_id); |
1201 } | 1203 } |
1202 return is_compiled; | 1204 return result->raw(); |
1203 } | 1205 } |
1204 | 1206 |
1205 | 1207 |
1206 static RawError* CompileFunctionHelper(CompilationPipeline* pipeline, | 1208 static RawObject* CompileFunctionHelper(CompilationPipeline* pipeline, |
1207 const Function& function, | 1209 const Function& function, |
1208 bool optimized, | 1210 bool optimized, |
1209 intptr_t osr_id) { | 1211 intptr_t osr_id) { |
1210 ASSERT(!FLAG_precompiled_mode); | 1212 ASSERT(!FLAG_precompiled_mode); |
1211 ASSERT(!optimized || function.was_compiled()); | 1213 ASSERT(!optimized || function.was_compiled()); |
1212 LongJumpScope jump; | 1214 LongJumpScope jump; |
1213 if (setjmp(*jump.Set()) == 0) { | 1215 if (setjmp(*jump.Set()) == 0) { |
1214 Thread* const thread = Thread::Current(); | 1216 Thread* const thread = Thread::Current(); |
1215 Isolate* const isolate = thread->isolate(); | 1217 Isolate* const isolate = thread->isolate(); |
1216 StackZone stack_zone(thread); | 1218 StackZone stack_zone(thread); |
1217 Zone* const zone = stack_zone.GetZone(); | 1219 Zone* const zone = stack_zone.GetZone(); |
1218 const bool trace_compiler = | 1220 const bool trace_compiler = |
1219 FLAG_trace_compiler || (FLAG_trace_optimizing_compiler && optimized); | 1221 FLAG_trace_compiler || (FLAG_trace_optimizing_compiler && optimized); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1255 (loading_invalidation_gen_at_start != | 1257 (loading_invalidation_gen_at_start != |
1256 isolate->loading_invalidation_gen())) { | 1258 isolate->loading_invalidation_gen())) { |
1257 // Loading occured while parsing. We need to abort here because state | 1259 // Loading occured while parsing. We need to abort here because state |
1258 // changed while compiling. | 1260 // changed while compiling. |
1259 Compiler::AbortBackgroundCompilation( | 1261 Compiler::AbortBackgroundCompilation( |
1260 Thread::kNoDeoptId, | 1262 Thread::kNoDeoptId, |
1261 "Invalidated state during parsing because of script loading"); | 1263 "Invalidated state during parsing because of script loading"); |
1262 } | 1264 } |
1263 } | 1265 } |
1264 | 1266 |
1265 const bool success = helper.Compile(pipeline); | 1267 const Code& result = Code::Handle(helper.Compile(pipeline)); |
1266 if (success) { | 1268 if (!result.IsNull()) { |
1267 if (!optimized) { | 1269 if (!optimized) { |
1268 function.set_was_compiled(true); | 1270 function.set_was_compiled(true); |
1269 } | 1271 } |
1270 } else { | 1272 } else { |
1271 if (optimized) { | 1273 if (optimized) { |
1272 if (Compiler::IsBackgroundCompilation()) { | 1274 if (Compiler::IsBackgroundCompilation()) { |
1273 // Try again later, background compilation may abort because of | 1275 // Try again later, background compilation may abort because of |
1274 // state change during compilation. | 1276 // state change during compilation. |
1275 if (FLAG_trace_compiler) { | 1277 if (FLAG_trace_compiler) { |
1276 THR_Print("Aborted background compilation: %s\n", | 1278 THR_Print("Aborted background compilation: %s\n", |
(...skipping 21 matching lines...) Expand all Loading... |
1298 if (trace_compiler) { | 1300 if (trace_compiler) { |
1299 THR_Print("--> disabling optimizations for '%s'\n", | 1301 THR_Print("--> disabling optimizations for '%s'\n", |
1300 function.ToFullyQualifiedCString()); | 1302 function.ToFullyQualifiedCString()); |
1301 } else if (FLAG_trace_failed_optimization_attempts) { | 1303 } else if (FLAG_trace_failed_optimization_attempts) { |
1302 THR_Print("Cannot optimize: %s\n", | 1304 THR_Print("Cannot optimize: %s\n", |
1303 function.ToFullyQualifiedCString()); | 1305 function.ToFullyQualifiedCString()); |
1304 } | 1306 } |
1305 function.SetIsOptimizable(false); | 1307 function.SetIsOptimizable(false); |
1306 return Error::null(); | 1308 return Error::null(); |
1307 } else { | 1309 } else { |
| 1310 ASSERT(!optimized); |
1308 // Encountered error. | 1311 // Encountered error. |
1309 Error& error = Error::Handle(); | 1312 Error& error = Error::Handle(); |
1310 // We got an error during compilation. | 1313 // We got an error during compilation. |
1311 error = thread->sticky_error(); | 1314 error = thread->sticky_error(); |
1312 thread->clear_sticky_error(); | 1315 thread->clear_sticky_error(); |
1313 // The non-optimizing compiler can get an unhandled exception | 1316 // The non-optimizing compiler can get an unhandled exception |
1314 // due to OOM or Stack overflow errors, it should not however | 1317 // due to OOM or Stack overflow errors, it should not however |
1315 // bail out. | 1318 // bail out. |
1316 ASSERT(error.IsUnhandledException() || | 1319 ASSERT(error.IsUnhandledException() || |
1317 (error.IsLanguageError() && | 1320 (error.IsLanguageError() && |
1318 LanguageError::Cast(error).kind() != Report::kBailout)); | 1321 LanguageError::Cast(error).kind() != Report::kBailout)); |
1319 return error.raw(); | 1322 return error.raw(); |
1320 } | 1323 } |
| 1324 UNREACHABLE(); |
1321 } | 1325 } |
1322 | 1326 |
1323 per_compile_timer.Stop(); | 1327 per_compile_timer.Stop(); |
1324 | 1328 |
1325 if (trace_compiler && success) { | 1329 if (trace_compiler) { |
1326 THR_Print("--> '%s' entry: %#" Px " size: %" Pd " time: %" Pd64 " us\n", | 1330 THR_Print("--> '%s' entry: %#" Px " size: %" Pd " time: %" Pd64 " us\n", |
1327 function.ToFullyQualifiedCString(), | 1331 function.ToFullyQualifiedCString(), |
1328 Code::Handle(function.CurrentCode()).PayloadStart(), | 1332 Code::Handle(function.CurrentCode()).PayloadStart(), |
1329 Code::Handle(function.CurrentCode()).Size(), | 1333 Code::Handle(function.CurrentCode()).Size(), |
1330 per_compile_timer.TotalElapsedTime()); | 1334 per_compile_timer.TotalElapsedTime()); |
1331 } | 1335 } |
1332 | 1336 |
1333 if (FLAG_support_debugger) { | 1337 if (FLAG_support_debugger) { |
1334 isolate->debugger()->NotifyCompilation(function); | 1338 isolate->debugger()->NotifyCompilation(function); |
1335 } | 1339 } |
1336 | 1340 |
1337 if (FLAG_disassemble && FlowGraphPrinter::ShouldPrint(function)) { | 1341 if (FLAG_disassemble && FlowGraphPrinter::ShouldPrint(function)) { |
1338 Disassembler::DisassembleCode(function, optimized); | 1342 Disassembler::DisassembleCode(function, optimized); |
1339 } else if (FLAG_disassemble_optimized && optimized && | 1343 } else if (FLAG_disassemble_optimized && optimized && |
1340 FlowGraphPrinter::ShouldPrint(function)) { | 1344 FlowGraphPrinter::ShouldPrint(function)) { |
1341 Disassembler::DisassembleCode(function, true); | 1345 Disassembler::DisassembleCode(function, true); |
1342 } | 1346 } |
1343 | 1347 |
1344 return Error::null(); | 1348 return result.raw(); |
1345 } else { | 1349 } else { |
1346 Thread* const thread = Thread::Current(); | 1350 Thread* const thread = Thread::Current(); |
1347 StackZone stack_zone(thread); | 1351 StackZone stack_zone(thread); |
1348 Error& error = Error::Handle(); | 1352 Error& error = Error::Handle(); |
1349 // We got an error during compilation or it is a bailout from background | 1353 // We got an error during compilation or it is a bailout from background |
1350 // compilation (e.g., during parsing with EnsureIsFinalized). | 1354 // compilation (e.g., during parsing with EnsureIsFinalized). |
1351 error = thread->sticky_error(); | 1355 error = thread->sticky_error(); |
1352 thread->clear_sticky_error(); | 1356 thread->clear_sticky_error(); |
1353 if (error.raw() == Object::background_compilation_error().raw()) { | 1357 if (error.raw() == Object::background_compilation_error().raw()) { |
1354 // Exit compilation, retry it later. | 1358 // Exit compilation, retry it later. |
1355 if (FLAG_trace_bailout) { | 1359 if (FLAG_trace_bailout) { |
1356 THR_Print("Aborted background compilation: %s\n", | 1360 THR_Print("Aborted background compilation: %s\n", |
1357 function.ToFullyQualifiedCString()); | 1361 function.ToFullyQualifiedCString()); |
1358 } | 1362 } |
1359 return Error::null(); | 1363 return Object::null(); |
1360 } | 1364 } |
1361 // Do not attempt to optimize functions that can cause errors. | 1365 // Do not attempt to optimize functions that can cause errors. |
1362 function.set_is_optimizable(false); | 1366 function.set_is_optimizable(false); |
1363 return error.raw(); | 1367 return error.raw(); |
1364 } | 1368 } |
1365 UNREACHABLE(); | 1369 UNREACHABLE(); |
1366 return Error::null(); | 1370 return Object::null(); |
1367 } | 1371 } |
1368 | 1372 |
1369 | 1373 |
1370 static RawError* ParseFunctionHelper(CompilationPipeline* pipeline, | 1374 static RawError* ParseFunctionHelper(CompilationPipeline* pipeline, |
1371 const Function& function, | 1375 const Function& function, |
1372 bool optimized, | 1376 bool optimized, |
1373 intptr_t osr_id) { | 1377 intptr_t osr_id) { |
1374 ASSERT(!FLAG_precompiled_mode); | 1378 ASSERT(!FLAG_precompiled_mode); |
1375 ASSERT(!optimized || function.was_compiled()); | 1379 ASSERT(!optimized || function.was_compiled()); |
1376 LongJumpScope jump; | 1380 LongJumpScope jump; |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1417 // Unoptimized compilation or precompilation may encounter compile-time | 1421 // Unoptimized compilation or precompilation may encounter compile-time |
1418 // errors, but regular optimized compilation should not. | 1422 // errors, but regular optimized compilation should not. |
1419 ASSERT(!optimized); | 1423 ASSERT(!optimized); |
1420 return error.raw(); | 1424 return error.raw(); |
1421 } | 1425 } |
1422 UNREACHABLE(); | 1426 UNREACHABLE(); |
1423 return Error::null(); | 1427 return Error::null(); |
1424 } | 1428 } |
1425 | 1429 |
1426 | 1430 |
1427 RawError* Compiler::CompileFunction(Thread* thread, const Function& function) { | 1431 RawObject* Compiler::CompileFunction(Thread* thread, const Function& function) { |
1428 #ifdef DART_PRECOMPILER | 1432 #ifdef DART_PRECOMPILER |
1429 if (FLAG_precompiled_mode) { | 1433 if (FLAG_precompiled_mode) { |
1430 return Precompiler::CompileFunction( | 1434 return Precompiler::CompileFunction( |
1431 /* precompiler = */ NULL, thread, thread->zone(), function); | 1435 /* precompiler = */ NULL, thread, thread->zone(), function); |
1432 } | 1436 } |
1433 #endif | 1437 #endif |
1434 | 1438 |
1435 Isolate* isolate = thread->isolate(); | 1439 Isolate* isolate = thread->isolate(); |
1436 | 1440 |
1437 #if !defined(PRODUCT) | 1441 #if !defined(PRODUCT) |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1480 const Function& function) { | 1484 const Function& function) { |
1481 if (function.unoptimized_code() != Object::null()) { | 1485 if (function.unoptimized_code() != Object::null()) { |
1482 return Error::null(); | 1486 return Error::null(); |
1483 } | 1487 } |
1484 Code& original_code = Code::ZoneHandle(thread->zone()); | 1488 Code& original_code = Code::ZoneHandle(thread->zone()); |
1485 if (function.HasCode()) { | 1489 if (function.HasCode()) { |
1486 original_code = function.CurrentCode(); | 1490 original_code = function.CurrentCode(); |
1487 } | 1491 } |
1488 CompilationPipeline* pipeline = | 1492 CompilationPipeline* pipeline = |
1489 CompilationPipeline::New(thread->zone(), function); | 1493 CompilationPipeline::New(thread->zone(), function); |
1490 const Error& error = Error::Handle( | 1494 const Object& result = Object::Handle( |
1491 CompileFunctionHelper(pipeline, function, false, /* not optimized */ | 1495 CompileFunctionHelper(pipeline, function, false, /* not optimized */ |
1492 kNoOSRDeoptId)); | 1496 kNoOSRDeoptId)); |
1493 if (!error.IsNull()) { | 1497 if (result.IsError()) { |
1494 return error.raw(); | 1498 return Error::Cast(result).raw(); |
1495 } | 1499 } |
1496 // Since CompileFunctionHelper replaces the current code, re-attach the | 1500 // Since CompileFunctionHelper replaces the current code, re-attach the |
1497 // the original code if the function was already compiled. | 1501 // the original code if the function was already compiled. |
1498 if (!original_code.IsNull() && | 1502 if (!original_code.IsNull() && result.raw() == function.CurrentCode() && |
1499 (original_code.raw() != function.CurrentCode())) { | 1503 !original_code.IsDisabled()) { |
1500 function.AttachCode(original_code); | 1504 function.AttachCode(original_code); |
1501 } | 1505 } |
1502 ASSERT(function.unoptimized_code() != Object::null()); | 1506 ASSERT(function.unoptimized_code() != Object::null()); |
| 1507 ASSERT(function.unoptimized_code() == result.raw()); |
1503 if (FLAG_trace_compiler) { | 1508 if (FLAG_trace_compiler) { |
1504 THR_Print("Ensure unoptimized code for %s\n", function.ToCString()); | 1509 THR_Print("Ensure unoptimized code for %s\n", function.ToCString()); |
1505 } | 1510 } |
1506 return Error::null(); | 1511 return Error::null(); |
1507 } | 1512 } |
1508 | 1513 |
1509 | 1514 |
1510 RawError* Compiler::CompileOptimizedFunction(Thread* thread, | 1515 RawObject* Compiler::CompileOptimizedFunction(Thread* thread, |
1511 const Function& function, | 1516 const Function& function, |
1512 intptr_t osr_id) { | 1517 intptr_t osr_id) { |
1513 #if !defined(PRODUCT) | 1518 #if !defined(PRODUCT) |
1514 VMTagScope tagScope(thread, VMTag::kCompileOptimizedTagId); | 1519 VMTagScope tagScope(thread, VMTag::kCompileOptimizedTagId); |
1515 const char* event_name; | 1520 const char* event_name; |
1516 if (osr_id != kNoOSRDeoptId) { | 1521 if (osr_id != kNoOSRDeoptId) { |
1517 event_name = "CompileFunctionOptimizedOSR"; | 1522 event_name = "CompileFunctionOptimizedOSR"; |
1518 } else if (IsBackgroundCompilation()) { | 1523 } else if (IsBackgroundCompilation()) { |
1519 event_name = "CompileFunctionOptimizedBackground"; | 1524 event_name = "CompileFunctionOptimizedBackground"; |
1520 } else { | 1525 } else { |
1521 event_name = "CompileFunctionOptimized"; | 1526 event_name = "CompileFunctionOptimized"; |
1522 } | 1527 } |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1585 } else { | 1590 } else { |
1586 // Only possible with background compilation. | 1591 // Only possible with background compilation. |
1587 ASSERT(Compiler::IsBackgroundCompilation()); | 1592 ASSERT(Compiler::IsBackgroundCompilation()); |
1588 } | 1593 } |
1589 } | 1594 } |
1590 | 1595 |
1591 | 1596 |
1592 RawError* Compiler::CompileAllFunctions(const Class& cls) { | 1597 RawError* Compiler::CompileAllFunctions(const Class& cls) { |
1593 Thread* thread = Thread::Current(); | 1598 Thread* thread = Thread::Current(); |
1594 Zone* zone = thread->zone(); | 1599 Zone* zone = thread->zone(); |
1595 Error& error = Error::Handle(zone); | 1600 Object& result = Object::Handle(zone); |
1596 Array& functions = Array::Handle(zone, cls.functions()); | 1601 Array& functions = Array::Handle(zone, cls.functions()); |
1597 Function& func = Function::Handle(zone); | 1602 Function& func = Function::Handle(zone); |
1598 // Class dynamic lives in the vm isolate. Its array fields cannot be set to | 1603 // Class dynamic lives in the vm isolate. Its array fields cannot be set to |
1599 // an empty array. | 1604 // an empty array. |
1600 if (functions.IsNull()) { | 1605 if (functions.IsNull()) { |
1601 ASSERT(cls.IsDynamicClass()); | 1606 ASSERT(cls.IsDynamicClass()); |
1602 return error.raw(); | 1607 return Error::null(); |
1603 } | 1608 } |
1604 // Compile all the regular functions. | 1609 // Compile all the regular functions. |
1605 for (int i = 0; i < functions.Length(); i++) { | 1610 for (int i = 0; i < functions.Length(); i++) { |
1606 func ^= functions.At(i); | 1611 func ^= functions.At(i); |
1607 ASSERT(!func.IsNull()); | 1612 ASSERT(!func.IsNull()); |
1608 if (!func.HasCode() && !func.is_abstract() && | 1613 if (!func.HasCode() && !func.is_abstract() && |
1609 !func.IsRedirectingFactory()) { | 1614 !func.IsRedirectingFactory()) { |
1610 if ((cls.is_mixin_app_alias() || cls.IsMixinApplication()) && | 1615 if ((cls.is_mixin_app_alias() || cls.IsMixinApplication()) && |
1611 func.HasOptionalParameters()) { | 1616 func.HasOptionalParameters()) { |
1612 // Skipping optional parameters in mixin application. | 1617 // Skipping optional parameters in mixin application. |
1613 continue; | 1618 continue; |
1614 } | 1619 } |
1615 error = CompileFunction(thread, func); | 1620 result = CompileFunction(thread, func); |
1616 if (!error.IsNull()) { | 1621 if (result.IsError()) { |
1617 return error.raw(); | 1622 return Error::Cast(result).raw(); |
1618 } | 1623 } |
| 1624 ASSERT(!result.IsNull()); |
1619 func.ClearICDataArray(); | 1625 func.ClearICDataArray(); |
1620 func.ClearCode(); | 1626 func.ClearCode(); |
1621 } | 1627 } |
1622 } | 1628 } |
1623 return error.raw(); | 1629 return Error::null(); |
1624 } | 1630 } |
1625 | 1631 |
1626 | 1632 |
1627 RawError* Compiler::ParseAllFunctions(const Class& cls) { | 1633 RawError* Compiler::ParseAllFunctions(const Class& cls) { |
1628 Thread* thread = Thread::Current(); | 1634 Thread* thread = Thread::Current(); |
1629 Zone* zone = thread->zone(); | 1635 Zone* zone = thread->zone(); |
1630 Error& error = Error::Handle(zone); | 1636 Error& error = Error::Handle(zone); |
1631 Array& functions = Array::Handle(zone, cls.functions()); | 1637 Array& functions = Array::Handle(zone, cls.functions()); |
1632 Function& func = Function::Handle(zone); | 1638 Function& func = Function::Handle(zone); |
1633 // Class dynamic lives in the vm isolate. Its array fields cannot be set to | 1639 // Class dynamic lives in the vm isolate. Its array fields cannot be set to |
(...skipping 556 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2190 return Error::null(); | 2196 return Error::null(); |
2191 } | 2197 } |
2192 | 2198 |
2193 | 2199 |
2194 RawError* Compiler::CompileClass(const Class& cls) { | 2200 RawError* Compiler::CompileClass(const Class& cls) { |
2195 UNREACHABLE(); | 2201 UNREACHABLE(); |
2196 return Error::null(); | 2202 return Error::null(); |
2197 } | 2203 } |
2198 | 2204 |
2199 | 2205 |
2200 RawError* Compiler::CompileFunction(Thread* thread, const Function& function) { | 2206 RawObject* Compiler::CompileFunction(Thread* thread, const Function& function) { |
2201 UNREACHABLE(); | 2207 UNREACHABLE(); |
2202 return Error::null(); | 2208 return Error::null(); |
2203 } | 2209 } |
2204 | 2210 |
2205 | 2211 |
2206 RawError* Compiler::ParseFunction(Thread* thread, const Function& function) { | 2212 RawError* Compiler::ParseFunction(Thread* thread, const Function& function) { |
2207 UNREACHABLE(); | 2213 UNREACHABLE(); |
2208 return Error::null(); | 2214 return Error::null(); |
2209 } | 2215 } |
2210 | 2216 |
2211 | 2217 |
2212 RawError* Compiler::EnsureUnoptimizedCode(Thread* thread, | 2218 RawError* Compiler::EnsureUnoptimizedCode(Thread* thread, |
2213 const Function& function) { | 2219 const Function& function) { |
2214 UNREACHABLE(); | 2220 UNREACHABLE(); |
2215 return Error::null(); | 2221 return Error::null(); |
2216 } | 2222 } |
2217 | 2223 |
2218 | 2224 |
2219 RawError* Compiler::CompileOptimizedFunction(Thread* thread, | 2225 RawObject* Compiler::CompileOptimizedFunction(Thread* thread, |
2220 const Function& function, | 2226 const Function& function, |
2221 intptr_t osr_id) { | 2227 intptr_t osr_id) { |
2222 UNREACHABLE(); | 2228 UNREACHABLE(); |
2223 return Error::null(); | 2229 return Error::null(); |
2224 } | 2230 } |
2225 | 2231 |
2226 | 2232 |
2227 RawError* Compiler::CompileParsedFunction(ParsedFunction* parsed_function) { | 2233 RawError* Compiler::CompileParsedFunction(ParsedFunction* parsed_function) { |
2228 UNREACHABLE(); | 2234 UNREACHABLE(); |
2229 return Error::null(); | 2235 return Error::null(); |
2230 } | 2236 } |
2231 | 2237 |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2297 | 2303 |
2298 | 2304 |
2299 bool BackgroundCompiler::IsDisabled() { | 2305 bool BackgroundCompiler::IsDisabled() { |
2300 UNREACHABLE(); | 2306 UNREACHABLE(); |
2301 return true; | 2307 return true; |
2302 } | 2308 } |
2303 | 2309 |
2304 #endif // DART_PRECOMPILED_RUNTIME | 2310 #endif // DART_PRECOMPILED_RUNTIME |
2305 | 2311 |
2306 } // namespace dart | 2312 } // namespace dart |
OLD | NEW |