This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Forbid __builtin_return_address when inlining
- From: Andrew Haley <aph at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Wed, 22 Nov 2006 19:09:58 +0000
- Subject: Forbid __builtin_return_address when inlining
__builtin_return_address(0) returns the wrong address if its caller
has been inlined. Weirdly, we never seem to have detected this
before, but it surely must be wrong.
OK for trunk?
Andrew.
2006-11-22 Andrew Haley <aph@redhat.com>
* tree-inline.c (inline_forbidden_p_1): Forbid
__builtin_return_address.
Index: tree-inline.c
===================================================================
--- tree-inline.c (revision 118936)
+++ tree-inline.c (working copy)
@@ -1388,6 +1388,16 @@ inline_forbidden_p_1 (tree *nodep, int *
"it uses __builtin_return or __builtin_apply_args");
return node;
+ /* We can't inline functions that call
+ __builtin_return_address because it would return the
+ address of the caller of the function the inline has
+ been inlined into. */
+ case BUILT_IN_RETURN_ADDRESS:
+ inline_forbidden_reason
+ = G_("function %q+F can never be inlined because "
+ "it uses __builtin_return_address");
+ return node;
+
default:
break;
}