re PR c++/7099 (G++ doesn't set the noreturn attribute on std::exit and std::abort)
authorRoger Sayle <roger@eyesopen.com>
Sat, 6 Jul 2002 00:16:44 +0000 (00:16 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Sat, 6 Jul 2002 00:16:44 +0000 (00:16 +0000)
PR c++/7099
* builtin-attrs.def: Define new attribute lists for use in
builtins.def.
* builtins.def [DEF_BUILTIN]: Modify to take an additional
ATTRS argument, an enumerated value defined in builtin-attrs.def
that represents the attribute list for the builtins.  Modify
all builtin functions to pass an appropriate attribute list.
Specify "abort", "exit", "_exit" and "_Exit" builtins here with
their required noreturn attributes.
* tree.h (enum_builtin_function): Ignore the additional parameter
to DEF_BUILTIN.
* builtins.c (built_in_names): Likewise.
* c-common.c: (builtin_function_2): Replace the "int noreturn_p"
argument with a tree representing the functions attribute list.
Pass this "attrs" argument to builtin_function.  No longer handle
the noreturn_p processing manually.
(built_in_attributes): Move the definitions from builtin-attrs.def
before c_common_nodes_and_builtins.
(c_common_nodes_and_builtins): Handle the new ATTRS parameter in
DEF_BUILTIN, passing it to both builtin_function and the changed
builtin_function_2.

* doc/extend.texi: Document __builtin_abort, __builtin_exit,
__builtin__exit and __builtin__Exit.

* java/builtins.c (initialize_builtins): Ignore the additional
parameter to DEF_BUILTIN.  Handle more C/C++ specific junk in
the builtins.def file.

From-SVN: r55276

gcc/ChangeLog
gcc/builtin-attrs.def
gcc/builtins.c
gcc/builtins.def
gcc/c-common.c
gcc/doc/extend.texi
gcc/java/ChangeLog
gcc/java/builtins.c
gcc/tree.h

index f8a3583dc41b31c7be2e527eab2eb0189c313aa2..9e0987735ce3c6b9615844f7f1f0eeea1aabe76d 100644 (file)
@@ -1,3 +1,30 @@
+2002-07-05  Roger Sayle  <roger@eyesopen.com>
+
+       PR c++/7099
+       * builtin-attrs.def: Define new attribute lists for use in
+       builtins.def.
+       * builtins.def [DEF_BUILTIN]: Modify to take an additional
+       ATTRS argument, an enumerated value defined in builtin-attrs.def
+       that represents the attribute list for the builtins.  Modify
+       all builtin functions to pass an appropriate attribute list.
+       Specify "abort", "exit", "_exit" and "_Exit" builtins here with
+       their required noreturn attributes.
+       * tree.h (enum_builtin_function): Ignore the additional parameter
+       to DEF_BUILTIN.
+       * builtins.c (built_in_names): Likewise.
+       * c-common.c: (builtin_function_2): Replace the "int noreturn_p"
+       argument with a tree representing the functions attribute list.
+       Pass this "attrs" argument to builtin_function.  No longer handle
+       the noreturn_p processing manually.
+       (built_in_attributes): Move the definitions from builtin-attrs.def
+       before c_common_nodes_and_builtins.
+       (c_common_nodes_and_builtins): Handle the new ATTRS parameter in
+       DEF_BUILTIN, passing it to both builtin_function and the changed
+       builtin_function_2.
+
+       * doc/extend.texi: Document __builtin_abort, __builtin_exit,
+       __builtin__exit and __builtin__Exit.
+
 2002-07-05  Stephane Carrez  <stcarrez@nerim.fr>
 
        * config/m68hc11/m68hc11.md ("*movqi_68hc12"): Avoid allocating
index 56081d1cc5194212da60d869ef833e14722e587c..b307151d5089279f3214f5cded8b102d12b72a76 100644 (file)
@@ -77,15 +77,30 @@ DEF_LIST_INT_INT (3,0)
 DEF_LIST_INT_INT (3,4)
 #undef DEF_LIST_INT_INT
 
+/* Construct tress for identifiers.  */
+DEF_ATTR_IDENT (ATTR_CONST, "const")
+DEF_ATTR_IDENT (ATTR_FORMAT, "format")
+DEF_ATTR_IDENT (ATTR_FORMAT_ARG, "format_arg")
+DEF_ATTR_IDENT (ATTR_MALLOC, "malloc")
+DEF_ATTR_IDENT (ATTR_NONNULL, "nonnull")
+DEF_ATTR_IDENT (ATTR_NORETURN, "noreturn")
+DEF_ATTR_IDENT (ATTR_NOTHROW, "nothrow")
 DEF_ATTR_IDENT (ATTR_PRINTF, "printf")
+DEF_ATTR_IDENT (ATTR_PURE, "pure")
 DEF_ATTR_IDENT (ATTR_SCANF, "scanf")
-DEF_ATTR_IDENT (ATTR_STRFTIME, "strftime")
 DEF_ATTR_IDENT (ATTR_STRFMON, "strfmon")
+DEF_ATTR_IDENT (ATTR_STRFTIME, "strftime")
 
-DEF_ATTR_IDENT (ATTR_FORMAT, "format")
-DEF_ATTR_IDENT (ATTR_FORMAT_ARG, "format_arg")
+DEF_ATTR_TREE_LIST (ATTR_NOTHROW_LIST, ATTR_NOTHROW, ATTR_NULL, ATTR_NULL)
 
-DEF_ATTR_IDENT (ATTR_NONNULL, "nonnull")
+DEF_ATTR_TREE_LIST (ATTR_CONST_NOTHROW_LIST, ATTR_CONST,       \
+                       ATTR_NULL, ATTR_NOTHROW_LIST)
+DEF_ATTR_TREE_LIST (ATTR_PURE_NOTHROW_LIST, ATTR_PURE,         \
+                       ATTR_NULL, ATTR_NOTHROW_LIST)
+DEF_ATTR_TREE_LIST (ATTR_NORETURN_NOTHROW_LIST, ATTR_NORETURN, \
+                       ATTR_NULL, ATTR_NOTHROW_LIST)
+DEF_ATTR_TREE_LIST (ATTR_MALLOC_NOTHROW_LIST, ATTR_MALLOC,     \
+                       ATTR_NULL, ATTR_NOTHROW_LIST)
 
 DEF_ATTR_TREE_LIST (ATTR_NONNULL_1, ATTR_NONNULL, ATTR_LIST_1, ATTR_NULL)
 DEF_ATTR_TREE_LIST (ATTR_NONNULL_2, ATTR_NONNULL, ATTR_LIST_2, ATTR_NULL)
@@ -132,17 +147,8 @@ DEF_FORMAT_ARG_ATTRIBUTE(2)
    -ffreestanding, these default attributes are disabled, and must be
    specified manually if desired.  */
 
-/* __builtin functions should be checked unconditionally, even with
-   -ffreestanding.  */
-DEF_FN_ATTR_IDENT (__builtin_printf, ATTR_FORMAT_PRINTF_1_2, true)
-DEF_FN_ATTR_IDENT (__builtin_fprintf, ATTR_FORMAT_PRINTF_2_3, true)
-DEF_FN_ATTR_IDENT (__builtin_printf_unlocked, ATTR_FORMAT_PRINTF_1_2, true)
-DEF_FN_ATTR_IDENT (__builtin_fprintf_unlocked, ATTR_FORMAT_PRINTF_2_3, true)
-
 /* Functions from ISO/IEC 9899:1990.  */
 #define DEF_C89_ATTR(NAME, ATTRS) DEF_FN_ATTR_IDENT (NAME, ATTRS, flag_hosted)
-DEF_C89_ATTR (printf, ATTR_FORMAT_PRINTF_1_2)
-DEF_C89_ATTR (fprintf, ATTR_FORMAT_PRINTF_2_3)
 DEF_C89_ATTR (sprintf, ATTR_FORMAT_PRINTF_2_3)
 DEF_C89_ATTR (scanf, ATTR_FORMAT_SCANF_1_2)
 DEF_C89_ATTR (fscanf, ATTR_FORMAT_SCANF_2_3)
@@ -175,8 +181,5 @@ DEF_EXT_ATTR (dgettext, ATTR_FORMAT_ARG_2)
 DEF_EXT_ATTR (dcgettext, ATTR_FORMAT_ARG_2)
 /* X/Open strfmon function.  */
 DEF_EXT_ATTR (strfmon, ATTR_FORMAT_STRFMON_3_4)
-/* Glibc thread-unsafe stdio functions.  */
-DEF_EXT_ATTR (printf_unlocked, ATTR_FORMAT_PRINTF_1_2)
-DEF_EXT_ATTR (fprintf_unlocked, ATTR_FORMAT_PRINTF_2_3)
 #undef DEF_EXT_ATTR
 #undef DEF_FN_ATTR_IDENT
index bcf1118039084ddaafb88d76d9770875bc320e2c..4b66369d7863f8e5ba44e59de1662b53d6e65e9c 100644 (file)
@@ -63,7 +63,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 const char *const built_in_class_names[4]
   = {"NOT_BUILT_IN", "BUILT_IN_FRONTEND", "BUILT_IN_MD", "BUILT_IN_NORMAL"};
 
-#define DEF_BUILTIN(X, N, C, T, LT, B, F, NA) STRINGX(X),
+#define DEF_BUILTIN(X, N, C, T, LT, B, F, NA, AT) STRINGX(X),
 const char *const built_in_names[(int) END_BUILTINS] =
 {
 #include "builtins.def"
index 7bfe7c2a1585f1d8a56db92449b755e7aee83647..5c2dbb20ebf42b92c16a79d0e76a21055fd56840 100644 (file)
@@ -22,7 +22,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 /* Before including this file, you should define a macro:
 
      DEF_BUILTIN (ENUM, NAME, CLASS, TYPE, LIBTYPE, BOTH_P,
-                  FALLBACK_P, NONANSI_P)
+                  FALLBACK_P, NONANSI_P, ATTRS)
 
    This macro will be called once for each builtin function.  The
    ENUM will be of type `enum built_in_function', and will indicate
@@ -50,7 +50,10 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 
    If NONANSI_P is true, then the non-`__builtin_' variant is not an
    ANSI/ISO library function, and so we should pretend it does not
-   exist when compiling in ANSI conformant mode.  */
+   exist when compiling in ANSI conformant mode.
+
+   ATTRs is an attribute list as defined in builtin-attrs.def that
+   describes the attributes of this builtin function.  */
    
 /* A GCC builtin (like __builtin_saveregs) is provided by the
    compiler, but does not correspond to a function in the standard
@@ -58,7 +61,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #undef DEF_GCC_BUILTIN
 #define DEF_GCC_BUILTIN(ENUM, NAME, TYPE)                      \
   DEF_BUILTIN (ENUM, NAME, BUILT_IN_NORMAL, TYPE, BT_LAST,     \
-               false, false, false)
+               false, false, false, ATTR_NULL)
 
 
 /* A fallback builtin is a builtin (like __builtin_puts) that falls
@@ -66,9 +69,9 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
    for which we should not introduce the non-`__builtin' variant of
    the name.  */
 #undef DEF_FALLBACK_BUILTIN                            
-#define DEF_FALLBACK_BUILTIN(ENUM, NAME, TYPE)         \
+#define DEF_FALLBACK_BUILTIN(ENUM, NAME, TYPE, ATTRS)  \
   DEF_BUILTIN (ENUM, NAME, BUILT_IN_NORMAL, TYPE, TYPE,        \
-              false, true, false)
+              false, true, false, ATTRS)
 
 /* Like DEF_FALLBACK_BUILTIN, except that the function is not one that
    is specified by ANSI/ISO C.  So, when we're being fully conformant
@@ -77,7 +80,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #undef DEF_EXT_FALLBACK_BUILTIN
 #define DEF_EXT_FALLBACK_BUILTIN(ENUM, NAME, TYPE)     \
   DEF_BUILTIN (ENUM, NAME, BUILT_IN_NORMAL, TYPE, TYPE,        \
-              false, true, true)
+              false, true, true, ATTR_NOTHROW_LIST)
 
 /* A library builtin (like __builtin_strchr) is a builtin equivalent
    of an ANSI/ISO standard library function.  In addition to the
@@ -86,65 +89,67 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
    builtin function, we will fall back to the standard library
    version. */
 #undef DEF_LIB_BUILTIN                                 
-#define DEF_LIB_BUILTIN(ENUM, NAME, TYPE)              \
+#define DEF_LIB_BUILTIN(ENUM, NAME, TYPE, ATTRS)       \
   DEF_BUILTIN (ENUM, NAME, BUILT_IN_NORMAL, TYPE, TYPE,        \
-              true, true, false)
+              true, true, false, ATTRS)
 
 /* Like DEF_LIB_BUILTIN, except that a call to the builtin should
    never fall back to the library version.  */
 #undef DEF_LIB_ALWAYS_BUILTIN                          
 #define DEF_LIB_ALWAYS_BUILTIN(ENUM, NAME, TYPE)       \
   DEF_BUILTIN (ENUM, NAME, BUILT_IN_NORMAL, TYPE, TYPE,        \
-              true, false, true)
+              true, false, true, ATTR_CONST_NOTHROW_LIST)
 
 /* Like DEF_LIB_BUILTIN, except that the function is not one that is
    specified by ANSI/ISO C.  So, when we're being fully conformant we
    ignore the version of these builtins that does not begin with
    __builtin.  */
 #undef DEF_EXT_LIB_BUILTIN                             
