OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_COMPILER_INSTRUCTION_H_ | 5 #ifndef V8_COMPILER_INSTRUCTION_H_ |
6 #define V8_COMPILER_INSTRUCTION_H_ | 6 #define V8_COMPILER_INSTRUCTION_H_ |
7 | 7 |
8 #include <deque> | 8 #include <deque> |
9 #include <iosfwd> | 9 #include <iosfwd> |
10 #include <map> | 10 #include <map> |
11 #include <set> | 11 #include <set> |
12 | 12 |
13 #include "src/compiler/common-operator.h" | 13 #include "src/compiler/common-operator.h" |
14 #include "src/compiler/frame.h" | 14 #include "src/compiler/frame.h" |
15 #include "src/compiler/instruction-codes.h" | 15 #include "src/compiler/instruction-codes.h" |
16 #include "src/compiler/opcodes.h" | 16 #include "src/compiler/opcodes.h" |
17 #include "src/compiler/register-configuration.h" | 17 #include "src/compiler/register-configuration.h" |
18 #include "src/compiler/source-position.h" | 18 #include "src/compiler/source-position.h" |
19 #include "src/zone-allocator.h" | 19 #include "src/zone-allocator.h" |
20 | 20 |
21 namespace v8 { | 21 namespace v8 { |
22 namespace internal { | 22 namespace internal { |
23 namespace compiler { | 23 namespace compiler { |
24 | 24 |
25 class Schedule; | 25 class Schedule; |
26 | 26 |
27 // A couple of reserved opcodes are used for internal use. | |
28 const InstructionCode kSourcePositionInstruction = -1; | |
29 | |
30 class InstructionOperand { | 27 class InstructionOperand { |
31 public: | 28 public: |
32 static const int kInvalidVirtualRegister = -1; | 29 static const int kInvalidVirtualRegister = -1; |
33 | 30 |
34 // TODO(dcarney): recover bit. INVALID can be represented as UNALLOCATED with | 31 // TODO(dcarney): recover bit. INVALID can be represented as UNALLOCATED with |
35 // kInvalidVirtualRegister and some DCHECKS. | 32 // kInvalidVirtualRegister and some DCHECKS. |
36 enum Kind { INVALID, UNALLOCATED, CONSTANT, IMMEDIATE, ALLOCATED }; | 33 enum Kind { INVALID, UNALLOCATED, CONSTANT, IMMEDIATE, ALLOCATED }; |
37 | 34 |
38 InstructionOperand() : InstructionOperand(INVALID) {} | 35 InstructionOperand() : InstructionOperand(INVALID) {} |
39 | 36 |
(...skipping 577 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
617 } | 614 } |
618 | 615 |
619 Instruction* MarkAsCall() { | 616 Instruction* MarkAsCall() { |
620 bit_field_ = IsCallField::update(bit_field_, true); | 617 bit_field_ = IsCallField::update(bit_field_, true); |
621 return this; | 618 return this; |
622 } | 619 } |
623 bool IsCall() const { return IsCallField::decode(bit_field_); } | 620 bool IsCall() const { return IsCallField::decode(bit_field_); } |
624 bool NeedsReferenceMap() const { return IsCall(); } | 621 bool NeedsReferenceMap() const { return IsCall(); } |
625 bool HasReferenceMap() const { return reference_map_ != NULL; } | 622 bool HasReferenceMap() const { return reference_map_ != NULL; } |
626 | 623 |
627 bool IsSourcePosition() const { | |
628 return opcode() == kSourcePositionInstruction; | |
629 } | |
630 | |
631 bool ClobbersRegisters() const { return IsCall(); } | 624 bool ClobbersRegisters() const { return IsCall(); } |
632 bool ClobbersTemps() const { return IsCall(); } | 625 bool ClobbersTemps() const { return IsCall(); } |
633 bool ClobbersDoubleRegisters() const { return IsCall(); } | 626 bool ClobbersDoubleRegisters() const { return IsCall(); } |
634 ReferenceMap* reference_map() const { return reference_map_; } | 627 ReferenceMap* reference_map() const { return reference_map_; } |
635 | 628 |
636 void set_reference_map(ReferenceMap* map) { | 629 void set_reference_map(ReferenceMap* map) { |
637 DCHECK(NeedsReferenceMap()); | 630 DCHECK(NeedsReferenceMap()); |
638 DCHECK(!reference_map_); | 631 DCHECK(!reference_map_); |
639 reference_map_ = map; | 632 reference_map_ = map; |
640 } | 633 } |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
702 }; | 695 }; |
703 | 696 |
704 | 697 |
705 struct PrintableInstruction { | 698 struct PrintableInstruction { |
706 const RegisterConfiguration* register_configuration_; | 699 const RegisterConfiguration* register_configuration_; |
707 const Instruction* instr_; | 700 const Instruction* instr_; |
708 }; | 701 }; |
709 std::ostream& operator<<(std::ostream& os, const PrintableInstruction& instr); | 702 std::ostream& operator<<(std::ostream& os, const PrintableInstruction& instr); |
710 | 703 |
711 | 704 |
712 class SourcePositionInstruction FINAL : public Instruction { | |
713 public: | |
714 static SourcePositionInstruction* New(Zone* zone, SourcePosition position) { | |
715 void* buffer = zone->New(sizeof(SourcePositionInstruction)); | |
716 return new (buffer) SourcePositionInstruction(position); | |
717 } | |
718 | |
719 SourcePosition source_position() const { return source_position_; } | |
720 | |
721 static SourcePositionInstruction* cast(Instruction* instr) { | |
722 DCHECK(instr->IsSourcePosition()); | |
723 return static_cast<SourcePositionInstruction*>(instr); | |
724 } | |
725 | |
726 static const SourcePositionInstruction* cast(const Instruction* instr) { | |
727 DCHECK(instr->IsSourcePosition()); | |
728 return static_cast<const SourcePositionInstruction*>(instr); | |
729 } | |
730 | |
731 private: | |
732 explicit SourcePositionInstruction(SourcePosition source_position) | |
733 : Instruction(kSourcePositionInstruction), | |
734 source_position_(source_position) { | |
735 DCHECK(!source_position_.IsInvalid()); | |
736 DCHECK(!source_position_.IsUnknown()); | |
737 } | |
738 | |
739 SourcePosition source_position_; | |
740 }; | |
741 | |
742 | |
743 class RpoNumber FINAL { | 705 class RpoNumber FINAL { |
744 public: | 706 public: |
745 static const int kInvalidRpoNumber = -1; | 707 static const int kInvalidRpoNumber = -1; |
746 int ToInt() const { | 708 int ToInt() const { |
747 DCHECK(IsValid()); | 709 DCHECK(IsValid()); |
748 return index_; | 710 return index_; |
749 } | 711 } |
750 size_t ToSize() const { | 712 size_t ToSize() const { |
751 DCHECK(IsValid()); | 713 DCHECK(IsValid()); |
752 return static_cast<size_t>(index_); | 714 return static_cast<size_t>(index_); |
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1106 explicit StateId(int id) : id_(id) {} | 1068 explicit StateId(int id) : id_(id) {} |
1107 int id_; | 1069 int id_; |
1108 }; | 1070 }; |
1109 | 1071 |
1110 StateId AddFrameStateDescriptor(FrameStateDescriptor* descriptor); | 1072 StateId AddFrameStateDescriptor(FrameStateDescriptor* descriptor); |
1111 FrameStateDescriptor* GetFrameStateDescriptor(StateId deoptimization_id); | 1073 FrameStateDescriptor* GetFrameStateDescriptor(StateId deoptimization_id); |
1112 int GetFrameStateDescriptorCount(); | 1074 int GetFrameStateDescriptorCount(); |
1113 | 1075 |
1114 RpoNumber InputRpo(Instruction* instr, size_t index); | 1076 RpoNumber InputRpo(Instruction* instr, size_t index); |
1115 | 1077 |
| 1078 bool GetSourcePosition(const Instruction* instr, |
| 1079 SourcePosition* result) const; |
| 1080 void SetSourcePosition(const Instruction* instr, SourcePosition value); |
| 1081 |
1116 private: | 1082 private: |
1117 friend std::ostream& operator<<(std::ostream& os, | 1083 friend std::ostream& operator<<(std::ostream& os, |
1118 const PrintableInstructionSequence& code); | 1084 const PrintableInstructionSequence& code); |
1119 | 1085 |
1120 typedef std::set<int, std::less<int>, ZoneIntAllocator> VirtualRegisterSet; | 1086 typedef std::set<int, std::less<int>, ZoneIntAllocator> VirtualRegisterSet; |
| 1087 typedef ZoneMap<const Instruction*, SourcePosition> SourcePositionMap; |
1121 | 1088 |
1122 Isolate* isolate_; | 1089 Isolate* isolate_; |
1123 Zone* const zone_; | 1090 Zone* const zone_; |
1124 InstructionBlocks* const instruction_blocks_; | 1091 InstructionBlocks* const instruction_blocks_; |
| 1092 SourcePositionMap source_positions_; |
1125 IntVector block_starts_; | 1093 IntVector block_starts_; |
1126 ConstantMap constants_; | 1094 ConstantMap constants_; |
1127 Immediates immediates_; | 1095 Immediates immediates_; |
1128 InstructionDeque instructions_; | 1096 InstructionDeque instructions_; |
1129 int next_virtual_register_; | 1097 int next_virtual_register_; |
1130 ReferenceMapDeque reference_maps_; | 1098 ReferenceMapDeque reference_maps_; |
1131 VirtualRegisterSet doubles_; | 1099 VirtualRegisterSet doubles_; |
1132 VirtualRegisterSet references_; | 1100 VirtualRegisterSet references_; |
1133 DeoptimizationVector deoptimization_entries_; | 1101 DeoptimizationVector deoptimization_entries_; |
1134 | 1102 |
1135 DISALLOW_COPY_AND_ASSIGN(InstructionSequence); | 1103 DISALLOW_COPY_AND_ASSIGN(InstructionSequence); |
1136 }; | 1104 }; |
1137 | 1105 |
1138 | 1106 |
1139 struct PrintableInstructionSequence { | 1107 struct PrintableInstructionSequence { |
1140 const RegisterConfiguration* register_configuration_; | 1108 const RegisterConfiguration* register_configuration_; |
1141 const InstructionSequence* sequence_; | 1109 const InstructionSequence* sequence_; |
1142 }; | 1110 }; |
1143 | 1111 |
1144 | 1112 |
1145 std::ostream& operator<<(std::ostream& os, | 1113 std::ostream& operator<<(std::ostream& os, |
1146 const PrintableInstructionSequence& code); | 1114 const PrintableInstructionSequence& code); |
1147 | 1115 |
1148 } // namespace compiler | 1116 } // namespace compiler |
1149 } // namespace internal | 1117 } // namespace internal |
1150 } // namespace v8 | 1118 } // namespace v8 |
1151 | 1119 |
1152 #endif // V8_COMPILER_INSTRUCTION_H_ | 1120 #endif // V8_COMPILER_INSTRUCTION_H_ |
OLD | NEW |