diff options
author | Richard Henderson <rth@redhat.com> | 2010-10-09 15:05:51 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2010-10-09 15:05:51 -0700 |
commit | 3a42502df4cb1fd3b8090658920bfe2635b39613 (patch) | |
tree | a90073debda145f6a7cc32fb368f7c0370185f15 /gcc/calls.c | |
parent | a5f4f531fe6b58b550d0fda12a90bc94b7986402 (diff) | |
download | gcc-3a42502df4cb1fd3b8090658920bfe2635b39613.zip gcc-3a42502df4cb1fd3b8090658920bfe2635b39613.tar.gz gcc-3a42502df4cb1fd3b8090658920bfe2635b39613.tar.bz2 |
re PR rtl-optimization/33721 ([meta-bug] Gcc can't properly align stack variable)
PR rtl-opt/33721
* explow.c (allocate_dynamic_stack_space): Add REQUIRED_ALIGN parm,
remove TARGET parm, convert KNOWN_ALIGN parm to SIZE_ALIGN. Honor
required_align, tidy the code a bit. Emit split_stack code in the
right place. Mark the return value with the alignment properly.
* expr.h (allocate_dynamic_stack_space): Update decl.
* builtins.c (expand_builtin_apply): Update call to
allocate_dynamic_stack_space.
(expand_builtin_alloca): Likewise. Remove TARGET parameter.
* calls.c (initialize_argument_information): Update call to
allocate_dynamic_stack_space.
(expand_call): Likewise.
* cfgexpand.c (get_decl_align_unit): Don't limit alignment.
Don't update_stack_alignment here.
(alloc_stack_frame_space): Make ALIGN unsigned.
(stack_var_cmp): Sort by alignment too.
(partition_stack_vars): Don't merge large and small alignment vars.
(expand_one_stack_var_at): Add BASE and BASE_ALIGN parameters.
Take care when BASE is not virtual_stack_vars_rtx.
(expand_stack_vars): Allocate dynamic stack space for large
alignment variables.
(expand_one_stack_var): Update all to expand_one_stack_var_at.
(defer_stack_allocation): True for large alignment vars.
(update_stack_alignment): Merge into ...
(expand_one_var): ... here.
(gimple_expand_cfg): Place code from expand_stack_vars.
From-SVN: r165240
Diffstat (limited to 'gcc/calls.c')
-rw-r--r-- | gcc/calls.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/gcc/calls.c b/gcc/calls.c index 9a4768a..31dcd7b 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -1100,10 +1100,11 @@ initialize_argument_information (int num_actuals ATTRIBUTE_UNUSED, /* We can pass TRUE as the 4th argument because we just saved the stack pointer and will restore it right after the call. */ - copy = gen_rtx_MEM (BLKmode, - allocate_dynamic_stack_space - (size_rtx, NULL_RTX, - TYPE_ALIGN (type), TRUE)); + copy = allocate_dynamic_stack_space (size_rtx, + TYPE_ALIGN (type), + TYPE_ALIGN (type), + true); + copy = gen_rtx_MEM (BLKmode, copy); set_mem_attributes (copy, type, 1); } else @@ -2664,8 +2665,8 @@ expand_call (tree exp, rtx target, int ignore) /* We can pass TRUE as the 4th argument because we just saved the stack pointer and will restore it right after the call. */ - allocate_dynamic_stack_space (push_size, NULL_RTX, - BITS_PER_UNIT, TRUE); + allocate_dynamic_stack_space (push_size, 0, + BIGGEST_ALIGNMENT, true); } /* If argument evaluation might modify the stack pointer, |