diff options
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r-- | gcc/builtins.c | 57 |
1 files changed, 27 insertions, 30 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c index 133aa7c..6dff9b8 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -291,7 +291,7 @@ get_pointer_alignment (tree exp, unsigned int max_align) align = MIN (inner, max_align); break; - case PLUS_EXPR: + case POINTER_PLUS_EXPR: /* If sum of pointer + int, restrict our maximum alignment to that imposed by the integer. If not, we can't do any better than ALIGN. */ @@ -4433,10 +4433,9 @@ expand_builtin_strcat (tree fndecl, tree exp, rtx target, enum machine_mode mode /* Create strlen (dst). */ newdst = build_call_expr (strlen_fn, 1, dst); - /* Create (dst + (cast) strlen (dst)). */ - newdst = fold_convert (TREE_TYPE (dst), newdst); - newdst = fold_build2 (PLUS_EXPR, TREE_TYPE (dst), dst, newdst); + /* Create (dst p+ strlen (dst)). */ + newdst = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (dst), dst, newdst); newdst = builtin_save_expr (newdst); if (!expand_builtin_strcpy_args (fndecl, newdst, newsrc, target, mode)) @@ -4650,9 +4649,10 @@ void std_expand_builtin_va_start (tree valist, rtx nextarg) { tree t; + t = make_tree (sizetype, nextarg); + t = fold_convert (ptr_type_node, t); - t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, - make_tree (ptr_type_node, nextarg)); + t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t); TREE_SIDE_EFFECTS (t) = 1; expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL); @@ -4719,14 +4719,16 @@ std_gimplify_va_arg_expr (tree valist, tree type, tree *pre_p, tree *post_p) if (boundary > align && !integer_zerop (TYPE_SIZE (type))) { - t = fold_convert (TREE_TYPE (valist), size_int (boundary - 1)); t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp, - build2 (PLUS_EXPR, TREE_TYPE (valist), valist_tmp, t)); + fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (valist), + valist_tmp, size_int (boundary - 1))); gimplify_and_add (t, pre_p); - t = fold_convert (TREE_TYPE (valist), size_int (-boundary)); + t = fold_convert (sizetype, valist_tmp); t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp, - build2 (BIT_AND_EXPR, TREE_TYPE (valist), valist_tmp, t)); + fold_convert (TREE_TYPE (valist), + fold_build2 (BIT_AND_EXPR, sizetype, t, + size_int (-boundary)))); gimplify_and_add (t, pre_p); } else @@ -4757,13 +4759,11 @@ std_gimplify_va_arg_expr (tree valist, tree type, tree *pre_p, tree *post_p) t = fold_build2 (GT_EXPR, sizetype, rounded_size, size_int (align)); t = fold_build3 (COND_EXPR, sizetype, t, size_zero_node, size_binop (MINUS_EXPR, rounded_size, type_size)); - t = fold_convert (TREE_TYPE (addr), t); - addr = fold_build2 (PLUS_EXPR, TREE_TYPE (addr), addr, t); + addr = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (addr), addr, t); } /* Compute new value for AP. */ - t = fold_convert (TREE_TYPE (valist), rounded_size); - t = build2 (PLUS_EXPR, TREE_TYPE (valist), valist_tmp, t); + t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (valist), valist_tmp, rounded_size); t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t); gimplify_and_add (t, pre_p); @@ -8607,8 +8607,7 @@ fold_builtin_memory_op (tree dest, tree src, tree len, tree type, bool ignore, i len = fold_build2 (MINUS_EXPR, TREE_TYPE (len), len, ssize_int (1)); - len = fold_convert (TREE_TYPE (dest), len); - dest = fold_build2 (PLUS_EXPR, TREE_TYPE (dest), dest, len); + dest = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (dest), dest, len); dest = fold_convert (type, dest); if (expr) dest = omit_one_operand (type, dest, expr); @@ -8731,8 +8730,8 @@ fold_builtin_memchr (tree arg1, tree arg2, tree len, tree type) if (r == NULL) return build_int_cst (TREE_TYPE (arg1), 0); - tem = fold_build2 (PLUS_EXPR, TREE_TYPE (arg1), arg1, - build_int_cst (TREE_TYPE (arg1), r - p1)); + tem = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (arg1), arg1, + size_int (r - p1)); return fold_convert (type, tem); } return NULL_TREE; @@ -10609,8 +10608,8 @@ fold_builtin_strstr (tree s1, tree s2, tree type) return build_int_cst (TREE_TYPE (s1), 0); /* Return an offset into the constant string argument. */ - tem = fold_build2 (PLUS_EXPR, TREE_TYPE (s1), - s1, build_int_cst (TREE_TYPE (s1), r - p1)); + tem = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (s1), + s1, size_int (r - p1)); return fold_convert (type, tem); } @@ -10679,8 +10678,8 @@ fold_builtin_strchr (tree s1, tree s2, tree type) return build_int_cst (TREE_TYPE (s1), 0); /* Return an offset into the constant string argument. */ - tem = fold_build2 (PLUS_EXPR, TREE_TYPE (s1), - s1, build_int_cst (TREE_TYPE (s1), r - p1)); + tem = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (s1), + s1, size_int (r - p1)); return fold_convert (type, tem); } return NULL_TREE; @@ -10735,8 +10734,8 @@ fold_builtin_strrchr (tree s1, tree s2, tree type) return build_int_cst (TREE_TYPE (s1), 0); /* Return an offset into the constant string argument. */ - tem = fold_build2 (PLUS_EXPR, TREE_TYPE (s1), - s1, build_int_cst (TREE_TYPE (s1), r - p1)); + tem = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (s1), + s1, size_int (r - p1)); return fold_convert (type, tem); } @@ -10795,8 +10794,8 @@ fold_builtin_strpbrk (tree s1, tree s2, tree type) return build_int_cst (TREE_TYPE (s1), 0); /* Return an offset into the constant string argument. */ - tem = fold_build2 (PLUS_EXPR, TREE_TYPE (s1), - s1, build_int_cst (TREE_TYPE (s1), r - p1)); + tem = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (s1), + s1, size_int (r - p1)); return fold_convert (type, tem); } @@ -11382,8 +11381,7 @@ expand_builtin_memory_chk (tree exp, rtx target, enum machine_mode mode, return expand_expr (dest, target, mode, EXPAND_NORMAL); } - len = fold_convert (TREE_TYPE (dest), len); - expr = fold_build2 (PLUS_EXPR, TREE_TYPE (dest), dest, len); + expr = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (dest), dest, len); return expand_expr (expr, target, mode, EXPAND_NORMAL); } @@ -11630,8 +11628,7 @@ fold_builtin_memory_chk (tree fndecl, return omit_one_operand (TREE_TYPE (TREE_TYPE (fndecl)), dest, len); else { - tree temp = fold_convert (TREE_TYPE (dest), len); - temp = fold_build2 (PLUS_EXPR, TREE_TYPE (dest), dest, temp); + tree temp = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (dest), dest, len); return fold_convert (TREE_TYPE (TREE_TYPE (fndecl)), temp); } } |