| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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/globals.h" // Needed here to get TARGET_ARCH_XXX. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_XXX. |
| 6 | 6 |
| 7 #include "vm/flow_graph_compiler.h" | 7 #include "vm/flow_graph_compiler.h" |
| 8 | 8 |
| 9 #include "vm/bit_vector.h" | 9 #include "vm/bit_vector.h" |
| 10 #include "vm/cha.h" | 10 #include "vm/cha.h" |
| 11 #include "vm/dart_entry.h" | 11 #include "vm/dart_entry.h" |
| 12 #include "vm/debugger.h" | 12 #include "vm/debugger.h" |
| 13 #include "vm/deopt_instructions.h" | 13 #include "vm/deopt_instructions.h" |
| 14 #include "vm/exceptions.h" | 14 #include "vm/exceptions.h" |
| 15 #include "vm/flow_graph_allocator.h" | 15 #include "vm/flow_graph_allocator.h" |
| 16 #include "vm/il_printer.h" | 16 #include "vm/il_printer.h" |
| 17 #include "vm/intrinsifier.h" | 17 #include "vm/intrinsifier.h" |
| 18 #include "vm/locations.h" | 18 #include "vm/locations.h" |
| 19 #include "vm/longjump.h" | 19 #include "vm/longjump.h" |
| 20 #include "vm/object_store.h" | 20 #include "vm/object_store.h" |
| 21 #include "vm/parser.h" | 21 #include "vm/parser.h" |
| 22 #include "vm/raw_object.h" | |
| 23 #include "vm/stack_frame.h" | 22 #include "vm/stack_frame.h" |
| 24 #include "vm/stub_code.h" | 23 #include "vm/stub_code.h" |
| 25 #include "vm/symbols.h" | 24 #include "vm/symbols.h" |
| 26 | 25 |
| 27 namespace dart { | 26 namespace dart { |
| 28 | 27 |
| 29 DECLARE_FLAG(bool, code_comments); | 28 DECLARE_FLAG(bool, code_comments); |
| 30 DECLARE_FLAG(bool, disassemble); | 29 DECLARE_FLAG(bool, disassemble); |
| 31 DECLARE_FLAG(bool, disassemble_optimized); | 30 DECLARE_FLAG(bool, disassemble_optimized); |
| 32 DECLARE_FLAG(bool, emit_edge_counters); | 31 DECLARE_FLAG(bool, emit_edge_counters); |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 222 return true; | 221 return true; |
| 223 } | 222 } |
| 224 return false; | 223 return false; |
| 225 } | 224 } |
| 226 | 225 |
| 227 | 226 |
| 228 static bool IsEmptyBlock(BlockEntryInstr* block) { | 227 static bool IsEmptyBlock(BlockEntryInstr* block) { |
| 229 return !block->IsCatchBlockEntry() && | 228 return !block->IsCatchBlockEntry() && |
| 230 !block->HasNonRedundantParallelMove() && | 229 !block->HasNonRedundantParallelMove() && |
| 231 block->next()->IsGoto() && | 230 block->next()->IsGoto() && |
| 232 !block->next()->AsGoto()->HasNonRedundantParallelMove() && | 231 !block->next()->AsGoto()->HasNonRedundantParallelMove(); |
| 233 !block->IsIndirectEntry(); | |
| 234 } | 232 } |
| 235 | 233 |
| 236 | 234 |
| 237 void FlowGraphCompiler::CompactBlock(BlockEntryInstr* block) { | 235 void FlowGraphCompiler::CompactBlock(BlockEntryInstr* block) { |
| 238 BlockInfo* block_info = block_info_[block->postorder_number()]; | 236 BlockInfo* block_info = block_info_[block->postorder_number()]; |
| 239 | 237 |
| 240 // Break out of cycles in the control flow graph. | 238 // Break out of cycles in the control flow graph. |
| 241 if (block_info->is_marked()) { | 239 if (block_info->is_marked()) { |
| 242 return; | 240 return; |
| 243 } | 241 } |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 350 BlockEntryInstr* entry = block_order()[i]; | 348 BlockEntryInstr* entry = block_order()[i]; |
| 351 assembler()->Comment("B%" Pd "", entry->block_id()); | 349 assembler()->Comment("B%" Pd "", entry->block_id()); |
| 352 set_current_block(entry); | 350 set_current_block(entry); |
| 353 | 351 |
| 354 if (WasCompacted(entry)) { | 352 if (WasCompacted(entry)) { |
| 355 continue; | 353 continue; |
| 356 } | 354 } |
| 357 | 355 |
| 358 LoopInfoComment(assembler(), *entry, *loop_headers); | 356 LoopInfoComment(assembler(), *entry, *loop_headers); |
| 359 | 357 |
| 360 entry->set_offset(assembler()->CodeSize()); | |
| 361 entry->EmitNativeCode(this); | 358 entry->EmitNativeCode(this); |
| 362 // Compile all successors until an exit, branch, or a block entry. | 359 // Compile all successors until an exit, branch, or a block entry. |
| 363 for (ForwardInstructionIterator it(entry); !it.Done(); it.Advance()) { | 360 for (ForwardInstructionIterator it(entry); !it.Done(); it.Advance()) { |
| 364 Instruction* instr = it.Current(); | 361 Instruction* instr = it.Current(); |
| 365 if (FLAG_code_comments || | 362 if (FLAG_code_comments || |
| 366 FLAG_disassemble || | 363 FLAG_disassemble || |
| 367 FLAG_disassemble_optimized) { | 364 FLAG_disassemble_optimized) { |
| 368 if (FLAG_source_lines) { | 365 if (FLAG_source_lines) { |
| 369 EmitSourceLine(instr); | 366 EmitSourceLine(instr); |
| 370 } | 367 } |
| (...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 823 } else { | 820 } else { |
| 824 // Finalize the stack map array and add it to the code object. | 821 // Finalize the stack map array and add it to the code object. |
| 825 ASSERT(is_optimizing()); | 822 ASSERT(is_optimizing()); |
| 826 code.set_stackmaps( | 823 code.set_stackmaps( |
| 827 Array::Handle(stackmap_table_builder_->FinalizeStackmaps(code))); | 824 Array::Handle(stackmap_table_builder_->FinalizeStackmaps(code))); |
| 828 } | 825 } |
| 829 } | 826 } |
| 830 | 827 |
| 831 | 828 |
| 832 void FlowGraphCompiler::FinalizeVarDescriptors(const Code& code) { | 829 void FlowGraphCompiler::FinalizeVarDescriptors(const Code& code) { |
| 833 LocalVarDescriptors& var_descs = LocalVarDescriptors::Handle(); | 830 const LocalVarDescriptors& var_descs = LocalVarDescriptors::Handle( |
| 834 if (parsed_function().node_sequence() == NULL) { | 831 parsed_function_.node_sequence()->scope()->GetVarDescriptors( |
| 835 ASSERT(flow_graph().IsIrregexpFunction()); | 832 parsed_function_.function())); |
| 836 var_descs = LocalVarDescriptors::New(1); | |
| 837 RawLocalVarDescriptors::VarInfo info; | |
| 838 info.set_kind(RawLocalVarDescriptors::kSavedCurrentContext); | |
| 839 info.scope_id = 0; | |
| 840 info.begin_pos = 0; | |
| 841 info.end_pos = 0; | |
| 842 info.set_index(parsed_function().current_context_var()->index()); | |
| 843 var_descs.SetVar(0, Symbols::CurrentContextVar(), &info); | |
| 844 } else { | |
| 845 var_descs = | |
| 846 parsed_function_.node_sequence()->scope()->GetVarDescriptors( | |
| 847 parsed_function_.function()); | |
| 848 } | |
| 849 code.set_var_descriptors(var_descs); | 833 code.set_var_descriptors(var_descs); |
| 850 } | 834 } |
| 851 | 835 |
| 852 | 836 |
| 853 void FlowGraphCompiler::FinalizeStaticCallTargetsTable(const Code& code) { | 837 void FlowGraphCompiler::FinalizeStaticCallTargetsTable(const Code& code) { |
| 854 ASSERT(code.static_calls_target_table() == Array::null()); | 838 ASSERT(code.static_calls_target_table() == Array::null()); |
| 855 code.set_static_calls_target_table( | 839 code.set_static_calls_target_table( |
| 856 Array::Handle(Array::MakeArray(static_calls_target_table_))); | 840 Array::Handle(Array::MakeArray(static_calls_target_table_))); |
| 857 } | 841 } |
| 858 | 842 |
| (...skipping 667 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1526 case kUnboxedMint: | 1510 case kUnboxedMint: |
| 1527 return mint_class(); | 1511 return mint_class(); |
| 1528 default: | 1512 default: |
| 1529 UNREACHABLE(); | 1513 UNREACHABLE(); |
| 1530 return Class::ZoneHandle(); | 1514 return Class::ZoneHandle(); |
| 1531 } | 1515 } |
| 1532 } | 1516 } |
| 1533 | 1517 |
| 1534 | 1518 |
| 1535 } // namespace dart | 1519 } // namespace dart |
| OLD | NEW |