OSDN Git Service

* function.c (assign_stack_local_1): Issue an error message if
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 9 Nov 2005 23:28:59 +0000 (23:28 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 9 Nov 2005 23:28:59 +0000 (23:28 +0000)
the frame size overflows in the signed target arithmetics.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@106717 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/function.c

index b3e05f3..ea22150 100644 (file)
@@ -1,5 +1,10 @@
 2005-11-09  Eric Botcazou  <ebotcazou@adacore.com>
 
+       * function.c (assign_stack_local_1): Issue an error message if
+       the frame size overflows in the signed target arithmetics.
+
+2005-11-09  Eric Botcazou  <ebotcazou@adacore.com>
+
        * tree.c (build_qualified_type): Chain the new type to the original
        type's TYPE_NEXT_PTR_TO or TYPE_NEXT_REF_TO linked lists if it is
        a POINTER_TYPE or a REFERENCE_TYPE respectively.
index 9e36af7..963ad4f 100644 (file)
@@ -479,6 +479,19 @@ assign_stack_local_1 (enum machine_mode mode, HOST_WIDE_INT size, int align,
   function->x_stack_slot_list
     = gen_rtx_EXPR_LIST (VOIDmode, x, function->x_stack_slot_list);
 
+  /* Try to detect frame size overflows.  */
+  if ((FRAME_GROWS_DOWNWARD
+       ? (unsigned HOST_WIDE_INT) -function->x_frame_offset
+       : (unsigned HOST_WIDE_INT) function->x_frame_offset)
+       > ((unsigned HOST_WIDE_INT) 1 << (BITS_PER_WORD - 1))
+           /* Leave room for the fixed part of the frame.  */
+           - 64 * UNITS_PER_WORD)
+    {
+      error ("%Jtotal size of local objects too large", function->decl);
+      /* Avoid duplicate error messages as much as possible.  */
+      function->x_frame_offset = 0;
+    }
+
   return x;
 }