From: Kaveh R. Ghazi Date: Mon, 13 Nov 2000 02:14:05 +0000 (+0000) Subject: builtins.c (expand_builtin): Handle BUILT_IN_INDEX and BUILT_IN_RINDEX. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c7b6c6cd4791c3003397feea31482c3d19419fe2;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 458ad1ae183..e27245a8c44 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2000-11-12 Kaveh R. Ghazi + + * 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 * configure.in: Turn on libstdc++ V3 by default. diff --git a/gcc/builtins.c b/gcc/builtins.c index 68a0e41a22f..68677b52950 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 980099c1b96..1920282b280 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 c8e9c123c1b..fdc287581cc 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 351954c3582..4f9bde73798 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 8595efc3c18..53362e0b2a5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2000-11-12 Kaveh R. Ghazi + + * 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 * 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 132127137cd..a623451b229 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 f07ab12dfb7..77c0950ff7e 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