From: Max Filippov <jcmvbkbc@gmail.com>
To: gcc-patches@gcc.gnu.org
Cc: Sterling Augustine <augustine.sterling@gmail.com>,
Joseph Myers <joseph@codesourcery.com>,
"David S. Miller" <davem@redhat.com>,
Richard Henderson <rth@redhat.com>,
Eric Botcazou <ebotcazou@libertysurf.fr>,
Max Filippov <jcmvbkbc@gmail.com>
Subject: [PATCH] Turn RETURN_ADDR_IN_PREVIOUS_FRAME into C expression
Date: Tue, 03 Mar 2015 06:43:00 -0000 [thread overview]
Message-ID: <1425364962-16436-1-git-send-email-jcmvbkbc@gmail.com> (raw)
This allows a target to support both windowed and non-windowed ABI.
2015-03-03 Max Filippov <jcmvbkbc@gmail.com>
gcc/
* builtins.c (expand_builtin_return_addr): Add
RETURN_ADDR_IN_PREVIOUS_FRAME to 'if' condition, remove
surrounding #ifdef.
* config/sparc/sparc.h (RETURN_ADDR_IN_PREVIOUS_FRAME): Change
definition to 1.
* config/xtensa/xtensa.h (RETURN_ADDR_IN_PREVIOUS_FRAME):
Likewise.
* defaults.h (RETURN_ADDR_IN_PREVIOUS_FRAME): Define to 0 if
undefined.
doc/tm.texi.in (RETURN_ADDR_IN_PREVIOUS_FRAME): Update
paragraph.
---
Changes RFC->PATCH:
- provide default definition for RETURN_ADDR_IN_PREVIOUS_FRAME and drop
#ifdef from builtins.c;
- update doc/tm.texi.in.
gcc/builtins.c | 4 +---
gcc/config/sparc/sparc.h | 2 +-
gcc/config/xtensa/xtensa.h | 2 +-
gcc/defaults.h | 4 ++++
gcc/doc/tm.texi.in | 7 ++++---
5 files changed, 11 insertions(+), 8 deletions(-)
diff --git a/gcc/builtins.c b/gcc/builtins.c
index fb871e6..9263777 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -802,10 +802,8 @@ expand_builtin_return_addr (enum built_in_function fndecl_code, int count)
register. There is no way to access it off of the current frame
pointer, but it can be accessed off the previous frame pointer by
reading the value from the register window save area. */
-#ifdef RETURN_ADDR_IN_PREVIOUS_FRAME
- if (fndecl_code == BUILT_IN_RETURN_ADDRESS)
+ if (RETURN_ADDR_IN_PREVIOUS_FRAME && fndecl_code == BUILT_IN_RETURN_ADDRESS)
count--;
-#endif
/* Scan back COUNT frames to the specified frame. */
for (i = 0; i < count; i++)
diff --git a/gcc/config/sparc/sparc.h b/gcc/config/sparc/sparc.h
index c6100a1..27ad748 100644
--- a/gcc/config/sparc/sparc.h
+++ b/gcc/config/sparc/sparc.h
@@ -1293,7 +1293,7 @@ do { \
access it from the current frame pointer. We can access it from the
previous frame pointer though by reading a value from the register window
save area. */
-#define RETURN_ADDR_IN_PREVIOUS_FRAME
+#define RETURN_ADDR_IN_PREVIOUS_FRAME 1
/* This is the offset of the return address to the true next instruction to be
executed for the current function. */
diff --git a/gcc/config/xtensa/xtensa.h b/gcc/config/xtensa/xtensa.h
index 74ca240..14fe4bb 100644
--- a/gcc/config/xtensa/xtensa.h
+++ b/gcc/config/xtensa/xtensa.h
@@ -615,7 +615,7 @@ typedef struct xtensa_args
/* Define this if the return address of a particular stack frame is
accessed from the frame pointer of the previous stack frame. */
-#define RETURN_ADDR_IN_PREVIOUS_FRAME
+#define RETURN_ADDR_IN_PREVIOUS_FRAME 1
/* A C expression whose value is RTL representing the value of the
return address for the frame COUNT steps up from the current
diff --git a/gcc/defaults.h b/gcc/defaults.h
index 5cef92c..1d54798 100644
--- a/gcc/defaults.h
+++ b/gcc/defaults.h
@@ -1095,6 +1095,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#define FRAME_GROWS_DOWNWARD 0
#endif
+#ifndef RETURN_ADDR_IN_PREVIOUS_FRAME
+#define RETURN_ADDR_IN_PREVIOUS_FRAME 0
+#endif
+
/* On most machines, the CFA coincides with the first incoming parm. */
#ifndef ARG_POINTER_CFA_OFFSET
#define ARG_POINTER_CFA_OFFSET(FNDECL) \
diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in
index 16d5df7..8d6dfbc 100644
--- a/gcc/doc/tm.texi.in
+++ b/gcc/doc/tm.texi.in
@@ -2650,7 +2650,7 @@ A C expression whose value is RTL representing the value of the return
address for the frame @var{count} steps up from the current frame, after
the prologue. @var{frameaddr} is the frame pointer of the @var{count}
frame, or the frame pointer of the @var{count} @minus{} 1 frame if
-@code{RETURN_ADDR_IN_PREVIOUS_FRAME} is defined.
+@code{RETURN_ADDR_IN_PREVIOUS_FRAME} is nonzero.
The value of the expression must always be the correct address when
@var{count} is zero, but may be @code{NULL_RTX} if there is no way to
@@ -2658,8 +2658,9 @@ determine the return address of other frames.
@end defmac
@defmac RETURN_ADDR_IN_PREVIOUS_FRAME
-Define this if the return address of a particular stack frame is accessed
-from the frame pointer of the previous stack frame.
+Define this macro to nonzero value if the return address of a particular
+stack frame is accessed from the frame pointer of the previous stack
+frame. The zero default for this macro is suitable for most ports.
@end defmac
@defmac INCOMING_RETURN_ADDR_RTX
--
1.8.1.4
next reply other threads:[~2015-03-03 6:43 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-03 6:43 Max Filippov [this message]
2015-03-03 14:51 ` Richard Henderson
2015-03-03 15:05 ` Max Filippov
2015-03-03 15:53 ` H.J. Lu
2015-03-03 17:01 ` Max Filippov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1425364962-16436-1-git-send-email-jcmvbkbc@gmail.com \
--to=jcmvbkbc@gmail.com \
--cc=augustine.sterling@gmail.com \
--cc=davem@redhat.com \
--cc=ebotcazou@libertysurf.fr \
--cc=gcc-patches@gcc.gnu.org \
--cc=joseph@codesourcery.com \
--cc=rth@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).