-#define DEF_EXT_LIB_BUILTIN(ENUM, NAME, TYPE)          \
+#define DEF_EXT_LIB_BUILTIN(ENUM, NAME, TYPE, ATTRS)   \
   DEF_BUILTIN (ENUM, NAME, BUILT_IN_NORMAL, TYPE, TYPE,        \
-              true, true, true)
+              true, true, true, ATTRS)
 
 /* Like DEF_LIB_BUILTIN, except that the function is only a part of
    the standard in C99 or above.  */
 #undef DEF_C99_BUILTIN                                 
 #define DEF_C99_BUILTIN(ENUM, NAME, TYPE)              \
   DEF_BUILTIN (ENUM, NAME, BUILT_IN_NORMAL, TYPE, TYPE,        \
-              true, !flag_isoc99, true)
+              true, !flag_isoc99, true, ATTR_NOTHROW_LIST)
 
 /* Like DEF_LIB_BUILTIN, except that the function is expanded in the
    front-end.  */
 #undef DEF_FRONT_END_LIB_BUILTIN                       
-#define DEF_FRONT_END_LIB_BUILTIN(ENUM, NAME, TYPE)            \
+#define DEF_FRONT_END_LIB_BUILTIN(ENUM, NAME, TYPE, ATTRS)     \
   DEF_BUILTIN (ENUM, NAME, BUILT_IN_FRONTEND, TYPE, TYPE,      \
-              true, true, false)
+              true, true, false, ATTRS)
 
 /* Like DEF_FRONT_END_LIB_BUILTIN, except that the function is not one
    that is specified by ANSI/ISO C.  So, when we're being fully
    conformant we ignore the version of these builtins that does not
    begin with __builtin.  */
 #undef DEF_EXT_FRONT_END_LIB_BUILTIN                   
