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 #include "vm/deopt_instructions.h" | 5 #include "vm/deopt_instructions.h" |
6 | 6 |
7 #include "vm/assembler_macros.h" | 7 #include "vm/assembler_macros.h" |
8 #include "vm/intermediate_language.h" | 8 #include "vm/intermediate_language.h" |
9 #include "vm/locations.h" | 9 #include "vm/locations.h" |
10 #include "vm/parser.h" | 10 #include "vm/parser.h" |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 public: | 48 public: |
49 explicit DeoptStackSlotInstr(intptr_t from_index) | 49 explicit DeoptStackSlotInstr(intptr_t from_index) |
50 : stack_slot_index_(from_index) { | 50 : stack_slot_index_(from_index) { |
51 ASSERT(stack_slot_index_ >= 0); | 51 ASSERT(stack_slot_index_ >= 0); |
52 } | 52 } |
53 | 53 |
54 virtual intptr_t from_index() const { return stack_slot_index_; } | 54 virtual intptr_t from_index() const { return stack_slot_index_; } |
55 virtual DeoptInstr::Kind kind() const { return kCopyStackSlot; } | 55 virtual DeoptInstr::Kind kind() const { return kCopyStackSlot; } |
56 | 56 |
57 virtual const char* ToCString() const { | 57 virtual const char* ToCString() const { |
58 intptr_t len = OS::SNPrint(NULL, 0, "s%d", stack_slot_index_); | 58 const char* format = "s%"Pd""; |
| 59 intptr_t len = OS::SNPrint(NULL, 0, format, stack_slot_index_); |
59 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len + 1); | 60 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len + 1); |
60 OS::SNPrint(chars, len + 1, "s%d", stack_slot_index_); | 61 OS::SNPrint(chars, len + 1, format, stack_slot_index_); |
61 return chars; | 62 return chars; |
62 } | 63 } |
63 | 64 |
64 void Execute(DeoptimizationContext* deopt_context, intptr_t to_index) { | 65 void Execute(DeoptimizationContext* deopt_context, intptr_t to_index) { |
65 intptr_t from_index = | 66 intptr_t from_index = |
66 deopt_context->from_frame_size() - stack_slot_index_ - 1; | 67 deopt_context->from_frame_size() - stack_slot_index_ - 1; |
67 intptr_t* from_addr = deopt_context->GetFromFrameAddressAt(from_index); | 68 intptr_t* from_addr = deopt_context->GetFromFrameAddressAt(from_index); |
68 intptr_t* to_addr = deopt_context->GetToFrameAddressAt(to_index); | 69 intptr_t* to_addr = deopt_context->GetToFrameAddressAt(to_index); |
69 *to_addr = *from_addr; | 70 *to_addr = *from_addr; |
70 } | 71 } |
71 | 72 |
72 private: | 73 private: |
73 const intptr_t stack_slot_index_; // First argument is 0, always >= 0. | 74 const intptr_t stack_slot_index_; // First argument is 0, always >= 0. |
74 | 75 |
75 DISALLOW_COPY_AND_ASSIGN(DeoptStackSlotInstr); | 76 DISALLOW_COPY_AND_ASSIGN(DeoptStackSlotInstr); |
76 }; | 77 }; |
77 | 78 |
78 | 79 |
79 class DeoptDoubleStackSlotInstr : public DeoptInstr { | 80 class DeoptDoubleStackSlotInstr : public DeoptInstr { |
80 public: | 81 public: |
81 explicit DeoptDoubleStackSlotInstr(intptr_t from_index) | 82 explicit DeoptDoubleStackSlotInstr(intptr_t from_index) |
82 : stack_slot_index_(from_index) { | 83 : stack_slot_index_(from_index) { |
83 ASSERT(stack_slot_index_ >= 0); | 84 ASSERT(stack_slot_index_ >= 0); |
84 } | 85 } |
85 | 86 |
86 virtual intptr_t from_index() const { return stack_slot_index_; } | 87 virtual intptr_t from_index() const { return stack_slot_index_; } |
87 virtual DeoptInstr::Kind kind() const { return kCopyDoubleStackSlot; } | 88 virtual DeoptInstr::Kind kind() const { return kCopyDoubleStackSlot; } |
88 | 89 |
89 virtual const char* ToCString() const { | 90 virtual const char* ToCString() const { |
90 intptr_t len = OS::SNPrint(NULL, 0, "ds%d", stack_slot_index_); | 91 const char* format = "ds%"Pd""; |
| 92 intptr_t len = OS::SNPrint(NULL, 0, format, stack_slot_index_); |
91 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len + 1); | 93 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len + 1); |
92 OS::SNPrint(chars, len + 1, "ds%d", stack_slot_index_); | 94 OS::SNPrint(chars, len + 1, format, stack_slot_index_); |
93 return chars; | 95 return chars; |
94 } | 96 } |
95 | 97 |
96 void Execute(DeoptimizationContext* deopt_context, intptr_t to_index) { | 98 void Execute(DeoptimizationContext* deopt_context, intptr_t to_index) { |
97 intptr_t from_index = | 99 intptr_t from_index = |
98 deopt_context->from_frame_size() - stack_slot_index_ - 1; | 100 deopt_context->from_frame_size() - stack_slot_index_ - 1; |
99 double* from_addr = reinterpret_cast<double*>( | 101 double* from_addr = reinterpret_cast<double*>( |
100 deopt_context->GetFromFrameAddressAt(from_index)); | 102 deopt_context->GetFromFrameAddressAt(from_index)); |
101 intptr_t* to_addr = deopt_context->GetToFrameAddressAt(to_index); | 103 intptr_t* to_addr = deopt_context->GetToFrameAddressAt(to_index); |
102 *reinterpret_cast<RawSmi**>(to_addr) = Smi::New(0); | 104 *reinterpret_cast<RawSmi**>(to_addr) = Smi::New(0); |
(...skipping 15 matching lines...) Expand all Loading... |
118 public: | 120 public: |
119 explicit DeoptRetAddrAfterInstr(intptr_t object_table_index) | 121 explicit DeoptRetAddrAfterInstr(intptr_t object_table_index) |
120 : object_table_index_(object_table_index) { | 122 : object_table_index_(object_table_index) { |
121 ASSERT(object_table_index >= 0); | 123 ASSERT(object_table_index >= 0); |
122 } | 124 } |
123 | 125 |
124 virtual intptr_t from_index() const { return object_table_index_; } | 126 virtual intptr_t from_index() const { return object_table_index_; } |
125 virtual DeoptInstr::Kind kind() const { return kSetRetAfterAddress; } | 127 virtual DeoptInstr::Kind kind() const { return kSetRetAfterAddress; } |
126 | 128 |
127 virtual const char* ToCString() const { | 129 virtual const char* ToCString() const { |
128 intptr_t len = OS::SNPrint(NULL, 0, "ret aft oti:%d", object_table_index_); | 130 const char* format = "ret aft oti:%"Pd""; |
| 131 intptr_t len = OS::SNPrint(NULL, 0, format, object_table_index_); |
129 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len + 1); | 132 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len + 1); |
130 OS::SNPrint(chars, len + 1, "ret aft oti:%d", object_table_index_); | 133 OS::SNPrint(chars, len + 1, format, object_table_index_); |
131 return chars; | 134 return chars; |
132 } | 135 } |
133 | 136 |
134 void Execute(DeoptimizationContext* deopt_context, intptr_t to_index) { | 137 void Execute(DeoptimizationContext* deopt_context, intptr_t to_index) { |
135 Function& function = Function::Handle(deopt_context->isolate()); | 138 Function& function = Function::Handle(deopt_context->isolate()); |
136 function ^= deopt_context->ObjectAt(object_table_index_); | 139 function ^= deopt_context->ObjectAt(object_table_index_); |
137 Smi& deopt_id_as_smi = Smi::Handle(deopt_context->isolate()); | 140 Smi& deopt_id_as_smi = Smi::Handle(deopt_context->isolate()); |
138 deopt_id_as_smi ^= deopt_context->ObjectAt(object_table_index_ + 1); | 141 deopt_id_as_smi ^= deopt_context->ObjectAt(object_table_index_ + 1); |
139 const Code& code = | 142 const Code& code = |
140 Code::Handle(deopt_context->isolate(), function.unoptimized_code()); | 143 Code::Handle(deopt_context->isolate(), function.unoptimized_code()); |
(...skipping 17 matching lines...) Expand all Loading... |
158 public: | 161 public: |
159 explicit DeoptRetAddrBeforeInstr(intptr_t object_table_index) | 162 explicit DeoptRetAddrBeforeInstr(intptr_t object_table_index) |
160 : object_table_index_(object_table_index) { | 163 : object_table_index_(object_table_index) { |
161 ASSERT(object_table_index >= 0); | 164 ASSERT(object_table_index >= 0); |
162 } | 165 } |
163 | 166 |
164 virtual intptr_t from_index() const { return object_table_index_; } | 167 virtual intptr_t from_index() const { return object_table_index_; } |
165 virtual DeoptInstr::Kind kind() const { return kSetRetBeforeAddress; } | 168 virtual DeoptInstr::Kind kind() const { return kSetRetBeforeAddress; } |
166 | 169 |
167 virtual const char* ToCString() const { | 170 virtual const char* ToCString() const { |
168 intptr_t len = OS::SNPrint(NULL, 0, "ret bef oti:%d", object_table_index_); | 171 const char* format = "ret bef oti:%"Pd""; |
| 172 intptr_t len = OS::SNPrint(NULL, 0, format, object_table_index_); |
169 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len + 1); | 173 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len + 1); |
170 OS::SNPrint(chars, len + 1, "ret bef oti:%d", object_table_index_); | 174 OS::SNPrint(chars, len + 1, format, object_table_index_); |
171 return chars; | 175 return chars; |
172 } | 176 } |
173 | 177 |
174 void Execute(DeoptimizationContext* deopt_context, intptr_t to_index) { | 178 void Execute(DeoptimizationContext* deopt_context, intptr_t to_index) { |
175 Function& function = Function::Handle(deopt_context->isolate()); | 179 Function& function = Function::Handle(deopt_context->isolate()); |
176 function ^= deopt_context->ObjectAt(object_table_index_); | 180 function ^= deopt_context->ObjectAt(object_table_index_); |
177 Smi& deopt_id_as_smi = Smi::Handle(deopt_context->isolate()); | 181 Smi& deopt_id_as_smi = Smi::Handle(deopt_context->isolate()); |
178 deopt_id_as_smi ^= deopt_context->ObjectAt(object_table_index_ + 1); | 182 deopt_id_as_smi ^= deopt_context->ObjectAt(object_table_index_ + 1); |
179 const Code& code = | 183 const Code& code = |
180 Code::Handle(deopt_context->isolate(), function.unoptimized_code()); | 184 Code::Handle(deopt_context->isolate(), function.unoptimized_code()); |
(...skipping 15 matching lines...) Expand all Loading... |
196 public: | 200 public: |
197 explicit DeoptConstantInstr(intptr_t object_table_index) | 201 explicit DeoptConstantInstr(intptr_t object_table_index) |
198 : object_table_index_(object_table_index) { | 202 : object_table_index_(object_table_index) { |
199 ASSERT(object_table_index >= 0); | 203 ASSERT(object_table_index >= 0); |
200 } | 204 } |
201 | 205 |
202 virtual intptr_t from_index() const { return object_table_index_; } | 206 virtual intptr_t from_index() const { return object_table_index_; } |
203 virtual DeoptInstr::Kind kind() const { return kCopyConstant; } | 207 virtual DeoptInstr::Kind kind() const { return kCopyConstant; } |
204 | 208 |
205 virtual const char* ToCString() const { | 209 virtual const char* ToCString() const { |
206 intptr_t len = OS::SNPrint(NULL, 0, "const oti:%d", object_table_index_); | 210 const char* format = "const oti:%"Pd""; |
| 211 intptr_t len = OS::SNPrint(NULL, 0, format, object_table_index_); |
207 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len + 1); | 212 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len + 1); |
208 OS::SNPrint(chars, len + 1, "const oti:%d", object_table_index_); | 213 OS::SNPrint(chars, len + 1, format, object_table_index_); |
209 return chars; | 214 return chars; |
210 } | 215 } |
211 | 216 |
212 void Execute(DeoptimizationContext* deopt_context, intptr_t to_index) { | 217 void Execute(DeoptimizationContext* deopt_context, intptr_t to_index) { |
213 const Object& obj = Object::Handle( | 218 const Object& obj = Object::Handle( |
214 deopt_context->isolate(), deopt_context->ObjectAt(object_table_index_)); | 219 deopt_context->isolate(), deopt_context->ObjectAt(object_table_index_)); |
215 RawObject** to_addr = reinterpret_cast<RawObject**>( | 220 RawObject** to_addr = reinterpret_cast<RawObject**>( |
216 deopt_context->GetToFrameAddressAt(to_index)); | 221 deopt_context->GetToFrameAddressAt(to_index)); |
217 *to_addr = obj.raw(); | 222 *to_addr = obj.raw(); |
218 } | 223 } |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
284 public: | 289 public: |
285 explicit DeoptPcMarkerInstr(intptr_t object_table_index) | 290 explicit DeoptPcMarkerInstr(intptr_t object_table_index) |
286 : object_table_index_(object_table_index) { | 291 : object_table_index_(object_table_index) { |
287 ASSERT(object_table_index >= 0); | 292 ASSERT(object_table_index >= 0); |
288 } | 293 } |
289 | 294 |
290 virtual intptr_t from_index() const { return object_table_index_; } | 295 virtual intptr_t from_index() const { return object_table_index_; } |
291 virtual DeoptInstr::Kind kind() const { return kSetPcMarker; } | 296 virtual DeoptInstr::Kind kind() const { return kSetPcMarker; } |
292 | 297 |
293 virtual const char* ToCString() const { | 298 virtual const char* ToCString() const { |
294 intptr_t len = OS::SNPrint(NULL, 0, "pcmark oti:%d", object_table_index_); | 299 const char* format = "pcmark oti:%"Pd""; |
| 300 intptr_t len = OS::SNPrint(NULL, 0, format, object_table_index_); |
295 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len + 1); | 301 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len + 1); |
296 OS::SNPrint(chars, len + 1, "pcmark oti:%d", object_table_index_); | 302 OS::SNPrint(chars, len + 1, format, object_table_index_); |
297 return chars; | 303 return chars; |
298 } | 304 } |
299 | 305 |
300 void Execute(DeoptimizationContext* deopt_context, intptr_t to_index) { | 306 void Execute(DeoptimizationContext* deopt_context, intptr_t to_index) { |
301 Function& function = Function::Handle(deopt_context->isolate()); | 307 Function& function = Function::Handle(deopt_context->isolate()); |
302 function ^= deopt_context->ObjectAt(object_table_index_); | 308 function ^= deopt_context->ObjectAt(object_table_index_); |
303 const Code& code = | 309 const Code& code = |
304 Code::Handle(deopt_context->isolate(), function.unoptimized_code()); | 310 Code::Handle(deopt_context->isolate(), function.unoptimized_code()); |
305 intptr_t pc_marker = code.EntryPoint() + | 311 intptr_t pc_marker = code.EntryPoint() + |
306 AssemblerMacros::kOffsetOfSavedPCfromEntrypoint; | 312 AssemblerMacros::kOffsetOfSavedPCfromEntrypoint; |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
472 const intptr_t len = instructions_.length(); | 478 const intptr_t len = instructions_.length(); |
473 const DeoptInfo& deopt_info = DeoptInfo::Handle(DeoptInfo::New(len)); | 479 const DeoptInfo& deopt_info = DeoptInfo::Handle(DeoptInfo::New(len)); |
474 for (intptr_t i = 0; i < len; i++) { | 480 for (intptr_t i = 0; i < len; i++) { |
475 DeoptInstr* instr = instructions_[i]; | 481 DeoptInstr* instr = instructions_[i]; |
476 deopt_info.SetAt(i, instr->kind(), instr->from_index()); | 482 deopt_info.SetAt(i, instr->kind(), instr->from_index()); |
477 } | 483 } |
478 return deopt_info.raw(); | 484 return deopt_info.raw(); |
479 } | 485 } |
480 | 486 |
481 } // namespace dart | 487 } // namespace dart |
OLD | NEW |