builtins.c (expand_builtin_return_addr): Only use frame_pointer_rtx when count =...
authorMark Shinwell <shinwell@codesourcery.com>
Mon, 12 Jun 2006 12:56:52 +0000 (12:56 +0000)
committerMark Shinwell <shinwell@gcc.gnu.org>
Mon, 12 Jun 2006 12:56:52 +0000 (12:56 +0000)
gcc/
* builtins.c (expand_builtin_return_addr): Only use
frame_pointer_rtx when count == 0 and we are expanding
__builtin_return_address.

From-SVN: r114567

gcc/ChangeLog
gcc/builtins.c

index 475c36fccae2238e729a4216d3588f537f2ba8a4..45696359c28e0e48e427dac0c7fd577aad2f960f 100644 (file)
@@ -1,3 +1,9 @@
+2006-06-12  Mark Shinwell  <shinwell@codesourcery.com>
+
+       * builtins.c (expand_builtin_return_addr): Only use
+       frame_pointer_rtx when count == 0 and we are expanding
+       __builtin_return_address.
+
 2006-06-12  Fred Fish  <fnf@specifix.com>
 
        * config/mips/mips.c (mips_file_start): Create special section
index 603106a6751ceffcae657e7df1e25a273769c975..80f2fbbf4b79320df5cfccffe220c213fe48ba20 100644 (file)
@@ -509,12 +509,16 @@ expand_builtin_return_addr (enum built_in_function fndecl_code, int count)
 #else
   rtx tem;
 
-  /* For a zero count, we don't care what frame address we return, so frame
-     pointer elimination is OK, and using the soft frame pointer is OK.
-     For a nonzero count, we require a stable offset from the current frame
-     pointer to the previous one, so we must use the hard frame pointer, and
+  /* 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 non-zero 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)
+  if (count == 0 && fndecl_code == BUILT_IN_RETURN_ADDRESS)
     tem = frame_pointer_rtx;
   else
     {