Index: runtime/vm/stub_code_arm.cc |
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc |
index 01f2e34542e441146b2b4ec6592cc9570ac24747..ab56734911c1f712c25c8e54825d3d953e6a9a22 100644 |
--- a/runtime/vm/stub_code_arm.cc |
+++ b/runtime/vm/stub_code_arm.cc |
@@ -200,7 +200,7 @@ void StubCode::GenerateCallNativeCFunctionStub(Assembler* assembler) { |
__ LoadImmediate(R2, entry); |
__ blx(R2); |
#else |
- __ BranchLink(&NativeEntry::NativeCallWrapperLabel()); |
+ __ BranchLink(&NativeEntry::NativeCallWrapperLabel(), kNotPatchable); |
#endif |
// Mark that the isolate is executing Dart code. |
@@ -427,6 +427,8 @@ static void GenerateDeoptimizationSequence(Assembler* assembler, |
__ mov(FP, Operand(SP)); |
__ Push(PP); |
+ __ LoadPoolPointer(); |
+ |
// Now that IP holding the return address has been written to the stack, |
// we can clobber it with 0 to write the null PC marker. |
__ mov(IP, Operand(0)); |
@@ -469,9 +471,7 @@ static void GenerateDeoptimizationSequence(Assembler* assembler, |
// DeoptimizeFillFrame expects a Dart frame, i.e. EnterDartFrame(0), but there |
// is no need to set the correct PC marker or load PP, since they get patched. |
- __ mov(IP, Operand(LR)); |
- __ mov(LR, Operand(0)); |
- __ EnterFrame((1 << PP) | (1 << FP) | (1 << IP) | (1 << LR), 0); |
+ __ EnterStubFrame(); |
__ mov(R0, Operand(FP)); // Get last FP address. |
if (preserve_result) { |
__ Push(R1); // Preserve result as first local. |
@@ -483,7 +483,7 @@ static void GenerateDeoptimizationSequence(Assembler* assembler, |
__ ldr(R1, Address(FP, kFirstLocalSlotFromFp * kWordSize)); |
} |
// Code above cannot cause GC. |
- __ LeaveDartFrame(); |
+ __ LeaveStubFrame(); |
// Frame is fully rewritten at this point and it is safe to perform a GC. |
// Materialize any objects that were deferred by FillFrame because they |