aboutsummaryrefslogtreecommitdiff
path: root/gcc/function.c
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@gcc.gnu.org>2013-08-30 11:13:20 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2013-08-30 11:13:20 +0000
commitf7e088e7de99b6ab31dc56d2a3ed358647207256 (patch)
tree28d46552357ed039d57e797a50db601708d5d55e /gcc/function.c
parentbec9ec3fc1f24d55a37a6c90ac03dc60f87d4d72 (diff)
downloadgcc-f7e088e7de99b6ab31dc56d2a3ed358647207256.zip
gcc-f7e088e7de99b6ab31dc56d2a3ed358647207256.tar.gz
gcc-f7e088e7de99b6ab31dc56d2a3ed358647207256.tar.bz2
function.c (assign_parm_setup_reg): For a parameter passed by pointer and which can live in a register...
* function.c (assign_parm_setup_reg): For a parameter passed by pointer and which can live in a register, always retrieve the value on entry. * var-tracking.c (add_stores): Treat the copy on entry for a parameter passed by invisible reference specially. (emit_notes_in_bb) <MO_VAL_USE>: Emit notes before the instruction. (vt_add_function_parameter): Correctly deal with a parameter passed by invisible reference. From-SVN: r202102
Diffstat (limited to 'gcc/function.c')
-rw-r--r--gcc/function.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/gcc/function.c b/gcc/function.c
index c1550a2..08731e84 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -3101,17 +3101,27 @@ assign_parm_setup_reg (struct assign_parm_data_all *all, tree parm,
emit_move_insn (parmreg, validated_mem);
/* If we were passed a pointer but the actual value can safely live
- in a register, put it in one. */
- if (data->passed_pointer
- && TYPE_MODE (TREE_TYPE (parm)) != BLKmode
- /* If by-reference argument was promoted, demote it. */
- && (TYPE_MODE (TREE_TYPE (parm)) != GET_MODE (DECL_RTL (parm))
- || use_register_for_decl (parm)))
+ in a register, retrieve it and use it directly. */
+ if (data->passed_pointer && TYPE_MODE (TREE_TYPE (parm)) != BLKmode)
{
/* We can't use nominal_mode, because it will have been set to
Pmode above. We must use the actual mode of the parm. */
- parmreg = gen_reg_rtx (TYPE_MODE (TREE_TYPE (parm)));
- mark_user_reg (parmreg);
+ if (use_register_for_decl (parm))
+ {
+ parmreg = gen_reg_rtx (TYPE_MODE (TREE_TYPE (parm)));
+ mark_user_reg (parmreg);
+ }
+ else
+ {
+ int align = STACK_SLOT_ALIGNMENT (TREE_TYPE (parm),
+ TYPE_MODE (TREE_TYPE (parm)),
+ TYPE_ALIGN (TREE_TYPE (parm)));
+ parmreg
+ = assign_stack_local (TYPE_MODE (TREE_TYPE (parm)),
+ GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (parm))),
+ align);
+ set_mem_attributes (parmreg, parm, 1);
+ }
if (GET_MODE (parmreg) != GET_MODE (DECL_RTL (parm)))
{