aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1994-02-27 15:19:57 -0500
committerRichard Kenner <kenner@gcc.gnu.org>1994-02-27 15:19:57 -0500
commit739d15ab1771aff57c8601b4256a40de131cc975 (patch)
tree5dbe15e64402a6a5fb6483c13c5b2289c33e9c7c
parentb51e9c62f99d0cbd87924771f08c3485a0f12300 (diff)
downloadgcc-739d15ab1771aff57c8601b4256a40de131cc975.zip
gcc-739d15ab1771aff57c8601b4256a40de131cc975.tar.gz
gcc-739d15ab1771aff57c8601b4256a40de131cc975.tar.bz2
(finish_decl, finish_function): Issue warning for large objects, if
requested. From-SVN: r6653
-rw-r--r--gcc/c-decl.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/gcc/c-decl.c b/gcc/c-decl.c
index 87bf6f4..76d890b 100644
--- a/gcc/c-decl.c
+++ b/gcc/c-decl.c
@@ -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. */