From 69f8179c23f1fe1a86e3742db1020073e448b9e8 Mon Sep 17 00:00:00 2001 From: "rmcilroy@chromium.org" Date: Tue, 1 Apr 2014 10:49:44 +0000 Subject: [PATCH] Only allow automatic FrameScope types for FrameAndConstantPoolScope In certain situations the PP register would be invalid in a FrameScope::Manual FrameAndConstantPoolScope R=ulan@chromium.org Review URL: https://codereview.chromium.org/214623002 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@20387 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/arm/code-stubs-arm.cc | 6 +++--- src/arm/macro-assembler-arm.cc | 1 - src/arm/macro-assembler-arm.h | 7 ++++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/arm/code-stubs-arm.cc b/src/arm/code-stubs-arm.cc index aadfb29c..81691a3 100644 --- a/src/arm/code-stubs-arm.cc +++ b/src/arm/code-stubs-arm.cc @@ -1648,7 +1648,7 @@ void CEntryStub::Generate(MacroAssembler* masm) { __ sub(r6, r6, Operand(kPointerSize)); // Enter the exit frame that transitions from JavaScript to C++. - FrameAndConstantPoolScope scope(masm, StackFrame::MANUAL); + FrameScope scope(masm, StackFrame::MANUAL); __ EnterExitFrame(save_doubles_); // Set up argc and the builtin function in callee-saved registers. @@ -5377,7 +5377,7 @@ void CallApiFunctionStub::Generate(MacroAssembler* masm) { // it's not controlled by GC. const int kApiStackSpace = 4; - FrameAndConstantPoolScope frame_scope(masm, StackFrame::MANUAL); + FrameScope frame_scope(masm, StackFrame::MANUAL); __ EnterExitFrame(false, kApiStackSpace); ASSERT(!api_function_address.is(r0) && !scratch.is(r0)); @@ -5437,7 +5437,7 @@ void CallApiGetterStub::Generate(MacroAssembler* masm) { __ add(r1, r0, Operand(1 * kPointerSize)); // r1 = PCA const int kApiStackSpace = 1; - FrameAndConstantPoolScope frame_scope(masm, StackFrame::MANUAL); + FrameScope frame_scope(masm, StackFrame::MANUAL); __ EnterExitFrame(false, kApiStackSpace); // Create PropertyAccessorInfo instance on the stack above the exit frame with diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc index 2bfe09f..076c042 100644 --- a/src/arm/macro-assembler-arm.cc +++ b/src/arm/macro-assembler-arm.cc @@ -989,7 +989,6 @@ void MacroAssembler::EnterExitFrame(bool save_doubles, int stack_space) { } if (FLAG_enable_ool_constant_pool) { str(pp, MemOperand(fp, ExitFrameConstants::kConstantPoolOffset)); - LoadConstantPoolPointerRegister(); } mov(ip, Operand(CodeObject())); str(ip, MemOperand(fp, ExitFrameConstants::kCodeOffset)); diff --git a/src/arm/macro-assembler-arm.h b/src/arm/macro-assembler-arm.h index 6b6ecd3..9230df0 100644 --- a/src/arm/macro-assembler-arm.h +++ b/src/arm/macro-assembler-arm.h @@ -1524,11 +1524,12 @@ class FrameAndConstantPoolScope { type_(type), old_has_frame_(masm->has_frame()), old_constant_pool_available_(masm->is_constant_pool_available()) { + // We only want to enable constant pool access for non-manual frame scopes + // to ensure the constant pool pointer is valid throughout the scope. + ASSERT(type_ != StackFrame::MANUAL && type_ != StackFrame::NONE); masm->set_has_frame(true); masm->set_constant_pool_available(true); - if (type_ != StackFrame::MANUAL && type_ != StackFrame::NONE) { - masm->EnterFrame(type, !old_constant_pool_available_); - } + masm->EnterFrame(type, !old_constant_pool_available_); } ~FrameAndConstantPoolScope() { -- 2.7.4