diff options
author | mpolacek <mpolacek@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-12-03 12:11:36 +0000 |
---|---|---|
committer | mpolacek <mpolacek@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-12-03 12:11:36 +0000 |
commit | ba83222c8887b2e4e5f1b3476a5cd9914ced1d6a (patch) | |
tree | b8d4def2131b95da10e3344eaeb8be439020791c /gcc/calls.c | |
parent | 05e8f674615f219ecae7d66036b25521879f3fd6 (diff) | |
download | ppe42-gcc-ba83222c8887b2e4e5f1b3476a5cd9914ced1d6a.tar.gz ppe42-gcc-ba83222c8887b2e4e5f1b3476a5cd9914ced1d6a.zip |
PR middle-end/56344
* calls.c (expand_call): Disallow passing huge arguments
by value.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@205628 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/calls.c')
-rw-r--r-- | gcc/calls.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/gcc/calls.c b/gcc/calls.c index 7d6327f28ef..3963bc29754 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -3045,6 +3045,15 @@ expand_call (tree exp, rtx target, int ignore) { rtx before_arg = get_last_insn (); + /* We don't allow passing huge (> 2^30 B) arguments + by value. It would cause an overflow later on. */ + if (adjusted_args_size.constant + >= (1 << (HOST_BITS_PER_INT - 2))) + { + sorry ("passing too large argument on stack"); + continue; + } + if (store_one_arg (&args[i], argblock, flags, adjusted_args_size.var != 0, reg_parm_stack_space) |