Chromium Code Reviews| Index: runtime/vm/code_generator.cc |
| diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc |
| index 3a8cf41b45ff3db30fa874210a6448627dad9c25..5b6777976f19a33ee4c1fee19c82d35709e80665 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 = kNumberOfFpuRegisters; |
|
zra
2016/05/19 16:24:27
kNumberOfCpuRegisters?
Vyacheslav Egorov (Google)
2016/05/20 12:11:46
Done.
|
| +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; |
| @@ -1679,14 +1689,20 @@ DEFINE_LEAF_RUNTIME_ENTRY(intptr_t, DeoptimizeCopyFrame, |
| StackZone zone(thread); |
| HANDLESCOPE(thread); |
| +#if !defined(TARGET_ARCH_DBC) |
| // 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); |
| +#else |
|
Florian Schneider
2016/05/19 13:21:39
Needed?
I think the code above works for DBC as w
Vyacheslav Egorov (Google)
2016/05/19 15:19:39
Done.
|
| + // Get optimized code and frame that need to be deoptimized. |
| + DartFrameIterator iterator(saved_registers_address); |
| +#endif |
| + |
| StackFrame* caller_frame = iterator.NextFrame(); |
| ASSERT(caller_frame != NULL); |
| const Code& optimized_code = Code::Handle(caller_frame->LookupDartCode()); |
| @@ -1762,8 +1778,15 @@ DEFINE_LEAF_RUNTIME_ENTRY(void, DeoptimizeFillFrame, 1, uword last_fp) { |
| // 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)); |
| +#if !defined(TARGET_ARCH_DBC) |
| + // On non-DBC architectures stack grows down: SP <= FP |
| + intptr_t* start = reinterpret_cast<intptr_t*>(caller_frame->sp() - |
| + kDartFrameFixedSize * kWordSize); |
| +#else |
| + // On DBC stack grows up: FP <= SP |
| + intptr_t* start = reinterpret_cast<intptr_t*>(caller_frame->fp() - |
|
Florian Schneider
2016/05/19 13:21:39
Maybe a helper FrameStart(frame)?
Vyacheslav Egorov (Google)
2016/05/19 15:19:40
Done.
|
| + (kDartFrameFixedSize + deopt_context->num_args()) * kWordSize); |
| +#endif // !defined(TARGET_ARCH_DBC) |
| deopt_context->set_dest_frame(start); |
| deopt_context->FillDestFrame(); |
| #else |