-#define DEF_EXT_FRONT_END_LIB_BUILTIN(ENUM, NAME, TYPE)                \
+#define DEF_EXT_FRONT_END_LIB_BUILTIN(ENUM, NAME, TYPE, ATTRS) \
   DEF_BUILTIN (ENUM, NAME, BUILT_IN_FRONTEND, TYPE, TYPE,      \
-              true, true, true)
+              true, true, true, ATTRS)
 
 /* A built-in that is not currently used.  */
 #undef DEF_UNUSED_BUILTIN                                      
 #define DEF_UNUSED_BUILTIN(X)                                  \
   DEF_BUILTIN (X, (const char *) NULL, NOT_BUILT_IN, BT_LAST,  \
-              BT_LAST, false, false, false)
+              BT_LAST, false, false, false, ATTR_NOTHROW_LIST)
 
 /* If SMALL_STACK is defined, then `alloca' is only defined in its
    `__builtin' form.  */
 #if SMALL_STACK  
 DEF_FALLBACK_BUILTIN(BUILT_IN_ALLOCA,
                     "__builtin_alloca",
-                    BT_FN_PTR_SIZE)
+                    BT_FN_PTR_SIZE,
+                    ATTR_MALLOC_NOTHROW_LIST)
 #else
 DEF_EXT_LIB_BUILTIN(BUILT_IN_ALLOCA,
                    "__builtin_alloca",
-                   BT_FN_PTR_SIZE)
+                   BT_FN_PTR_SIZE,
+                   ATTR_MALLOC_NOTHROW_LIST)
 #endif
 
 DEF_LIB_ALWAYS_BUILTIN(BUILT_IN_ABS,
@@ -213,101 +218,146 @@ DEF_BUILTIN (BUILT_IN_BZERO,
             BUILT_IN_NORMAL,
             BT_FN_VOID_PTR_SIZE, 
             BT_FN_VOID_VAR,
-            true, true, true)
+            true, true, true,
+            ATTR_NOTHROW_LIST)
 DEF_BUILTIN (BUILT_IN_BCMP,
             "__builtin_bcmp",
             BUILT_IN_NORMAL,
             BT_FN_INT_CONST_PTR_CONST_PTR_SIZE,
             BT_FN_INT_VAR,
-            true, true, true)
+            true, true, true,
+            ATTR_PURE_NOTHROW_LIST)
 
 DEF_EXT_LIB_BUILTIN(BUILT_IN_FFS,
                    "__builtin_ffs",
-                   BT_FN_INT_INT)
+                   BT_FN_INT_INT,
+                   ATTR_CONST_NOTHROW_LIST)
 DEF_EXT_LIB_BUILTIN(BUILT_IN_INDEX,
                    "__builtin_index",
-                   BT_FN_STRING_CONST_STRING_INT)
+                   BT_FN_STRING_CONST_STRING_INT,
+                   ATTR_PURE_NOTHROW_LIST)
 DEF_EXT_LIB_BUILTIN(BUILT_IN_RINDEX,
                    "__builtin_rindex",
-                   BT_FN_STRING_CONST_STRING_INT)
+                   BT_FN_STRING_CONST_STRING_INT,
+                   ATTR_PURE_NOTHROW_LIST)
 
 DEF_LIB_BUILTIN(BUILT_IN_MEMCPY,
                "__builtin_memcpy",
-               BT_FN_PTR_PTR_CONST_PTR_SIZE)
+               BT_FN_PTR_PTR_CONST_PTR_SIZE,
+               ATTR_NOTHROW_LIST)
 DEF_LIB_BUILTIN(BUILT_IN_MEMCMP,
                "__builtin_memcmp",
-               BT_FN_INT_CONST_PTR_CONST_PTR_SIZE)
+               BT_FN_INT_CONST_PTR_CONST_PTR_SIZE,
+               ATTR_PURE_NOTHROW_LIST)
 DEF_LIB_BUILTIN(BUILT_IN_MEMSET,
                "__builtin_memset",
-               BT_FN_PTR_PTR_INT_SIZE)
+               BT_FN_PTR_PTR_INT_SIZE,
+               ATTR_NOTHROW_LIST)
 
 DEF_LIB_BUILTIN(BUILT_IN_STRCAT,
                "__builtin_strcat",
-               BT_FN_STRING_STRING_CONST_STRING)
+               BT_FN_STRING_STRING_CONST_STRING,
+               ATTR_NOTHROW_LIST)
 DEF_LIB_BUILTIN(BUILT_IN_STRNCAT,
                "__builtin_strncat",
-               BT_FN_STRING_STRING_CONST_STRING_SIZE)
+               BT_FN_STRING_STRING_CONST_STRING_SIZE,
+               ATTR_NOTHROW_LIST)
 DEF_LIB_BUILTIN(BUILT_IN_STRCPY,
                "__builtin_strcpy",
-               BT_FN_STRING_STRING_CONST_STRING)
+               BT_FN_STRING_STRING_CONST_STRING,
+               ATTR_NOTHROW_LIST)
 DEF_LIB_BUILTIN(BUILT_IN_STRNCPY,
                "__builtin_strncpy",
-               BT_FN_STRING_STRING_CONST_STRING_SIZE)
+               BT_FN_STRING_STRING_CONST_STRING_SIZE,
+               ATTR_NOTHROW_LIST)
 DEF_LIB_BUILTIN(BUILT_IN_STRCMP,
                "__builtin_strcmp",
-               BT_FN_INT_CONST_STRING_CONST_STRING)
+               BT_FN_INT_CONST_STRING_CONST_STRING,
+               ATTR_PURE_NOTHROW_LIST)
 DEF_LIB_BUILTIN(BUILT_IN_STRNCMP,
                "__builtin_strncmp",
-               BT_FN_INT_CONST_STRING_CONST_STRING_SIZE)
+               BT_FN_INT_CONST_STRING_CONST_STRING_SIZE,
+               ATTR_PURE_NOTHROW_LIST)
 DEF_LIB_BUILTIN(BUILT_IN_STRLEN,
                "__builtin_strlen",
-               BT_FN_SIZE_CONST_STRING)
+               BT_FN_SIZE_CONST_STRING,
+               ATTR_PURE_NOTHROW_LIST)
 DEF_LIB_BUILTIN(BUILT_IN_STRSTR,
                "__builtin_strstr",
-               BT_FN_STRING_CONST_STRING_CONST_STRING)
+               BT_FN_STRING_CONST_STRING_CONST_STRING,
+               ATTR_PURE_NOTHROW_LIST)
 DEF_LIB_BUILTIN(BUILT_IN_STRPBRK,
                "__builtin_strpbrk",
-               BT_FN_STRING_CONST_STRING_CONST_STRING)
+               BT_FN_STRING_CONST_STRING_CONST_STRING,
+               ATTR_PURE_NOTHROW_LIST)
 DEF_LIB_BUILTIN(BUILT_IN_STRSPN,
                "__builtin_strspn",
-               BT_FN_SIZE_CONST_STRING_CONST_STRING)
+               BT_FN_SIZE_CONST_STRING_CONST_STRING,
+               ATTR_PURE_NOTHROW_LIST)
 DEF_LIB_BUILTIN(BUILT_IN_STRCSPN,
                "__builtin_strcspn",
-               BT_FN_SIZE_CONST_STRING_CONST_STRING)
+               BT_FN_SIZE_CONST_STRING_CONST_STRING,
+               ATTR_PURE_NOTHROW_LIST)
 DEF_LIB_BUILTIN(BUILT_IN_STRCHR,
                "__builtin_strchr",
-               BT_FN_STRING_CONST_STRING_INT)
+               BT_FN_STRING_CONST_STRING_INT,
+               ATTR_PURE_NOTHROW_LIST)
 DEF_LIB_BUILTIN(BUILT_IN_STRRCHR,
                "__builtin_strrchr",
-               BT_FN_STRING_CONST_STRING_INT)
+               BT_FN_STRING_CONST_STRING_INT,
+               ATTR_PURE_NOTHROW_LIST)
 
 DEF_LIB_BUILTIN(BUILT_IN_SQRT,
                "__builtin_sqrt",
-               BT_FN_DOUBLE_DOUBLE)
+               BT_FN_DOUBLE_DOUBLE,
+               flag_errno_math ? ATTR_NOTHROW_LIST
+                               : (flag_unsafe_math_optimizations
+                                  ? ATTR_CONST_NOTHROW_LIST
+                                  : ATTR_PURE_NOTHROW_LIST))
 DEF_LIB_BUILTIN(BUILT_IN_SIN,
                "__builtin_sin",
-               BT_FN_DOUBLE_DOUBLE)
+               BT_FN_DOUBLE_DOUBLE,
+               flag_unsafe_math_optimizations ? ATTR_CONST_NOTHROW_LIST
+                                              : ATTR_PURE_NOTHROW_LIST)
 DEF_LIB_BUILTIN(BUILT_IN_COS,
                "__builtin_cos",
-               BT_FN_DOUBLE_DOUBLE)
+               BT_FN_DOUBLE_DOUBLE,
+               flag_unsafe_math_optimizations ? ATTR_CONST_NOTHROW_LIST
+                                              : ATTR_PURE_NOTHROW_LIST)
 DEF_LIB_BUILTIN(BUILT_IN_SQRTF,
                "__builtin_sqrtf",
-               BT_FN_FLOAT_FLOAT)
+               BT_FN_FLOAT_FLOAT,
+               flag_errno_math ? ATTR_NOTHROW_LIST
+                               : (flag_unsafe_math_optimizations
+                                  ? ATTR_CONST_NOTHROW_LIST
+                                  : ATTR_PURE_NOTHROW_LIST))
 DEF_LIB_BUILTIN(BUILT_IN_SINF,
                "__builtin_sinf",
-               BT_FN_FLOAT_FLOAT)
+               BT_FN_FLOAT_FLOAT,
+               flag_unsafe_math_optimizations ? ATTR_CONST_NOTHROW_LIST
+                                              : ATTR_PURE_NOTHROW_LIST)
 DEF_LIB_BUILTIN(BUILT_IN_COSF,
                "__builtin_cosf",
-               BT_FN_FLOAT_FLOAT)
+               BT_FN_FLOAT_FLOAT,
+               flag_unsafe_math_optimizations ? ATTR_CONST_NOTHROW_LIST
+                                              : ATTR_PURE_NOTHROW_LIST)
 DEF_LIB_BUILTIN(BUILT_IN_SQRTL,
                "__builtin_sqrtl",
-               BT_FN_LONG_DOUBLE_LONG_DOUBLE)
+               BT_FN_LONG_DOUBLE_LONG_DOUBLE,
+               flag_errno_math ? ATTR_NOTHROW_LIST
+                               : (flag_unsafe_math_optimizations
+                                  ? ATTR_CONST_NOTHROW_LIST
+                                  : ATTR_PURE_NOTHROW_LIST))
 DEF_LIB_BUILTIN(BUILT_IN_SINL,
                "__builtin_sinl",
-               BT_FN_LONG_DOUBLE_LONG_DOUBLE)
+               BT_FN_LONG_DOUBLE_LONG_DOUBLE,
+               flag_unsafe_math_optimizations ? ATTR_CONST_NOTHROW_LIST
+                                              : ATTR_PURE_NOTHROW_LIST)
 DEF_LIB_BUILTIN(BUILT_IN_COSL,
                "__builtin_cosl",
-               BT_FN_LONG_DOUBLE_LONG_DOUBLE)
+               BT_FN_LONG_DOUBLE_LONG_DOUBLE,
+               flag_unsafe_math_optimizations ? ATTR_CONST_NOTHROW_LIST
+                                              : ATTR_PURE_NOTHROW_LIST)
 
 DEF_UNUSED_BUILTIN(BUILT_IN_GETEXP)
 DEF_UNUSED_BUILTIN(BUILT_IN_GETMAN)
