Index: src/arm/builtins-arm.cc |
diff --git a/src/arm/builtins-arm.cc b/src/arm/builtins-arm.cc |
index 1f5481bed7862c229739d420515d6fded6f40559..9c4deecc3d8c845231cb69f666ac57defcb4e1bf 100644 |
--- a/src/arm/builtins-arm.cc |
+++ b/src/arm/builtins-arm.cc |
@@ -1077,13 +1077,44 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { |
__ Jump(r4); |
} |
- |
void Builtins::Generate_InterpreterExitTrampoline(MacroAssembler* masm) { |
// The return value is in accumulator, which is already in r0. |
- // Leave the frame (also dropping the register file). |
+ // Save the interpreter frame's function and callee pc to check if it has |
+ // been marked for baseline compilation on return. |
+ __ ldr(r2, MemOperand(sp, -kPointerSize)); |
+ __ ldr(r1, MemOperand(fp, StandardFrameConstants::kFunctionOffset)); |
+ |
+ // Leave the frame (also dropping the register file). Do this before checking |
+ // for baseline compile so that we don't count as an activation on the stack. |
__ LeaveFrame(StackFrame::JAVA_SCRIPT); |
+ // Check if the function has been marked for baseline compilation on return. |
+ Label not_marked_for_baseline; |
+ __ mov(r3, Operand(ExternalReference( |
+ Builtins::kInterpreterMarkBaselineOnReturn, masm->isolate()))); |
+ __ ldr(r3, MemOperand(r3)); |
+ __ add(r3, r3, Operand(Code::kHeaderSize - kHeapObjectTag)); |
+ __ cmp(r2, Operand(r3)); |
+ __ b(ne, ¬_marked_for_baseline); |
+ |
+ { |
+ FrameScope frame_scope(masm, StackFrame::INTERNAL); |
+ // Push bytecode array and r0 for return. |
+ __ push(kInterpreterBytecodeArrayRegister); |
+ __ push(r0); |
+ |
+ // Push function as argument and compile for baseline. |
+ __ push(r1); |
+ __ CallRuntime(Runtime::kCompileBaseline); |
+ |
+ // Restore bytecode array and r0. |
+ __ pop(r0); |
+ __ pop(kInterpreterBytecodeArrayRegister); |
+ } |
+ |
+ __ bind(¬_marked_for_baseline); |
+ |
// Drop receiver + arguments and return. |
__ ldr(ip, FieldMemOperand(kInterpreterBytecodeArrayRegister, |
BytecodeArray::kParameterSizeOffset)); |
@@ -1091,6 +1122,11 @@ void Builtins::Generate_InterpreterExitTrampoline(MacroAssembler* masm) { |
__ Jump(lr); |
} |
+void Builtins::Generate_InterpreterMarkBaselineOnReturn(MacroAssembler* masm) { |
+ // This builtin is only used as a marker to be checked in |
+ // InterpreterExitTrampoline and should never be called itself. |
+ __ Abort(kUnexpectedCallToMarkBaselineOnReturn); |
+} |
static void Generate_InterpreterPushArgs(MacroAssembler* masm, Register index, |
Register limit, Register scratch) { |