diff options
Diffstat (limited to 'deps/v8/src/compiler/frame.cc')
-rw-r--r-- | deps/v8/src/compiler/frame.cc | 40 |
1 files changed, 34 insertions, 6 deletions
diff --git a/deps/v8/src/compiler/frame.cc b/deps/v8/src/compiler/frame.cc index 079fccb71c..b08030b8c6 100644 --- a/deps/v8/src/compiler/frame.cc +++ b/deps/v8/src/compiler/frame.cc @@ -12,12 +12,40 @@ namespace v8 { namespace internal { namespace compiler { -Frame::Frame(int fixed_frame_size_in_slots) - : frame_slot_count_(fixed_frame_size_in_slots), - spilled_callee_register_slot_count_(0), - stack_slot_count_(0), - allocated_registers_(NULL), - allocated_double_registers_(NULL) {} +Frame::Frame(int fixed_frame_size_in_slots, const CallDescriptor* descriptor) + : needs_frame_((descriptor != nullptr) && + descriptor->RequiresFrameAsIncoming()), + frame_slot_count_(fixed_frame_size_in_slots), + callee_saved_slot_count_(0), + spill_slot_count_(0), + allocated_registers_(nullptr), + allocated_double_registers_(nullptr) {} + + +void FrameAccessState::SetFrameAccessToDefault() { + if (frame()->needs_frame() && !FLAG_turbo_sp_frame_access) { + SetFrameAccessToFP(); + } else { + SetFrameAccessToSP(); + } +} + + +FrameOffset FrameAccessState::GetFrameOffset(int spill_slot) const { + const int offset = + (StandardFrameConstants::kFixedSlotCountAboveFp - spill_slot - 1) * + kPointerSize; + if (access_frame_with_fp()) { + DCHECK(frame()->needs_frame()); + return FrameOffset::FromFramePointer(offset); + } else { + // No frame. Retrieve all parameters relative to stack pointer. + int sp_offset = + offset + ((frame()->GetSpToFpSlotCount() + sp_delta()) * kPointerSize); + return FrameOffset::FromStackPointer(sp_offset); + } +} + } // namespace compiler } // namespace internal |