@@ -361,16 +411,20 @@ DEF_GCC_BUILTIN(BUILT_IN_PREFETCH,
 /* Stdio builtins.  */
 DEF_FALLBACK_BUILTIN(BUILT_IN_PUTCHAR,
                    "__builtin_putchar",
-                    BT_FN_INT_INT)
+                    BT_FN_INT_INT,
+                    ATTR_NOTHROW_LIST)
 DEF_FALLBACK_BUILTIN(BUILT_IN_PUTS,
                     "__builtin_puts",
-                    BT_FN_INT_CONST_STRING)
+                    BT_FN_INT_CONST_STRING,
+                    ATTR_NOTHROW_LIST)
 DEF_FRONT_END_LIB_BUILTIN(BUILT_IN_PRINTF,
                          "__builtin_printf",
-                         BT_FN_INT_CONST_STRING_VAR)
+                         BT_FN_INT_CONST_STRING_VAR,
+                         ATTR_FORMAT_PRINTF_1_2)
 DEF_FALLBACK_BUILTIN(BUILT_IN_FPUTC,
                     "__builtin_fputc",
-                    BT_FN_INT_INT_PTR)
+                    BT_FN_INT_INT_PTR,
+                    ATTR_NOTHROW_LIST)
 /* Declare the __builtin_ style with arguments and the regular style
    without them.  We rely on stdio.h to supply the arguments for the
    regular style declaration since we had to use void* instead of
@@ -380,13 +434,15 @@ DEF_BUILTIN (BUILT_IN_FPUTS,
             BUILT_IN_NORMAL,
             BT_FN_INT_CONST_STRING_PTR,
             BT_FN_INT_VAR,
-            true, true, false)
+            true, true, false, ATTR_NOTHROW_LIST)
 DEF_FALLBACK_BUILTIN(BUILT_IN_FWRITE,
                     "__builtin_fwrite",
-                    BT_FN_SIZE_CONST_PTR_SIZE_SIZE_PTR)
+                    BT_FN_SIZE_CONST_PTR_SIZE_SIZE_PTR,
+                     ATTR_NOTHROW_LIST)
 DEF_FRONT_END_LIB_BUILTIN(BUILT_IN_FPRINTF,
                         "__builtin_fprintf",
-                        BT_FN_INT_PTR_CONST_STRING_VAR)
+                        BT_FN_INT_PTR_CONST_STRING_VAR,
+                        ATTR_FORMAT_PRINTF_2_3)
 
 /* Stdio unlocked builtins.  */
 
