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 #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/code_generator.h" | 10 #include "vm/code_generator.h" |
11 #include "vm/growable_array.h" | 11 #include "vm/growable_array.h" |
12 #include "vm/object.h" | 12 #include "vm/object.h" |
13 | 13 |
14 namespace dart { | 14 namespace dart { |
15 | 15 |
16 class Location; | 16 class Location; |
17 class Value; | 17 class Value; |
18 class MaterializeObjectInstr; | 18 class MaterializeObjectInstr; |
19 | 19 |
20 // Holds all data relevant for execution of deoptimization instructions. | 20 // Holds all data relevant for execution of deoptimization instructions. |
21 class DeoptimizationContext : public ValueObject { | 21 class DeoptimizationContext : public ValueObject { |
22 public: | 22 public: |
23 // 'to_frame_start' points to the return address just below the frame's | 23 // 'to_frame_start' points to the fixed size portion of the frame under sp. |
24 // stack pointer (kPcAddressOffsetFromSp). 'num_args' is 0 if there are no | 24 // 'num_args' is 0 if there are no arguments or if there are optional |
25 // arguments or if there are optional arguments. | 25 // arguments. |
26 DeoptimizationContext(intptr_t* to_frame_start, | 26 DeoptimizationContext(intptr_t* to_frame_start, |
27 intptr_t to_frame_size, | 27 intptr_t to_frame_size, |
28 const Array& object_table, | 28 const Array& object_table, |
29 intptr_t num_args, | 29 intptr_t num_args, |
30 DeoptReasonId deopt_reason); | 30 DeoptReasonId deopt_reason); |
31 | 31 |
32 intptr_t* GetFromFrameAddressAt(intptr_t index) const { | 32 intptr_t* GetFromFrameAddressAt(intptr_t index) const { |
33 ASSERT((0 <= index) && (index < from_frame_size_)); | 33 ASSERT((0 <= index) && (index < from_frame_size_)); |
34 return &from_frame_[index]; | 34 return &from_frame_[index]; |
35 } | 35 } |
36 | 36 |
37 intptr_t* GetToFrameAddressAt(intptr_t index) const { | 37 intptr_t* GetToFrameAddressAt(intptr_t index) const { |
38 ASSERT((0 <= index) && (index < to_frame_size_)); | 38 ASSERT((0 <= index) && (index < to_frame_size_)); |
39 return &to_frame_[index]; | 39 return &to_frame_[index]; |
40 } | 40 } |
41 | 41 |
42 intptr_t GetFromFp() const; | 42 intptr_t GetFromFp() const; |
| 43 intptr_t GetFromPp() const; |
43 intptr_t GetFromPc() const; | 44 intptr_t GetFromPc() const; |
44 | 45 |
45 intptr_t GetCallerFp() const; | 46 intptr_t GetCallerFp() const; |
46 void SetCallerFp(intptr_t callers_fp); | 47 void SetCallerFp(intptr_t callers_fp); |
47 | 48 |
48 RawObject* ObjectAt(intptr_t index) const { | 49 RawObject* ObjectAt(intptr_t index) const { |
49 return object_table_.At(index); | 50 return object_table_.At(index); |
50 } | 51 } |
51 | 52 |
52 intptr_t RegisterValue(Register reg) const { | 53 intptr_t RegisterValue(Register reg) const { |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
102 kFpuRegister, | 103 kFpuRegister, |
103 kInt64FpuRegister, | 104 kInt64FpuRegister, |
104 kFloat32x4FpuRegister, | 105 kFloat32x4FpuRegister, |
105 kUint32x4FpuRegister, | 106 kUint32x4FpuRegister, |
106 kStackSlot, | 107 kStackSlot, |
107 kDoubleStackSlot, | 108 kDoubleStackSlot, |
108 kInt64StackSlot, | 109 kInt64StackSlot, |
109 kFloat32x4StackSlot, | 110 kFloat32x4StackSlot, |
110 kUint32x4StackSlot, | 111 kUint32x4StackSlot, |
111 kPcMarker, | 112 kPcMarker, |
| 113 kPp, |
112 kCallerFp, | 114 kCallerFp, |
| 115 kCallerPp, |
113 kCallerPc, | 116 kCallerPc, |
114 kSuffix, | 117 kSuffix, |
115 kMaterializedObjectRef, | 118 kMaterializedObjectRef, |
116 kMaterializeObject | 119 kMaterializeObject |
117 }; | 120 }; |
118 | 121 |
119 static DeoptInstr* Create(intptr_t kind_as_int, intptr_t from_index); | 122 static DeoptInstr* Create(intptr_t kind_as_int, intptr_t from_index); |
120 | 123 |
121 DeoptInstr() {} | 124 DeoptInstr() {} |
122 virtual ~DeoptInstr() {} | 125 virtual ~DeoptInstr() {} |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 const GrowableObjectArray& object_table() { return object_table_; } | 176 const GrowableObjectArray& object_table() { return object_table_; } |
174 | 177 |
175 // Return address before instruction. | 178 // Return address before instruction. |
176 void AddReturnAddress(const Function& function, | 179 void AddReturnAddress(const Function& function, |
177 intptr_t deopt_id, | 180 intptr_t deopt_id, |
178 intptr_t to_index); | 181 intptr_t to_index); |
179 | 182 |
180 // Copy from optimized frame to unoptimized. | 183 // Copy from optimized frame to unoptimized. |
181 void AddCopy(Value* value, const Location& from_loc, intptr_t to_index); | 184 void AddCopy(Value* value, const Location& from_loc, intptr_t to_index); |
182 void AddPcMarker(const Function& function, intptr_t to_index); | 185 void AddPcMarker(const Function& function, intptr_t to_index); |
| 186 void AddPp(const Function& function, intptr_t to_index); |
183 void AddCallerFp(intptr_t to_index); | 187 void AddCallerFp(intptr_t to_index); |
| 188 void AddCallerPp(intptr_t to_index); |
184 void AddCallerPc(intptr_t to_index); | 189 void AddCallerPc(intptr_t to_index); |
185 | 190 |
186 // Add object to be materialized. Emit kMaterializeObject instruction. | 191 // Add object to be materialized. Emit kMaterializeObject instruction. |
187 void AddMaterialization(MaterializeObjectInstr* mat); | 192 void AddMaterialization(MaterializeObjectInstr* mat); |
188 | 193 |
189 // For every materialized object emit instructions describing data required | 194 // For every materialized object emit instructions describing data required |
190 // for materialization: class of the instance to allocate and field-value | 195 // for materialization: class of the instance to allocate and field-value |
191 // pairs for initialization. | 196 // pairs for initialization. |
192 // Emitted instructions are expected to follow return-address slot emitted | 197 // Emitted instructions are expected to follow fixed size section of frame |
193 // first. This way they become a part of the bottom-most deoptimized frame | 198 // emitted first. This way they become a part of the bottom-most deoptimized |
194 // and are discoverable by GC. | 199 // frame and are discoverable by GC. |
195 // At deoptimization they will be removed by the stub at the very end: | 200 // At deoptimization they will be removed by the stub at the very end: |
196 // after they were used to materialize objects. | 201 // after they were used to materialize objects. |
197 // Returns the index of the next stack slot. Used for verification. | 202 // Returns the index of the next stack slot. Used for verification. |
198 intptr_t EmitMaterializationArguments(); | 203 intptr_t EmitMaterializationArguments(intptr_t to_index); |
199 | 204 |
200 RawDeoptInfo* CreateDeoptInfo(); | 205 RawDeoptInfo* CreateDeoptInfo(); |
201 | 206 |
202 // Mark the actual start of the frame description after all materialization | 207 // Mark the actual start of the frame description after all materialization |
203 // instructions were emitted. Used for verification purposes. | 208 // instructions were emitted. Used for verification purposes. |
204 void MarkFrameStart() { | 209 void MarkFrameStart() { |
205 ASSERT(frame_start_ == -1); | 210 ASSERT(frame_start_ == -1); |
206 frame_start_ = instructions_.length(); | 211 frame_start_ = instructions_.length(); |
207 } | 212 } |
208 | 213 |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
261 DeoptInfo* info, | 266 DeoptInfo* info, |
262 Smi* reason); | 267 Smi* reason); |
263 | 268 |
264 private: | 269 private: |
265 static const intptr_t kEntrySize = 3; | 270 static const intptr_t kEntrySize = 3; |
266 }; | 271 }; |
267 | 272 |
268 } // namespace dart | 273 } // namespace dart |
269 | 274 |
270 #endif // VM_DEOPT_INSTRUCTIONS_H_ | 275 #endif // VM_DEOPT_INSTRUCTIONS_H_ |
OLD | NEW |