expr.c (expand_expr_addr_expr_1): Detect a user request for a local frame in a naked...
authorDJ Delorie <dj@redhat.com>
Thu, 28 Jul 2011 22:26:23 +0000 (18:26 -0400)
committerDJ Delorie <dj@gcc.gnu.org>
Thu, 28 Jul 2011 22:26:23 +0000 (18:26 -0400)
* expr.c (expand_expr_addr_expr_1): Detect a user request for a
local frame in a naked function, and produce a suitable error for
that specific case.

From-SVN: r176904

gcc/ChangeLog
gcc/expr.c

index 371128808b3942120c3481112791d685d7829dcf..015724c506d11cc5990426e9b02491516a92dbca 100644 (file)
@@ -1,5 +1,9 @@
 2011-07-28  DJ Delorie  <dj@redhat.com>
 
+       * expr.c (expand_expr_addr_expr_1): Detect a user request for a
+       local frame in a naked function, and produce a suitable error for
+       that specific case.
+
        * config/m32c/m32c.c (m32c_secondary_reload_class): Allow PSI
        registers to be reloaded in HI classes when the target is HI.
 
index 59a20b79edf996dea3d6438e8a893621c352e8d1..0d88a21fded2f3ede9f1b9111ab2a05f90d75e21 100644 (file)
@@ -7088,7 +7088,16 @@ expand_expr_addr_expr_1 (tree exp, rtx target, enum machine_mode tmode,
          /* If the DECL isn't in memory, then the DECL wasn't properly
             marked TREE_ADDRESSABLE, which will be either a front-end
             or a tree optimizer bug.  */
-         gcc_assert (MEM_P (result));
+
+         if (TREE_ADDRESSABLE (exp)
+             && ! MEM_P (result)
+             && ! targetm.calls.allocate_stack_slots_for_args())
+           {
+             error ("local frame unavailable (naked function?)");
+             return result;
+           }
+         else
+           gcc_assert (MEM_P (result));
          result = XEXP (result, 0);
 
          /* ??? Is this needed anymore?  */