diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1994-02-27 15:19:57 -0500 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1994-02-27 15:19:57 -0500 |
commit | 739d15ab1771aff57c8601b4256a40de131cc975 (patch) | |
tree | 5dbe15e64402a6a5fb6483c13c5b2289c33e9c7c | |
parent | b51e9c62f99d0cbd87924771f08c3485a0f12300 (diff) | |
download | gcc-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.c | 42 |
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. */ |