@@ -398,7 +454,8 @@ DEF_EXT_FALLBACK_BUILTIN(BUILT_IN_PUTS_UNLOCKED,
                         BT_FN_INT_CONST_STRING)
 DEF_EXT_FRONT_END_LIB_BUILTIN(BUILT_IN_PRINTF_UNLOCKED,
                              "__builtin_printf_unlocked",
-                             BT_FN_INT_CONST_STRING_VAR)
+                             BT_FN_INT_CONST_STRING_VAR,
+                             ATTR_FORMAT_PRINTF_1_2)
 DEF_EXT_FALLBACK_BUILTIN(BUILT_IN_FPUTC_UNLOCKED,
                         "__builtin_fputc_unlocked",
                         BT_FN_INT_INT_PTR)
@@ -411,13 +468,14 @@ DEF_BUILTIN (BUILT_IN_FPUTS_UNLOCKED,
             BUILT_IN_NORMAL,
             BT_FN_INT_CONST_STRING_PTR,
             BT_FN_INT_VAR,
-            true, true, true)
+            true, true, true, ATTR_NOTHROW_LIST)
 DEF_EXT_FALLBACK_BUILTIN(BUILT_IN_FWRITE_UNLOCKED,
                         "__builtin_fwrite_unlocked",
                         BT_FN_SIZE_CONST_PTR_SIZE_SIZE_PTR)
 DEF_EXT_FRONT_END_LIB_BUILTIN(BUILT_IN_FPRINTF_UNLOCKED,
                              "__builtin_fprintf_unlocked",
-                             BT_FN_INT_PTR_CONST_STRING_VAR)
+                             BT_FN_INT_PTR_CONST_STRING_VAR,
+                             ATTR_FORMAT_PRINTF_2_3)
 
   /* ISO C99 floating point unordered comparisons.  */
 DEF_GCC_BUILTIN(BUILT_IN_ISGREATER, 
@@ -486,3 +544,37 @@ DEF_UNUSED_BUILTIN(BUILT_IN_NEW)
 DEF_UNUSED_BUILTIN(BUILT_IN_VEC_NEW)
 DEF_UNUSED_BUILTIN(BUILT_IN_DELETE)
 DEF_UNUSED_BUILTIN(BUILT_IN_VEC_DELETE)
+
+/* Declare abort, exit, _exit and _Exit */
+DEF_BUILTIN (BUILT_IN_ABORT,
+            "__builtin_abort",
+            NOT_BUILT_IN,
+            (c_language == clk_cplusplus ? BT_FN_VOID : BT_FN_VOID_VAR),
+            (c_language == clk_cplusplus ? BT_FN_VOID : BT_FN_VOID_VAR),
+            1, 0, 0,
+            ATTR_NORETURN_NOTHROW_LIST)
+
+DEF_BUILTIN (BUILT_IN_EXIT,
+            "__builtin_exit",
+            NOT_BUILT_IN,
+            (c_language == clk_cplusplus ? BT_FN_VOID_INT : BT_FN_VOID_VAR),
+            (c_language == clk_cplusplus ? BT_FN_VOID_INT : BT_FN_VOID_VAR),
+            1, 0, 0,
+            ATTR_NORETURN_NOTHROW_LIST)
+
+DEF_BUILTIN (BUILT_IN__EXIT,
+            "__builtin__exit",
+            NOT_BUILT_IN,
+            BT_FN_VOID_INT,
+            BT_FN_VOID_INT,
+            1, 0, 1,
+            ATTR_NORETURN_NOTHROW_LIST)
+
+DEF_BUILTIN (BUILT_IN__EXIT2,
+            "__builtin__Exit",
+            NOT_BUILT_IN,
+            BT_FN_VOID_INT,
+            BT_FN_VOID_INT,
+            1, 0, !flag_isoc99,
+            ATTR_NORETURN_NOTHROW_LIST)
+
index 4438abe2a092987d593572912779daf340237492..57c191ab423a25aaa96195d34f488971582ae63c 100644 (file)
@@ -2456,7 +2456,7 @@ c_common_truthvalue_conversion (expr)
 \f
 static tree builtin_function_2 PARAMS ((const char *, const char *, tree, tree,
                                        int, enum built_in_class, int, int,
-                                       int));
+                                       tree));
 
 /* Make a variant type in the proper way for C/C++, propagating qualifiers
    down to the element type of an array.  */
