1 // Copyright 2015 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "src/compiler/frame.h" 6 7 #include "src/compiler/linkage.h" 8 #include "src/compiler/register-allocator.h" 9 #include "src/macro-assembler.h" 10 11 namespace v8 { 12 namespace internal { 13 namespace compiler { 14 Frame(int fixed_frame_size_in_slots,const CallDescriptor * descriptor)15Frame::Frame(int fixed_frame_size_in_slots, const CallDescriptor* descriptor) 16 : needs_frame_((descriptor != nullptr) && 17 descriptor->RequiresFrameAsIncoming()), 18 frame_slot_count_(fixed_frame_size_in_slots), 19 callee_saved_slot_count_(0), 20 spill_slot_count_(0), 21 allocated_registers_(nullptr), 22 allocated_double_registers_(nullptr) {} 23 24 SetFrameAccessToDefault()25void FrameAccessState::SetFrameAccessToDefault() { 26 if (frame()->needs_frame() && !FLAG_turbo_sp_frame_access) { 27 SetFrameAccessToFP(); 28 } else { 29 SetFrameAccessToSP(); 30 } 31 } 32 33 GetFrameOffset(int spill_slot) const34FrameOffset FrameAccessState::GetFrameOffset(int spill_slot) const { 35 const int offset = 36 (StandardFrameConstants::kFixedSlotCountAboveFp - spill_slot - 1) * 37 kPointerSize; 38 if (access_frame_with_fp()) { 39 DCHECK(frame()->needs_frame()); 40 return FrameOffset::FromFramePointer(offset); 41 } else { 42 // No frame. Retrieve all parameters relative to stack pointer. 43 int sp_offset = 44 offset + ((frame()->GetSpToFpSlotCount() + sp_delta()) * kPointerSize); 45 return FrameOffset::FromStackPointer(sp_offset); 46 } 47 } 48 49 50 } // namespace compiler 51 } // namespace internal 52 } // namespace v8 53