This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH]: Add ctype builtin declarations


This patch adds builtins declarations for the ctype functions.

I realize that often these are defined by various ctype.h to be macros
and therefore the builtins won't get used, however there are also
circumstances where macros are not used and it would be worthwhile to
have the appropriate function attributes set.  E.g. on a linux-gnu box
I have access to, glibc doesn't use the macros for any g++
compilation.

I defined all of the new functions to be C90 builtins with the "pure"
attribute.  I used "pure" because they examine the locale, i.e. read
global memory.

Exceptions: isblank is C99 (but still "pure"), and isascii/toascii are
STDC extentions with the "const" attribute because they don't care
about locale.

(Whoever reviews, please sanity check these assumptions.)

Bootstrapped on sparc-sun-solaris2.7, no regressions and the new
testcase passes.

Ok for mainline?

		Thanks,
		--Kaveh



2004-03-25  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>

	* builtins.def: Add ctype builtins.
	* doc/extend.texi: Likewise.
testsuite:
	* gcc.dg/torture/builtin-ctype-1.c: New test.
	
diff -rup orig/egcc-CVS20040322/gcc/builtins.def egcc-CVS20040322/gcc/builtins.def
--- orig/egcc-CVS20040322/gcc/builtins.def	2004-03-20 20:01:15.000000000 -0500
+++ egcc-CVS20040322/gcc/builtins.def	2004-03-23 21:16:06.823751802 -0500
@@ -491,6 +491,24 @@ DEF_C99_BUILTIN        (BUILT_IN_VSNPRIN
 DEF_LIB_BUILTIN        (BUILT_IN_VSPRINTF, "vsprintf", BT_FN_INT_STRING_CONST_STRING_VALIST_ARG, ATTR_FORMAT_PRINTF_2_0)
 DEF_C99_BUILTIN        (BUILT_IN_VSSCANF, "vsscanf", BT_FN_INT_CONST_STRING_CONST_STRING_VALIST_ARG, ATTR_FORMAT_SCANF_2_0)
 
+/* Category: ctype builtins.  */
+DEF_LIB_BUILTIN        (BUILT_IN_ISALNUM, "isalnum", BT_FN_INT_INT, ATTR_PURE_NOTHROW_LIST)
+DEF_LIB_BUILTIN        (BUILT_IN_ISALPHA, "isalpha", BT_FN_INT_INT, ATTR_PURE_NOTHROW_LIST)
+DEF_EXT_LIB_BUILTIN    (BUILT_IN_ISASCII, "isascii", BT_FN_INT_INT, ATTR_CONST_NOTHROW_LIST)
+DEF_C99_BUILTIN        (BUILT_IN_ISBLANK, "isblank", BT_FN_INT_INT, ATTR_PURE_NOTHROW_LIST)
+DEF_LIB_BUILTIN        (BUILT_IN_ISCNTRL, "iscntrl", BT_FN_INT_INT, ATTR_PURE_NOTHROW_LIST)
+DEF_LIB_BUILTIN        (BUILT_IN_ISDIGIT, "isdigit", BT_FN_INT_INT, ATTR_PURE_NOTHROW_LIST)
+DEF_LIB_BUILTIN        (BUILT_IN_ISGRAPH, "isgraph", BT_FN_INT_INT, ATTR_PURE_NOTHROW_LIST)
+DEF_LIB_BUILTIN        (BUILT_IN_ISLOWER, "islower", BT_FN_INT_INT, ATTR_PURE_NOTHROW_LIST)
+DEF_LIB_BUILTIN        (BUILT_IN_ISPRINT, "isprint", BT_FN_INT_INT, ATTR_PURE_NOTHROW_LIST)
+DEF_LIB_BUILTIN        (BUILT_IN_ISPUNCT, "ispunct", BT_FN_INT_INT, ATTR_PURE_NOTHROW_LIST)
+DEF_LIB_BUILTIN        (BUILT_IN_ISSPACE, "isspace", BT_FN_INT_INT, ATTR_PURE_NOTHROW_LIST)
+DEF_LIB_BUILTIN        (BUILT_IN_ISUPPER, "isupper", BT_FN_INT_INT, ATTR_PURE_NOTHROW_LIST)
+DEF_LIB_BUILTIN        (BUILT_IN_ISXDIGIT, "isxdigit", BT_FN_INT_INT, ATTR_PURE_NOTHROW_LIST)
+DEF_EXT_LIB_BUILTIN    (BUILT_IN_TOASCII, "toascii", BT_FN_INT_INT, ATTR_CONST_NOTHROW_LIST)
+DEF_LIB_BUILTIN        (BUILT_IN_TOLOWER, "tolower", BT_FN_INT_INT, ATTR_PURE_NOTHROW_LIST)
+DEF_LIB_BUILTIN        (BUILT_IN_TOUPPER, "toupper", BT_FN_INT_INT, ATTR_PURE_NOTHROW_LIST)
+
 /* Category: miscellaneous builtins.  */
 DEF_LIB_BUILTIN        (BUILT_IN_ABORT, "abort", BT_FN_VOID, ATTR_NORETURN_NOTHROW_LIST)
 DEF_LIB_BUILTIN        (BUILT_IN_ABS, "abs", BT_FN_INT_INT, ATTR_CONST_NOTHROW_LIST)
diff -rup orig/egcc-CVS20040322/gcc/doc/extend.texi egcc-CVS20040322/gcc/doc/extend.texi
--- orig/egcc-CVS20040322/gcc/doc/extend.texi	2004-03-16 20:02:34.000000000 -0500
+++ egcc-CVS20040322/gcc/doc/extend.texi	2004-03-23 20:57:43.000677786 -0500
@@ -4886,6 +4886,19 @@ v4si f (v4si a, v4si b, v4si c)
 @findex ilogbl
 @findex imaxabs
 @findex index
+@findex isalnum
+@findex isalpha
+@findex isascii
+@findex isblank
+@findex iscntrl
+@findex isdigit
+@findex isgraph
+@findex islower
+@findex isprint
+@findex ispunct
+@findex isspace
+@findex isupper
+@findex isxdigit
 @findex j0
 @findex j0f
 @findex j0l
@@ -5026,6 +5039,9 @@ v4si f (v4si a, v4si b, v4si c)
 @findex tgamma
 @findex tgammaf
 @findex tgammal
+@findex toascii
+@findex tolower
+@findex toupper
 @findex trunc
 @findex truncf
 @findex truncl
@@ -5072,15 +5088,16 @@ Outside strict ISO C mode (@option{-ansi
 @code{drem}, @code{exp10f}, @code{exp10l}, @code{exp10}, @code{ffsll},
 @code{ffsl}, @code{ffs}, @code{fprintf_unlocked}, @code{fputs_unlocked},
 @code{gammaf}, @code{gammal}, @code{gamma}, @code{gettext},
-@code{index}, @code{j0f}, @code{j0l}, @code{j0}, @code{j1f}, @code{j1l},
-@code{j1}, @code{jnf}, @code{jnl}, @code{jn}, @code{mempcpy},
-@code{pow10f}, @code{pow10l}, @code{pow10}, @code{printf_unlocked},
-@code{rindex}, @code{scalbf}, @code{scalbl}, @code{scalb},
-@code{signbit}, @code{signbitf}, @code{signbitl},
+@code{index}, @code{isascii}, @code{j0f}, @code{j0l}, @code{j0},
+@code{j1f}, @code{j1l}, @code{j1}, @code{jnf}, @code{jnl}, @code{jn},
+@code{mempcpy}, @code{pow10f}, @code{pow10l}, @code{pow10},
+@code{printf_unlocked}, @code{rindex}, @code{scalbf}, @code{scalbl},
+@code{scalb}, @code{signbit}, @code{signbitf}, @code{signbitl},
 @code{significandf}, @code{significandl}, @code{significand},
 @code{sincosf}, @code{sincosl}, @code{sincos}, @code{stpcpy},
-@code{strdup}, @code{strfmon}, @code{y0f}, @code{y0l}, @code{y0},
-@code{y1f}, @code{y1l}, @code{y1}, @code{ynf}, @code{ynl} and @code{yn}
+@code{strdup}, @code{strfmon}, @code{toascii}, @code{y0f}, @code{y0l},
+@code{y0}, @code{y1f}, @code{y1l}, @code{y1}, @code{ynf}, @code{ynl} and
+@code{yn}
 may be handled as built-in functions.
 All these functions have corresponding versions
 prefixed with @code{__builtin_}, which may be used even in strict C89
@@ -5097,36 +5114,35 @@ The ISO C99 functions
 @code{catanl}, @code{catan}, @code{cbrtf}, @code{cbrtl}, @code{cbrt},
 @code{ccosf}, @code{ccoshf}, @code{ccoshl}, @code{ccosh}, @code{ccosl},
 @code{ccos}, @code{cexpf}, @code{cexpl}, @code{cexp}, @code{cimagf},
-@code{cimagl}, @code{cimag},
-@code{conjf}, @code{conjl}, @code{conj}, @code{copysignf},
-@code{copysignl}, @code{copysign}, @code{cpowf}, @code{cpowl},
-@code{cpow}, @code{cprojf}, @code{cprojl}, @code{cproj}, @code{crealf},
-@code{creall}, @code{creal}, @code{csinf}, @code{csinhf}, @code{csinhl},
-@code{csinh}, @code{csinl}, @code{csin}, @code{csqrtf}, @code{csqrtl},
-@code{csqrt}, @code{ctanf}, @code{ctanhf}, @code{ctanhl}, @code{ctanh},
-@code{ctanl}, @code{ctan}, @code{erfcf}, @code{erfcl}, @code{erfc},
-@code{erff}, @code{erfl}, @code{erf}, @code{exp2f}, @code{exp2l},
-@code{exp2}, @code{expm1f}, @code{expm1l}, @code{expm1}, @code{fdimf},
-@code{fdiml}, @code{fdim}, @code{fmaf}, @code{fmal}, @code{fmaxf},
-@code{fmaxl}, @code{fmax}, @code{fma}, @code{fminf}, @code{fminl},
-@code{fmin}, @code{hypotf}, @code{hypotl}, @code{hypot}, @code{ilogbf},
-@code{ilogbl}, @code{ilogb}, @code{imaxabs}, @code{lgammaf},
-@code{lgammal}, @code{lgamma}, @code{llabs}, @code{llrintf},
-@code{llrintl}, @code{llrint}, @code{llroundf}, @code{llroundl},
-@code{llround}, @code{log1pf}, @code{log1pl}, @code{log1p},
-@code{log2f}, @code{log2l}, @code{log2}, @code{logbf}, @code{logbl},
-@code{logb}, @code{lrintf}, @code{lrintl}, @code{lrint}, @code{lroundf},
-@code{lroundl}, @code{lround}, @code{nearbyintf}, @code{nearbyintl},
-@code{nearbyint}, @code{nextafterf}, @code{nextafterl},
-@code{nextafter}, @code{nexttowardf}, @code{nexttowardl},
-@code{nexttoward}, @code{remainderf}, @code{remainderl},
-@code{remainder}, @code{remquof}, @code{remquol}, @code{remquo},
-@code{rintf}, @code{rintl}, @code{rint}, @code{roundf}, @code{roundl},
-@code{round}, @code{scalblnf}, @code{scalblnl}, @code{scalbln},
-@code{scalbnf}, @code{scalbnl}, @code{scalbn}, @code{snprintf},
-@code{tgammaf}, @code{tgammal}, @code{tgamma}, @code{truncf},
-@code{truncl}, @code{trunc}, @code{vfscanf}, @code{vscanf},
-@code{vsnprintf} and @code{vsscanf}
+@code{cimagl}, @code{cimag}, @code{conjf}, @code{conjl}, @code{conj},
+@code{copysignf}, @code{copysignl}, @code{copysign}, @code{cpowf},
+@code{cpowl}, @code{cpow}, @code{cprojf}, @code{cprojl}, @code{cproj},
+@code{crealf}, @code{creall}, @code{creal}, @code{csinf}, @code{csinhf},
+@code{csinhl}, @code{csinh}, @code{csinl}, @code{csin}, @code{csqrtf},
+@code{csqrtl}, @code{csqrt}, @code{ctanf}, @code{ctanhf}, @code{ctanhl},
+@code{ctanh}, @code{ctanl}, @code{ctan}, @code{erfcf}, @code{erfcl},
+@code{erfc}, @code{erff}, @code{erfl}, @code{erf}, @code{exp2f},
+@code{exp2l}, @code{exp2}, @code{expm1f}, @code{expm1l}, @code{expm1},
+@code{fdimf}, @code{fdiml}, @code{fdim}, @code{fmaf}, @code{fmal},
+@code{fmaxf}, @code{fmaxl}, @code{fmax}, @code{fma}, @code{fminf},
+@code{fminl}, @code{fmin}, @code{hypotf}, @code{hypotl}, @code{hypot},
+@code{ilogbf}, @code{ilogbl}, @code{ilogb}, @code{imaxabs},
+@code{isblank}, @code{lgammaf}, @code{lgammal}, @code{lgamma},
+@code{llabs}, @code{llrintf}, @code{llrintl}, @code{llrint},
+@code{llroundf}, @code{llroundl}, @code{llround}, @code{log1pf},
+@code{log1pl}, @code{log1p}, @code{log2f}, @code{log2l}, @code{log2},
+@code{logbf}, @code{logbl}, @code{logb}, @code{lrintf}, @code{lrintl},
+@code{lrint}, @code{lroundf}, @code{lroundl}, @code{lround},
+@code{nearbyintf}, @code{nearbyintl}, @code{nearbyint},
+@code{nextafterf}, @code{nextafterl}, @code{nextafter},
+@code{nexttowardf}, @code{nexttowardl}, @code{nexttoward},
+@code{remainderf}, @code{remainderl}, @code{remainder}, @code{remquof},
+@code{remquol}, @code{remquo}, @code{rintf}, @code{rintl}, @code{rint},
+@code{roundf}, @code{roundl}, @code{round}, @code{scalblnf},
+@code{scalblnl}, @code{scalbln}, @code{scalbnf}, @code{scalbnl},
+@code{scalbn}, @code{snprintf}, @code{tgammaf}, @code{tgammal},
+@code{tgamma}, @code{truncf}, @code{truncl}, @code{trunc},
+@code{vfscanf}, @code{vscanf}, @code{vsnprintf} and @code{vsscanf}
 are handled as built-in functions
 except in strict ISO C90 mode (@option{-ansi} or @option{-std=c89}).
 
@@ -5148,16 +5164,19 @@ The ISO C90 functions
 @code{abort}, @code{abs}, @code{acos}, @code{asin}, @code{atan2},
 @code{atan}, @code{calloc}, @code{ceil}, @code{cosh}, @code{cos},
 @code{exit}, @code{exp}, @code{fabs}, @code{floor}, @code{fmod},
-@code{fprintf}, @code{fputs}, @code{frexp}, @code{fscanf}, @code{labs},
-@code{ldexp}, @code{log10}, @code{log}, @code{malloc}, @code{memcmp},
-@code{memcpy}, @code{memset}, @code{modf}, @code{pow}, @code{printf},
-@code{putchar}, @code{puts}, @code{scanf}, @code{sinh}, @code{sin},
-@code{snprintf}, @code{sprintf}, @code{sqrt}, @code{sscanf},
-@code{strcat}, @code{strchr}, @code{strcmp}, @code{strcpy},
-@code{strcspn}, @code{strlen}, @code{strncat}, @code{strncmp},
-@code{strncpy}, @code{strpbrk}, @code{strrchr}, @code{strspn},
-@code{strstr}, @code{tanh}, @code{tan}, @code{vfprintf}, @code{vprintf}
-and @code{vsprintf}
+@code{fprintf}, @code{fputs}, @code{frexp}, @code{fscanf},
+@code{isalnum}, @code{isalpha}, @code{iscntrl}, @code{isdigit},
+@code{isgraph}, @code{islower}, @code{isprint}, @code{ispunct},
+@code{isspace}, @code{isupper}, @code{isxdigit}, @code{tolower},
+@code{toupper}, @code{labs}, @code{ldexp}, @code{log10}, @code{log},
+@code{malloc}, @code{memcmp}, @code{memcpy}, @code{memset}, @code{modf},
+@code{pow}, @code{printf}, @code{putchar}, @code{puts}, @code{scanf},
+@code{sinh}, @code{sin}, @code{snprintf}, @code{sprintf}, @code{sqrt},
+@code{sscanf}, @code{strcat}, @code{strchr}, @code{strcmp},
+@code{strcpy}, @code{strcspn}, @code{strlen}, @code{strncat},
+@code{strncmp}, @code{strncpy}, @code{strpbrk}, @code{strrchr},
+@code{strspn}, @code{strstr}, @code{tanh}, @code{tan}, @code{vfprintf},
+@code{vprintf} and @code{vsprintf}
 are all recognized as built-in functions unless
 @option{-fno-builtin} is specified (or @option{-fno-builtin-@var{function}}
 is specified for an individual function).  All of these functions have
diff -rup orig/egcc-CVS20040322/gcc/testsuite/gcc.dg/torture/builtin-ctype-1.c egcc-CVS20040322/gcc/testsuite/gcc.dg/torture/builtin-ctype-1.c
--- orig/egcc-CVS20040322/gcc/testsuite/gcc.dg/torture/builtin-ctype-1.c	2004-03-23 21:18:13.714096191 -0500
+++ egcc-CVS20040322/gcc/testsuite/gcc.dg/torture/builtin-ctype-1.c	2004-03-23 21:22:14.754550332 -0500
@@ -0,0 +1,44 @@
+/* Copyright (C) 2004  Free Software Foundation.
+
+   Verify that built-in ctype function attributes are correctly set by
+   the compiler.
+
+   Written by Kaveh Ghazi, 2004-03-23.  */
+
+/* { dg-do link } */
+
+
+void test(int i)
+{
+  /* All of these ctype functions should be const/pure and thus
+     eliminated.  */
+#define TEST_CTYPE(FN) \
+  extern int FN(int); \
+  extern void link_failure_##FN(void); \
+  if (FN(i) != FN(i)) \
+    link_failure_##FN()
+  
+#ifdef __OPTIMIZE__
+  TEST_CTYPE(isalnum);
+  TEST_CTYPE(isalpha);
+  TEST_CTYPE(isascii);
+  TEST_CTYPE(isblank);
+  TEST_CTYPE(iscntrl);
+  TEST_CTYPE(isdigit);
+  TEST_CTYPE(isgraph);
+  TEST_CTYPE(islower);
+  TEST_CTYPE(isprint);
+  TEST_CTYPE(ispunct);
+  TEST_CTYPE(isspace);
+  TEST_CTYPE(isupper);
+  TEST_CTYPE(isxdigit);
+  TEST_CTYPE(toascii);
+  TEST_CTYPE(tolower);
+  TEST_CTYPE(toupper);
+#endif /* __OPTIMIZE__ */
+}
+
+int main (void)
+{
+  return 0;
+}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]