| 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 712 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 723 CSTAT_TIMER_SCOPE(thread, graphcompiler_timer); | 723 CSTAT_TIMER_SCOPE(thread, graphcompiler_timer); |
| 724 graph_compiler.CompileGraph(); | 724 graph_compiler.CompileGraph(); |
| 725 pipeline->FinalizeCompilation(); | 725 pipeline->FinalizeCompilation(); |
| 726 } | 726 } |
| 727 { | 727 { |
| 728 CSTAT_TIMER_SCOPE(thread, codefinalizer_timer); | 728 CSTAT_TIMER_SCOPE(thread, codefinalizer_timer); |
| 729 // CreateDeoptInfo uses the object pool and needs to be done before | 729 // CreateDeoptInfo uses the object pool and needs to be done before |
| 730 // FinalizeCode. | 730 // FinalizeCode. |
| 731 const Array& deopt_info_array = | 731 const Array& deopt_info_array = |
| 732 Array::Handle(zone, graph_compiler.CreateDeoptInfo(&assembler)); | 732 Array::Handle(zone, graph_compiler.CreateDeoptInfo(&assembler)); |
| 733 INC_STAT(isolate, total_code_size, | 733 INC_STAT(thread, total_code_size, |
| 734 deopt_info_array.Length() * sizeof(uword)); | 734 deopt_info_array.Length() * sizeof(uword)); |
| 735 const Code& code = Code::Handle( | 735 const Code& code = Code::Handle( |
| 736 Code::FinalizeCode(function, &assembler, optimized)); | 736 Code::FinalizeCode(function, &assembler, optimized)); |
| 737 code.set_is_optimized(optimized); | 737 code.set_is_optimized(optimized); |
| 738 | 738 |
| 739 const Array& intervals = graph_compiler.inlined_code_intervals(); | 739 const Array& intervals = graph_compiler.inlined_code_intervals(); |
| 740 INC_STAT(isolate, total_code_size, | 740 INC_STAT(thread, total_code_size, |
| 741 intervals.Length() * sizeof(uword)); | 741 intervals.Length() * sizeof(uword)); |
| 742 code.SetInlinedIntervals(intervals); | 742 code.SetInlinedIntervals(intervals); |
| 743 | 743 |
| 744 const Array& inlined_id_array = | 744 const Array& inlined_id_array = |
| 745 Array::Handle(zone, graph_compiler.InliningIdToFunction()); | 745 Array::Handle(zone, graph_compiler.InliningIdToFunction()); |
| 746 INC_STAT(isolate, total_code_size, | 746 INC_STAT(thread, total_code_size, |
| 747 inlined_id_array.Length() * sizeof(uword)); | 747 inlined_id_array.Length() * sizeof(uword)); |
| 748 code.SetInlinedIdToFunction(inlined_id_array); | 748 code.SetInlinedIdToFunction(inlined_id_array); |
| 749 | 749 |
| 750 const Array& caller_inlining_id_map_array = | 750 const Array& caller_inlining_id_map_array = |
| 751 Array::Handle(zone, graph_compiler.CallerInliningIdMap()); | 751 Array::Handle(zone, graph_compiler.CallerInliningIdMap()); |
| 752 INC_STAT(isolate, total_code_size, | 752 INC_STAT(thread, total_code_size, |
| 753 caller_inlining_id_map_array.Length() * sizeof(uword)); | 753 caller_inlining_id_map_array.Length() * sizeof(uword)); |
| 754 code.SetInlinedCallerIdMap(caller_inlining_id_map_array); | 754 code.SetInlinedCallerIdMap(caller_inlining_id_map_array); |
| 755 | 755 |
| 756 graph_compiler.FinalizePcDescriptors(code); | 756 graph_compiler.FinalizePcDescriptors(code); |
| 757 code.set_deopt_info_array(deopt_info_array); | 757 code.set_deopt_info_array(deopt_info_array); |
| 758 | 758 |
| 759 graph_compiler.FinalizeStackmaps(code); | 759 graph_compiler.FinalizeStackmaps(code); |
| 760 graph_compiler.FinalizeVarDescriptors(code); | 760 graph_compiler.FinalizeVarDescriptors(code); |
| 761 graph_compiler.FinalizeExceptionHandlers(code); | 761 graph_compiler.FinalizeExceptionHandlers(code); |
| 762 graph_compiler.FinalizeStaticCallTargetsTable(code); | 762 graph_compiler.FinalizeStaticCallTargetsTable(code); |
| (...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1045 ParsedFunction* parsed_function = new(zone) ParsedFunction( | 1045 ParsedFunction* parsed_function = new(zone) ParsedFunction( |
| 1046 thread, Function::ZoneHandle(zone, function.raw())); | 1046 thread, Function::ZoneHandle(zone, function.raw())); |
| 1047 if (FLAG_trace_compiler) { | 1047 if (FLAG_trace_compiler) { |
| 1048 ISL_Print("Compiling %s%sfunction: '%s' @ token %" Pd ", size %" Pd "\n", | 1048 ISL_Print("Compiling %s%sfunction: '%s' @ token %" Pd ", size %" Pd "\n", |
| 1049 (osr_id == Isolate::kNoDeoptId ? "" : "osr "), | 1049 (osr_id == Isolate::kNoDeoptId ? "" : "osr "), |
| 1050 (optimized ? "optimized " : ""), | 1050 (optimized ? "optimized " : ""), |
| 1051 function.ToFullyQualifiedCString(), | 1051 function.ToFullyQualifiedCString(), |
| 1052 function.token_pos(), | 1052 function.token_pos(), |
| 1053 (function.end_token_pos() - function.token_pos())); | 1053 (function.end_token_pos() - function.token_pos())); |
| 1054 } | 1054 } |
| 1055 INC_STAT(thread, num_functions_compiled, 1); |
| 1056 if (optimized) { |
| 1057 INC_STAT(thread, num_functions_optimized, 1); |
| 1058 } |
| 1055 { | 1059 { |
| 1056 HANDLESCOPE(thread); | 1060 HANDLESCOPE(thread); |
| 1061 const int64_t num_tokens_before = STAT_VALUE(thread, num_tokens_consumed); |
| 1057 pipeline->ParseFunction(parsed_function); | 1062 pipeline->ParseFunction(parsed_function); |
| 1063 const int64_t num_tokens_after = STAT_VALUE(thread, num_tokens_consumed); |
| 1064 INC_STAT(thread, |
| 1065 num_func_tokens_compiled, |
| 1066 num_tokens_after - num_tokens_before); |
| 1058 } | 1067 } |
| 1059 | 1068 |
| 1060 const bool success = CompileParsedFunctionHelper(pipeline, | 1069 const bool success = CompileParsedFunctionHelper(pipeline, |
| 1061 parsed_function, | 1070 parsed_function, |
| 1062 optimized, | 1071 optimized, |
| 1063 osr_id); | 1072 osr_id); |
| 1064 if (!success) { | 1073 if (!success) { |
| 1065 if (optimized) { | 1074 if (optimized) { |
| 1066 ASSERT(!Compiler::always_optimize()); // Optimized is the only code. | 1075 ASSERT(!Compiler::always_optimize()); // Optimized is the only code. |
| 1067 // Optimizer bailed out. Disable optimizations and never try again. | 1076 // Optimizer bailed out. Disable optimizations and never try again. |
| (...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1427 const Object& result = | 1436 const Object& result = |
| 1428 PassiveObject::Handle(isolate->object_store()->sticky_error()); | 1437 PassiveObject::Handle(isolate->object_store()->sticky_error()); |
| 1429 isolate->object_store()->clear_sticky_error(); | 1438 isolate->object_store()->clear_sticky_error(); |
| 1430 return result.raw(); | 1439 return result.raw(); |
| 1431 } | 1440 } |
| 1432 UNREACHABLE(); | 1441 UNREACHABLE(); |
| 1433 return Object::null(); | 1442 return Object::null(); |
| 1434 } | 1443 } |
| 1435 | 1444 |
| 1436 } // namespace dart | 1445 } // namespace dart |
| OLD | NEW |