Chromium Code Reviews| Index: runtime/vm/flow_graph_allocator.cc |
| diff --git a/runtime/vm/flow_graph_allocator.cc b/runtime/vm/flow_graph_allocator.cc |
| index 7b62e3792c3461fd16262c6b9814eb4e6c5622cc..34e0b0bbfc3c51488235e70c8a8ea9c19d377d68 100644 |
| --- a/runtime/vm/flow_graph_allocator.cc |
| +++ b/runtime/vm/flow_graph_allocator.cc |
| @@ -11,6 +11,7 @@ |
| #include "vm/flow_graph_compiler.h" |
| #include "vm/log.h" |
| #include "vm/parser.h" |
| +#include "vm/stack_frame.h" |
| namespace dart { |
| @@ -612,10 +613,6 @@ void FlowGraphAllocator::BuildLiveRanges() { |
| } else if (block->IsCatchBlockEntry()) { |
| // Process initial definitions. |
| CatchBlockEntryInstr* catch_entry = block->AsCatchBlockEntry(); |
| -#if defined(TARGET_ARCH_DBC) |
| - // TODO(vegorov) support try-catch/finally for DBC. |
| - flow_graph_.parsed_function().Bailout("FlowGraphAllocator", "Catch"); |
| -#endif |
| ProcessEnvironmentUses(catch_entry, catch_entry); // For lazy deopt |
| @@ -631,10 +628,19 @@ void FlowGraphAllocator::BuildLiveRanges() { |
| // block start to until the end of the instruction so that they are |
| // preserved. |
| intptr_t start = catch_entry->start_pos(); |
| - BlockLocation(Location::RegisterLocation(kExceptionObjectReg), |
| +#if !defined(TARGET_ARCH_DBC) |
| + const Register exception_reg = kExceptionObjectReg; |
| + const Register stacktrace_reg = kStackTraceObjectReg; |
| +#else |
| + const intptr_t exception_reg = |
| + LocalVarIndex(0, catch_entry->exception_var().index()); |
| + const intptr_t stacktrace_reg = |
| + LocalVarIndex(0, catch_entry->stacktrace_var().index()); |
| +#endif |
| + BlockLocation(Location::RegisterLocation(exception_reg), |
| start, |
| ToInstructionEnd(start)); |
| - BlockLocation(Location::RegisterLocation(kStackTraceObjectReg), |
| + BlockLocation(Location::RegisterLocation(stacktrace_reg), |
| start, |
| ToInstructionEnd(start)); |
| } |
| @@ -657,8 +663,10 @@ void FlowGraphAllocator::BuildLiveRanges() { |
| void FlowGraphAllocator::ProcessInitialDefinition(Definition* defn, |
| LiveRange* range, |
| BlockEntryInstr* block) { |
| +#if !defined(TARGET_ARCH_DBC) |
| // Save the range end because it may change below. |
| intptr_t range_end = range->End(); |
| +#endif |
| if (defn->IsParameter()) { |
| ParameterInstr* param = defn->AsParameter(); |
| // Assert that copied and non-copied parameters are mutually exclusive. |
| @@ -679,7 +687,7 @@ void FlowGraphAllocator::ProcessInitialDefinition(Definition* defn, |
| AssignSafepoints(defn, range); |
| range->finger()->Initialize(range); |
| range->set_assigned_location(Location::RegisterLocation(slot_index)); |
| - if (range->End() > kNormalEntryPos) { |
| + if (block->IsGraphEntry() && (range->End() > kNormalEntryPos)) { |
| LiveRange* tail = range->SplitAt(kNormalEntryPos); |
| CompleteRange(tail, Location::kRegister); |
| } |
| @@ -726,6 +734,7 @@ void FlowGraphAllocator::ProcessInitialDefinition(Definition* defn, |
| } |
| ConvertAllUses(range); |
| if (defn->IsParameter() && (range->spill_slot().stack_index() >= 0)) { |
|
Vyacheslav Egorov (Google)
2016/10/04 17:07:54
I thought we don't support spilling on DBC. How do
Florian Schneider
2016/10/04 17:11:02
You're right. This should be UNREACHABLE() in DBC.
Vyacheslav Egorov (Google)
2016/10/04 17:55:31
I am still not completely sure how this stuff mana
|
| +#if !defined(TARGET_ARCH_DBC) |
| // Parameters above the frame pointer consume spill slots and are marked |
| // in stack maps. |
| spill_slots_.Add(range_end); |
| @@ -738,6 +747,9 @@ void FlowGraphAllocator::ProcessInitialDefinition(Definition* defn, |
| spill_slots_.Add(range_end); |
| quad_spill_slots_.Add(false); |
| untagged_spill_slots_.Add(false); |
| +#else |
| + MarkAsObjectAtSafepoints(range); |
| +#endif |
| } |
| } |