@@ -2681,6 +2681,30 @@ c_alignof_expr (expr)
   return fold (build1 (NOP_EXPR, c_size_type_node, t));
 }
 \f
+/* Handle C and C++ default attributes.  */
+
+enum built_in_attribute
+{
+#define DEF_ATTR_NULL_TREE(ENUM) ENUM,
+#define DEF_ATTR_INT(ENUM, VALUE) ENUM,
+#define DEF_ATTR_IDENT(ENUM, STRING) ENUM,
+#define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN) ENUM,
+#define DEF_FN_ATTR(NAME, ATTRS, PREDICATE) /* No entry needed in enum.  */
+#include "builtin-attrs.def"
+#undef DEF_ATTR_NULL_TREE
+#undef DEF_ATTR_INT
+#undef DEF_ATTR_IDENT
+#undef DEF_ATTR_TREE_LIST
+#undef DEF_FN_ATTR
+  ATTR_LAST
+};
+
+static GTY(()) tree built_in_attributes[(int) ATTR_LAST];
+
+static bool c_attrs_initialized = false;
+
+static void c_init_attributes PARAMS ((void));
+
 /* Build tree nodes and builtin functions common to both C and C++ language
    frontends.  */
 
@@ -3041,8 +3065,11 @@ c_common_nodes_and_builtins ()
 #undef DEF_FUNCTION_TYPE_VAR_1
 #undef DEF_POINTER_TYPE
 
