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" |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
85 } | 85 } |
86 | 86 |
87 Isolate* isolate() const { return isolate_; } | 87 Isolate* isolate() const { return isolate_; } |
88 | 88 |
89 intptr_t source_frame_size() const { return source_frame_size_; } | 89 intptr_t source_frame_size() const { return source_frame_size_; } |
90 intptr_t dest_frame_size() const { return dest_frame_size_; } | 90 intptr_t dest_frame_size() const { return dest_frame_size_; } |
91 | 91 |
92 RawCode* code() const { return code_; } | 92 RawCode* code() const { return code_; } |
93 | 93 |
94 ICData::DeoptReasonId deopt_reason() const { return deopt_reason_; } | 94 ICData::DeoptReasonId deopt_reason() const { return deopt_reason_; } |
| 95 bool HasDeoptFlag(ICData::DeoptFlags flag) { |
| 96 return (deopt_flags_ & flag) != 0; |
| 97 } |
95 | 98 |
96 RawDeoptInfo* deopt_info() const { return deopt_info_; } | 99 RawDeoptInfo* deopt_info() const { return deopt_info_; } |
97 | 100 |
98 // Fills the destination frame but defers materialization of | 101 // Fills the destination frame but defers materialization of |
99 // objects. | 102 // objects. |
100 void FillDestFrame(); | 103 void FillDestFrame(); |
101 | 104 |
102 // Materializes all deferred objects. Returns the total number of | 105 // Materializes all deferred objects. Returns the total number of |
103 // artificial arguments used during deoptimization. | 106 // artificial arguments used during deoptimization. |
104 intptr_t MaterializeDeferredObjects(); | 107 intptr_t MaterializeDeferredObjects(); |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 bool dest_frame_is_allocated_; | 187 bool dest_frame_is_allocated_; |
185 intptr_t* dest_frame_; | 188 intptr_t* dest_frame_; |
186 intptr_t dest_frame_size_; | 189 intptr_t dest_frame_size_; |
187 bool source_frame_is_allocated_; | 190 bool source_frame_is_allocated_; |
188 intptr_t* source_frame_; | 191 intptr_t* source_frame_; |
189 intptr_t source_frame_size_; | 192 intptr_t source_frame_size_; |
190 intptr_t* cpu_registers_; | 193 intptr_t* cpu_registers_; |
191 fpu_register_t* fpu_registers_; | 194 fpu_register_t* fpu_registers_; |
192 intptr_t num_args_; | 195 intptr_t num_args_; |
193 ICData::DeoptReasonId deopt_reason_; | 196 ICData::DeoptReasonId deopt_reason_; |
| 197 uint32_t deopt_flags_; |
194 intptr_t caller_fp_; | 198 intptr_t caller_fp_; |
195 Isolate* isolate_; | 199 Isolate* isolate_; |
196 | 200 |
197 DeferredSlot* deferred_slots_; | 201 DeferredSlot* deferred_slots_; |
198 | 202 |
199 intptr_t deferred_objects_count_; | 203 intptr_t deferred_objects_count_; |
200 DeferredObject** deferred_objects_; | 204 DeferredObject** deferred_objects_; |
201 | 205 |
202 DISALLOW_COPY_AND_ASSIGN(DeoptContext); | 206 DISALLOW_COPY_AND_ASSIGN(DeoptContext); |
203 }; | 207 }; |
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
479 class DeoptTable : public AllStatic { | 483 class DeoptTable : public AllStatic { |
480 public: | 484 public: |
481 // Return the array size in elements for a given number of table entries. | 485 // Return the array size in elements for a given number of table entries. |
482 static intptr_t SizeFor(intptr_t length); | 486 static intptr_t SizeFor(intptr_t length); |
483 | 487 |
484 // Set the entry at the given index into the table (not an array index). | 488 // Set the entry at the given index into the table (not an array index). |
485 static void SetEntry(const Array& table, | 489 static void SetEntry(const Array& table, |
486 intptr_t index, | 490 intptr_t index, |
487 const Smi& offset, | 491 const Smi& offset, |
488 const DeoptInfo& info, | 492 const DeoptInfo& info, |
489 const Smi& reason); | 493 const Smi& reason_and_flags); |
490 | 494 |
491 // Return the length of the table in entries. | 495 // Return the length of the table in entries. |
492 static intptr_t GetLength(const Array& table); | 496 static intptr_t GetLength(const Array& table); |
493 | 497 |
494 // Set the output parameters (offset, info, reason) to the entry values at | 498 // Set the output parameters (offset, info, reason) to the entry values at |
495 // the index into the table (not an array index). | 499 // the index into the table (not an array index). |
496 static void GetEntry(const Array& table, | 500 static void GetEntry(const Array& table, |
497 intptr_t index, | 501 intptr_t index, |
498 Smi* offset, | 502 Smi* offset, |
499 DeoptInfo* info, | 503 DeoptInfo* info, |
500 Smi* reason); | 504 Smi* reason_and_flags); |
| 505 |
| 506 static RawSmi* EncodeReasonAndFlags(ICData::DeoptReasonId reason, |
| 507 uint32_t flags) { |
| 508 return Smi::New(ReasonField::encode(reason) | |
| 509 FlagsField::encode(flags)); |
| 510 } |
| 511 |
| 512 class ReasonField : public BitField<ICData::DeoptReasonId, 0, 8> { }; |
| 513 class FlagsField : public BitField<uint32_t, 8, 8> { }; |
501 | 514 |
502 private: | 515 private: |
503 static const intptr_t kEntrySize = 3; | 516 static const intptr_t kEntrySize = 3; |
504 }; | 517 }; |
505 | 518 |
506 } // namespace dart | 519 } // namespace dart |
507 | 520 |
508 #endif // VM_DEOPT_INSTRUCTIONS_H_ | 521 #endif // VM_DEOPT_INSTRUCTIONS_H_ |
OLD | NEW |