Chromium Code Reviews| Index: src/arm/macro-assembler-arm.h |
| diff --git a/src/arm/macro-assembler-arm.h b/src/arm/macro-assembler-arm.h |
| index 0eaf4dc9b10fcb5e7d4c8272b375a6585cb83f66..68645fb9b97869d572e6eb2c50a393f0a32fcdac 100644 |
| --- a/src/arm/macro-assembler-arm.h |
| +++ b/src/arm/macro-assembler-arm.h |
| @@ -540,9 +540,6 @@ class MacroAssembler: public Assembler { |
| // Generates function and stub prologue code. |
| void Prologue(PrologueFrameMode frame_mode); |
| - // Loads the constant pool pointer (pp) register. |
| - void LoadConstantPoolPointerRegister(); |
| - |
| // Enter exit frame. |
| // stack_space - extra stack space, used for alignment before call to C. |
| void EnterExitFrame(bool save_doubles, int stack_space = 0); |
| @@ -1383,7 +1380,7 @@ class MacroAssembler: public Assembler { |
| } |
| // Activation support. |
| - void EnterFrame(StackFrame::Type type); |
| + void EnterFrame(StackFrame::Type type, bool load_constant_pool = false); |
| // Returns the pc offset at which the frame ends. |
| int LeaveFrame(StackFrame::Type type); |
| @@ -1460,6 +1457,9 @@ class MacroAssembler: public Assembler { |
| MemOperand SafepointRegisterSlot(Register reg); |
| MemOperand SafepointRegistersAndDoublesSlot(Register reg); |
| + // Loads the constant pool pointer (pp) register. |
| + void LoadConstantPoolPointerRegister(); |
| + |
| bool generating_stub_; |
| bool has_frame_; |
| // This handle will be patched with the code object on installation. |
| @@ -1509,6 +1509,72 @@ class CodePatcher { |
| }; |
| +class FrameAndConstantPoolScope { |
| + public: |
| + FrameAndConstantPoolScope(MacroAssembler* masm, StackFrame::Type type) |
| + : masm_(masm), |
| + type_(type), |
| + old_has_frame_(masm->has_frame()), |
| + old_constant_pool_available_(masm->is_constant_pool_available()) { |
| + // The constant pool load happens in EnterFrame, so this must not be a |
| + // manual or none frame type. |
|
ulan
2014/03/11 13:00:46
Did you mean to assert (type_ != StackFrame::MANUA
rmcilroy
2014/03/11 16:36:34
Ahh originally had this assert, but changed it to
|
| + 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_); |
| + } |
| + } |
| + |
| + ~FrameAndConstantPoolScope() { |
| + masm_->LeaveFrame(type_); |
| + masm_->set_has_frame(old_has_frame_); |
| + masm_->set_constant_pool_available(old_has_frame_); |
|
Rodolph Perfetta (ARM)
2014/03/11 13:28:34
old_constant_pool_available_
rmcilroy
2014/03/11 16:36:34
Done thanks (I had this change, but it seemed to h
|
| + } |
| + |
| + // Normally we generate the leave-frame code when this object goes |
| + // out of scope. Sometimes we may need to generate the code somewhere else |
| + // in addition. Calling this will achieve that, but the object stays in |
| + // scope, the MacroAssembler is still marked as being in a frame scope, and |
| + // the code will be generated again when it goes out of scope. |
| + void GenerateLeaveFrame() { |
| + ASSERT(type_ != StackFrame::MANUAL && type_ != StackFrame::NONE); |
| + masm_->LeaveFrame(type_); |
| + } |
| + |
| + private: |
| + MacroAssembler* masm_; |
| + StackFrame::Type type_; |
| + bool old_has_frame_; |
| + bool old_constant_pool_available_; |
| + |
| + DISALLOW_IMPLICIT_CONSTRUCTORS(FrameAndConstantPoolScope); |
| +}; |
| + |
| + |
| +// Class for scoping the the unavailability of constant pool access. |
| +class ConstantPoolUnavailableScope { |
| + public: |
| + explicit ConstantPoolUnavailableScope(MacroAssembler* masm) |
| + : masm_(masm), |
| + old_constant_pool_available_(masm->is_constant_pool_available()) { |
| + if (FLAG_enable_ool_constant_pool) { |
| + masm_->set_constant_pool_available(false); |
| + } |
| + } |
| + ~ConstantPoolUnavailableScope() { |
| + if (FLAG_enable_ool_constant_pool) { |
| + masm_->set_constant_pool_available(old_constant_pool_available_); |
| + } |
| + } |
| + |
| + private: |
| + MacroAssembler* masm_; |
| + int old_constant_pool_available_; |
| + |
| + DISALLOW_IMPLICIT_CONSTRUCTORS(ConstantPoolUnavailableScope); |
| +}; |
| + |
| + |
| // ----------------------------------------------------------------------------- |
| // Static helper functions. |