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
This commit is contained in:
Kaveh R. Ghazi 2000-11-13 02:14:05 +00:00 committed by Kaveh Ghazi
parent 34f6fbdb65
commit c7b6c6cd47
8 changed files with 68 additions and 7 deletions

View 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.

View 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)

View 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)

View 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,

View 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

View 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

View 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

View 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