(finish_decl, finish_function): Issue warning for large objects, if
authorRichard Kenner <kenner@gcc.gnu.org>
Sun, 27 Feb 1994 20:19:57 +0000 (15:19 -0500)
committerRichard Kenner <kenner@gcc.gnu.org>
Sun, 27 Feb 1994 20:19:57 +0000 (15:19 -0500)
requested.

From-SVN: r6653

gcc/c-decl.c

index 87bf6f4a9988bca8bdc17c9c85610a4fc6f90657..76d890b8e0493ecc8a1c013ad3bf80f0599bd67d 100644 (file)
@@ -3589,6 +3589,23 @@ finish_decl (decl, init, asmspec_tree)
        }
     }
 
+  /* If requested, warn about definitions of large data objects.  */
+
+  if (warn_larger_than
+      && (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == PARM_DECL)
+      && !DECL_EXTERNAL (decl))
+    {
+      register tree decl_size = DECL_SIZE (decl);
+
+      if (decl_size && TREE_CODE (decl_size) == INTEGER_CST)
+       {
+          unsigned units = TREE_INT_CST_LOW(decl_size) / BITS_PER_UNIT;
+
+         if (units > larger_than_size)
+           warning_with_decl (decl, "size of `%s' is %u bytes", units);
+       }
+    }
+
 #if 0
   /* Resume permanent allocation, if not within a function.  */
   /* The corresponding push_obstacks_nochange is in start_decl,
@@ -6499,6 +6516,31 @@ finish_function (nested)
           && current_function_returns_value && current_function_returns_null)
     warning ("this function may return with or without a value");
 
+  /* If requested, warn about function definitions where the function will
+     return a value (usually of some struct or union type) which itself will
+     take up a lot of stack space.  */
+
+  if (warn_larger_than && !DECL_EXTERNAL (fndecl) && TREE_TYPE (fndecl))
+    {
+      register tree ret_type = TREE_TYPE (TREE_TYPE (fndecl));
+
+      if (ret_type)
+       {
+         register tree ret_type_size = TYPE_SIZE (ret_type);
+
+         if (TREE_CODE (ret_type_size) == INTEGER_CST)
+           {
+             unsigned units
+               = TREE_INT_CST_LOW (ret_type_size) / BITS_PER_UNIT;
+
+             if (units > larger_than_size)
+               warning_with_decl (fndecl,
+                                  "size of return value of `%s' is %u bytes",
+                                  units);
+           }
+       }
+    }
+
   /* Free all the tree nodes making up this function.  */
   /* Switch back to allocating nodes permanently
      until we start another function.  */