-#define DEF_BUILTIN(ENUM, NAME, CLASS,                                 \
-                    TYPE, LIBTYPE, BOTH_P, FALLBACK_P, NONANSI_P)      \
+  if (!c_attrs_initialized)
+    c_init_attributes ();
+
+#define DEF_BUILTIN(ENUM, NAME, CLASS, TYPE, LIBTYPE,                  \
+                   BOTH_P, FALLBACK_P, NONANSI_P, ATTRS)               \
   if (NAME)                                                            \
     {                                                                  \
       tree decl;                                                       \
@@ -3055,7 +3082,8 @@ c_common_nodes_and_builtins ()
                                 CLASS,                                 \
                                 (FALLBACK_P                            \
                                  ? (NAME + strlen ("__builtin_"))      \
-                                 : NULL), NULL_TREE);                  \
+                                 : NULL),                              \
+                                built_in_attributes[(int) ATTRS]);     \
       else                                                             \
        decl = builtin_function_2 (NAME,                                \
                                   NAME + strlen ("__builtin_"),        \
@@ -3065,35 +3093,13 @@ c_common_nodes_and_builtins ()
                                   CLASS,                               \
                                   FALLBACK_P,                          \
                                   NONANSI_P,                           \
-                                  /*noreturn_p=*/0);                   \
+                                  built_in_attributes[(int) ATTRS]);   \
                                                                        \
       built_in_decls[(int) ENUM] = decl;                               \
     }                                                                  
 #include "builtins.def"
 #undef DEF_BUILTIN
 
-  /* Declare _exit and _Exit just to mark them as non-returning.  */
-  builtin_function_2 (NULL, "_exit", NULL_TREE, 
-                     builtin_types[BT_FN_VOID_INT],
-                     0, NOT_BUILT_IN, 0, 1, 1);
-  builtin_function_2 (NULL, "_Exit", NULL_TREE, 
-                     builtin_types[BT_FN_VOID_INT],
-                     0, NOT_BUILT_IN, 0, !flag_isoc99, 1);
-
-  /* Declare these functions non-returning
-     to avoid spurious "control drops through" warnings.  */
-  builtin_function_2 (NULL, "abort",
-                     NULL_TREE, ((c_language == clk_cplusplus)
-                                 ? builtin_types[BT_FN_VOID]
-                                 : builtin_types[BT_FN_VOID_VAR]),
-                     0, NOT_BUILT_IN, 0, 0, 1);
-
-  builtin_function_2 (NULL, "exit",
-                     NULL_TREE, ((c_language == clk_cplusplus)
-                                 ? builtin_types[BT_FN_VOID_INT]
-                                 : builtin_types[BT_FN_VOID_VAR]),
-                     0, NOT_BUILT_IN, 0, 0, 1);
-
   main_identifier_node = get_identifier ("main");
 }
 
@@ -3161,15 +3167,15 @@ builtin_function_disabled_p (name)
    conflicts with headers.  FUNCTION_CODE and CLASS are as for
    builtin_function.  If LIBRARY_NAME_P is nonzero, NAME is passed as
    the LIBRARY_NAME parameter to builtin_function when declaring BUILTIN_NAME.
-   If NONANSI_P is nonzero, the name NAME is treated as a non-ANSI name; if
-   NORETURN_P is nonzero, the function is marked as non-returning.
+   If NONANSI_P is nonzero, the name NAME is treated as a non-ANSI name;
+   ATTRS is the tree list representing the builtin's function attributes.
    Returns the declaration of BUILTIN_NAME, if any, otherwise
    the declaration of NAME.  Does not declare NAME if flag_no_builtin,
    or if NONANSI_P and flag_no_nonansi_builtin.  */
 
 static tree
 builtin_function_2 (builtin_name, name, builtin_type, type, function_code,
-                   class, library_name_p, nonansi_p, noreturn_p)
+                   class, library_name_p, nonansi_p, attrs)
      const char *builtin_name;
      const char *name;
      tree builtin_type;
