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/code_generator.h" | 10 #include "vm/code_generator.h" |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
114 } | 114 } |
115 | 115 |
116 | 116 |
117 // Return false if bailed out. | 117 // Return false if bailed out. |
118 static bool CompileParsedFunctionHelper(const ParsedFunction& parsed_function, | 118 static bool CompileParsedFunctionHelper(const ParsedFunction& parsed_function, |
119 bool optimized) { | 119 bool optimized) { |
120 TimerScope timer(FLAG_compiler_stats, &CompilerStats::codegen_timer); | 120 TimerScope timer(FLAG_compiler_stats, &CompilerStats::codegen_timer); |
121 bool is_compiled = false; | 121 bool is_compiled = false; |
122 Isolate* isolate = Isolate::Current(); | 122 Isolate* isolate = Isolate::Current(); |
123 HANDLESCOPE(isolate); | 123 HANDLESCOPE(isolate); |
124 ASSERT(isolate->ic_data_array() == Array::null()); // Must be reset to null. | |
125 const intptr_t prev_deopt_id = isolate->deopt_id(); | 124 const intptr_t prev_deopt_id = isolate->deopt_id(); |
126 isolate->set_deopt_id(0); | 125 isolate->set_deopt_id(0); |
127 LongJump* old_base = isolate->long_jump_base(); | 126 LongJump* old_base = isolate->long_jump_base(); |
128 LongJump bailout_jump; | 127 LongJump bailout_jump; |
129 isolate->set_long_jump_base(&bailout_jump); | 128 isolate->set_long_jump_base(&bailout_jump); |
130 if (setjmp(*bailout_jump.Set()) == 0) { | 129 if (setjmp(*bailout_jump.Set()) == 0) { |
131 FlowGraph* flow_graph = NULL; | 130 FlowGraph* flow_graph = NULL; |
132 // TimerScope needs an isolate to be properly terminated in case of a | 131 // TimerScope needs an isolate to be properly terminated in case of a |
133 // LongJump. | 132 // LongJump. |
134 { | 133 { |
135 TimerScope timer(FLAG_compiler_stats, | 134 TimerScope timer(FLAG_compiler_stats, |
136 &CompilerStats::graphbuilder_timer, | 135 &CompilerStats::graphbuilder_timer, |
137 isolate); | 136 isolate); |
| 137 Array& ic_data_array = Array::Handle(); |
138 if (optimized) { | 138 if (optimized) { |
139 ASSERT(parsed_function.function().HasCode()); | 139 ASSERT(parsed_function.function().HasCode()); |
140 // Extract type feedback before the graph is built, as the graph | 140 // Extract type feedback before the graph is built, as the graph |
141 // builder uses it to attach it to nodes. | 141 // builder uses it to attach it to nodes. |
142 // Do not use type feedback to optimize a function that was | 142 // Do not use type feedback to optimize a function that was |
143 // deoptimized too often. | 143 // deoptimized too often. |
144 if (parsed_function.function().deoptimization_counter() < | 144 if (parsed_function.function().deoptimization_counter() < |
145 FLAG_deoptimization_counter_threshold) { | 145 FLAG_deoptimization_counter_threshold) { |
146 const Code& unoptimized_code = | 146 const Code& unoptimized_code = |
147 Code::Handle(parsed_function.function().unoptimized_code()); | 147 Code::Handle(parsed_function.function().unoptimized_code()); |
148 isolate->set_ic_data_array( | 148 ic_data_array = unoptimized_code.ExtractTypeFeedbackArray(); |
149 unoptimized_code.ExtractTypeFeedbackArray()); | |
150 } | 149 } |
151 } | 150 } |
152 | 151 |
153 // Build the flow graph. | 152 // Build the flow graph. |
154 FlowGraphBuilder builder(parsed_function, NULL); // NULL = not inlining. | 153 FlowGraphBuilder builder(parsed_function, |
| 154 ic_data_array, |
| 155 NULL); // NULL = not inlining. |
155 flow_graph = builder.BuildGraph(); | 156 flow_graph = builder.BuildGraph(); |
156 } | 157 } |
157 | 158 |
158 if (optimized) { | 159 if (optimized) { |
159 TimerScope timer(FLAG_compiler_stats, | 160 TimerScope timer(FLAG_compiler_stats, |
160 &CompilerStats::ssa_timer, | 161 &CompilerStats::ssa_timer, |
161 isolate); | 162 isolate); |
162 // Transform to SSA (virtual register 0 and no inlining arguments). | 163 // Transform to SSA (virtual register 0 and no inlining arguments). |
163 flow_graph->ComputeSSA(0, NULL); | 164 flow_graph->ComputeSSA(0, NULL); |
164 DEBUG_ASSERT(flow_graph->VerifyUseLists()); | 165 DEBUG_ASSERT(flow_graph->VerifyUseLists()); |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
389 isolate->object_store()->sticky_error()); | 390 isolate->object_store()->sticky_error()); |
390 isolate->object_store()->clear_sticky_error(); | 391 isolate->object_store()->clear_sticky_error(); |
391 if (FLAG_trace_bailout) { | 392 if (FLAG_trace_bailout) { |
392 OS::Print("%s\n", bailout_error.ToErrorCString()); | 393 OS::Print("%s\n", bailout_error.ToErrorCString()); |
393 } | 394 } |
394 // We only bail out from generating ssa code. | 395 // We only bail out from generating ssa code. |
395 ASSERT(optimized); | 396 ASSERT(optimized); |
396 is_compiled = false; | 397 is_compiled = false; |
397 } | 398 } |
398 // Reset global isolate state. | 399 // Reset global isolate state. |
399 isolate->set_ic_data_array(Array::null()); | |
400 isolate->set_long_jump_base(old_base); | 400 isolate->set_long_jump_base(old_base); |
401 isolate->set_deopt_id(prev_deopt_id); | 401 isolate->set_deopt_id(prev_deopt_id); |
402 return is_compiled; | 402 return is_compiled; |
403 } | 403 } |
404 | 404 |
405 | 405 |
406 static void DisassembleCode(const Function& function, bool optimized) { | 406 static void DisassembleCode(const Function& function, bool optimized) { |
407 const char* function_fullname = function.ToFullyQualifiedCString(); | 407 const char* function_fullname = function.ToFullyQualifiedCString(); |
408 OS::Print("Code for %sfunction '%s' {\n", | 408 OS::Print("Code for %sfunction '%s' {\n", |
409 optimized ? "optimized " : "", | 409 optimized ? "optimized " : "", |
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
736 Object::Handle(isolate->object_store()->sticky_error()); | 736 Object::Handle(isolate->object_store()->sticky_error()); |
737 isolate->object_store()->clear_sticky_error(); | 737 isolate->object_store()->clear_sticky_error(); |
738 isolate->set_long_jump_base(base); | 738 isolate->set_long_jump_base(base); |
739 return result.raw(); | 739 return result.raw(); |
740 } | 740 } |
741 UNREACHABLE(); | 741 UNREACHABLE(); |
742 return Object::null(); | 742 return Object::null(); |
743 } | 743 } |
744 | 744 |
745 } // namespace dart | 745 } // namespace dart |
OLD | NEW |