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 14 matching lines...) Expand all Loading... |
25 #include "vm/il_printer.h" | 25 #include "vm/il_printer.h" |
26 #include "vm/longjump.h" | 26 #include "vm/longjump.h" |
27 #include "vm/object.h" | 27 #include "vm/object.h" |
28 #include "vm/object_store.h" | 28 #include "vm/object_store.h" |
29 #include "vm/os.h" | 29 #include "vm/os.h" |
30 #include "vm/parser.h" | 30 #include "vm/parser.h" |
31 #include "vm/scanner.h" | 31 #include "vm/scanner.h" |
32 #include "vm/symbols.h" | 32 #include "vm/symbols.h" |
33 #include "vm/tags.h" | 33 #include "vm/tags.h" |
34 #include "vm/timer.h" | 34 #include "vm/timer.h" |
35 #include "vm/trace_buffer.h" | |
36 | 35 |
37 namespace dart { | 36 namespace dart { |
38 | 37 |
39 DEFINE_FLAG(bool, allocation_sinking, true, | 38 DEFINE_FLAG(bool, allocation_sinking, true, |
40 "Attempt to sink temporary allocations to side exits"); | 39 "Attempt to sink temporary allocations to side exits"); |
41 DEFINE_FLAG(bool, common_subexpression_elimination, true, | 40 DEFINE_FLAG(bool, common_subexpression_elimination, true, |
42 "Do common subexpression elimination."); | 41 "Do common subexpression elimination."); |
43 DEFINE_FLAG(bool, constant_propagation, true, | 42 DEFINE_FLAG(bool, constant_propagation, true, |
44 "Do conditional constant propagation/unreachable code elimination."); | 43 "Do conditional constant propagation/unreachable code elimination."); |
45 DEFINE_FLAG(int, deoptimization_counter_threshold, 16, | 44 DEFINE_FLAG(int, deoptimization_counter_threshold, 16, |
(...skipping 552 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
598 Object::branch_offset_error().raw()) { | 597 Object::branch_offset_error().raw()) { |
599 // Compilation failed due to an out of range branch offset in the | 598 // Compilation failed due to an out of range branch offset in the |
600 // assembler. We try again (done = false) with far branches enabled. | 599 // assembler. We try again (done = false) with far branches enabled. |
601 done = false; | 600 done = false; |
602 ASSERT(!use_far_branches); | 601 ASSERT(!use_far_branches); |
603 use_far_branches = true; | 602 use_far_branches = true; |
604 } else { | 603 } else { |
605 // If the error isn't due to an out of range branch offset, we don't | 604 // If the error isn't due to an out of range branch offset, we don't |
606 // try again (done = true), and indicate that we did not finish | 605 // try again (done = true), and indicate that we did not finish |
607 // compiling (is_compiled = false). | 606 // compiling (is_compiled = false). |
608 const Error& bailout_error = Error::Handle( | 607 if (FLAG_trace_bailout) { |
| 608 const Error& bailout_error = Error::Handle( |
609 isolate->object_store()->sticky_error()); | 609 isolate->object_store()->sticky_error()); |
610 if (FLAG_trace_bailout) { | |
611 OS::Print("%s\n", bailout_error.ToErrorCString()); | 610 OS::Print("%s\n", bailout_error.ToErrorCString()); |
612 } | 611 } |
613 function.log()->TraceF("Failed to compile optimized code: %s", | |
614 bailout_error.ToErrorCString()); | |
615 done = true; | 612 done = true; |
616 ASSERT(optimized); | 613 ASSERT(optimized); |
617 } | 614 } |
618 | 615 |
619 isolate->object_store()->clear_sticky_error(); | 616 isolate->object_store()->clear_sticky_error(); |
620 is_compiled = false; | 617 is_compiled = false; |
621 } | 618 } |
622 // Reset global isolate state. | 619 // Reset global isolate state. |
623 isolate->set_deopt_id(prev_deopt_id); | 620 isolate->set_deopt_id(prev_deopt_id); |
624 } | 621 } |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
763 if (!optimized && !unoptimized_code.IsNull()) { | 760 if (!optimized && !unoptimized_code.IsNull()) { |
764 InstallUnoptimizedCode(function); | 761 InstallUnoptimizedCode(function); |
765 return Error::null(); | 762 return Error::null(); |
766 } | 763 } |
767 if (setjmp(*jump.Set()) == 0) { | 764 if (setjmp(*jump.Set()) == 0) { |
768 TIMERSCOPE(isolate, time_compilation); | 765 TIMERSCOPE(isolate, time_compilation); |
769 Timer per_compile_timer(FLAG_trace_compiler, "Compilation time"); | 766 Timer per_compile_timer(FLAG_trace_compiler, "Compilation time"); |
770 per_compile_timer.Start(); | 767 per_compile_timer.Start(); |
771 ParsedFunction* parsed_function = | 768 ParsedFunction* parsed_function = |
772 new ParsedFunction(Function::ZoneHandle(function.raw())); | 769 new ParsedFunction(Function::ZoneHandle(function.raw())); |
773 function.log()->TraceF("Compiled %s%s", | |
774 (osr_id == Isolate::kNoDeoptId ? "" : "osr "), | |
775 (optimized ? "optimized " : "")); | |
776 if (FLAG_trace_compiler) { | 770 if (FLAG_trace_compiler) { |
777 OS::Print("Compiling %s%sfunction: '%s' @ token %" Pd ", size %" Pd "\n", | 771 OS::Print("Compiling %s%sfunction: '%s' @ token %" Pd ", size %" Pd "\n", |
778 (osr_id == Isolate::kNoDeoptId ? "" : "osr "), | 772 (osr_id == Isolate::kNoDeoptId ? "" : "osr "), |
779 (optimized ? "optimized " : ""), | 773 (optimized ? "optimized " : ""), |
780 function.ToFullyQualifiedCString(), | 774 function.ToFullyQualifiedCString(), |
781 function.token_pos(), | 775 function.token_pos(), |
782 (function.end_token_pos() - function.token_pos())); | 776 (function.end_token_pos() - function.token_pos())); |
783 } | 777 } |
784 { | 778 { |
785 HANDLESCOPE(isolate); | 779 HANDLESCOPE(isolate); |
786 Parser::ParseFunction(parsed_function); | 780 Parser::ParseFunction(parsed_function); |
787 parsed_function->AllocateVariables(); | 781 parsed_function->AllocateVariables(); |
788 } | 782 } |
789 | 783 |
790 const bool success = | 784 const bool success = |
791 CompileParsedFunctionHelper(parsed_function, optimized, osr_id); | 785 CompileParsedFunctionHelper(parsed_function, optimized, osr_id); |
792 if (optimized && !success) { | 786 if (optimized && !success) { |
793 // Optimizer bailed out. Disable optimizations and to never try again. | 787 // Optimizer bailed out. Disable optimizations and to never try again. |
794 function.log()->TraceF("Optimizations disabled"); | |
795 if (FLAG_trace_compiler) { | 788 if (FLAG_trace_compiler) { |
796 OS::Print("--> disabling optimizations for '%s'\n", | 789 OS::Print("--> disabling optimizations for '%s'\n", |
797 function.ToFullyQualifiedCString()); | 790 function.ToFullyQualifiedCString()); |
798 } else if (FLAG_trace_failed_optimization_attempts) { | 791 } else if (FLAG_trace_failed_optimization_attempts) { |
799 OS::Print("Cannot optimize: %s\n", function.ToFullyQualifiedCString()); | 792 OS::Print("Cannot optimize: %s\n", function.ToFullyQualifiedCString()); |
800 } | 793 } |
801 function.SetIsOptimizable(false); | 794 function.SetIsOptimizable(false); |
802 return Error::null(); | 795 return Error::null(); |
803 } | 796 } |
804 | 797 |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
966 const Object& result = | 959 const Object& result = |
967 Object::Handle(isolate->object_store()->sticky_error()); | 960 Object::Handle(isolate->object_store()->sticky_error()); |
968 isolate->object_store()->clear_sticky_error(); | 961 isolate->object_store()->clear_sticky_error(); |
969 return result.raw(); | 962 return result.raw(); |
970 } | 963 } |
971 UNREACHABLE(); | 964 UNREACHABLE(); |
972 return Object::null(); | 965 return Object::null(); |
973 } | 966 } |
974 | 967 |
975 } // namespace dart | 968 } // namespace dart |
OLD | NEW |