(expand_builtin, BUILT_IN_FRAME_ADDRESS case): Use new
authorJim Wilson <wilson@gcc.gnu.org>
Tue, 2 Mar 1993 21:10:49 +0000 (13:10 -0800)
committerJim Wilson <wilson@gcc.gnu.org>
Tue, 2 Mar 1993 21:10:49 +0000 (13:10 -0800)
macros SETUP_FRAME_ADDRESSES and RETURN_ADDR_IN_PREVIOUS_FRAME.

From-SVN: r3609

gcc/expr.c

index 0f63276..aa98632 100644 (file)
@@ -6301,6 +6301,23 @@ expand_builtin (exp, target, subtarget, mode, ignore)
          rtx tem = frame_pointer_rtx;
          int i;
 
+         /* 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.  */
+#ifdef SETUP_FRAME_ADDRESSES
+         SETUP_FRAME_ADDRESSES ();
+#endif
+
+         /* On the sparc, the return address is not in the frame, it is
+            in a 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 (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_RETURN_ADDRESS)
+           count--;
+#endif
+
          /* Scan back COUNT frames to the specified frame.  */
          for (i = 0; i < count; i++)
            {