Index: src/x64/lithium-codegen-x64.cc |
diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc |
index fa2a632f8c0e5f5b0a87795bca52806c4b38e596..6729a6789b76d335b0a496b96025a76edf1ba2ec 100644 |
--- a/src/x64/lithium-codegen-x64.cc |
+++ b/src/x64/lithium-codegen-x64.cc |
@@ -32,6 +32,7 @@ |
#include "x64/lithium-codegen-x64.h" |
#include "code-stubs.h" |
#include "stub-cache.h" |
+#include "hydrogen-osr.h" |
namespace v8 { |
namespace internal { |
@@ -257,6 +258,21 @@ bool LCodeGen::GeneratePrologue() { |
} |
+void LCodeGen::GenerateOsrPrologue() { |
+ // Generate the OSR entry prologue at the first unknown OSR value, or if there |
+ // are none, at the OSR entrypoint instruction. |
+ if (osr_pc_offset_ >= 0) return; |
+ |
+ osr_pc_offset_ = masm()->pc_offset(); |
+ |
+ // Adjust the frame size, subsuming the unoptimized frame into the |
+ // optimized frame. |
+ int slots = GetStackSlotCount() - graph()->osr()->UnoptimizedFrameSlots(); |
+ ASSERT(slots >= 0); |
+ __ subq(rsp, Immediate(slots * kPointerSize)); |
+} |
+ |
+ |
bool LCodeGen::GenerateBody() { |
ASSERT(is_generating()); |
bool emit_instructions = true; |
@@ -979,8 +995,7 @@ void LCodeGen::DoCallStub(LCallStub* instr) { |
void LCodeGen::DoUnknownOSRValue(LUnknownOSRValue* instr) { |
- // Record the address of the first unknown OSR value as the place to enter. |
- if (osr_pc_offset_ == -1) osr_pc_offset_ = masm()->pc_offset(); |
+ GenerateOsrPrologue(); |
} |
@@ -5457,9 +5472,7 @@ void LCodeGen::DoOsrEntry(LOsrEntry* instr) { |
ASSERT(!environment->HasBeenRegistered()); |
RegisterEnvironmentForDeoptimization(environment, Safepoint::kNoLazyDeopt); |
- // Normally we record the first unknown OSR value as the entrypoint to the OSR |
- // code, but if there were none, record the entrypoint here. |
- if (osr_pc_offset_ == -1) osr_pc_offset_ = masm()->pc_offset(); |
+ GenerateOsrPrologue(); |
} |