Index: runtime/vm/code_generator.cc |
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc |
index 3a8cf41b45ff3db30fa874210a6448627dad9c25..5d4e3cbe1de97ada4ef9b65c783d864bd22e35d9 100644 |
--- a/runtime/vm/code_generator.cc |
+++ b/runtime/vm/code_generator.cc |
@@ -1604,7 +1604,9 @@ void DeoptimizeAt(const Code& optimized_code, uword pc) { |
// Patch call site (lazy deoptimization is quite rare, patching it twice |
// is not a performance issue). |
uword lazy_deopt_jump = optimized_code.GetLazyDeoptPc(); |
+#if !defined(TARGET_ARCH_DBC) |
ASSERT(lazy_deopt_jump != 0); |
+#endif |
const Instructions& instrs = |
Instructions::Handle(zone, optimized_code.instructions()); |
{ |
@@ -1637,14 +1639,22 @@ void DeoptimizeFunctionsOnStack() { |
} |
#if !defined(DART_PRECOMPILED_RUNTIME) |
+#if !defined(TARGET_ARCH_DBC) |
+static const intptr_t kNumberOfSavedCpuRegisters = kNumberOfCpuRegisters; |
+static const intptr_t kNumberOfSavedFpuRegisters = kNumberOfFpuRegisters; |
+#else |
+static const intptr_t kNumberOfSavedCpuRegisters = 0; |
+static const intptr_t kNumberOfSavedFpuRegisters = 0; |
+#endif |
+ |
static void CopySavedRegisters(uword saved_registers_address, |
fpu_register_t** fpu_registers, |
intptr_t** cpu_registers) { |
ASSERT(sizeof(fpu_register_t) == kFpuRegisterSize); |
fpu_register_t* fpu_registers_copy = |
- new fpu_register_t[kNumberOfFpuRegisters]; |
+ new fpu_register_t[kNumberOfSavedFpuRegisters]; |
ASSERT(fpu_registers_copy != NULL); |
- for (intptr_t i = 0; i < kNumberOfFpuRegisters; i++) { |
+ for (intptr_t i = 0; i < kNumberOfSavedFpuRegisters; i++) { |
fpu_registers_copy[i] = |
*reinterpret_cast<fpu_register_t*>(saved_registers_address); |
saved_registers_address += kFpuRegisterSize; |
@@ -1652,9 +1662,9 @@ static void CopySavedRegisters(uword saved_registers_address, |
*fpu_registers = fpu_registers_copy; |
ASSERT(sizeof(intptr_t) == kWordSize); |
- intptr_t* cpu_registers_copy = new intptr_t[kNumberOfCpuRegisters]; |
+ intptr_t* cpu_registers_copy = new intptr_t[kNumberOfSavedCpuRegisters]; |
ASSERT(cpu_registers_copy != NULL); |
- for (intptr_t i = 0; i < kNumberOfCpuRegisters; i++) { |
+ for (intptr_t i = 0; i < kNumberOfSavedCpuRegisters; i++) { |
cpu_registers_copy[i] = |
*reinterpret_cast<intptr_t*>(saved_registers_address); |
saved_registers_address += kWordSize; |
@@ -1681,12 +1691,13 @@ DEFINE_LEAF_RUNTIME_ENTRY(intptr_t, DeoptimizeCopyFrame, |
// All registers have been saved below last-fp as if they were locals. |
const uword last_fp = saved_registers_address |
- + (kNumberOfCpuRegisters * kWordSize) |
- + (kNumberOfFpuRegisters * kFpuRegisterSize) |
+ + (kNumberOfSavedCpuRegisters * kWordSize) |
+ + (kNumberOfSavedFpuRegisters * kFpuRegisterSize) |
- ((kFirstLocalSlotFromFp + 1) * kWordSize); |
// Get optimized code and frame that need to be deoptimized. |
DartFrameIterator iterator(last_fp); |
+ |
StackFrame* caller_frame = iterator.NextFrame(); |
ASSERT(caller_frame != NULL); |
const Code& optimized_code = Code::Handle(caller_frame->LookupDartCode()); |
@@ -1760,11 +1771,7 @@ DEFINE_LEAF_RUNTIME_ENTRY(void, DeoptimizeFillFrame, 1, uword last_fp) { |
} |
#endif |
- // TODO(turnidge): Compute the start of the dest frame in the |
- // DeoptContext instead of passing it in here. |
- intptr_t* start = reinterpret_cast<intptr_t*>( |
- caller_frame->sp() - (kDartFrameFixedSize * kWordSize)); |
- deopt_context->set_dest_frame(start); |
+ deopt_context->set_dest_frame(caller_frame); |
deopt_context->FillDestFrame(); |
#else |
UNREACHABLE(); |