aboutsummaryrefslogtreecommitdiff
path: root/gcc/builtins.c
diff options
context:
space:
mode:
authorKaveh R. Ghazi <ghazi@caip.rutgers.edu>2004-10-08 16:06:02 +0000
committerKaveh Ghazi <ghazi@gcc.gnu.org>2004-10-08 16:06:02 +0000
commit559837f74a358ea117300f422312a33735aa9fc2 (patch)
treeae4c253a884ebb18fb26844a656196c3733e617d /gcc/builtins.c
parenta58eeb317d540ceddf751e55581ab87035481118 (diff)
downloadgcc-559837f74a358ea117300f422312a33735aa9fc2.zip
gcc-559837f74a358ea117300f422312a33735aa9fc2.tar.gz
gcc-559837f74a358ea117300f422312a33735aa9fc2.tar.bz2
builtins.c (expand_builtin_strncpy): Delete duplicate code.
* builtins.c (expand_builtin_strncpy): Delete duplicate code. Accept an `exp' instead of an `arglist'. From-SVN: r88761
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r--gcc/builtins.c44
1 files changed, 12 insertions, 32 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c
index 11fd568..dc2297e 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -3010,35 +3010,21 @@ builtin_strncpy_read_str (void *data, HOST_WIDE_INT offset,
if we failed the caller should emit a normal call. */
static rtx
-expand_builtin_strncpy (tree arglist, rtx target, enum machine_mode mode)
+expand_builtin_strncpy (tree exp, rtx target, enum machine_mode mode)
{
- if (!validate_arglist (arglist,
- POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
- return 0;
- else
+ tree arglist = TREE_OPERAND (exp, 1);
+ if (validate_arglist (arglist,
+ POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
{
tree slen = c_strlen (TREE_VALUE (TREE_CHAIN (arglist)), 1);
tree len = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
- tree fn;
-
- /* We must be passed a constant len parameter. */
- if (TREE_CODE (len) != INTEGER_CST)
- return 0;
-
- /* If the len parameter is zero, return the dst parameter. */
- if (integer_zerop (len))
- {
- /* Evaluate and ignore the src argument in case it has
- side-effects. */
- expand_expr (TREE_VALUE (TREE_CHAIN (arglist)), const0_rtx,
- VOIDmode, EXPAND_NORMAL);
- /* Return the dst parameter. */
- return expand_expr (TREE_VALUE (arglist), target, mode,
- EXPAND_NORMAL);
- }
+ tree result = fold_builtin_strncpy (exp, slen);
+
+ if (result)
+ return expand_expr (result, target, mode, EXPAND_NORMAL);
- /* Now, we must be passed a constant src ptr parameter. */
- if (slen == 0 || TREE_CODE (slen) != INTEGER_CST)
+ /* We must be passed a constant len and src parameter. */
+ if (!host_integerp (len, 1) || !slen || !host_integerp (slen, 1))
return 0;
slen = size_binop (PLUS_EXPR, slen, ssize_int (1));
@@ -3068,14 +3054,8 @@ expand_builtin_strncpy (tree arglist, rtx target, enum machine_mode mode)
dest_mem = convert_memory_address (ptr_mode, dest_mem);
return dest_mem;
}
-
- /* OK transform into builtin memcpy. */
- fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
- if (!fn)
- return 0;
- return expand_expr (build_function_call_expr (fn, arglist),
- target, mode, EXPAND_NORMAL);
}
+ return 0;
}
/* Callback routine for store_by_pieces. Read GET_MODE_BITSIZE (MODE)
@@ -5391,7 +5371,7 @@ expand_builtin (tree exp, rtx target, rtx subtarget, enum machine_mode mode,
break;
case BUILT_IN_STRNCPY:
- target = expand_builtin_strncpy (arglist, target, mode);
+ target = expand_builtin_strncpy (exp, target, mode);
if (target)
return target;
break;