diff options
author | Richard Sandiford <rdsandiford@googlemail.com> | 2011-09-22 12:26:41 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2011-09-22 12:26:41 +0000 |
commit | 3576f984e8e8cc65385cffcba23f403632aa88c8 (patch) | |
tree | ea10f15658f10eca2def948025beed6db152833c /gcc/calls.c | |
parent | 9e990d143674829b6583da2ab91030abbb8257dc (diff) | |
download | gcc-3576f984e8e8cc65385cffcba23f403632aa88c8.zip gcc-3576f984e8e8cc65385cffcba23f403632aa88c8.tar.gz gcc-3576f984e8e8cc65385cffcba23f403632aa88c8.tar.bz2 |
re PR middle-end/50113 (soft-float MIPS64 compiler is miscompiling ggc-page.c)
gcc/
PR middle-end/50113
PR middle-end/50061
* calls.c (emit_library_call_value_1): Use BLOCK_REG_PADDING to
get the locate.where_pad value for register-only arguments.
* config/arm/arm.c (arm_pad_arg_upward): Remove HFmode handling.
(arm_pad_reg_upward): Handle null types.
From-SVN: r179085
Diffstat (limited to 'gcc/calls.c')
-rw-r--r-- | gcc/calls.c | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/gcc/calls.c b/gcc/calls.c index 1413c8d..3fa70b5 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -3577,20 +3577,29 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value, argvec[count].partial = targetm.calls.arg_partial_bytes (args_so_far, mode, NULL_TREE, 1); - locate_and_pad_parm (mode, NULL_TREE, + if (argvec[count].reg == 0 + || argvec[count].partial != 0 + || reg_parm_stack_space > 0) + { + locate_and_pad_parm (mode, NULL_TREE, #ifdef STACK_PARMS_IN_REG_PARM_AREA - 1, + 1, #else - argvec[count].reg != 0, + argvec[count].reg != 0, +#endif + argvec[count].partial, + NULL_TREE, &args_size, &argvec[count].locate); + args_size.constant += argvec[count].locate.size.constant; + gcc_assert (!argvec[count].locate.size.var); + } +#ifdef BLOCK_REG_PADDING + else + /* The argument is passed entirely in registers. See at which + end it should be padded. */ + argvec[count].locate.where_pad = + BLOCK_REG_PADDING (mode, NULL_TREE, + GET_MODE_SIZE (mode) <= UNITS_PER_WORD); #endif - argvec[count].partial, - NULL_TREE, &args_size, &argvec[count].locate); - - gcc_assert (!argvec[count].locate.size.var); - - if (argvec[count].reg == 0 || argvec[count].partial != 0 - || reg_parm_stack_space > 0) - args_size.constant += argvec[count].locate.size.constant; targetm.calls.function_arg_advance (args_so_far, mode, (tree) 0, true); } |