| 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 #include "vm/deopt_instructions.h" | 5 #include "vm/deopt_instructions.h" |
| 6 | 6 |
| 7 #include "vm/assembler.h" | 7 #include "vm/assembler.h" |
| 8 #include "vm/code_patcher.h" | 8 #include "vm/code_patcher.h" |
| 9 #include "vm/compiler.h" | 9 #include "vm/compiler.h" |
| 10 #include "vm/intermediate_language.h" | 10 #include "vm/intermediate_language.h" |
| 11 #include "vm/locations.h" | 11 #include "vm/locations.h" |
| 12 #include "vm/parser.h" | 12 #include "vm/parser.h" |
| 13 #include "vm/stack_frame.h" | 13 #include "vm/stack_frame.h" |
| 14 #include "vm/thread.h" | 14 #include "vm/thread.h" |
| 15 | 15 |
| 16 namespace dart { | 16 namespace dart { |
| 17 | 17 |
| 18 DEFINE_FLAG(bool, compress_deopt_info, true, | 18 DEFINE_FLAG(bool, compress_deopt_info, true, |
| 19 "Compress the size of the deoptimization info for optimized code."); | 19 "Compress the size of the deoptimization info for optimized code."); |
| 20 DECLARE_FLAG(bool, trace_deoptimization); | 20 DECLARE_FLAG(bool, trace_deoptimization); |
| 21 DECLARE_FLAG(bool, trace_deoptimization_verbose); | 21 DECLARE_FLAG(bool, trace_deoptimization_verbose); |
| 22 | 22 |
| 23 | 23 |
| 24 DeoptContext::DeoptContext(const StackFrame* frame, | 24 DeoptContext::DeoptContext(const StackFrame* frame, |
| 25 const Code& code, | 25 const Code& code, |
| 26 DestFrameOptions dest_options, | 26 DestFrameOptions dest_options, |
| 27 fpu_register_t* fpu_registers, | 27 fpu_register_t* fpu_registers, |
| 28 intptr_t* cpu_registers) | 28 intptr_t* cpu_registers) |
| 29 : code_(code.raw()), | 29 : code_(code.raw()), |
| 30 object_table_(code.object_table()), | 30 object_pool_(code.ObjectPool()), |
| 31 deopt_info_(TypedData::null()), | 31 deopt_info_(TypedData::null()), |
| 32 dest_frame_is_allocated_(false), | 32 dest_frame_is_allocated_(false), |
| 33 dest_frame_(NULL), | 33 dest_frame_(NULL), |
| 34 dest_frame_size_(0), | 34 dest_frame_size_(0), |
| 35 source_frame_is_allocated_(false), | 35 source_frame_is_allocated_(false), |
| 36 source_frame_(NULL), | 36 source_frame_(NULL), |
| 37 source_frame_size_(0), | 37 source_frame_size_(0), |
| 38 cpu_registers_(cpu_registers), | 38 cpu_registers_(cpu_registers), |
| 39 fpu_registers_(fpu_registers), | 39 fpu_registers_(fpu_registers), |
| 40 num_args_(0), | 40 num_args_(0), |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 123 for (intptr_t i = 0; i < deferred_objects_count_; i++) { | 123 for (intptr_t i = 0; i < deferred_objects_count_; i++) { |
| 124 delete deferred_objects_[i]; | 124 delete deferred_objects_[i]; |
| 125 } | 125 } |
| 126 delete[] deferred_objects_; | 126 delete[] deferred_objects_; |
| 127 deferred_objects_ = NULL; | 127 deferred_objects_ = NULL; |
| 128 deferred_objects_count_ = 0; | 128 deferred_objects_count_ = 0; |
| 129 } | 129 } |
| 130 | 130 |
| 131 | 131 |
| 132 void DeoptContext::VisitObjectPointers(ObjectPointerVisitor* visitor) { | 132 void DeoptContext::VisitObjectPointers(ObjectPointerVisitor* visitor) { |
| 133 visitor->VisitPointer(reinterpret_cast<RawObject**>(&object_table_)); | 133 visitor->VisitPointer(reinterpret_cast<RawObject**>(&object_pool_)); |
| 134 visitor->VisitPointer(reinterpret_cast<RawObject**>(&deopt_info_)); | 134 visitor->VisitPointer(reinterpret_cast<RawObject**>(&deopt_info_)); |
| 135 | 135 |
| 136 // Visit any object pointers on the destination stack. | 136 // Visit any object pointers on the destination stack. |
| 137 if (dest_frame_is_allocated_) { | 137 if (dest_frame_is_allocated_) { |
| 138 for (intptr_t i = 0; i < dest_frame_size_; i++) { | 138 for (intptr_t i = 0; i < dest_frame_size_; i++) { |
| 139 if (dest_frame_[i] != 0) { | 139 if (dest_frame_[i] != 0) { |
| 140 visitor->VisitPointer(reinterpret_cast<RawObject**>(&dest_frame_[i])); | 140 visitor->VisitPointer(reinterpret_cast<RawObject**>(&dest_frame_[i])); |
| 141 } | 141 } |
| 142 } | 142 } |
| 143 } | 143 } |
| (...skipping 765 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 909 } | 909 } |
| 910 | 910 |
| 911 private: | 911 private: |
| 912 const DeoptInstr* instruction_; // Instruction that was written. | 912 const DeoptInstr* instruction_; // Instruction that was written. |
| 913 const intptr_t info_number_; // Index of the deopt info it was written to. | 913 const intptr_t info_number_; // Index of the deopt info it was written to. |
| 914 | 914 |
| 915 GrowableArray<TrieNode*> children_; | 915 GrowableArray<TrieNode*> children_; |
| 916 }; | 916 }; |
| 917 | 917 |
| 918 | 918 |
| 919 DeoptInfoBuilder::DeoptInfoBuilder(Zone* zone, const intptr_t num_args) | 919 DeoptInfoBuilder::DeoptInfoBuilder(Zone* zone, |
| 920 const intptr_t num_args, |
| 921 Assembler* assembler) |
| 920 : zone_(zone), | 922 : zone_(zone), |
| 921 instructions_(), | 923 instructions_(), |
| 922 object_table_(GrowableObjectArray::Handle( | |
| 923 GrowableObjectArray::New(Heap::kOld))), | |
| 924 num_args_(num_args), | 924 num_args_(num_args), |
| 925 assembler_(assembler), |
| 925 trie_root_(new(zone) TrieNode()), | 926 trie_root_(new(zone) TrieNode()), |
| 926 current_info_number_(0), | 927 current_info_number_(0), |
| 927 frame_start_(-1), | 928 frame_start_(-1), |
| 928 materializations_() { | 929 materializations_() { |
| 929 } | 930 } |
| 930 | 931 |
| 931 | 932 |
| 932 intptr_t DeoptInfoBuilder::FindOrAddObjectInTable(const Object& obj) const { | 933 intptr_t DeoptInfoBuilder::FindOrAddObjectInTable(const Object& obj) const { |
| 933 for (intptr_t i = 0; i < object_table_.Length(); i++) { | 934 return assembler_->object_pool().FindObject(obj, kNotPatchable); |
| 934 if (object_table_.At(i) == obj.raw()) { | |
| 935 return i; | |
| 936 } | |
| 937 } | |
| 938 // Add object. | |
| 939 const intptr_t result = object_table_.Length(); | |
| 940 object_table_.Add(obj, Heap::kOld); | |
| 941 return result; | |
| 942 } | 935 } |
| 943 | 936 |
| 944 | 937 |
| 945 intptr_t DeoptInfoBuilder::CalculateStackIndex( | 938 intptr_t DeoptInfoBuilder::CalculateStackIndex( |
| 946 const Location& source_loc) const { | 939 const Location& source_loc) const { |
| 947 return source_loc.stack_index() < 0 ? | 940 return source_loc.stack_index() < 0 ? |
| 948 source_loc.stack_index() + num_args_ : | 941 source_loc.stack_index() + num_args_ : |
| 949 source_loc.stack_index() + num_args_ + kDartFrameFixedSize; | 942 source_loc.stack_index() + num_args_ + kDartFrameFixedSize; |
| 950 } | 943 } |
| 951 | 944 |
| (...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1261 Smi* offset, | 1254 Smi* offset, |
| 1262 TypedData* info, | 1255 TypedData* info, |
| 1263 Smi* reason) { | 1256 Smi* reason) { |
| 1264 intptr_t i = index * kEntrySize; | 1257 intptr_t i = index * kEntrySize; |
| 1265 *offset ^= table.At(i); | 1258 *offset ^= table.At(i); |
| 1266 *info ^= table.At(i + 1); | 1259 *info ^= table.At(i + 1); |
| 1267 *reason ^= table.At(i + 2); | 1260 *reason ^= table.At(i + 2); |
| 1268 } | 1261 } |
| 1269 | 1262 |
| 1270 } // namespace dart | 1263 } // namespace dart |
| OLD | NEW |