mirror of
https://github.com/crosstool-ng/crosstool-ng.git
synced 2024-12-27 00:11:05 +00:00
85 lines
3.4 KiB
Diff
85 lines
3.4 KiB
Diff
|
From a519149de34facf645064c1ea5748aeb7d72aca4 Mon Sep 17 00:00:00 2001
|
||
|
From: Richard Sandiford <richard.sandiford@arm.com>
|
||
|
Date: Tue, 27 Jun 2023 11:17:33 +0100
|
||
|
Subject: [PATCH 28/42] aarch64: Add bytes_below_hard_fp to frame info
|
||
|
|
||
|
Following on from the previous bytes_below_saved_regs patch, this one
|
||
|
records the number of bytes that are below the hard frame pointer.
|
||
|
This eventually replaces below_hard_fp_saved_regs_size.
|
||
|
|
||
|
If a frame pointer is not needed, the epilogue adds final_adjust
|
||
|
to the stack pointer before restoring registers:
|
||
|
|
||
|
aarch64_add_sp (tmp1_rtx, tmp0_rtx, final_adjust, true);
|
||
|
|
||
|
Therefore, if the epilogue needs to restore the stack pointer from
|
||
|
the hard frame pointer, the directly corresponding offset is:
|
||
|
|
||
|
-bytes_below_hard_fp + final_adjust
|
||
|
|
||
|
i.e. go from the hard frame pointer to the bottom of the frame,
|
||
|
then add the same amount as if we were using the stack pointer
|
||
|
from the outset.
|
||
|
|
||
|
gcc/
|
||
|
* config/aarch64/aarch64.h (aarch64_frame::bytes_below_hard_fp): New
|
||
|
field.
|
||
|
* config/aarch64/aarch64.c (aarch64_layout_frame): Initialize it.
|
||
|
(aarch64_expand_epilogue): Use it instead of
|
||
|
below_hard_fp_saved_regs_size.
|
||
|
---
|
||
|
gcc/config/aarch64/aarch64.c | 6 +++---
|
||
|
gcc/config/aarch64/aarch64.h | 5 +++++
|
||
|
2 files changed, 8 insertions(+), 3 deletions(-)
|
||
|
|
||
|
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
|
||
|
index 6109518189fb..2652515b3615 100644
|
||
|
--- a/gcc/config/aarch64/aarch64.c
|
||
|
+++ b/gcc/config/aarch64/aarch64.c
|
||
|
@@ -6954,6 +6954,7 @@ aarch64_layout_frame (void)
|
||
|
of the callee save area. */
|
||
|
bool saves_below_hard_fp_p = maybe_ne (offset, 0);
|
||
|
frame.below_hard_fp_saved_regs_size = offset;
|
||
|
+ frame.bytes_below_hard_fp = offset + frame.bytes_below_saved_regs;
|
||
|
if (frame.emit_frame_chain)
|
||
|
{
|
||
|
/* FP and LR are placed in the linkage record. */
|
||
|
@@ -8481,8 +8482,7 @@ aarch64_expand_epilogue (bool for_sibcall)
|
||
|
poly_int64 final_adjust = frame.final_adjust;
|
||
|
poly_int64 callee_offset = frame.callee_offset;
|
||
|
poly_int64 sve_callee_adjust = frame.sve_callee_adjust;
|
||
|
- poly_int64 below_hard_fp_saved_regs_size
|
||
|
- = frame.below_hard_fp_saved_regs_size;
|
||
|
+ poly_int64 bytes_below_hard_fp = frame.bytes_below_hard_fp;
|
||
|
unsigned reg1 = frame.wb_candidate1;
|
||
|
unsigned reg2 = frame.wb_candidate2;
|
||
|
rtx cfi_ops = NULL;
|
||
|
@@ -8538,7 +8538,7 @@ aarch64_expand_epilogue (bool for_sibcall)
|
||
|
is restored on the instruction doing the writeback. */
|
||
|
aarch64_add_offset (Pmode, stack_pointer_rtx,
|
||
|
hard_frame_pointer_rtx,
|
||
|
- -callee_offset - below_hard_fp_saved_regs_size,
|
||
|
+ -bytes_below_hard_fp + final_adjust,
|
||
|
tmp1_rtx, tmp0_rtx, callee_adjust == 0);
|
||
|
else
|
||
|
/* The case where we need to re-use the register here is very rare, so
|
||
|
diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h
|
||
|
index 083ffbfbc530..a4cbc678cef3 100644
|
||
|
--- a/gcc/config/aarch64/aarch64.h
|
||
|
+++ b/gcc/config/aarch64/aarch64.h
|
||
|
@@ -829,6 +829,11 @@ struct GTY (()) aarch64_frame
|
||
|
are saved below the hard frame pointer. */
|
||
|
poly_int64 below_hard_fp_saved_regs_size;
|
||
|
|
||
|
+ /* The number of bytes between the bottom of the static frame (the bottom
|
||
|
+ of the outgoing arguments) and the hard frame pointer. This value is
|
||
|
+ always a multiple of STACK_BOUNDARY. */
|
||
|
+ poly_int64 bytes_below_hard_fp;
|
||
|
+
|
||
|
/* Offset from the base of the frame (incomming SP) to the
|
||
|
top of the locals area. This value is always a multiple of
|
||
|
STACK_BOUNDARY. */
|
||
|
--
|
||
|
2.42.0
|
||
|
|