Commit 13568594 authored by Bill Budge's avatar Bill Budge Committed by Commit Bot

Reland "[compiler][linkage] No allocation of slots after aligning a frame"

This is a reland of b18bc221

It is unchanged, so:
TBR=jgruber@chromium.org, georgia.kouveli@arm.com

Original change's description:
> [compiler][linkage] No allocation of slots after aligning a frame
>
> - Adds DCHECKs to make sure no stack slots are allocated after
>   aligning a frame.
> - Changes Arm64 CodeGenerator::FinishFrame to align the frame after
>   allocating callee-saved registers, and relaxes the constraints on
>   the number of callee-saved registers.
>
> Bug: v8:9198
> Change-Id: Iacb0518b57fa3ea2ff801eda69719f4c32733850
> Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2694104
> Reviewed-by: Jakob Gruber <jgruber@chromium.org>
> Commit-Queue: Bill Budge <bbudge@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#72781}

Bug: v8:9198
Change-Id: I0b809fab67586ac188c39ef1569c0b2ceb60d3b9
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2738957Reviewed-by: 's avatarBill Budge <bbudge@chromium.org>
Commit-Queue: Bill Budge <bbudge@chromium.org>
Cr-Commit-Position: refs/heads/master@{#73239}
parent e639eafe
...@@ -3014,7 +3014,6 @@ void CodeGenerator::AssembleArchTableSwitch(Instruction* instr) { ...@@ -3014,7 +3014,6 @@ void CodeGenerator::AssembleArchTableSwitch(Instruction* instr) {
} }
void CodeGenerator::FinishFrame(Frame* frame) { void CodeGenerator::FinishFrame(Frame* frame) {
frame->AlignFrame(16);
auto call_descriptor = linkage()->GetIncomingDescriptor(); auto call_descriptor = linkage()->GetIncomingDescriptor();
// Save FP registers. // Save FP registers.
...@@ -3023,7 +3022,6 @@ void CodeGenerator::FinishFrame(Frame* frame) { ...@@ -3023,7 +3022,6 @@ void CodeGenerator::FinishFrame(Frame* frame) {
int saved_count = saves_fp.Count(); int saved_count = saves_fp.Count();
if (saved_count != 0) { if (saved_count != 0) {
DCHECK(saves_fp.list() == CPURegList::GetCalleeSavedV().list()); DCHECK(saves_fp.list() == CPURegList::GetCalleeSavedV().list());
DCHECK_EQ(saved_count % 2, 0);
frame->AllocateSavedCalleeRegisterSlots(saved_count * frame->AllocateSavedCalleeRegisterSlots(saved_count *
(kDoubleSize / kSystemPointerSize)); (kDoubleSize / kSystemPointerSize));
} }
...@@ -3032,9 +3030,9 @@ void CodeGenerator::FinishFrame(Frame* frame) { ...@@ -3032,9 +3030,9 @@ void CodeGenerator::FinishFrame(Frame* frame) {
call_descriptor->CalleeSavedRegisters()); call_descriptor->CalleeSavedRegisters());
saved_count = saves.Count(); saved_count = saves.Count();
if (saved_count != 0) { if (saved_count != 0) {
DCHECK_EQ(saved_count % 2, 0);
frame->AllocateSavedCalleeRegisterSlots(saved_count); frame->AllocateSavedCalleeRegisterSlots(saved_count);
} }
frame->AlignFrame(16);
} }
void CodeGenerator::AssembleConstructFrame() { void CodeGenerator::AssembleConstructFrame() {
......
...@@ -20,6 +20,7 @@ Frame::Frame(int fixed_frame_size_in_slots) ...@@ -20,6 +20,7 @@ Frame::Frame(int fixed_frame_size_in_slots)
void Frame::AlignFrame(int alignment) { void Frame::AlignFrame(int alignment) {
#if DEBUG #if DEBUG
spill_slots_finished_ = true; spill_slots_finished_ = true;
frame_aligned_ = true;
#endif #endif
// In the calculations below we assume that alignment is a power of 2. // In the calculations below we assume that alignment is a power of 2.
DCHECK(base::bits::IsPowerOfTwo(alignment)); DCHECK(base::bits::IsPowerOfTwo(alignment));
......
...@@ -116,6 +116,7 @@ class V8_EXPORT_PRIVATE Frame : public ZoneObject { ...@@ -116,6 +116,7 @@ class V8_EXPORT_PRIVATE Frame : public ZoneObject {
} }
void AlignSavedCalleeRegisterSlots(int alignment = kDoubleSize) { void AlignSavedCalleeRegisterSlots(int alignment = kDoubleSize) {
DCHECK(!frame_aligned_);
#if DEBUG #if DEBUG
spill_slots_finished_ = true; spill_slots_finished_ = true;
#endif #endif
...@@ -127,6 +128,7 @@ class V8_EXPORT_PRIVATE Frame : public ZoneObject { ...@@ -127,6 +128,7 @@ class V8_EXPORT_PRIVATE Frame : public ZoneObject {
} }
void AllocateSavedCalleeRegisterSlots(int count) { void AllocateSavedCalleeRegisterSlots(int count) {
DCHECK(!frame_aligned_);
#if DEBUG #if DEBUG
spill_slots_finished_ = true; spill_slots_finished_ = true;
#endif #endif
...@@ -138,6 +140,7 @@ class V8_EXPORT_PRIVATE Frame : public ZoneObject { ...@@ -138,6 +140,7 @@ class V8_EXPORT_PRIVATE Frame : public ZoneObject {
fixed_slot_count_ + spill_slot_count_ + return_slot_count_); fixed_slot_count_ + spill_slot_count_ + return_slot_count_);
// Never allocate spill slots after the callee-saved slots are defined. // Never allocate spill slots after the callee-saved slots are defined.
DCHECK(!spill_slots_finished_); DCHECK(!spill_slots_finished_);
DCHECK(!frame_aligned_);
int actual_width = std::max({width, AlignedSlotAllocator::kSlotSize}); int actual_width = std::max({width, AlignedSlotAllocator::kSlotSize});
int actual_alignment = int actual_alignment =
std::max({alignment, AlignedSlotAllocator::kSlotSize}); std::max({alignment, AlignedSlotAllocator::kSlotSize});
...@@ -164,6 +167,7 @@ class V8_EXPORT_PRIVATE Frame : public ZoneObject { ...@@ -164,6 +167,7 @@ class V8_EXPORT_PRIVATE Frame : public ZoneObject {
} }
void EnsureReturnSlots(int count) { void EnsureReturnSlots(int count) {
DCHECK(!frame_aligned_);
return_slot_count_ = std::max(return_slot_count_, count); return_slot_count_ = std::max(return_slot_count_, count);
} }
...@@ -171,6 +175,7 @@ class V8_EXPORT_PRIVATE Frame : public ZoneObject { ...@@ -171,6 +175,7 @@ class V8_EXPORT_PRIVATE Frame : public ZoneObject {
int ReserveSpillSlots(size_t slot_count) { int ReserveSpillSlots(size_t slot_count) {
DCHECK_EQ(0, spill_slot_count_); DCHECK_EQ(0, spill_slot_count_);
DCHECK(!frame_aligned_);
spill_slot_count_ += static_cast<int>(slot_count); spill_slot_count_ += static_cast<int>(slot_count);
slot_allocator_.AllocateUnaligned(static_cast<int>(slot_count)); slot_allocator_.AllocateUnaligned(static_cast<int>(slot_count));
return slot_allocator_.Size() - 1; return slot_allocator_.Size() - 1;
...@@ -187,6 +192,7 @@ class V8_EXPORT_PRIVATE Frame : public ZoneObject { ...@@ -187,6 +192,7 @@ class V8_EXPORT_PRIVATE Frame : public ZoneObject {
BitVector* allocated_double_registers_; BitVector* allocated_double_registers_;
#if DEBUG #if DEBUG
bool spill_slots_finished_ = false; bool spill_slots_finished_ = false;
bool frame_aligned_ = false;
#endif #endif
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment