builtins.c (expand_builtin): Handle BUILT_IN_INDEX and BUILT_IN_RINDEX.
authorKaveh R. Ghazi <ghazi@caip.rutgers.edu>
Mon, 13 Nov 2000 02:14:05 +0000 (02:14 +0000)
committerKaveh Ghazi <ghazi@gcc.gnu.org>
Mon, 13 Nov 2000 02:14:05 +0000 (02:14 +0000)
* 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

gcc/ChangeLog
gcc/builtins.c
gcc/builtins.def
gcc/c-common.c
gcc/extend.texi
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/string-opt-3.c
gcc/testsuite/gcc.c-torture/execute/string-opt-4.c

index 458ad1ae1839a3293c2cc5694a994707a475785f..e27245a8c44f018d30e4b53880b8dc6f3cd26a08 100644 (file)
@@ -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.
index 68a0e41a22fee7580a110dcf705f304abeb5a129..68677b5295031d2a64f8ec2d6e97e09eb847c03a 100644 (file)
@@ -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)
index 980099c1b9682e6ed2d4cfc80d20e1c6ff1d4247..1920282b280dcc72f03f60710f99e0565563e695 100644 (file)
@@ -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)
index c8e9c123c1bfbe35cd7b69b102c456a443e22518..fdc287581cc47316061f35456af4674af80b4b6d 100644 (file)
@@ -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,
index 351954c3582bff7939e2076d67c224e1f4505c0e..4f9bde737985a65f716ac236e29fc14c90b1f8b0 100644 (file)
@@ -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
index 8595efc3c18199bf0f8aea34a84b2241d575c50b..53362e0b2a51dc41895a7d23b9091d40eb5556ce 100644 (file)
@@ -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
index 132127137cd483156dbdbc3c680f7e124914ccac..a623451b2296758e8fd71824a9490756581b9ce9 100644 (file)
@@ -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
index f07ab12dfb7985b7714ca859e1c89774f1d7f781..77c0950ff7e251fa22d42b67249bc8ed40d83755 100644 (file)
@@ -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