aboutsummaryrefslogtreecommitdiff
path: root/gcc/var-tracking.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2011-03-17 16:21:39 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2011-03-17 16:21:39 +0100
commitdb3ed0b3b72051c8b3f82f2f1228dfaad4fbce10 (patch)
tree882a420e77f6dfd63495021ecfdf408baf36266f /gcc/var-tracking.c
parent1bce4ff313bf2e2c9e942df52b494bf22886f163 (diff)
downloadgcc-db3ed0b3b72051c8b3f82f2f1228dfaad4fbce10.zip
gcc-db3ed0b3b72051c8b3f82f2f1228dfaad4fbce10.tar.gz
gcc-db3ed0b3b72051c8b3f82f2f1228dfaad4fbce10.tar.bz2
re PR middle-end/48152 (Bootstrap failure for x86_64-w64-mingw32 due ICE)
PR middle-end/48152 * var-tracking.c (prepare_call_arguments): If argument needs to be passed by reference, adjust argtype and mode. From-SVN: r171101
Diffstat (limited to 'gcc/var-tracking.c')
-rw-r--r--gcc/var-tracking.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c
index 266f11f..aab9833 100644
--- a/gcc/var-tracking.c
+++ b/gcc/var-tracking.c
@@ -5732,11 +5732,18 @@ prepare_call_arguments (basic_block bb, rtx insn)
call_arguments = gen_rtx_EXPR_LIST (VOIDmode, item, call_arguments);
if (t && t != void_list_node)
{
- enum machine_mode mode = TYPE_MODE (TREE_VALUE (t));
- rtx reg = targetm.calls.function_arg (&args_so_far, mode,
- TREE_VALUE (t), true);
- if (TREE_CODE (TREE_VALUE (t)) == REFERENCE_TYPE
- && INTEGRAL_TYPE_P (TREE_TYPE (TREE_VALUE (t)))
+ tree argtype = TREE_VALUE (t);
+ enum machine_mode mode = TYPE_MODE (argtype);
+ rtx reg;
+ if (pass_by_reference (&args_so_far, mode, argtype, true))
+ {
+ argtype = build_pointer_type (argtype);
+ mode = TYPE_MODE (argtype);
+ }
+ reg = targetm.calls.function_arg (&args_so_far, mode,
+ argtype, true);
+ if (TREE_CODE (argtype) == REFERENCE_TYPE
+ && INTEGRAL_TYPE_P (TREE_TYPE (argtype))
&& reg
&& REG_P (reg)
&& GET_MODE (reg) == mode
@@ -5747,7 +5754,7 @@ prepare_call_arguments (basic_block bb, rtx insn)
&& item)
{
enum machine_mode indmode
- = TYPE_MODE (TREE_TYPE (TREE_VALUE (t)));
+ = TYPE_MODE (TREE_TYPE (argtype));
rtx mem = gen_rtx_MEM (indmode, x);
cselib_val *val = cselib_lookup (mem, indmode, 0, VOIDmode);
if (val && cselib_preserved_value_p (val))
@@ -5784,7 +5791,7 @@ prepare_call_arguments (basic_block bb, rtx insn)
}
}
targetm.calls.function_arg_advance (&args_so_far, mode,
- TREE_VALUE (t), true);
+ argtype, true);
t = TREE_CHAIN (t);
}
}