Chromium Code Reviews| Index: runtime/vm/intermediate_language_x64.cc |
| diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc |
| index b4eefbf3c86c7e268afa0ddb0ecfb1ebf2fcb8ca..5765281f4708c1fce7d10eae4e9b5b3cad5bee67 100644 |
| --- a/runtime/vm/intermediate_language_x64.cc |
| +++ b/runtime/vm/intermediate_language_x64.cc |
| @@ -12,6 +12,7 @@ |
| #include "vm/flow_graph.h" |
| #include "vm/flow_graph_compiler.h" |
| #include "vm/flow_graph_range_analysis.h" |
| +#include "vm/instructions.h" |
| #include "vm/locations.h" |
| #include "vm/object_store.h" |
| #include "vm/parser.h" |
| @@ -2563,17 +2564,25 @@ LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(Zone* zone, |
| void CatchBlockEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| + // Ensure space for patching return sites for lazy deopt. |
| + __ nop(ShortCallPattern::pattern_length_in_bytes()); |
| + |
| __ Bind(compiler->GetJumpLabel(this)); |
| compiler->AddExceptionHandler(catch_try_index(), |
| try_index(), |
| compiler->assembler()->CodeSize(), |
| catch_handler_types_, |
| needs_stacktrace()); |
| - |
| - // Restore the pool pointer. |
| - __ RestoreCodePointer(); |
| - __ LoadPoolPointer(PP); |
|
Florian Schneider
2016/09/23 19:53:34
This now happens in the JumpToExceptionHandler stu
|
| - |
| + // On lazy deoptimization we patch the optimized code here to enter the |
| + // deoptimization stub. |
| + const intptr_t deopt_id = Thread::ToDeoptAfter(GetDeoptId()); |
| + if (compiler->is_optimizing()) { |
| + compiler->AddDeoptIndexAtCall(deopt_id); |
| + } else { |
| + compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, |
| + deopt_id, |
| + TokenPosition::kNoSource); |
| + } |
| if (HasParallelMove()) { |
| compiler->parallel_move_resolver()->EmitNativeCode(parallel_move()); |
| } |
| @@ -6507,7 +6516,7 @@ void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| // deoptimization point in optimized code, after call. |
| const intptr_t deopt_id_after = Thread::ToDeoptAfter(deopt_id()); |
| if (compiler->is_optimizing()) { |
| - compiler->AddDeoptIndexAtCall(deopt_id_after, token_pos()); |
| + compiler->AddDeoptIndexAtCall(deopt_id_after); |
| } |
| // Add deoptimization continuation point after the call and before the |
| // arguments are removed. |