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 #ifndef RUNTIME_VM_FLOW_GRAPH_COMPILER_H_ | 5 #ifndef RUNTIME_VM_FLOW_GRAPH_COMPILER_H_ |
6 #define RUNTIME_VM_FLOW_GRAPH_COMPILER_H_ | 6 #define RUNTIME_VM_FLOW_GRAPH_COMPILER_H_ |
7 | 7 |
8 #include "vm/allocation.h" | 8 #include "vm/allocation.h" |
9 #include "vm/assembler.h" | 9 #include "vm/assembler.h" |
10 #include "vm/code_descriptors.h" | 10 #include "vm/code_descriptors.h" |
11 #include "vm/code_generator.h" | 11 #include "vm/code_generator.h" |
12 #include "vm/intermediate_language.h" | 12 #include "vm/intermediate_language.h" |
13 | 13 |
14 namespace dart { | 14 namespace dart { |
15 | 15 |
16 // Forward declarations. | 16 // Forward declarations. |
17 class Code; | 17 class Code; |
18 class DeoptInfoBuilder; | 18 class DeoptInfoBuilder; |
19 class FlowGraph; | 19 class FlowGraph; |
20 class FlowGraphCompiler; | 20 class FlowGraphCompiler; |
21 class Function; | 21 class Function; |
22 template <typename T> | 22 template <typename T> |
23 class GrowableArray; | 23 class GrowableArray; |
24 class ParsedFunction; | 24 class ParsedFunction; |
25 | 25 |
26 | |
27 class ParallelMoveResolver : public ValueObject { | 26 class ParallelMoveResolver : public ValueObject { |
28 public: | 27 public: |
29 explicit ParallelMoveResolver(FlowGraphCompiler* compiler); | 28 explicit ParallelMoveResolver(FlowGraphCompiler* compiler); |
30 | 29 |
31 // Resolve a set of parallel moves, emitting assembler instructions. | 30 // Resolve a set of parallel moves, emitting assembler instructions. |
32 void EmitNativeCode(ParallelMoveInstr* parallel_move); | 31 void EmitNativeCode(ParallelMoveInstr* parallel_move); |
33 | 32 |
34 private: | 33 private: |
35 class ScratchFpuRegisterScope : public ValueObject { | 34 class ScratchFpuRegisterScope : public ValueObject { |
36 public: | 35 public: |
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
355 intptr_t deopt_id, | 354 intptr_t deopt_id, |
356 const RuntimeEntry& entry, | 355 const RuntimeEntry& entry, |
357 intptr_t argument_count, | 356 intptr_t argument_count, |
358 LocationSummary* locs); | 357 LocationSummary* locs); |
359 | 358 |
360 void GenerateCall(TokenPosition token_pos, | 359 void GenerateCall(TokenPosition token_pos, |
361 const StubEntry& stub_entry, | 360 const StubEntry& stub_entry, |
362 RawPcDescriptors::Kind kind, | 361 RawPcDescriptors::Kind kind, |
363 LocationSummary* locs); | 362 LocationSummary* locs); |
364 | 363 |
365 void GenerateCallWithDeopt(TokenPosition token_pos, | |
366 intptr_t deopt_id, | |
367 const StubEntry& stub_entry, | |
368 RawPcDescriptors::Kind kind, | |
369 LocationSummary* locs); | |
370 | |
371 void GeneratePatchableCall(TokenPosition token_pos, | 364 void GeneratePatchableCall(TokenPosition token_pos, |
372 const StubEntry& stub_entry, | 365 const StubEntry& stub_entry, |
373 RawPcDescriptors::Kind kind, | 366 RawPcDescriptors::Kind kind, |
374 LocationSummary* locs); | 367 LocationSummary* locs); |
375 | 368 |
376 void GenerateDartCall(intptr_t deopt_id, | 369 void GenerateDartCall(intptr_t deopt_id, |
377 TokenPosition token_pos, | 370 TokenPosition token_pos, |
378 const StubEntry& stub_entry, | 371 const StubEntry& stub_entry, |
379 RawPcDescriptors::Kind kind, | 372 RawPcDescriptors::Kind kind, |
380 LocationSummary* locs); | 373 LocationSummary* locs); |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
467 TokenPosition token_pos); | 460 TokenPosition token_pos); |
468 Condition EmitEqualityRegRegCompare(Register left, | 461 Condition EmitEqualityRegRegCompare(Register left, |
469 Register right, | 462 Register right, |
470 bool needs_number_check, | 463 bool needs_number_check, |
471 TokenPosition token_pos); | 464 TokenPosition token_pos); |
472 | 465 |
473 bool NeedsEdgeCounter(TargetEntryInstr* block); | 466 bool NeedsEdgeCounter(TargetEntryInstr* block); |
474 | 467 |
475 void EmitEdgeCounter(intptr_t edge_id); | 468 void EmitEdgeCounter(intptr_t edge_id); |
476 #endif // !defined(TARGET_ARCH_DBC) | 469 #endif // !defined(TARGET_ARCH_DBC) |
477 void EmitCatchEntryState( | |
478 Environment* env = NULL, | |
479 intptr_t try_index = CatchClauseNode::kInvalidTryIndex); | |
480 | 470 |
481 void EmitCallsiteMetaData(TokenPosition token_pos, | 471 void EmitTrySync(Instruction* instr, intptr_t try_index); |
482 intptr_t deopt_id, | |
483 RawPcDescriptors::Kind kind, | |
484 LocationSummary* locs); | |
485 | 472 |
486 void EmitComment(Instruction* instr); | 473 void EmitComment(Instruction* instr); |
487 | 474 |
488 intptr_t StackSize() const; | 475 intptr_t StackSize() const; |
489 | 476 |
490 // Returns assembler label associated with the given block entry. | 477 // Returns assembler label associated with the given block entry. |
491 Label* GetJumpLabel(BlockEntryInstr* block_entry) const; | 478 Label* GetJumpLabel(BlockEntryInstr* block_entry) const; |
492 bool WasCompacted(BlockEntryInstr* block_entry) const; | 479 bool WasCompacted(BlockEntryInstr* block_entry) const; |
493 | 480 |
494 // Returns the label of the fall-through of the current block. | 481 // Returns the label of the fall-through of the current block. |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
536 | 523 |
537 CompilerDeoptInfo* AddDeoptIndexAtCall(intptr_t deopt_id); | 524 CompilerDeoptInfo* AddDeoptIndexAtCall(intptr_t deopt_id); |
538 | 525 |
539 void AddSlowPathCode(SlowPathCode* slow_path); | 526 void AddSlowPathCode(SlowPathCode* slow_path); |
540 | 527 |
541 void FinalizeExceptionHandlers(const Code& code); | 528 void FinalizeExceptionHandlers(const Code& code); |
542 void FinalizePcDescriptors(const Code& code); | 529 void FinalizePcDescriptors(const Code& code); |
543 RawArray* CreateDeoptInfo(Assembler* assembler); | 530 RawArray* CreateDeoptInfo(Assembler* assembler); |
544 void FinalizeStackMaps(const Code& code); | 531 void FinalizeStackMaps(const Code& code); |
545 void FinalizeVarDescriptors(const Code& code); | 532 void FinalizeVarDescriptors(const Code& code); |
546 void FinalizeCatchEntryStateMap(const Code& code); | |
547 void FinalizeStaticCallTargetsTable(const Code& code); | 533 void FinalizeStaticCallTargetsTable(const Code& code); |
548 void FinalizeCodeSourceMap(const Code& code); | 534 void FinalizeCodeSourceMap(const Code& code); |
549 | 535 |
550 const Class& double_class() const { return double_class_; } | 536 const Class& double_class() const { return double_class_; } |
551 const Class& mint_class() const { return mint_class_; } | 537 const Class& mint_class() const { return mint_class_; } |
552 const Class& float32x4_class() const { return float32x4_class_; } | 538 const Class& float32x4_class() const { return float32x4_class_; } |
553 const Class& float64x2_class() const { return float64x2_class_; } | 539 const Class& float64x2_class() const { return float64x2_class_; } |
554 const Class& int32x4_class() const { return int32x4_class_; } | 540 const Class& int32x4_class() const { return int32x4_class_; } |
555 | 541 |
556 const Class& BoxClassFor(Representation rep); | 542 const Class& BoxClassFor(Representation rep); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
616 void RecordAfterCallHelper(TokenPosition token_pos, | 602 void RecordAfterCallHelper(TokenPosition token_pos, |
617 intptr_t deopt_id, | 603 intptr_t deopt_id, |
618 intptr_t argument_count, | 604 intptr_t argument_count, |
619 CallResult result, | 605 CallResult result, |
620 LocationSummary* locs); | 606 LocationSummary* locs); |
621 void RecordAfterCall(Instruction* instr, CallResult result); | 607 void RecordAfterCall(Instruction* instr, CallResult result); |
622 #endif | 608 #endif |
623 | 609 |
624 private: | 610 private: |
625 friend class CheckStackOverflowSlowPath; // For pending_deoptimization_env_. | 611 friend class CheckStackOverflowSlowPath; // For pending_deoptimization_env_. |
626 friend class CheckedSmiSlowPath; // Same. | |
627 friend class CheckedSmiComparisonSlowPath; // Same. | |
628 | 612 |
629 static bool ShouldInlineSmiStringHashCode(const ICData& ic_data); | 613 static bool ShouldInlineSmiStringHashCode(const ICData& ic_data); |
630 | 614 |
631 void EmitFrameEntry(); | 615 void EmitFrameEntry(); |
632 | 616 |
633 void AddStaticCallTarget(const Function& function); | 617 void AddStaticCallTarget(const Function& function); |
634 | 618 |
635 void GenerateDeferredCode(); | 619 void GenerateDeferredCode(); |
636 | 620 |
637 void EmitInstructionPrologue(Instruction* instr); | 621 void EmitInstructionPrologue(Instruction* instr); |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
780 #endif | 764 #endif |
781 | 765 |
782 // Compiler specific per-block state. Indexed by postorder block number | 766 // Compiler specific per-block state. Indexed by postorder block number |
783 // for convenience. This is not the block's index in the block order, | 767 // for convenience. This is not the block's index in the block order, |
784 // which is reverse postorder. | 768 // which is reverse postorder. |
785 BlockEntryInstr* current_block_; | 769 BlockEntryInstr* current_block_; |
786 ExceptionHandlerList* exception_handlers_list_; | 770 ExceptionHandlerList* exception_handlers_list_; |
787 DescriptorList* pc_descriptors_list_; | 771 DescriptorList* pc_descriptors_list_; |
788 StackMapTableBuilder* stackmap_table_builder_; | 772 StackMapTableBuilder* stackmap_table_builder_; |
789 CodeSourceMapBuilder* code_source_map_builder_; | 773 CodeSourceMapBuilder* code_source_map_builder_; |
790 CatchEntryStateMapBuilder* catch_entry_state_maps_builder_; | |
791 GrowableArray<BlockInfo*> block_info_; | 774 GrowableArray<BlockInfo*> block_info_; |
792 GrowableArray<CompilerDeoptInfo*> deopt_infos_; | 775 GrowableArray<CompilerDeoptInfo*> deopt_infos_; |
793 GrowableArray<SlowPathCode*> slow_path_code_; | 776 GrowableArray<SlowPathCode*> slow_path_code_; |
794 // Stores static call targets as well as stub targets. | 777 // Stores static call targets as well as stub targets. |
795 // TODO(srdjan): Evaluate if we should store allocation stub targets into a | 778 // TODO(srdjan): Evaluate if we should store allocation stub targets into a |
796 // separate table? | 779 // separate table? |
797 GrowableArray<StaticCallsStruct*> static_calls_target_table_; | 780 GrowableArray<StaticCallsStruct*> static_calls_target_table_; |
798 const bool is_optimizing_; | 781 const bool is_optimizing_; |
799 // Set to true if optimized code has IC calls. | 782 // Set to true if optimized code has IC calls. |
800 bool may_reoptimize_; | 783 bool may_reoptimize_; |
(...skipping 19 matching lines...) Expand all Loading... |
820 ZoneGrowableArray<const ICData*>* deopt_id_to_ic_data_; | 803 ZoneGrowableArray<const ICData*>* deopt_id_to_ic_data_; |
821 | 804 |
822 Array& edge_counters_array_; | 805 Array& edge_counters_array_; |
823 | 806 |
824 DISALLOW_COPY_AND_ASSIGN(FlowGraphCompiler); | 807 DISALLOW_COPY_AND_ASSIGN(FlowGraphCompiler); |
825 }; | 808 }; |
826 | 809 |
827 } // namespace dart | 810 } // namespace dart |
828 | 811 |
829 #endif // RUNTIME_VM_FLOW_GRAPH_COMPILER_H_ | 812 #endif // RUNTIME_VM_FLOW_GRAPH_COMPILER_H_ |
OLD | NEW |