| 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 #include "vm/ast_printer.h" | 8 #include "vm/ast_printer.h" |
| 9 #include "vm/code_generator.h" | 9 #include "vm/code_generator.h" |
| 10 #include "vm/code_patcher.h" | 10 #include "vm/code_patcher.h" |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 157 bool is_compiled = false; | 157 bool is_compiled = false; |
| 158 if (FLAG_use_new_compiler) { | 158 if (FLAG_use_new_compiler) { |
| 159 ASSERT(!optimized); | 159 ASSERT(!optimized); |
| 160 LongJump* old_base = isolate->long_jump_base(); | 160 LongJump* old_base = isolate->long_jump_base(); |
| 161 LongJump bailout_jump; | 161 LongJump bailout_jump; |
| 162 isolate->set_long_jump_base(&bailout_jump); | 162 isolate->set_long_jump_base(&bailout_jump); |
| 163 if (setjmp(*bailout_jump.Set()) == 0) { | 163 if (setjmp(*bailout_jump.Set()) == 0) { |
| 164 FlowGraphBuilder graph_builder(parsed_function); | 164 FlowGraphBuilder graph_builder(parsed_function); |
| 165 graph_builder.BuildGraph(); | 165 graph_builder.BuildGraph(); |
| 166 | 166 |
| 167 Assembler assembler; | |
| 168 // The non-optimizing compiler compiles blocks in reverse postorder, | 167 // The non-optimizing compiler compiles blocks in reverse postorder, |
| 169 // because it is a 'natural' order for the human reader of the | 168 // because it is a 'natural' order for the human reader of the |
| 170 // generated code. | 169 // generated code. |
| 171 intptr_t length = graph_builder.postorder_block_entries().length(); | 170 intptr_t length = graph_builder.postorder_block_entries().length(); |
| 172 GrowableArray<BlockEntryInstr*> block_order(length); | 171 GrowableArray<BlockEntryInstr*> block_order(length); |
| 173 for (intptr_t i = length - 1; i >= 0; --i) { | 172 for (intptr_t i = length - 1; i >= 0; --i) { |
| 174 block_order.Add(graph_builder.postorder_block_entries()[i]); | 173 block_order.Add(graph_builder.postorder_block_entries()[i]); |
| 175 } | 174 } |
| 175 |
| 176 Assembler assembler; |
| 176 FlowGraphCompiler graph_compiler(&assembler, parsed_function, | 177 FlowGraphCompiler graph_compiler(&assembler, parsed_function, |
| 177 block_order); | 178 block_order); |
| 178 graph_compiler.CompileGraph(); | 179 graph_compiler.CompileGraph(); |
| 180 |
| 181 TimerScope timer(FLAG_compiler_stats, |
| 182 &CompilerStats::codefinalizer_timer); |
| 179 const Code& code = | 183 const Code& code = |
| 180 Code::Handle(Code::FinalizeCode(function_fullname, &assembler)); | 184 Code::Handle(Code::FinalizeCode(function_fullname, &assembler)); |
| 181 code.set_is_optimized(false); | 185 code.set_is_optimized(false); |
| 182 graph_compiler.FinalizePcDescriptors(code); | 186 graph_compiler.FinalizePcDescriptors(code); |
| 187 graph_compiler.FinalizeStackmaps(code); |
| 183 graph_compiler.FinalizeVarDescriptors(code); | 188 graph_compiler.FinalizeVarDescriptors(code); |
| 184 graph_compiler.FinalizeExceptionHandlers(code); | 189 graph_compiler.FinalizeExceptionHandlers(code); |
| 185 function.set_unoptimized_code(code); | 190 function.set_unoptimized_code(code); |
| 186 function.SetCode(code); | 191 function.SetCode(code); |
| 187 ASSERT(CodePatcher::CodeIsPatchable(code)); | 192 ASSERT(CodePatcher::CodeIsPatchable(code)); |
| 188 is_compiled = true; | 193 is_compiled = true; |
| 189 } else { | 194 } else { |
| 190 // We bailed out. | 195 // We bailed out. |
| 191 Error& bailout_error = Error::Handle( | 196 Error& bailout_error = Error::Handle( |
| 192 isolate->object_store()->sticky_error()); | 197 isolate->object_store()->sticky_error()); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 208 // Do not use type feedback to optimize a function that was | 213 // Do not use type feedback to optimize a function that was |
| 209 // deoptimized too often. | 214 // deoptimized too often. |
| 210 if (parsed_function.function().deoptimization_counter() < | 215 if (parsed_function.function().deoptimization_counter() < |
| 211 FLAG_deoptimization_counter_threshold) { | 216 FLAG_deoptimization_counter_threshold) { |
| 212 ExtractTypeFeedback( | 217 ExtractTypeFeedback( |
| 213 Code::Handle(parsed_function.function().unoptimized_code()), | 218 Code::Handle(parsed_function.function().unoptimized_code()), |
| 214 parsed_function.node_sequence()); | 219 parsed_function.node_sequence()); |
| 215 } | 220 } |
| 216 OptimizingCodeGenerator code_gen(&assembler, parsed_function); | 221 OptimizingCodeGenerator code_gen(&assembler, parsed_function); |
| 217 code_gen.GenerateCode(); | 222 code_gen.GenerateCode(); |
| 223 TimerScope timer(FLAG_compiler_stats, |
| 224 &CompilerStats::codefinalizer_timer); |
| 218 Code& code = Code::Handle( | 225 Code& code = Code::Handle( |
| 219 Code::FinalizeCode(function_fullname, &assembler)); | 226 Code::FinalizeCode(function_fullname, &assembler)); |
| 220 code.set_is_optimized(true); | 227 code.set_is_optimized(true); |
| 221 code_gen.FinalizePcDescriptors(code); | 228 code_gen.FinalizePcDescriptors(code); |
| 222 code_gen.FinalizeStackmaps(code); | 229 code_gen.FinalizeStackmaps(code); |
| 223 code_gen.FinalizeExceptionHandlers(code); | 230 code_gen.FinalizeExceptionHandlers(code); |
| 224 function.SetCode(code); | 231 function.SetCode(code); |
| 225 CodePatcher::PatchEntry(Code::Handle(function.unoptimized_code())); | 232 CodePatcher::PatchEntry(Code::Handle(function.unoptimized_code())); |
| 226 if (FLAG_trace_compiler) { | 233 if (FLAG_trace_compiler) { |
| 227 OS::Print("--> patching entry 0x%x\n", | 234 OS::Print("--> patching entry 0x%x\n", |
| 228 Code::Handle(function.unoptimized_code()).EntryPoint()); | 235 Code::Handle(function.unoptimized_code()).EntryPoint()); |
| 229 } | 236 } |
| 230 } else { | 237 } else { |
| 231 // Compile unnoptimized code. | 238 // Compile unnoptimized code. |
| 232 ASSERT(!function.HasCode()); | 239 ASSERT(!function.HasCode()); |
| 233 // Compiling first time. | 240 // Compiling first time. |
| 234 CodeGenerator code_gen(&assembler, parsed_function); | 241 CodeGenerator code_gen(&assembler, parsed_function); |
| 235 code_gen.GenerateCode(); | 242 code_gen.GenerateCode(); |
| 243 TimerScope timer(FLAG_compiler_stats, |
| 244 &CompilerStats::codefinalizer_timer); |
| 236 const Code& code = | 245 const Code& code = |
| 237 Code::Handle(Code::FinalizeCode(function_fullname, &assembler)); | 246 Code::Handle(Code::FinalizeCode(function_fullname, &assembler)); |
| 238 code.set_is_optimized(false); | 247 code.set_is_optimized(false); |
| 239 code_gen.FinalizePcDescriptors(code); | 248 code_gen.FinalizePcDescriptors(code); |
| 240 code_gen.FinalizeStackmaps(code); | 249 code_gen.FinalizeStackmaps(code); |
| 241 code_gen.FinalizeVarDescriptors(code); | 250 code_gen.FinalizeVarDescriptors(code); |
| 242 code_gen.FinalizeExceptionHandlers(code); | 251 code_gen.FinalizeExceptionHandlers(code); |
| 243 function.set_unoptimized_code(code); | 252 function.set_unoptimized_code(code); |
| 244 function.SetCode(code); | 253 function.SetCode(code); |
| 245 ASSERT(CodePatcher::CodeIsPatchable(code)); | 254 ASSERT(CodePatcher::CodeIsPatchable(code)); |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 392 } else { | 401 } else { |
| 393 result = isolate->object_store()->sticky_error(); | 402 result = isolate->object_store()->sticky_error(); |
| 394 isolate->object_store()->clear_sticky_error(); | 403 isolate->object_store()->clear_sticky_error(); |
| 395 } | 404 } |
| 396 isolate->set_long_jump_base(base); | 405 isolate->set_long_jump_base(base); |
| 397 return result.raw(); | 406 return result.raw(); |
| 398 } | 407 } |
| 399 | 408 |
| 400 | 409 |
| 401 } // namespace dart | 410 } // namespace dart |
| OLD | NEW |