@@ -3178,7 +3184,7 @@ builtin_function_2 (builtin_name, name, builtin_type, type, function_code,
      enum built_in_class class;
      int library_name_p;
      int nonansi_p;
-     int noreturn_p;
+     tree attrs;
 {
   tree bdecl = NULL_TREE;
   tree decl = NULL_TREE;
@@ -3186,25 +3192,15 @@ builtin_function_2 (builtin_name, name, builtin_type, type, function_code,
     {
       bdecl = builtin_function (builtin_name, builtin_type, function_code,
                                class, library_name_p ? name : NULL,
-                               NULL_TREE);
-      if (noreturn_p)
-       {
-         TREE_THIS_VOLATILE (bdecl) = 1;
-         TREE_SIDE_EFFECTS (bdecl) = 1;
-       }
+                               attrs);
     }
   if (name != 0 && !flag_no_builtin && !builtin_function_disabled_p (name)
       && !(nonansi_p && flag_no_nonansi_builtin))
     {
       decl = builtin_function (name, type, function_code, class, NULL,
-                              NULL_TREE);
+                              attrs);
       if (nonansi_p)
        DECL_BUILT_IN_NONANSI (decl) = 1;
-      if (noreturn_p)
-       {
-         TREE_THIS_VOLATILE (decl) = 1;
-         TREE_SIDE_EFFECTS (decl) = 1;
-       }
     }
   return (bdecl != 0 ? bdecl : decl);
 }
@@ -4232,30 +4228,6 @@ boolean_increment (code, arg)
   return val;
 }
 \f
-/* Handle C and C++ default attributes.  */
-
-enum built_in_attribute
-{
-#define DEF_ATTR_NULL_TREE(ENUM) ENUM,
-#define DEF_ATTR_INT(ENUM, VALUE) ENUM,
-#define DEF_ATTR_IDENT(ENUM, STRING) ENUM,
-#define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN) ENUM,
-#define DEF_FN_ATTR(NAME, ATTRS, PREDICATE) /* No entry needed in enum.  */
-#include "builtin-attrs.def"
-#undef DEF_ATTR_NULL_TREE
-#undef DEF_ATTR_INT
-#undef DEF_ATTR_IDENT
-#undef DEF_ATTR_TREE_LIST
-#undef DEF_FN_ATTR
-  ATTR_LAST
-};
-
-static GTY(()) tree built_in_attributes[(int) ATTR_LAST];
-
-static bool c_attrs_initialized = false;
-
-static void c_init_attributes PARAMS ((void));
-
 /* Common initialization before parsing options.  */
 void
 c_common_init_options (lang)
index c8048277fed56e11400103062b85dd67fcf15317..56b92e74ff27e8433bff5104e165a0e623696442 100644 (file)
@@ -4519,7 +4519,9 @@ The functions @code{abort}, @code{exit}, @code{_Exit} and @code{_exit}
 are recognized and presumed not to return, but otherwise are not built
 in.  @code{_exit} is not recognized in strict ISO C mode (@option{-ansi},
 @option{-std=c89} or @option{-std=c99}).  @code{_Exit} is not recognized in
-strict C89 mode (@option{-ansi} or @option{-std=c89}).
+strict C89 mode (@option{-ansi} or @option{-std=c89}).  All these functions
+have corresponding versions prefixed with @code{__builtin_}, which may be
+used even in strict C89 mode.
 
 Outside strict ISO C mode, the functions @code{alloca}, @code{bcmp},
 @code{bzero}, @code{index}, @code{rindex}, @code{ffs}, @code{fputs_unlocked},
index 2a5b27a294169b85236c496206b2cbb4c3c8356e..d93b34641b62b6145c7b9d94053d4baa329422d4 100644 (file)
@@ -1,3 +1,9 @@
+2002-07-05  Roger Sayle  <roger@eyesopen.com>
+
+       * java/builtins.c (initialize_builtins): Ignore the additional
+       parameter to DEF_BUILTIN.  Handle more C/C++ specific junk in
+       the builtins.def file.
+
 2002-07-01  Tom Tromey  <tromey@redhat.com>
 
        For PR libgcj/7073:
index c167df5b16b930980dd9b7a1d85da3fdc6c0276f..dafad79b434669773696f478426ab6184a087892 100644 (file)
@@ -284,6 +284,8 @@ initialize_builtins ()
 #define va_list_ref_type_node NULL_TREE
 #define va_list_arg_type_node NULL_TREE
 #define flag_isoc99 0
+#define c_language 0
+#define clk_cplusplus 0
 
 #define DEF_PRIMITIVE_TYPE(ENUM, VALUE)                                              \
   builtin_types[(int) ENUM] = VALUE;
@@ -314,7 +316,7 @@ initialize_builtins ()
 #include "builtin-types.def"
 
 #define DEF_BUILTIN(ENUM, NAME, CLASS, TYPE, LIBTYPE, BOTH_P, \
-                    FALLBACK_P, NONANSI_P) \
+                    FALLBACK_P, NONANSI_P, ATTRS) \
   define_builtin (ENUM, NAME, CLASS, builtin_types[TYPE], FALLBACK_P);
 #include "builtins.def"
 }
index 75c8e6036e7119ec2ac2453f42ede943fbf43502..795abebfef22dba0f4897f0efef2ef0f4a57e23f 100644 (file)
@@ -80,7 +80,7 @@ extern const char *const built_in_class_names[4];
 /* Codes that identify the various built in functions
    so that expand_call can identify them quickly.  */
 
-#define DEF_BUILTIN(ENUM, N, C, T, LT, B, F, NA) ENUM,
+#define DEF_BUILTIN(ENUM, N, C, T, LT, B, F, NA, AT) ENUM,
 enum built_in_function
 {
 #include "builtins.def"