| Index: runtime/vm/flow_graph_compiler_arm.cc
|
| diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
|
| index a11916db9e64fb4dc09567874900d56c39d8a174..1fe137e3632d47be6964ff73be6272f40e372975 100644
|
| --- a/runtime/vm/flow_graph_compiler_arm.cc
|
| +++ b/runtime/vm/flow_graph_compiler_arm.cc
|
| @@ -31,6 +31,18 @@ DECLARE_FLAG(bool, enable_simd_inline);
|
| DECLARE_FLAG(bool, use_megamorphic_stub);
|
|
|
|
|
| +void MegamorphicSlowPath::EmitNativeCode(FlowGraphCompiler* compiler) {
|
| + Assembler* assembler = compiler->assembler();
|
| +#define __ assembler->
|
| + __ Bind(entry_label());
|
| + __ Comment("MegamorphicSlowPath");
|
| + compiler->EmitMegamorphicInstanceCall(ic_data_, argument_count_, deopt_id_,
|
| + token_pos_, locs_, try_index_);
|
| + __ b(exit_label());
|
| +#undef __
|
| +}
|
| +
|
| +
|
| FlowGraphCompiler::~FlowGraphCompiler() {
|
| // BlockInfos are zone-allocated, so their destructors are not called.
|
| // Verify the labels explicitly here.
|
| @@ -175,8 +187,8 @@ void CompilerDeoptInfoWithStub::GenerateCode(FlowGraphCompiler* compiler,
|
| intptr_t stub_ix) {
|
| // Calls do not need stubs, they share a deoptimization trampoline.
|
| ASSERT(reason() != ICData::kDeoptAtCall);
|
| - Assembler* assem = compiler->assembler();
|
| -#define __ assem->
|
| + Assembler* assembler = compiler->assembler();
|
| +#define __ assembler->
|
| __ Comment("%s", Name());
|
| __ Bind(entry_label());
|
| if (FLAG_trap_on_deoptimization) {
|
| @@ -191,7 +203,7 @@ void CompilerDeoptInfoWithStub::GenerateCode(FlowGraphCompiler* compiler,
|
| __ Push(CODE_REG);
|
| __ mov(IP, Operand(LR));
|
| __ BranchLink(*StubCode::Deoptimize_entry());
|
| - set_pc_offset(assem->CodeSize());
|
| + set_pc_offset(assembler->CodeSize());
|
| #undef __
|
| }
|
|
|
| @@ -1258,7 +1270,8 @@ void FlowGraphCompiler::EmitMegamorphicInstanceCall(
|
| intptr_t argument_count,
|
| intptr_t deopt_id,
|
| intptr_t token_pos,
|
| - LocationSummary* locs) {
|
| + LocationSummary* locs,
|
| + intptr_t try_index) {
|
| const String& name = String::Handle(zone(), ic_data.target_name());
|
| const Array& arguments_descriptor =
|
| Array::ZoneHandle(zone(), ic_data.arguments_descriptor());
|
| @@ -1276,12 +1289,26 @@ void FlowGraphCompiler::EmitMegamorphicInstanceCall(
|
| }
|
| __ blx(R1);
|
|
|
| - AddCurrentDescriptor(RawPcDescriptors::kOther, Thread::kNoDeoptId, token_pos);
|
| RecordSafepoint(locs);
|
| const intptr_t deopt_id_after = Thread::ToDeoptAfter(deopt_id);
|
| - if (is_optimizing()) {
|
| + if (Compiler::always_optimize()) {
|
| + // Megamorphic calls may occur in slow path stubs.
|
| + // If valid use try_index argument.
|
| + if (try_index == CatchClauseNode::kInvalidTryIndex) {
|
| + try_index = CurrentTryIndex();
|
| + }
|
| + pc_descriptors_list()->AddDescriptor(RawPcDescriptors::kOther,
|
| + assembler()->CodeSize(),
|
| + Thread::kNoDeoptId,
|
| + token_pos,
|
| + try_index);
|
| + } else if (is_optimizing()) {
|
| + AddCurrentDescriptor(RawPcDescriptors::kOther,
|
| + Thread::kNoDeoptId, token_pos);
|
| AddDeoptIndexAtCall(deopt_id_after, token_pos);
|
| } else {
|
| + AddCurrentDescriptor(RawPcDescriptors::kOther,
|
| + Thread::kNoDeoptId, token_pos);
|
| // Add deoptimization continuation point after the call and before the
|
| // arguments are removed.
|
| AddCurrentDescriptor(RawPcDescriptors::kDeopt,
|
|
|