| 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 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 "Print the IR flow graph when optimizing."); | 52 "Print the IR flow graph when optimizing."); |
| 53 DEFINE_FLAG(bool, range_analysis, true, "Enable range analysis"); | 53 DEFINE_FLAG(bool, range_analysis, true, "Enable range analysis"); |
| 54 DEFINE_FLAG(bool, reorder_basic_blocks, true, "Enable basic-block reordering."); | 54 DEFINE_FLAG(bool, reorder_basic_blocks, true, "Enable basic-block reordering."); |
| 55 DEFINE_FLAG(bool, trace_compiler, false, "Trace compiler operations."); | 55 DEFINE_FLAG(bool, trace_compiler, false, "Trace compiler operations."); |
| 56 DEFINE_FLAG(bool, trace_bailout, false, "Print bailout from ssa compiler."); | 56 DEFINE_FLAG(bool, trace_bailout, false, "Print bailout from ssa compiler."); |
| 57 DEFINE_FLAG(bool, use_inlining, true, "Enable call-site inlining"); | 57 DEFINE_FLAG(bool, use_inlining, true, "Enable call-site inlining"); |
| 58 DEFINE_FLAG(bool, verify_compiler, false, | 58 DEFINE_FLAG(bool, verify_compiler, false, |
| 59 "Enable compiler verification assertions"); | 59 "Enable compiler verification assertions"); |
| 60 | 60 |
| 61 DECLARE_FLAG(bool, trace_failed_optimization_attempts); | 61 DECLARE_FLAG(bool, trace_failed_optimization_attempts); |
| 62 DECLARE_FLAG(bool, trace_patching); |
| 62 DECLARE_FLAG(bool, warn_on_javascript_compatibility); | 63 DECLARE_FLAG(bool, warn_on_javascript_compatibility); |
| 63 DECLARE_FLAG(bool, warning_as_error); | 64 DECLARE_FLAG(bool, warning_as_error); |
| 64 | 65 |
| 65 // Compile a function. Should call only if the function has not been compiled. | 66 // Compile a function. Should call only if the function has not been compiled. |
| 66 // Arg0: function object. | 67 // Arg0: function object. |
| 67 DEFINE_RUNTIME_ENTRY(CompileFunction, 1) { | 68 DEFINE_RUNTIME_ENTRY(CompileFunction, 1) { |
| 68 const Function& function = Function::CheckedHandle(arguments.ArgAt(0)); | 69 const Function& function = Function::CheckedHandle(arguments.ArgAt(0)); |
| 69 ASSERT(!function.HasCode()); | 70 ASSERT(!function.HasCode()); |
| 70 const Error& error = Error::Handle(Compiler::CompileFunction(isolate, | 71 const Error& error = Error::Handle(Compiler::CompileFunction(isolate, |
| 71 function)); | 72 function)); |
| (...skipping 477 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 549 graph_compiler.FinalizePcDescriptors(code); | 550 graph_compiler.FinalizePcDescriptors(code); |
| 550 graph_compiler.FinalizeDeoptInfo(code); | 551 graph_compiler.FinalizeDeoptInfo(code); |
| 551 graph_compiler.FinalizeStackmaps(code); | 552 graph_compiler.FinalizeStackmaps(code); |
| 552 graph_compiler.FinalizeVarDescriptors(code); | 553 graph_compiler.FinalizeVarDescriptors(code); |
| 553 graph_compiler.FinalizeExceptionHandlers(code); | 554 graph_compiler.FinalizeExceptionHandlers(code); |
| 554 graph_compiler.FinalizeStaticCallTargetsTable(code); | 555 graph_compiler.FinalizeStaticCallTargetsTable(code); |
| 555 | 556 |
| 556 if (optimized) { | 557 if (optimized) { |
| 557 if (osr_id == Isolate::kNoDeoptId) { | 558 if (osr_id == Isolate::kNoDeoptId) { |
| 558 CodePatcher::PatchEntry(Code::Handle(function.CurrentCode())); | 559 CodePatcher::PatchEntry(Code::Handle(function.CurrentCode())); |
| 559 if (FLAG_trace_compiler) { | 560 if (FLAG_trace_compiler || FLAG_trace_patching) { |
| 560 OS::Print("--> patching entry %#" Px "\n", | 561 if (FLAG_trace_compiler) { |
| 562 OS::Print(" "); |
| 563 } |
| 564 OS::Print("Patch unoptimized '%s' entry point %#" Px "\n", |
| 565 function.ToFullyQualifiedCString(), |
| 561 Code::Handle(function.unoptimized_code()).EntryPoint()); | 566 Code::Handle(function.unoptimized_code()).EntryPoint()); |
| 562 } | 567 } |
| 563 } | 568 } |
| 564 function.AttachCode(code); | 569 function.AttachCode(code); |
| 565 | 570 |
| 566 for (intptr_t i = 0; | 571 for (intptr_t i = 0; |
| 567 i < flow_graph->guarded_fields()->length(); | 572 i < flow_graph->guarded_fields()->length(); |
| 568 i++) { | 573 i++) { |
| 569 const Field* field = (*flow_graph->guarded_fields())[i]; | 574 const Field* field = (*flow_graph->guarded_fields())[i]; |
| 570 field->RegisterDependentCode(code); | 575 field->RegisterDependentCode(code); |
| 571 } | 576 } |
| 572 } else { | 577 } else { |
| 573 function.set_unoptimized_code(code); | 578 function.set_unoptimized_code(code); |
| 574 function.AttachCode(code); | 579 function.AttachCode(code); |
| 575 ASSERT(CodePatcher::CodeIsPatchable(code)); | 580 ASSERT(CodePatcher::CodeIsPatchable(code)); |
| 576 } | 581 } |
| 577 if (parsed_function->HasDeferredPrefixes()) { | 582 if (parsed_function->HasDeferredPrefixes()) { |
| 578 GrowableObjectArray* prefixes = parsed_function->DeferredPrefixes(); | 583 ZoneGrowableArray<const LibraryPrefix*>* prefixes = |
| 579 LibraryPrefix& prefix = LibraryPrefix::Handle(); | 584 parsed_function->deferred_prefixes(); |
| 580 for (intptr_t i = 0; i < prefixes->Length(); i++) { | 585 for (intptr_t i = 0; i < prefixes->length(); i++) { |
| 581 prefix ^= prefixes->At(i); | 586 (*prefixes)[i]->RegisterDependentCode(code); |
| 582 prefix.RegisterDependentCode(code); | |
| 583 } | 587 } |
| 584 } | 588 } |
| 585 } | 589 } |
| 586 is_compiled = true; | 590 is_compiled = true; |
| 587 done = true; | 591 done = true; |
| 588 } else { | 592 } else { |
| 589 // We bailed out or we encountered an error. | 593 // We bailed out or we encountered an error. |
| 590 const Error& error = Error::Handle( | 594 const Error& error = Error::Handle( |
| 591 isolate->object_store()->sticky_error()); | 595 isolate->object_store()->sticky_error()); |
| 592 | 596 |
| (...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 971 const Object& result = | 975 const Object& result = |
| 972 Object::Handle(isolate->object_store()->sticky_error()); | 976 Object::Handle(isolate->object_store()->sticky_error()); |
| 973 isolate->object_store()->clear_sticky_error(); | 977 isolate->object_store()->clear_sticky_error(); |
| 974 return result.raw(); | 978 return result.raw(); |
| 975 } | 979 } |
| 976 UNREACHABLE(); | 980 UNREACHABLE(); |
| 977 return Object::null(); | 981 return Object::null(); |
| 978 } | 982 } |
| 979 | 983 |
| 980 } // namespace dart | 984 } // namespace dart |
| OLD | NEW |