diff options
Diffstat (limited to 'gcc/config/sh/sh.c')
-rw-r--r-- | gcc/config/sh/sh.c | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c index ab9ea90232b..2e74a4f3bd7 100644 --- a/gcc/config/sh/sh.c +++ b/gcc/config/sh/sh.c @@ -7138,7 +7138,8 @@ sh_va_start (tree valist, rtx nextarg) valist, f_next_stack, NULL_TREE); /* Call __builtin_saveregs. */ - u = make_tree (ptr_type_node, expand_builtin_saveregs ()); + u = make_tree (sizetype, expand_builtin_saveregs ()); + u = fold_convert (ptr_type_node, u); t = build2 (GIMPLE_MODIFY_STMT, ptr_type_node, next_fp, u); TREE_SIDE_EFFECTS (t) = 1; expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL); @@ -7148,8 +7149,8 @@ sh_va_start (tree valist, rtx nextarg) nfp = 8 - nfp; else nfp = 0; - u = fold_build2 (PLUS_EXPR, ptr_type_node, u, - build_int_cst (NULL_TREE, UNITS_PER_WORD * nfp)); + u = fold_build2 (POINTER_PLUS_EXPR, ptr_type_node, u, + size_int (UNITS_PER_WORD * nfp)); t = build2 (GIMPLE_MODIFY_STMT, ptr_type_node, next_fp_limit, u); TREE_SIDE_EFFECTS (t) = 1; expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL); @@ -7163,8 +7164,8 @@ sh_va_start (tree valist, rtx nextarg) nint = 4 - nint; else nint = 0; - u = fold_build2 (PLUS_EXPR, ptr_type_node, u, - build_int_cst (NULL_TREE, UNITS_PER_WORD * nint)); + u = fold_build2 (POINTER_PLUS_EXPR, ptr_type_node, u, + size_int (UNITS_PER_WORD * nint)); t = build2 (GIMPLE_MODIFY_STMT, ptr_type_node, next_o_limit, u); TREE_SIDE_EFFECTS (t) = 1; expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL); @@ -7297,8 +7298,8 @@ sh_gimplify_va_arg_expr (tree valist, tree type, tree *pre_p, gimplify_and_add (tmp, pre_p); tmp = next_fp_limit; if (size > 4 && !is_double) - tmp = build2 (PLUS_EXPR, TREE_TYPE (tmp), tmp, - fold_convert (TREE_TYPE (tmp), size_int (4 - size))); + tmp = build2 (POINTER_PLUS_EXPR, TREE_TYPE (tmp), tmp, + size_int (4 - size)); tmp = build2 (GE_EXPR, boolean_type_node, next_fp_tmp, tmp); cmp = build3 (COND_EXPR, void_type_node, tmp, build1 (GOTO_EXPR, void_type_node, lab_false), @@ -7309,9 +7310,11 @@ sh_gimplify_va_arg_expr (tree valist, tree type, tree *pre_p, if (TYPE_ALIGN (eff_type) > BITS_PER_WORD || (is_double || size == 16)) { - tmp = fold_convert (ptr_type_node, size_int (UNITS_PER_WORD)); - tmp = build2 (BIT_AND_EXPR, ptr_type_node, next_fp_tmp, tmp); - tmp = build2 (PLUS_EXPR, ptr_type_node, next_fp_tmp, tmp); + tmp = fold_convert (sizetype, next_fp_tmp); + tmp = build2 (BIT_AND_EXPR, sizetype, tmp, + size_int (UNITS_PER_WORD)); + tmp = build2 (POINTER_PLUS_EXPR, ptr_type_node, + next_fp_tmp, tmp); tmp = build2 (GIMPLE_MODIFY_STMT, ptr_type_node, next_fp_tmp, tmp); gimplify_and_add (tmp, pre_p); @@ -7357,8 +7360,8 @@ sh_gimplify_va_arg_expr (tree valist, tree type, tree *pre_p, } else { - tmp = fold_convert (ptr_type_node, size_int (rsize)); - tmp = build2 (PLUS_EXPR, ptr_type_node, next_o, tmp); + tmp = build2 (POINTER_PLUS_EXPR, ptr_type_node, next_o, + size_int (rsize)); tmp = build2 (GT_EXPR, boolean_type_node, tmp, next_o_limit); tmp = build3 (COND_EXPR, void_type_node, tmp, build1 (GOTO_EXPR, void_type_node, lab_false), |