Index: src/compiler/frame.h |
diff --git a/src/compiler/frame.h b/src/compiler/frame.h |
index 77dccaa629cc0c36e2cb604dc5e3ebf3e7065055..d413d3e0336841dee93a753b12a3b431dad99994 100644 |
--- a/src/compiler/frame.h |
+++ b/src/compiler/frame.h |
@@ -81,26 +81,13 @@ class Frame : public ZoneObject { |
explicit Frame(int fixed_frame_size_in_slots, |
const CallDescriptor* descriptor); |
- inline bool needs_frame() const { return needs_frame_; } |
- inline void MarkNeedsFrame() { needs_frame_ = true; } |
- |
inline int GetTotalFrameSlotCount() const { return frame_slot_count_; } |
- inline int GetSPToFPSlotCount() const { |
- return GetTotalFrameSlotCount() - |
- StandardFrameConstants::kFixedSlotCountAboveFp; |
- } |
inline int GetSavedCalleeRegisterSlotCount() const { |
return callee_saved_slot_count_; |
} |
inline int GetSpillSlotCount() const { return spill_slot_count_; } |
- inline void SetElidedFrameSizeInSlots(int slots) { |
- DCHECK_EQ(0, callee_saved_slot_count_); |
- DCHECK_EQ(0, spill_slot_count_); |
- frame_slot_count_ = slots; |
- } |
- |
void SetAllocatedRegisters(BitVector* regs) { |
DCHECK(allocated_registers_ == nullptr); |
allocated_registers_ = regs; |
@@ -120,21 +107,18 @@ class Frame : public ZoneObject { |
int alignment_slots = alignment / kPointerSize; |
int delta = alignment_slots - (frame_slot_count_ & (alignment_slots - 1)); |
if (delta != alignment_slots) { |
- DCHECK(needs_frame_); |
frame_slot_count_ += delta; |
} |
return delta; |
} |
void AllocateSavedCalleeRegisterSlots(int count) { |
- needs_frame_ = true; |
frame_slot_count_ += count; |
callee_saved_slot_count_ += count; |
} |
int AllocateSpillSlot(int width) { |
DCHECK_EQ(0, callee_saved_slot_count_); |
- needs_frame_ = true; |
int frame_slot_count_before = frame_slot_count_; |
int slot = AllocateAlignedFrameSlot(width); |
spill_slot_count_ += (frame_slot_count_ - frame_slot_count_before); |
@@ -146,7 +130,6 @@ class Frame : public ZoneObject { |
int ReserveSpillSlots(size_t slot_count) { |
DCHECK_EQ(0, callee_saved_slot_count_); |
DCHECK_EQ(0, spill_slot_count_); |
- needs_frame_ = true; |
spill_slot_count_ += static_cast<int>(slot_count); |
frame_slot_count_ += static_cast<int>(slot_count); |
return frame_slot_count_ - 1; |
@@ -168,7 +151,6 @@ class Frame : public ZoneObject { |
} |
private: |
- bool needs_frame_; |
int frame_slot_count_; |
int callee_saved_slot_count_; |
int spill_slot_count_; |
@@ -210,23 +192,33 @@ class FrameOffset { |
class FrameAccessState : public ZoneObject { |
public: |
explicit FrameAccessState(Frame* const frame) |
- : frame_(frame), access_frame_with_fp_(false), sp_delta_(0) { |
- SetFrameAccessToDefault(); |
- } |
+ : frame_(frame), |
+ access_frame_with_fp_(false), |
+ sp_delta_(0), |
+ has_frame_(false) {} |
Frame* frame() const { return frame_; } |
+ void MarkHasFrame(bool state); |
int sp_delta() const { return sp_delta_; } |
void ClearSPDelta() { sp_delta_ = 0; } |
void IncreaseSPDelta(int amount) { sp_delta_ += amount; } |
bool access_frame_with_fp() const { return access_frame_with_fp_; } |
+ |
+ // Regardless of how we access slots on the stack - using sp or fp - do we |
+ // have a frame, at the current stage in code generation. |
+ bool has_frame() const { return has_frame_; } |
+ |
void SetFrameAccessToDefault(); |
void SetFrameAccessToFP() { access_frame_with_fp_ = true; } |
void SetFrameAccessToSP() { access_frame_with_fp_ = false; } |
int GetSPToFPSlotCount() const { |
- return frame_->GetSPToFPSlotCount() + sp_delta(); |
+ int frame_slot_count = |
+ (has_frame() ? frame()->GetTotalFrameSlotCount() : kElidedFrameSlots) - |
+ StandardFrameConstants::kFixedSlotCountAboveFp; |
+ return frame_slot_count + sp_delta(); |
} |
int GetSPToFPOffset() const { return GetSPToFPSlotCount() * kPointerSize; } |
@@ -240,6 +232,7 @@ class FrameAccessState : public ZoneObject { |
Frame* const frame_; |
bool access_frame_with_fp_; |
int sp_delta_; |
+ bool has_frame_; |
}; |
} // namespace compiler |
} // namespace internal |