summaryrefslogtreecommitdiffstats
path: root/gcc/calls.c
diff options
context:
space:
mode:
authormpolacek <mpolacek@138bc75d-0d04-0410-961f-82ee72b054a4>2013-12-03 12:11:36 +0000
committermpolacek <mpolacek@138bc75d-0d04-0410-961f-82ee72b054a4>2013-12-03 12:11:36 +0000
commitba83222c8887b2e4e5f1b3476a5cd9914ced1d6a (patch)
treeb8d4def2131b95da10e3344eaeb8be439020791c /gcc/calls.c
parent05e8f674615f219ecae7d66036b25521879f3fd6 (diff)
downloadppe42-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.c9
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)
OpenPOWER on IntegriCloud