aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Krebbel <krebbel1@de.ibm.com>2005-02-17 21:09:23 +0000
committerUlrich Weigand <uweigand@gcc.gnu.org>2005-02-17 21:09:23 +0000
commitc6d010797f94f33e5c012334096bcff30ed83b04 (patch)
treec5957feb8d6a2c09259a5ac5db59b14bd8b33815
parent7b210806753f58281323b6cc4a05f1ee4f5e19dc (diff)
downloadgcc-c6d010797f94f33e5c012334096bcff30ed83b04.zip
gcc-c6d010797f94f33e5c012334096bcff30ed83b04.tar.gz
gcc-c6d010797f94f33e5c012334096bcff30ed83b04.tar.bz2
builtins.c (expand_builtin_return_addr): Remove tem parameter.
2005-02-17 Andreas Krebbel <krebbel1@de.ibm.com> * builtins.c (expand_builtin_return_addr): Remove tem parameter. tem becomes a local variable which is set to the value of the back end defined INITIAL_FRAME_ADDRESS macro. (expand_builtin_frame_address): Omit the base parameter to expand_builtin_return_addr. (expand_builtin_profile_func): Likewise. * config/s390/s390.h (INITIAL_FRAME_ADDRESS_RTX): Define new macro. (DYNAMIC_CHAIN_ADDRESS): Remove the case for the initial frame. * doc/tm.texi: Documentation for INITIAL_FRAME_ADDRESS_RTX added. From-SVN: r95194
-rw-r--r--gcc/ChangeLog12
-rw-r--r--gcc/builtins.c14
-rw-r--r--gcc/config/s390/s390.h20
-rw-r--r--gcc/doc/tm.texi12
4 files changed, 44 insertions, 14 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 899bba7..86723f9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,15 @@
+2005-02-17 Andreas Krebbel <krebbel1@de.ibm.com>
+
+ * builtins.c (expand_builtin_return_addr): Remove tem parameter.
+ tem becomes a local variable which is set to the value of the
+ back end defined INITIAL_FRAME_ADDRESS macro.
+ (expand_builtin_frame_address): Omit the base parameter to
+ expand_builtin_return_addr.
+ (expand_builtin_profile_func): Likewise.
+ * config/s390/s390.h (INITIAL_FRAME_ADDRESS_RTX): Define new macro.
+ (DYNAMIC_CHAIN_ADDRESS): Remove the case for the initial frame.
+ * doc/tm.texi: Documentation for INITIAL_FRAME_ADDRESS_RTX added.
+
2005-02-17 Jakub Jelinek <jakub@redhat.com>
* config/s390/s390.c (s390_alloc_pool, s390_free_pool,
diff --git a/gcc/builtins.c b/gcc/builtins.c
index e398019..c214ef7 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -453,11 +453,16 @@ builtin_save_expr (tree exp)
address located within it (depending on FNDECL_CODE). */
static rtx
-expand_builtin_return_addr (enum built_in_function fndecl_code, int count,
- rtx tem)
+expand_builtin_return_addr (enum built_in_function fndecl_code, int count)
{
int i;
+#ifdef INITIAL_FRAME_ADDRESS_RTX
+ rtx tem = INITIAL_FRAME_ADDRESS_RTX;
+#else
+ rtx tem = hard_frame_pointer_rtx;
+#endif
+
/* Some machines need special handling before we can access
arbitrary frames. For example, on the sparc, we must first flush
all register windows to the stack. */
@@ -4221,8 +4226,7 @@ expand_builtin_frame_address (tree fndecl, tree arglist)
{
rtx tem
= expand_builtin_return_addr (DECL_FUNCTION_CODE (fndecl),
- tree_low_cst (TREE_VALUE (arglist), 1),
- hard_frame_pointer_rtx);
+ tree_low_cst (TREE_VALUE (arglist), 1));
/* Some ports cannot access arbitrary stack frames. */
if (tem == NULL)
@@ -4855,7 +4859,7 @@ expand_builtin_profile_func (bool exitp)
emit_library_call (which, LCT_NORMAL, VOIDmode, 2, this, Pmode,
expand_builtin_return_addr (BUILT_IN_RETURN_ADDRESS,
- 0, hard_frame_pointer_rtx),
+ 0),
Pmode);
return const0_rtx;
diff --git a/gcc/config/s390/s390.h b/gcc/config/s390/s390.h
index 9a80e81..a6b7a3a 100644
--- a/gcc/config/s390/s390.h
+++ b/gcc/config/s390/s390.h
@@ -612,20 +612,22 @@ extern int current_function_outgoing_args_size;
the argument area. */
#define FIRST_PARM_OFFSET(FNDECL) 0
+/* Defining this macro makes __builtin_frame_address(0) and
+ __builtin_return_address(0) work with -fomit-frame-pointer. */
+#define INITIAL_FRAME_ADDRESS_RTX \
+ (TARGET_PACKED_STACK ? \
+ plus_constant (arg_pointer_rtx, -UNITS_PER_WORD) : \
+ plus_constant (arg_pointer_rtx, -STACK_POINTER_OFFSET))
+
/* The return address of the current frame is retrieved
from the initial value of register RETURN_REGNUM.
For frames farther back, we use the stack slot where
the corresponding RETURN_REGNUM register was saved. */
+#define DYNAMIC_CHAIN_ADDRESS(FRAME) \
+ (TARGET_PACKED_STACK ? \
+ plus_constant ((FRAME), STACK_POINTER_OFFSET - UNITS_PER_WORD) : (FRAME))
-#define DYNAMIC_CHAIN_ADDRESS(FRAME) \
- (TARGET_PACKED_STACK ? \
- ((FRAME) != hard_frame_pointer_rtx ? \
- plus_constant ((FRAME), STACK_POINTER_OFFSET - UNITS_PER_WORD) : \
- plus_constant (arg_pointer_rtx, -UNITS_PER_WORD)) : \
- ((FRAME) != hard_frame_pointer_rtx ? (FRAME) : \
- plus_constant (arg_pointer_rtx, -STACK_POINTER_OFFSET)))
-
-#define RETURN_ADDR_RTX(COUNT, FRAME) \
+#define RETURN_ADDR_RTX(COUNT, FRAME) \
s390_return_addr_rtx ((COUNT), DYNAMIC_CHAIN_ADDRESS ((FRAME)))
/* In 31-bit mode, we need to mask off the high bit of return addresses. */
diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index c14ce5d..023b907 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -2931,6 +2931,18 @@ length of the outgoing arguments. The default is correct for most
machines. See @file{function.c} for details.
@end defmac
+@defmac INITIAL_FRAME_ADDRESS_RTX
+A C expression whose value is RTL representing the address of the initial
+ stack frame. This address is passed to @code{RETURN_ADDR_RTX} and
+@code{DYNAMIC_CHAIN_ADDRESS}.
+If you don't define this macro, the default is to return
+@code{hard_frame_pointer_rtx}.
+This default is usually correct unless @code{-fomit-frame-pointer} is in
+effect.
+Define this macro in order to make @code{__builtin_frame_address (0)} and
+@code{__builtin_return_address (0)} work even in absence of a hard frame pointer.
+@end defmac
+
@defmac DYNAMIC_CHAIN_ADDRESS (@var{frameaddr})
A C expression whose value is RTL representing the address in a stack
frame where the pointer to the caller's frame is stored. Assume that