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 VM_DEOPT_INSTRUCTIONS_H_ | 5 #ifndef VM_DEOPT_INSTRUCTIONS_H_ |
6 #define VM_DEOPT_INSTRUCTIONS_H_ | 6 #define VM_DEOPT_INSTRUCTIONS_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/growable_array.h" | 10 #include "vm/growable_array.h" |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
77 DISALLOW_COPY_AND_ASSIGN(DeoptimizationContext); | 77 DISALLOW_COPY_AND_ASSIGN(DeoptimizationContext); |
78 }; | 78 }; |
79 | 79 |
80 | 80 |
81 | 81 |
82 // Represents one deopt instruction, e.g, setup return address, store object, | 82 // Represents one deopt instruction, e.g, setup return address, store object, |
83 // store register, etc. The target is defined by instruction's position in | 83 // store register, etc. The target is defined by instruction's position in |
84 // the deopt-info array. | 84 // the deopt-info array. |
85 class DeoptInstr : public ZoneAllocated { | 85 class DeoptInstr : public ZoneAllocated { |
86 public: | 86 public: |
| 87 enum Kind { |
| 88 kRetAfterAddress, |
| 89 kRetBeforeAddress, |
| 90 kConstant, |
| 91 kRegister, |
| 92 kXmmRegister, |
| 93 kInt64XmmRegister, |
| 94 kStackSlot, |
| 95 kDoubleStackSlot, |
| 96 kInt64StackSlot, |
| 97 kPcMarker, |
| 98 kCallerFp, |
| 99 kCallerPc, |
| 100 kSuffix, |
| 101 }; |
| 102 |
87 static DeoptInstr* Create(intptr_t kind_as_int, intptr_t from_index); | 103 static DeoptInstr* Create(intptr_t kind_as_int, intptr_t from_index); |
88 | 104 |
89 DeoptInstr() {} | 105 DeoptInstr() {} |
90 virtual ~DeoptInstr() {} | 106 virtual ~DeoptInstr() {} |
91 | 107 |
92 virtual const char* ToCString() const = 0; | 108 virtual const char* ToCString() const = 0; |
93 | 109 |
94 virtual void Execute(DeoptimizationContext* deopt_context, | 110 virtual void Execute(DeoptimizationContext* deopt_context, |
95 intptr_t to_index) = 0; | 111 intptr_t to_index) = 0; |
96 | 112 |
| 113 bool Equals(const DeoptInstr& other) const { |
| 114 return (kind() == other.kind()) && (from_index() == other.from_index()); |
| 115 } |
| 116 |
| 117 // Decode the payload of a suffix command. Return the suffix length and |
| 118 // set the output parameter info_number to the index of the shared suffix. |
| 119 static intptr_t DecodeSuffix(intptr_t from_index, intptr_t* info_number); |
| 120 |
97 protected: | 121 protected: |
98 enum Kind { | |
99 kSetRetAfterAddress, | |
100 kSetRetBeforeAddress, | |
101 kCopyConstant, | |
102 kCopyRegister, | |
103 kCopyXmmRegister, | |
104 kCopyInt64XmmRegister, | |
105 kCopyStackSlot, | |
106 kCopyDoubleStackSlot, | |
107 kCopyInt64StackSlot, | |
108 kSetPcMarker, | |
109 kSetCallerFp, | |
110 kSetCallerPc, | |
111 }; | |
112 | |
113 virtual DeoptInstr::Kind kind() const = 0; | 122 virtual DeoptInstr::Kind kind() const = 0; |
114 virtual intptr_t from_index() const = 0; | 123 virtual intptr_t from_index() const = 0; |
115 | 124 |
116 friend class DeoptInfoBuilder; | 125 friend class DeoptInfoBuilder; |
117 | 126 |
118 private: | 127 private: |
119 DISALLOW_COPY_AND_ASSIGN(DeoptInstr); | 128 DISALLOW_COPY_AND_ASSIGN(DeoptInstr); |
120 }; | 129 }; |
121 | 130 |
122 | 131 |
123 // Builds one instance of DeoptInfo. Call AddXXX methods in the order of | 132 // Builds a deoptimization info table, one DeoptInfo at a time. Call AddXXX |
124 // their target, starting wih deoptimized code continuation pc and ending with | 133 // methods in the order of their target, starting wih deoptimized code |
125 // the first argument of the deoptimized code. | 134 // continuation pc and ending with the first argument of the deoptimized |
| 135 // code. Call CreateDeoptInfo to write the accumulated instructions into |
| 136 // the heap and reset the builder's internal state for the next DeoptInfo. |
126 class DeoptInfoBuilder : public ValueObject { | 137 class DeoptInfoBuilder : public ValueObject { |
127 public: | 138 public: |
| 139 explicit DeoptInfoBuilder(const intptr_t num_args); |
| 140 |
128 // 'object_table' holds all objects referred to by DeoptInstr in | 141 // 'object_table' holds all objects referred to by DeoptInstr in |
129 // all DeoptInfo instances for a single Code object. | 142 // all DeoptInfo instances for a single Code object. |
130 DeoptInfoBuilder(const GrowableObjectArray& object_table, | 143 const GrowableObjectArray& object_table() { return object_table_; } |
131 const intptr_t num_args) | |
132 : instructions_(), | |
133 object_table_(object_table), | |
134 num_args_(num_args) {} | |
135 | 144 |
136 // Return address before instruction. | 145 // Return address before instruction. |
137 void AddReturnAddressBefore(const Function& function, | 146 void AddReturnAddressBefore(const Function& function, |
138 intptr_t deopt_id, | 147 intptr_t deopt_id, |
139 intptr_t to_index); | 148 intptr_t to_index); |
140 | 149 |
141 // Return address after instruction. | 150 // Return address after instruction. |
142 void AddReturnAddressAfter(const Function& function, | 151 void AddReturnAddressAfter(const Function& function, |
143 intptr_t deopt_id, | 152 intptr_t deopt_id, |
144 intptr_t to_index); | 153 intptr_t to_index); |
145 | 154 |
146 // Copy from optimized frame to unoptimized. | 155 // Copy from optimized frame to unoptimized. |
147 void AddCopy(const Location& from_loc, | 156 void AddCopy(const Location& from_loc, |
148 const Value& from_value, | 157 const Value& from_value, |
149 intptr_t to_index); | 158 intptr_t to_index); |
150 void AddPcMarker(const Function& function, intptr_t to_index); | 159 void AddPcMarker(const Function& function, intptr_t to_index); |
151 void AddCallerFp(intptr_t to_index); | 160 void AddCallerFp(intptr_t to_index); |
152 void AddCallerPc(intptr_t to_index); | 161 void AddCallerPc(intptr_t to_index); |
153 | 162 |
154 RawDeoptInfo* CreateDeoptInfo() const; | 163 RawDeoptInfo* CreateDeoptInfo(); |
155 | 164 |
156 private: | 165 private: |
| 166 class TrieNode; |
| 167 |
157 intptr_t FindOrAddObjectInTable(const Object& obj) const; | 168 intptr_t FindOrAddObjectInTable(const Object& obj) const; |
158 | 169 |
159 GrowableArray<DeoptInstr*> instructions_; | 170 GrowableArray<DeoptInstr*> instructions_; |
160 const GrowableObjectArray& object_table_; | 171 const GrowableObjectArray& object_table_; |
161 const intptr_t num_args_; | 172 const intptr_t num_args_; |
162 | 173 |
| 174 // Used to compress entries by sharing suffixes. |
| 175 TrieNode* trie_root_; |
| 176 intptr_t current_info_number_; |
| 177 |
163 DISALLOW_COPY_AND_ASSIGN(DeoptInfoBuilder); | 178 DISALLOW_COPY_AND_ASSIGN(DeoptInfoBuilder); |
164 }; | 179 }; |
165 | 180 |
166 | 181 |
167 // Utilities for managing the deopt table and its entries. The table is | 182 // Utilities for managing the deopt table and its entries. The table is |
168 // stored in an Array in the heap. It consists of triples of (PC offset, | 183 // stored in an Array in the heap. It consists of triples of (PC offset, |
169 // info, reason). Elements of each entry are stored consecutively in the | 184 // info, reason). Elements of each entry are stored consecutively in the |
170 // array. | 185 // array. |
171 class DeoptTable : public AllStatic { | 186 class DeoptTable : public AllStatic { |
172 public: | 187 public: |
(...skipping 18 matching lines...) Expand all Loading... |
191 DeoptInfo* info, | 206 DeoptInfo* info, |
192 Smi* reason); | 207 Smi* reason); |
193 | 208 |
194 private: | 209 private: |
195 static const intptr_t kEntrySize = 3; | 210 static const intptr_t kEntrySize = 3; |
196 }; | 211 }; |
197 | 212 |
198 } // namespace dart | 213 } // namespace dart |
199 | 214 |
200 #endif // VM_DEOPT_INSTRUCTIONS_H_ | 215 #endif // VM_DEOPT_INSTRUCTIONS_H_ |
OLD | NEW |