diff options
author | Martin Liska <mliska@suse.cz> | 2018-11-27 13:30:59 +0100 |
---|---|---|
committer | Martin Liska <marxin@gcc.gnu.org> | 2018-11-27 12:30:59 +0000 |
commit | 2ff5ffb623e17b6bb81532394cb1f42fe7b354c8 (patch) | |
tree | 82fc40305d36ff9ce012e68a6947467161e0a015 /gcc/builtins.c | |
parent | da193a2713d34358d564c9fd5b5347d7bc2cc150 (diff) | |
download | gcc-2ff5ffb623e17b6bb81532394cb1f42fe7b354c8.zip gcc-2ff5ffb623e17b6bb81532394cb1f42fe7b354c8.tar.gz gcc-2ff5ffb623e17b6bb81532394cb1f42fe7b354c8.tar.bz2 |
Come up with memop_ret enum instead of int endp for memory operations.
2018-11-27 Martin Liska <mliska@suse.cz>
* asan.c (asan_emit_stack_protection): Use new enum values
instead of int constants.
* builtins.c (expand_builtin_memory_copy_args): Replace int
type with memop_ret enum type.
(expand_builtin_mempcpy_args): Likewise.
(expand_builtin_memcpy): Use new enum values
instead of int constants. Likewise.
(expand_builtin_mempcpy): Likewise.
(expand_movstr): Likewise.
(expand_builtin_strcpy_args): Likewise.
(expand_builtin_stpcpy_1): Likewise.
(expand_builtin_strncpy): Likewise.
(expand_builtin_memset_args): Likewise.
* expr.c (move_by_pieces_d::finish_endp): Rename to ...
(move_by_pieces_d::finish_retmode): ... this.
(move_by_pieces): Change last argument type to memop_ret.
(store_by_pieces): Use new enum values
instead of int constants.
(emit_block_move_hints): Likewise.
(emit_push_insn): Likewise.
(store_expr): Likewise.
* expr.h (store_by_pieces): Change int to newly added enum
type.
* rtl.h (enum memop_ret): Define.
(move_by_pieces): Use the enum type.
From-SVN: r266508
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r-- | gcc/builtins.c | 73 |
1 files changed, 36 insertions, 37 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c index ebde2db..dcac49d 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -126,10 +126,11 @@ static rtx builtin_memcpy_read_str (void *, HOST_WIDE_INT, scalar_int_mode); static rtx expand_builtin_memchr (tree, rtx); static rtx expand_builtin_memcpy (tree, rtx); static rtx expand_builtin_memory_copy_args (tree dest, tree src, tree len, - rtx target, tree exp, int endp); + rtx target, tree exp, + memop_ret retmode); static rtx expand_builtin_memmove (tree, rtx); static rtx expand_builtin_mempcpy (tree, rtx); -static rtx expand_builtin_mempcpy_args (tree, tree, tree, rtx, tree, int); +static rtx expand_builtin_mempcpy_args (tree, tree, tree, rtx, tree, memop_ret); static rtx expand_builtin_strcat (tree, rtx); static rtx expand_builtin_strcpy (tree, rtx); static rtx expand_builtin_strcpy_args (tree, tree, tree, rtx); @@ -3751,7 +3752,7 @@ expand_builtin_memcpy (tree exp, rtx target) check_memop_access (exp, dest, src, len); return expand_builtin_memory_copy_args (dest, src, len, target, exp, - /*endp=*/ 0); + /*retmode=*/ RETURN_BEGIN); } /* Check a call EXP to the memmove built-in for validity. @@ -3776,10 +3777,7 @@ expand_builtin_memmove (tree exp, rtx) /* Expand a call EXP to the mempcpy builtin. Return NULL_RTX if we failed; the caller should emit a normal call, otherwise try to get the result in TARGET, if convenient (and in - mode MODE if that's convenient). If ENDP is 0 return the - destination pointer, if ENDP is 1 return the end pointer ala - mempcpy, and if ENDP is 2 return the end pointer minus one ala - stpcpy. */ + mode MODE if that's convenient). */ static rtx expand_builtin_mempcpy (tree exp, rtx target) @@ -3812,20 +3810,17 @@ expand_builtin_mempcpy (tree exp, rtx target) return NULL_RTX; return expand_builtin_mempcpy_args (dest, src, len, - target, exp, /*endp=*/ 1); + target, exp, /*retmode=*/ RETURN_END); } /* Helper function to do the actual work for expand of memory copy family functions (memcpy, mempcpy, stpcpy). Expansing should assign LEN bytes - of memory from SRC to DEST and assign to TARGET if convenient. - If ENDP is 0 return the - destination pointer, if ENDP is 1 return the end pointer ala - mempcpy, and if ENDP is 2 return the end pointer minus one ala - stpcpy. */ + of memory from SRC to DEST and assign to TARGET if convenient. Return + value is based on RETMODE argument. */ static rtx expand_builtin_memory_copy_args (tree dest, tree src, tree len, - rtx target, tree exp, int endp) + rtx target, tree exp, memop_ret retmode) { const char *src_str; unsigned int src_align = get_pointer_alignment (src); @@ -3872,7 +3867,7 @@ expand_builtin_memory_copy_args (tree dest, tree src, tree len, dest_mem = store_by_pieces (dest_mem, INTVAL (len_rtx), builtin_memcpy_read_str, CONST_CAST (char *, src_str), - dest_align, false, endp); + dest_align, false, retmode); dest_mem = force_operand (XEXP (dest_mem, 0), target); dest_mem = convert_memory_address (ptr_mode, dest_mem); return dest_mem; @@ -3883,9 +3878,10 @@ expand_builtin_memory_copy_args (tree dest, tree src, tree len, /* Copy word part most expediently. */ enum block_op_methods method = BLOCK_OP_NORMAL; - if (CALL_EXPR_TAILCALL (exp) && (endp == 0 || target == const0_rtx)) + if (CALL_EXPR_TAILCALL (exp) + && (retmode == RETURN_BEGIN || target == const0_rtx)) method = BLOCK_OP_TAILCALL; - if (endp == 1 && target != const0_rtx) + if (retmode == RETURN_END && target != const0_rtx) method = BLOCK_OP_NO_LIBCALL_RET; dest_addr = emit_block_move_hints (dest_mem, src_mem, len_rtx, method, expected_align, expected_size, @@ -3899,11 +3895,11 @@ expand_builtin_memory_copy_args (tree dest, tree src, tree len, dest_addr = convert_memory_address (ptr_mode, dest_addr); } - if (endp && target != const0_rtx) + if (retmode != RETURN_BEGIN && target != const0_rtx) { dest_addr = gen_rtx_PLUS (ptr_mode, dest_addr, len_rtx); /* stpcpy pointer to last byte. */ - if (endp == 2) + if (retmode == RETURN_END_MINUS_ONE) dest_addr = gen_rtx_MINUS (ptr_mode, dest_addr, const1_rtx); } @@ -3912,21 +3908,19 @@ expand_builtin_memory_copy_args (tree dest, tree src, tree len, static rtx expand_builtin_mempcpy_args (tree dest, tree src, tree len, - rtx target, tree orig_exp, int endp) + rtx target, tree orig_exp, memop_ret retmode) { return expand_builtin_memory_copy_args (dest, src, len, target, orig_exp, - endp); + retmode); } /* Expand into a movstr instruction, if one is available. Return NULL_RTX if we failed, the caller should emit a normal call, otherwise try to - get the result in TARGET, if convenient. If ENDP is 0 return the - destination pointer, if ENDP is 1 return the end pointer ala - mempcpy, and if ENDP is 2 return the end pointer minus one ala - stpcpy. */ + get the result in TARGET, if convenient. + Return value is based on RETMODE argument. */ static rtx -expand_movstr (tree dest, tree src, rtx target, int endp) +expand_movstr (tree dest, tree src, rtx target, memop_ret retmode) { struct expand_operand ops[3]; rtx dest_mem; @@ -3937,25 +3931,25 @@ expand_movstr (tree dest, tree src, rtx target, int endp) dest_mem = get_memory_rtx (dest, NULL); src_mem = get_memory_rtx (src, NULL); - if (!endp) + if (retmode != RETURN_BEGIN) { target = force_reg (Pmode, XEXP (dest_mem, 0)); dest_mem = replace_equiv_address (dest_mem, target); } - create_output_operand (&ops[0], endp ? target : NULL_RTX, Pmode); + create_output_operand (&ops[0], retmode ? target : NULL_RTX, Pmode); create_fixed_operand (&ops[1], dest_mem); create_fixed_operand (&ops[2], src_mem); if (!maybe_expand_insn (targetm.code_for_movstr, 3, ops)) return NULL_RTX; - if (endp && target != const0_rtx) + if (retmode != RETURN_BEGIN && target != const0_rtx) { target = ops[0].value; /* movstr is supposed to set end to the address of the NUL terminator. If the caller requested a mempcpy-like return value, adjust it. */ - if (endp == 1) + if (retmode == RETURN_END) { rtx tem = plus_constant (GET_MODE (target), gen_lowpart (GET_MODE (target), target), 1); @@ -4044,7 +4038,7 @@ expand_builtin_strcpy_args (tree exp, tree dest, tree src, rtx target) return NULL_RTX; } - return expand_movstr (dest, src, target, /*endp=*/0); + return expand_movstr (dest, src, target, /*retmode=*/ RETURN_BEGIN); } /* Expand a call EXP to the stpcpy builtin. @@ -4091,14 +4085,16 @@ expand_builtin_stpcpy_1 (tree exp, rtx target, machine_mode mode) memset (&data, 0, sizeof (c_strlen_data)); if (!c_getstr (src, NULL) || !(len = c_strlen (src, 0, &data, 1))) - return expand_movstr (dst, src, target, /*endp=*/2); + return expand_movstr (dst, src, target, + /*retmode=*/ RETURN_END_MINUS_ONE); if (data.decl && !TREE_NO_WARNING (exp)) warn_string_no_nul (EXPR_LOCATION (exp), "stpcpy", src, data.decl); lenp1 = size_binop_loc (loc, PLUS_EXPR, len, ssize_int (1)); ret = expand_builtin_mempcpy_args (dst, src, lenp1, - target, exp, /*endp=*/2); + target, exp, + /*retmode=*/ RETURN_END_MINUS_ONE); if (ret) return ret; @@ -4132,7 +4128,8 @@ expand_builtin_stpcpy_1 (tree exp, rtx target, machine_mode mode) } } - return expand_movstr (dst, src, target, /*endp=*/2); + return expand_movstr (dst, src, target, + /*retmode=*/ RETURN_END_MINUS_ONE); } } @@ -4378,7 +4375,8 @@ expand_builtin_strncpy (tree exp, rtx target) dest_mem = get_memory_rtx (dest, len); store_by_pieces (dest_mem, tree_to_uhwi (len), builtin_strncpy_read_str, - CONST_CAST (char *, p), dest_align, false, 0); + CONST_CAST (char *, p), dest_align, false, + RETURN_BEGIN); dest_mem = force_operand (XEXP (dest_mem, 0), target); dest_mem = convert_memory_address (ptr_mode, dest_mem); return dest_mem; @@ -4523,7 +4521,7 @@ expand_builtin_memset_args (tree dest, tree val, tree len, val_rtx = force_reg (val_mode, val_rtx); store_by_pieces (dest_mem, tree_to_uhwi (len), builtin_memset_gen_str, val_rtx, dest_align, - true, 0); + true, RETURN_BEGIN); } else if (!set_storage_via_setmem (dest_mem, len_rtx, val_rtx, dest_align, expected_align, @@ -4546,7 +4544,8 @@ expand_builtin_memset_args (tree dest, tree val, tree len, builtin_memset_read_str, &c, dest_align, true)) store_by_pieces (dest_mem, tree_to_uhwi (len), - builtin_memset_read_str, &c, dest_align, true, 0); + builtin_memset_read_str, &c, dest_align, true, + RETURN_BEGIN); else if (!set_storage_via_setmem (dest_mem, len_rtx, gen_int_mode (c, val_mode), dest_align, expected_align, |