Index: runtime/vm/flow_graph_compiler.cc |
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc |
index e4f461e6408809306ad2e8c3f59e579681dffaad..2e98d9f891cf1c0e8fdc3f7b8f1450bada63b04c 100644 |
--- a/runtime/vm/flow_graph_compiler.cc |
+++ b/runtime/vm/flow_graph_compiler.cc |
@@ -670,8 +670,17 @@ void FlowGraphCompiler::EmitTrySync(Instruction* instr, intptr_t try_index) { |
if (flow_graph().captured_parameters()->Contains(i)) continue; |
if ((*idefs)[i]->IsConstant()) continue; // Common constants |
Location src = env->LocationAt(i); |
+#if defined(TARGET_ARCH_DBC) |
+ intptr_t dest_index = kNumberOfCpuRegisters - 1 - i; |
+ Location dest = Location::RegisterLocation(dest_index); |
+ // Update safepoint bitmap to indicate that the target location |
+ // now contains a pointer. With DBC parameters are copied into |
+ // the locals area. |
+ instr->locs()->SetStackBit(dest_index); |
+#else |
intptr_t dest_index = i - num_non_copied_params; |
Location dest = Location::StackSlot(dest_index); |
+#endif |
move_instr->AddMove(dest, src); |
} |
@@ -687,8 +696,13 @@ void FlowGraphCompiler::EmitTrySync(Instruction* instr, intptr_t try_index) { |
Location src = env->LocationAt(i); |
ASSERT(!src.IsFpuRegister()); |
ASSERT(!src.IsDoubleStackSlot()); |
+#if defined(TARGET_ARCH_DBC) |
+ intptr_t dest_index = kNumberOfCpuRegisters - 1 - i; |
+ Location dest = Location::RegisterLocation(dest_index); |
+#else |
intptr_t dest_index = i - num_non_copied_params; |
Location dest = Location::StackSlot(dest_index); |
+#endif |
move_instr->AddMove(dest, src); |
// Update safepoint bitmap to indicate that the target location |
// now contains a pointer. |
@@ -845,12 +859,18 @@ void FlowGraphCompiler::RecordSafepoint(LocationSummary* locs, |
// with the same instruction (and same location summary) sees a bitmap that |
// is larger that StackSize(). It will never be larger than StackSize() + |
// live_registers_size. |
- ASSERT(bitmap->Length() <= (spill_area_size + live_registers_size)); |
// The first safepoint will grow the bitmap to be the size of |
// spill_area_size but the second safepoint will truncate the bitmap and |
// append the live registers to it again. The bitmap produced by both calls |
// will be the same. |
+#if !defined(TARGET_ARCH_DBC) |
+ ASSERT(bitmap->Length() <= (spill_area_size + live_registers_size)); |
bitmap->SetLength(spill_area_size); |
+#else |
+ if (bitmap->Length() <= (spill_area_size + live_registers_size)) { |
+ bitmap->SetLength(Utils::Maximum(bitmap->Length(), spill_area_size)); |
+ } |
+#endif |
// Mark the bits in the stack map in the same order we push registers in |
// slow path code (see FlowGraphCompiler::SaveLiveRegisters). |