aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKaveh R. Ghazi <ghazi@caip.rutgers.edu>2000-11-13 02:14:05 +0000
committerKaveh Ghazi <ghazi@gcc.gnu.org>2000-11-13 02:14:05 +0000
commitc7b6c6cd4791c3003397feea31482c3d19419fe2 (patch)
treee2619415f3516210288dc043ad4cdec1be4247a5
parent34f6fbdb65c5e2a8ff1c6553592503532ef0141f (diff)
downloadgcc-c7b6c6cd4791c3003397feea31482c3d19419fe2.zip
gcc-c7b6c6cd4791c3003397feea31482c3d19419fe2.tar.gz
gcc-c7b6c6cd4791c3003397feea31482c3d19419fe2.tar.bz2
builtins.c (expand_builtin): Handle BUILT_IN_INDEX and BUILT_IN_RINDEX.
* builtins.c (expand_builtin): Handle BUILT_IN_INDEX and BUILT_IN_RINDEX. Add missing checks for BUILT_IN_STRCHR and BUILT_IN_STRRCHR. * builtins.def (BUILT_IN_INDEX, BUILT_IN_RINDEX): New entries. * c-common.c (c_common_nodes_and_builtins): Declare index and rindex when nonansi builtins are allowed. * extend.texi (index, rindex): Document new builtins. testsuite: * gcc.c-torture/execute/string-opt-3.c: Also test builtin rindex. * gcc.c-torture/execute/string-opt-4.c: Also test builtin index. From-SVN: r37416
-rw-r--r--gcc/ChangeLog13
-rw-r--r--gcc/builtins.c4
-rw-r--r--gcc/builtins.def2
-rw-r--r--gcc/c-common.c10
-rw-r--r--gcc/extend.texi9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/string-opt-3.c16
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/string-opt-4.c16
8 files changed, 68 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 458ad1a..e27245a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,16 @@
+2000-11-12 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * builtins.c (expand_builtin): Handle BUILT_IN_INDEX and
+ BUILT_IN_RINDEX. Add missing checks for BUILT_IN_STRCHR and
+ BUILT_IN_STRRCHR.
+
+ * builtins.def (BUILT_IN_INDEX, BUILT_IN_RINDEX): New entries.
+
+ * c-common.c (c_common_nodes_and_builtins): Declare index and
+ rindex when nonansi builtins are allowed.
+
+ * extend.texi (index, rindex): Document new builtins.
+
2000-11-12 Mark Mitchell <mark@codesourcery.com>
* configure.in: Turn on libstdc++ V3 by default.
diff --git a/gcc/builtins.c b/gcc/builtins.c
index 68a0e41..68677b5 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -2746,6 +2746,8 @@ expand_builtin (exp, target, subtarget, mode, ignore)
|| fcode == BUILT_IN_FSQRT || fcode == BUILT_IN_MEMSET
|| fcode == BUILT_IN_MEMCPY || fcode == BUILT_IN_MEMCMP
|| fcode == BUILT_IN_BCMP || fcode == BUILT_IN_BZERO
+ || fcode == BUILT_IN_INDEX || fcode == BUILT_IN_RINDEX
+ || fcode == BUILT_IN_STRCHR || fcode == BUILT_IN_STRRCHR
|| fcode == BUILT_IN_STRLEN || fcode == BUILT_IN_STRCPY
|| fcode == BUILT_IN_STRSTR || fcode == BUILT_IN_STRPBRK
|| fcode == BUILT_IN_STRCMP || fcode == BUILT_IN_FFS
@@ -2888,12 +2890,14 @@ expand_builtin (exp, target, subtarget, mode, ignore)
return target;
break;
+ case BUILT_IN_INDEX:
case BUILT_IN_STRCHR:
target = expand_builtin_strchr (arglist, target, mode);
if (target)
return target;
break;
+ case BUILT_IN_RINDEX:
case BUILT_IN_STRRCHR:
target = expand_builtin_strrchr (arglist, target, mode);
if (target)
diff --git a/gcc/builtins.def b/gcc/builtins.def
index 980099c..1920282 100644
--- a/gcc/builtins.def
+++ b/gcc/builtins.def
@@ -36,6 +36,8 @@ DEF_BUILTIN(BUILT_IN_MEMCMP)
DEF_BUILTIN(BUILT_IN_MEMSET)
DEF_BUILTIN(BUILT_IN_BZERO)
DEF_BUILTIN(BUILT_IN_BCMP)
+DEF_BUILTIN(BUILT_IN_INDEX)
+DEF_BUILTIN(BUILT_IN_RINDEX)
DEF_BUILTIN(BUILT_IN_STRCPY)
DEF_BUILTIN(BUILT_IN_STRCMP)
DEF_BUILTIN(BUILT_IN_STRLEN)
diff --git a/gcc/c-common.c b/gcc/c-common.c
index c8e9c12..fdc2875 100644
--- a/gcc/c-common.c
+++ b/gcc/c-common.c
@@ -5045,6 +5045,12 @@ c_common_nodes_and_builtins ()
/* Suppress error if redefined as a non-function. */
DECL_BUILT_IN_NONANSI (temp) = 1;
+ temp = builtin_function ("index", string_ftype_string_int,
+ BUILT_IN_INDEX, BUILT_IN_NORMAL, NULL_PTR);
+ DECL_BUILT_IN_NONANSI (temp) = 1;
+ temp = builtin_function ("rindex", string_ftype_string_int,
+ BUILT_IN_RINDEX, BUILT_IN_NORMAL, NULL_PTR);
+ DECL_BUILT_IN_NONANSI (temp) = 1;
/* The system prototypes for these functions have many
variations, so don't specify parameters to avoid conflicts.
The expand_* functions check the argument types anyway. */
@@ -5175,6 +5181,10 @@ c_common_nodes_and_builtins ()
BUILT_IN_BZERO, BUILT_IN_NORMAL, "bzero");
builtin_function ("__builtin_bcmp", bcmp_ftype,
BUILT_IN_BCMP, BUILT_IN_NORMAL, "bcmp");
+ builtin_function ("__builtin_index", string_ftype_string_int,
+ BUILT_IN_INDEX, BUILT_IN_NORMAL, "index");
+ builtin_function ("__builtin_rindex", string_ftype_string_int,
+ BUILT_IN_RINDEX, BUILT_IN_NORMAL, "rindex");
builtin_function ("__builtin_strcmp", int_ftype_string_string,
BUILT_IN_STRCMP, BUILT_IN_NORMAL, "strcmp");
builtin_function ("__builtin_strstr", string_ftype_string_string,
diff --git a/gcc/extend.texi b/gcc/extend.texi
index 351954c..4f9bde7 100644
--- a/gcc/extend.texi
+++ b/gcc/extend.texi
@@ -3247,12 +3247,14 @@ function as well.
@findex fabsl
@findex ffs
@findex fputs
+@findex index
@findex labs
@findex llabs
@findex memcmp
@findex memcpy
@findex memset
@findex printf
+@findex rindex
@findex sin
@findex sinf
@findex sinl
@@ -3289,9 +3291,10 @@ and presumed not to return, but otherwise are not built in.
@samp{-std=c89} or @samp{-std=c99}).
Outside strict ISO C mode, the functions @code{alloca}, @code{bcmp},
-@code{bzero}, and @code{ffs} may be handled as builtins. Corresponding
-versions @code{__builtin_alloca}, @code{__builtin_bcmp},
-@code{__builtin_bzero}, and @code{__builtin_ffs} are also recognized in
+@code{bzero}, @code{index}, @code{rindex} and @code{ffs} may be handled
+as builtins. Corresponding versions @code{__builtin_alloca},
+@code{__builtin_bcmp}, @code{__builtin_bzero}, @code{__builtin_index},
+@code{__builtin_rindex} and @code{__builtin_ffs} are also recognized in
strict ISO C mode.
The ISO C99 function @code{llabs} is handled as a builtin except in
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8595efc..53362e0 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2000-11-12 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * gcc.c-torture/execute/string-opt-3.c: Also test builtin rindex.
+ * gcc.c-torture/execute/string-opt-4.c: Also test builtin index.
+
2000-11-11 Mark Mitchell <mark@codesourcery.com>
* g++.brendan/err-msg8.C: Avoid capricious line-number issues with
diff --git a/gcc/testsuite/gcc.c-torture/execute/string-opt-3.c b/gcc/testsuite/gcc.c-torture/execute/string-opt-3.c
index 1321271..a623451 100644
--- a/gcc/testsuite/gcc.c-torture/execute/string-opt-3.c
+++ b/gcc/testsuite/gcc.c-torture/execute/string-opt-3.c
@@ -1,7 +1,7 @@
/* Copyright (C) 2000 Free Software Foundation.
- Ensure all expected transformations of builtin strlen, strcmp and strrchr
- occur and perform correctly.
+ Ensure all expected transformations of builtin strlen, strcmp,
+ strrchr and rindex occur and perform correctly.
Written by Jakub Jelinek, 11/7/2000. */
@@ -55,10 +55,22 @@ int main()
abort ();
if (x != 8)
abort ();
+ /* For systems which don't have rindex, we test the __builtin_
+ version to avoid spurious link failures at -O0. We only need to
+ test one case since everything is handled in the same code path
+ as builtin strrchr. */
+ if (__builtin_rindex ("hello", 'z') != 0)
+ abort ();
return 0;
}
+static char *
+rindex (const char *s, int c)
+{
+ abort ();
+}
+
#ifdef __OPTIMIZE__
/* When optimizing, all the above cases should be transformed into
something else. So any remaining calls to the original function
diff --git a/gcc/testsuite/gcc.c-torture/execute/string-opt-4.c b/gcc/testsuite/gcc.c-torture/execute/string-opt-4.c
index f07ab12..77c0950 100644
--- a/gcc/testsuite/gcc.c-torture/execute/string-opt-4.c
+++ b/gcc/testsuite/gcc.c-torture/execute/string-opt-4.c
@@ -1,7 +1,7 @@
/* Copyright (C) 2000 Free Software Foundation.
- Ensure all expected transformations of builtin strchr occur and
- perform correctly.
+ Ensure all expected transformations of builtin strchr and index
+ occur and perform correctly.
Written by Jakub Jelinek, 11/7/2000. */
@@ -20,10 +20,22 @@ int main()
abort ();
if (strchr (foo, '\0') != foo + 11)
abort ();
+ /* For systems which don't have index, we test the __builtin_
+ version to avoid spurious link failures at -O0. We only need to
+ test one case since everything is handled in the same code path
+ as builtin strchr. */
+ if (__builtin_index ("hello", 'z') != 0)
+ abort ();
return 0;
}
+static char *
+index (const char *s, int c)
+{
+ abort ();
+}
+
#ifdef __OPTIMIZE__
/* When optimizing, all the above cases should be transformed into
something else. So any remaining calls to the original function