On 06/19/2018 09:11 PM, James Greenhalgh wrote:
On Mon, Jun 18, 2018 at 08:43:04AM -0500, Siddhesh Poyarekar wrote:
r217431 changed X30 as caller-saved in CALL_USE_REGISTERS because of
which this comment about X30 not being marked as call-clobbered is no
longer accurate.
Is the second paragraph is still relevant to how we define EPILOGUE_USES?
It is, but it is essentially a repetition of the comment directly above
EPILOGUE_USES.
Possibly I'd rewrite the comment to explain the behaviour around calls and
how they interact with x30.
How about this then:
Siddhesh
>From 51d1dd0ed45c3dde38192677f574f2259b869aca Mon Sep 17 00:00:00 2001
From: Siddhesh Poyarekar <siddh...@sourceware.org>
Date: Wed, 20 Jun 2018 15:06:44 +0530
Subject: [PATCH] [aarch64] Fix obsolete comment about X30
r217431 changed X30 as caller-saved in CALL_USE_REGISTERS because of
which this comment about X30 not being marked as call-clobbered is no
longer accurate. Fixed to describe the current state more accurately.
Siddhesh
* config/aarch64/aarch64.h (CALL_USE_REGISTERS): Fix obsolete
comment.
(EPILOGUE_USES): Likewise.
---
gcc/config/aarch64/aarch64.h | 23 +++++++++++------------
1 file changed, 11 insertions(+), 12 deletions(-)
diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h
index 976f9afae54..f284e74bfb8 100644
--- a/gcc/config/aarch64/aarch64.h
+++ b/gcc/config/aarch64/aarch64.h
@@ -303,15 +303,6 @@ extern unsigned aarch64_architecture_version;
register. GCC internally uses the poly_int variable aarch64_sve_vg
instead. */
-/* Note that we don't mark X30 as a call-clobbered register. The idea is
- that it's really the call instructions themselves which clobber X30.
- We don't care what the called function does with it afterwards.
-
- This approach makes it easier to implement sibcalls. Unlike normal
- calls, sibcalls don't clobber X30, so the register reaches the
- called function intact. EPILOGUE_USES says that X30 is useful
- to the called function. */
-
#define FIXED_REGISTERS \
{ \
0, 0, 0, 0, 0, 0, 0, 0, /* R0 - R7 */ \
@@ -327,6 +318,13 @@ extern unsigned aarch64_architecture_version;
0, 0, 0, 0, 0, 0, 0, 0, /* P8 - P15 */ \
}
+/* X30 is marked as caller-saved which is in line with regular function call
+ behavior since the call instructions clobber it; AARCH64_EXPAND_CALL does
+ that for regular function calls and avoids it for sibcalls. X30 is
+ considered live for sibcalls; EPILOGUE_USES helps achieve that by returning
+ true but not until function epilogues have been generated. This ensures
+ that X30 is available for use in leaf functions if needed. */
+
#define CALL_USED_REGISTERS \
{ \
1, 1, 1, 1, 1, 1, 1, 1, /* R0 - R7 */ \
@@ -391,9 +389,10 @@ extern unsigned aarch64_architecture_version;
V_ALIASES(28), V_ALIASES(29), V_ALIASES(30), V_ALIASES(31) \
}
-/* Say that the epilogue uses the return address register. Note that
- in the case of sibcalls, the values "used by the epilogue" are
- considered live at the start of the called function. */
+/* Say that the return address register is used by the epilogue, but only after
+ epilogue generation is complete. Note that in the case of sibcalls, the
+ values "used by the epilogue" are considered live at the start of the called
+ function. */
#define EPILOGUE_USES(REGNO) \
(epilogue_completed && (REGNO) == LR_REGNUM)
--
2.14.4