From: Trevor Saunders <tbsaunde+...@tbsaunde.org>

gcc/ChangeLog:

2015-10-10  Trevor Saunders  <tbsaunde+...@tbsaunde.org>

        * builtins.c (expand_builtin_return_addr): Adjust.
        * defaults.h (INITIAL_FRAME_ADDRESS_RTX): New default definition.
---
 gcc/builtins.c | 41 +++++++++++++++++++----------------------
 gcc/defaults.h |  4 ++++
 2 files changed, 23 insertions(+), 22 deletions(-)

diff --git a/gcc/builtins.c b/gcc/builtins.c
index 643eeef..3bbe763 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -761,31 +761,28 @@ static rtx
 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;
-
-  /* For a zero count with __builtin_return_address, we don't care what
-     frame address we return, because target-specific definitions will
-     override us.  Therefore frame pointer elimination is OK, and using
-     the soft frame pointer is OK.
-
-     For a nonzero count, or a zero count with __builtin_frame_address,
-     we require a stable offset from the current frame pointer to the
-     previous one, so we must use the hard frame pointer, and
-     we must disable frame pointer elimination.  */
-  if (count == 0 && fndecl_code == BUILT_IN_RETURN_ADDRESS)
-    tem = frame_pointer_rtx;
-  else
-    {
-      tem = hard_frame_pointer_rtx;
+  if (tem == NULL_RTX)
+    {
+      /* For a zero count with __builtin_return_address, we don't care what
+        frame address we return, because target-specific definitions will
+        override us.  Therefore frame pointer elimination is OK, and using
+        the soft frame pointer is OK.
+
+        For a nonzero count, or a zero count with __builtin_frame_address,
+        we require a stable offset from the current frame pointer to the
+        previous one, so we must use the hard frame pointer, and
+        we must disable frame pointer elimination.  */
+      if (count == 0 && fndecl_code == BUILT_IN_RETURN_ADDRESS)
+       tem = frame_pointer_rtx;
+      else
+       {
+         tem = hard_frame_pointer_rtx;
 
-      /* Tell reload not to eliminate the frame pointer.  */
-      crtl->accesses_prior_frames = 1;
+         /* Tell reload not to eliminate the frame pointer.  */
+         crtl->accesses_prior_frames = 1;
+       }
     }
-#endif
 
   /* Some machines need special handling before we can access
      arbitrary frames.  For example, on the SPARC, we must first flush
diff --git a/gcc/defaults.h b/gcc/defaults.h
index 14ef91a..c4d9536 100644
--- a/gcc/defaults.h
+++ b/gcc/defaults.h
@@ -1277,6 +1277,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. 
 If not, see
 #define CONSTANT_ALIGNMENT(EXP, ALIGN) ALIGN
 #endif
 
+#ifndef INITIAL_FRAME_ADDRESS_RTX
+#define INITIAL_FRAME_ADDRESS_RTX NULL
+#endif
+
 #ifdef GCC_INSN_FLAGS_H
 /* Dependent default target macro definitions
 
-- 
2.6.1

Reply via email to