| 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 10 matching lines...) Expand all Loading... |
| 21 from_frame_(NULL), | 21 from_frame_(NULL), |
| 22 from_frame_size_(0), | 22 from_frame_size_(0), |
| 23 registers_copy_(NULL), | 23 registers_copy_(NULL), |
| 24 xmm_registers_copy_(NULL), | 24 xmm_registers_copy_(NULL), |
| 25 num_args_(num_args), | 25 num_args_(num_args), |
| 26 isolate_(Isolate::Current()) { | 26 isolate_(Isolate::Current()) { |
| 27 from_frame_ = isolate_->deopt_frame_copy(); | 27 from_frame_ = isolate_->deopt_frame_copy(); |
| 28 from_frame_size_ = isolate_->deopt_frame_copy_size(); | 28 from_frame_size_ = isolate_->deopt_frame_copy_size(); |
| 29 registers_copy_ = isolate_->deopt_cpu_registers_copy(); | 29 registers_copy_ = isolate_->deopt_cpu_registers_copy(); |
| 30 xmm_registers_copy_ = isolate_->deopt_xmm_registers_copy(); | 30 xmm_registers_copy_ = isolate_->deopt_xmm_registers_copy(); |
| 31 caller_fp_ = GetFromFp(); |
| 31 } | 32 } |
| 32 | 33 |
| 33 | 34 |
| 34 intptr_t* DeoptimizationContext::GetFromFpAddress() const { | 35 intptr_t DeoptimizationContext::GetFromFp() const { |
| 35 return &from_frame_[from_frame_size_ - 1 - num_args_ - 1]; | 36 return from_frame_[from_frame_size_ - 1 - num_args_ - 1]; |
| 36 } | 37 } |
| 37 | 38 |
| 38 | 39 |
| 39 intptr_t* DeoptimizationContext::GetFromPcAddress() const { | 40 intptr_t DeoptimizationContext::GetFromPc() const { |
| 40 return &from_frame_[from_frame_size_ - 1 - num_args_]; | 41 return from_frame_[from_frame_size_ - 1 - num_args_]; |
| 42 } |
| 43 |
| 44 intptr_t DeoptimizationContext::GetCallerFp() const { |
| 45 return caller_fp_; |
| 46 } |
| 47 |
| 48 void DeoptimizationContext::SetCallerFp(intptr_t caller_fp) { |
| 49 caller_fp_ = caller_fp; |
| 41 } | 50 } |
| 42 | 51 |
| 43 // Deoptimization instruction moving value from optimized frame at | 52 // Deoptimization instruction moving value from optimized frame at |
| 44 // 'from_index' to specified slots in the unoptimized frame. | 53 // 'from_index' to specified slots in the unoptimized frame. |
| 45 // 'from_index' represents the slot index of the frame (0 being first argument) | 54 // 'from_index' represents the slot index of the frame (0 being first argument) |
| 46 // and accounts for saved return address, frame pointer and pc marker. | 55 // and accounts for saved return address, frame pointer and pc marker. |
| 47 class DeoptStackSlotInstr : public DeoptInstr { | 56 class DeoptStackSlotInstr : public DeoptInstr { |
| 48 public: | 57 public: |
| 49 explicit DeoptStackSlotInstr(intptr_t from_index) | 58 explicit DeoptStackSlotInstr(intptr_t from_index) |
| 50 : stack_slot_index_(from_index) { | 59 : stack_slot_index_(from_index) { |
| (...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 327 DeoptCallerFpInstr() {} | 336 DeoptCallerFpInstr() {} |
| 328 | 337 |
| 329 virtual intptr_t from_index() const { return 0; } | 338 virtual intptr_t from_index() const { return 0; } |
| 330 virtual DeoptInstr::Kind kind() const { return kSetCallerFp; } | 339 virtual DeoptInstr::Kind kind() const { return kSetCallerFp; } |
| 331 | 340 |
| 332 virtual const char* ToCString() const { | 341 virtual const char* ToCString() const { |
| 333 return "callerfp"; | 342 return "callerfp"; |
| 334 } | 343 } |
| 335 | 344 |
| 336 void Execute(DeoptimizationContext* deopt_context, intptr_t to_index) { | 345 void Execute(DeoptimizationContext* deopt_context, intptr_t to_index) { |
| 337 intptr_t* from_addr = deopt_context->GetFromFpAddress(); | 346 intptr_t from = deopt_context->GetCallerFp(); |
| 338 intptr_t* to_addr = deopt_context->GetToFrameAddressAt(to_index); | 347 intptr_t* to_addr = deopt_context->GetToFrameAddressAt(to_index); |
| 339 *to_addr = *from_addr; | 348 *to_addr = from; |
| 349 deopt_context->SetCallerFp(reinterpret_cast<intptr_t>(to_addr)); |
| 340 } | 350 } |
| 341 | 351 |
| 342 private: | 352 private: |
| 343 DISALLOW_COPY_AND_ASSIGN(DeoptCallerFpInstr); | 353 DISALLOW_COPY_AND_ASSIGN(DeoptCallerFpInstr); |
| 344 }; | 354 }; |
| 345 | 355 |
| 346 | 356 |
| 347 // Deoptimization instruction copying the caller return address from optimized | 357 // Deoptimization instruction copying the caller return address from optimized |
| 348 // frame. | 358 // frame. |
| 349 class DeoptCallerPcInstr : public DeoptInstr { | 359 class DeoptCallerPcInstr : public DeoptInstr { |
| 350 public: | 360 public: |
| 351 DeoptCallerPcInstr() {} | 361 DeoptCallerPcInstr() {} |
| 352 | 362 |
| 353 virtual intptr_t from_index() const { return 0; } | 363 virtual intptr_t from_index() const { return 0; } |
| 354 virtual DeoptInstr::Kind kind() const { return kSetCallerPc; } | 364 virtual DeoptInstr::Kind kind() const { return kSetCallerPc; } |
| 355 | 365 |
| 356 virtual const char* ToCString() const { | 366 virtual const char* ToCString() const { |
| 357 return "callerpc"; | 367 return "callerpc"; |
| 358 } | 368 } |
| 359 | 369 |
| 360 void Execute(DeoptimizationContext* deopt_context, intptr_t to_index) { | 370 void Execute(DeoptimizationContext* deopt_context, intptr_t to_index) { |
| 361 intptr_t* from_addr = deopt_context->GetFromPcAddress(); | 371 intptr_t from = deopt_context->GetFromPc(); |
| 362 intptr_t* to_addr = deopt_context->GetToFrameAddressAt(to_index); | 372 intptr_t* to_addr = deopt_context->GetToFrameAddressAt(to_index); |
| 363 *to_addr = *from_addr; | 373 *to_addr = from; |
| 364 } | 374 } |
| 365 | 375 |
| 366 private: | 376 private: |
| 367 DISALLOW_COPY_AND_ASSIGN(DeoptCallerPcInstr); | 377 DISALLOW_COPY_AND_ASSIGN(DeoptCallerPcInstr); |
| 368 }; | 378 }; |
| 369 | 379 |
| 370 | 380 |
| 371 DeoptInstr* DeoptInstr::Create(intptr_t kind_as_int, intptr_t from_index) { | 381 DeoptInstr* DeoptInstr::Create(intptr_t kind_as_int, intptr_t from_index) { |
| 372 Kind kind = static_cast<Kind>(kind_as_int); | 382 Kind kind = static_cast<Kind>(kind_as_int); |
| 373 switch (kind) { | 383 switch (kind) { |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 478 const intptr_t len = instructions_.length(); | 488 const intptr_t len = instructions_.length(); |
| 479 const DeoptInfo& deopt_info = DeoptInfo::Handle(DeoptInfo::New(len)); | 489 const DeoptInfo& deopt_info = DeoptInfo::Handle(DeoptInfo::New(len)); |
| 480 for (intptr_t i = 0; i < len; i++) { | 490 for (intptr_t i = 0; i < len; i++) { |
| 481 DeoptInstr* instr = instructions_[i]; | 491 DeoptInstr* instr = instructions_[i]; |
| 482 deopt_info.SetAt(i, instr->kind(), instr->from_index()); | 492 deopt_info.SetAt(i, instr->kind(), instr->from_index()); |
| 483 } | 493 } |
| 484 return deopt_info.raw(); | 494 return deopt_info.raw(); |
| 485 } | 495 } |
| 486 | 496 |
| 487 } // namespace dart | 497 } // namespace dart |
| OLD | NEW |