builtins.c (DEF_BUILTIN): Accept 10 arguments.
* builtins.c (DEF_BUILTIN): Accept 10 arguments. (implicit_built_in_decls): New global array. (mathfn_built_in): New global function. (fold_trunc_transparent_mathfn): New static function (expand_builtin_strstr, expand_bultin_strchr, expand_builtin_strpbrk, expand_builtin_strcpy, expand_builtin_strncpy, expand_bultin_strcmp, expand_bultin_strncat, expand_builtin_fputs): Use implicint_built_in_decls. (fold_builtin): Fold floor/trunc/round/ceil/nearbyint. * builtins.def: Fix comments. (DEF_GCC_BUILTIN, DEF_FALLBACK_BUILTIN, DEF_EXT_FALLBACK_BUILTIN, DEF_LIB_BUILTIN, DEF_LIB_ALWAYS_BUILTIN, DEF_EXT_LIB_BUILTIN, DEF_C99_BULTIN, DEF_FRONT_END_LIB_BUILTIN, DEF_EXT_FRONT_END_LIB_BUILTIN): Pass implicit as needed. (DEF_C99_C90RES_BULTIN): New. (*f, *l builtins): Update. * c-common.c (DEF_BUILTIN): Initialize implicit array. (c_expand_builtin_printf, c_expand_builtin_fprintf): Update. * convert.c (strip_float_extensions): New global function. * tree.h (DEF_BUILTIN): Accept 10 arguments. (implicit_built_in_decls, mathfn_built_in, strip_float_extension): Declare. * java/builtins.c (define_builtin): Handle implicit. (DEF_BUILTIN): Update. * tm.texi (TARGET_C99_FUNCTIONS): Document. * defaults.h (TARGET_C99_FUNCTIONS): Default to 0. * config/linux.h (TARGET_C99_FUNCTIONS): Default to 1 when using glibc2. From-SVN: r61738
This commit is contained in:
parent
0ced43354f
commit
272f51a36f
|
@ -1,3 +1,35 @@
|
|||
Fri Jan 24 23:03:32 CET 2003 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
* builtins.c (DEF_BUILTIN): Accept 10 arguments.
|
||||
(implicit_built_in_decls): New global array.
|
||||
(mathfn_built_in): New global function.
|
||||
(fold_trunc_transparent_mathfn): New static function
|
||||
(expand_builtin_strstr, expand_bultin_strchr,
|
||||
expand_builtin_strpbrk, expand_builtin_strcpy,
|
||||
expand_builtin_strncpy, expand_bultin_strcmp,
|
||||
expand_bultin_strncat, expand_builtin_fputs): Use
|
||||
implicint_built_in_decls.
|
||||
(fold_builtin): Fold floor/trunc/round/ceil/nearbyint.
|
||||
* builtins.def: Fix comments.
|
||||
(DEF_GCC_BUILTIN, DEF_FALLBACK_BUILTIN, DEF_EXT_FALLBACK_BUILTIN,
|
||||
DEF_LIB_BUILTIN, DEF_LIB_ALWAYS_BUILTIN, DEF_EXT_LIB_BUILTIN,
|
||||
DEF_C99_BULTIN, DEF_FRONT_END_LIB_BUILTIN,
|
||||
DEF_EXT_FRONT_END_LIB_BUILTIN): Pass implicit as needed.
|
||||
(DEF_C99_C90RES_BULTIN): New.
|
||||
(*f, *l builtins): Update.
|
||||
* c-common.c (DEF_BUILTIN): Initialize implicit array.
|
||||
(c_expand_builtin_printf, c_expand_builtin_fprintf): Update.
|
||||
* convert.c (strip_float_extensions): New global function.
|
||||
* tree.h (DEF_BUILTIN): Accept 10 arguments.
|
||||
(implicit_built_in_decls, mathfn_built_in, strip_float_extension):
|
||||
Declare.
|
||||
* java/builtins.c (define_builtin): Handle implicit.
|
||||
(DEF_BUILTIN): Update.
|
||||
* tm.texi (TARGET_C99_FUNCTIONS): Document.
|
||||
* defaults.h (TARGET_C99_FUNCTIONS): Default to 0.
|
||||
* config/linux.h (TARGET_C99_FUNCTIONS): Default to 1
|
||||
when using glibc2.
|
||||
|
||||
2003-01-24 Bob Wilson <bob.wilson@acm.org>
|
||||
|
||||
* config.gcc (xtensa-*-elf*): Removed assignments to with_newlib,
|
||||
|
|
197
gcc/builtins.c
197
gcc/builtins.c
|
@ -64,7 +64,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, AT) STRINGX(X),
|
||||
#define DEF_BUILTIN(X, N, C, T, LT, B, F, NA, AT, IM) STRINGX(X),
|
||||
const char *const built_in_names[(int) END_BUILTINS] =
|
||||
{
|
||||
#include "builtins.def"
|
||||
|
@ -74,6 +74,10 @@ const char *const built_in_names[(int) END_BUILTINS] =
|
|||
/* Setup an array of _DECL trees, make sure each element is
|
||||
initialized to NULL_TREE. */
|
||||
tree built_in_decls[(int) END_BUILTINS];
|
||||
/* Declarations used when constructing the builtin implicitly in the compiler.
|
||||
It may be NULL_TREE when this is invalid (for instance runtime is not
|
||||
required to implement the function call in all cases. */
|
||||
tree implicit_built_in_decls[(int) END_BUILTINS];
|
||||
|
||||
static int get_pointer_alignment PARAMS ((tree, unsigned int));
|
||||
static tree c_strlen PARAMS ((tree));
|
||||
|
@ -153,6 +157,7 @@ static tree fold_builtin_classify_type PARAMS ((tree));
|
|||
static tree fold_builtin_inf PARAMS ((tree, int));
|
||||
static tree fold_builtin_nan PARAMS ((tree, tree, int));
|
||||
static int validate_arglist PARAMS ((tree, ...));
|
||||
static tree fold_trunc_transparent_mathfn PARAMS ((tree));
|
||||
|
||||
/* Return the alignment in bits of EXP, a pointer valued expression.
|
||||
But don't return more than MAX_ALIGN no matter what.
|
||||
|
@ -1469,6 +1474,170 @@ expand_builtin_constant_p (exp)
|
|||
return tmp;
|
||||
}
|
||||
|
||||
/* Return mathematic function equivalent to FN but operating directly on TYPE,
|
||||
if available. */
|
||||
tree
|
||||
mathfn_built_in (type, fn)
|
||||
tree type;
|
||||
enum built_in_function fn;
|
||||
{
|
||||
enum built_in_function fcode = NOT_BUILT_IN;
|
||||
if (TYPE_MODE (type) == TYPE_MODE (double_type_node))
|
||||
switch (fn)
|
||||
{
|
||||
case BUILT_IN_SQRT:
|
||||
case BUILT_IN_SQRTF:
|
||||
case BUILT_IN_SQRTL:
|
||||
fcode = BUILT_IN_SQRT;
|
||||
break;
|
||||
case BUILT_IN_SIN:
|
||||
case BUILT_IN_SINF:
|
||||
case BUILT_IN_SINL:
|
||||
fcode = BUILT_IN_SIN;
|
||||
break;
|
||||
case BUILT_IN_COS:
|
||||
case BUILT_IN_COSF:
|
||||
case BUILT_IN_COSL:
|
||||
fcode = BUILT_IN_COS;
|
||||
break;
|
||||
case BUILT_IN_EXP:
|
||||
case BUILT_IN_EXPF:
|
||||
case BUILT_IN_EXPL:
|
||||
fcode = BUILT_IN_EXP;
|
||||
break;
|
||||
case BUILT_IN_FLOOR:
|
||||
case BUILT_IN_FLOORF:
|
||||
case BUILT_IN_FLOORL:
|
||||
fcode = BUILT_IN_FLOOR;
|
||||
break;
|
||||
case BUILT_IN_CEIL:
|
||||
case BUILT_IN_CEILF:
|
||||
case BUILT_IN_CEILL:
|
||||
fcode = BUILT_IN_CEIL;
|
||||
break;
|
||||
case BUILT_IN_TRUNC:
|
||||
case BUILT_IN_TRUNCF:
|
||||
case BUILT_IN_TRUNCL:
|
||||
fcode = BUILT_IN_TRUNC;
|
||||
break;
|
||||
case BUILT_IN_ROUND:
|
||||
case BUILT_IN_ROUNDF:
|
||||
case BUILT_IN_ROUNDL:
|
||||
fcode = BUILT_IN_ROUND;
|
||||
break;
|
||||
case BUILT_IN_NEARBYINT:
|
||||
case BUILT_IN_NEARBYINTF:
|
||||
case BUILT_IN_NEARBYINTL:
|
||||
fcode = BUILT_IN_NEARBYINT;
|
||||
break;
|
||||
default:
|
||||
abort ();
|
||||
}
|
||||
else if (TYPE_MODE (type) == TYPE_MODE (float_type_node))
|
||||
switch (fn)
|
||||
{
|
||||
case BUILT_IN_SQRT:
|
||||
case BUILT_IN_SQRTF:
|
||||
case BUILT_IN_SQRTL:
|
||||
fcode = BUILT_IN_SQRTF;
|
||||
break;
|
||||
case BUILT_IN_SIN:
|
||||
case BUILT_IN_SINF:
|
||||
case BUILT_IN_SINL:
|
||||
fcode = BUILT_IN_SINF;
|
||||
break;
|
||||
case BUILT_IN_COS:
|
||||
case BUILT_IN_COSF:
|
||||
case BUILT_IN_COSL:
|
||||
fcode = BUILT_IN_COSF;
|
||||
break;
|
||||
case BUILT_IN_EXP:
|
||||
case BUILT_IN_EXPF:
|
||||
case BUILT_IN_EXPL:
|
||||
fcode = BUILT_IN_EXPF;
|
||||
break;
|
||||
case BUILT_IN_FLOOR:
|
||||
case BUILT_IN_FLOORF:
|
||||
case BUILT_IN_FLOORL:
|
||||
fcode = BUILT_IN_FLOORF;
|
||||
break;
|
||||
case BUILT_IN_CEIL:
|
||||
case BUILT_IN_CEILF:
|
||||
case BUILT_IN_CEILL:
|
||||
fcode = BUILT_IN_CEILF;
|
||||
break;
|
||||
case BUILT_IN_TRUNC:
|
||||
case BUILT_IN_TRUNCF:
|
||||
case BUILT_IN_TRUNCL:
|
||||
fcode = BUILT_IN_TRUNCF;
|
||||
break;
|
||||
case BUILT_IN_ROUND:
|
||||
case BUILT_IN_ROUNDF:
|
||||
case BUILT_IN_ROUNDL:
|
||||
fcode = BUILT_IN_ROUNDF;
|
||||
break;
|
||||
case BUILT_IN_NEARBYINT:
|
||||
case BUILT_IN_NEARBYINTF:
|
||||
case BUILT_IN_NEARBYINTL:
|
||||
fcode = BUILT_IN_NEARBYINTF;
|
||||
break;
|
||||
default:
|
||||
abort ();
|
||||
}
|
||||
else if (TYPE_MODE (type) == TYPE_MODE (long_double_type_node))
|
||||
switch (fn)
|
||||
{
|
||||
case BUILT_IN_SQRT:
|
||||
case BUILT_IN_SQRTF:
|
||||
case BUILT_IN_SQRTL:
|
||||
fcode = BUILT_IN_SQRTL;
|
||||
break;
|
||||
case BUILT_IN_SIN:
|
||||
case BUILT_IN_SINF:
|
||||
case BUILT_IN_SINL:
|
||||
fcode = BUILT_IN_SINL;
|
||||
break;
|
||||
case BUILT_IN_COS:
|
||||
case BUILT_IN_COSF:
|
||||
case BUILT_IN_COSL:
|
||||
fcode = BUILT_IN_COSL;
|
||||
break;
|
||||
case BUILT_IN_EXP:
|
||||
case BUILT_IN_EXPF:
|
||||
case BUILT_IN_EXPL:
|
||||
fcode = BUILT_IN_EXPL;
|
||||
break;
|
||||
case BUILT_IN_FLOOR:
|
||||
case BUILT_IN_FLOORF:
|
||||
case BUILT_IN_FLOORL:
|
||||
fcode = BUILT_IN_FLOORL;
|
||||
break;
|
||||
case BUILT_IN_CEIL:
|
||||
case BUILT_IN_CEILF:
|
||||
case BUILT_IN_CEILL:
|
||||
fcode = BUILT_IN_CEILL;
|
||||
break;
|
||||
case BUILT_IN_TRUNC:
|
||||
case BUILT_IN_TRUNCF:
|
||||
case BUILT_IN_TRUNCL:
|
||||
fcode = BUILT_IN_TRUNCL;
|
||||
break;
|
||||
case BUILT_IN_ROUND:
|
||||
case BUILT_IN_ROUNDF:
|
||||
case BUILT_IN_ROUNDL:
|
||||
fcode = BUILT_IN_ROUNDL;
|
||||
break;
|
||||
case BUILT_IN_NEARBYINT:
|
||||
case BUILT_IN_NEARBYINTF:
|
||||
case BUILT_IN_NEARBYINTL:
|
||||
fcode = BUILT_IN_NEARBYINTL;
|
||||
break;
|
||||
default:
|
||||
abort ();
|
||||
}
|
||||
return implicit_built_in_decls[fcode];
|
||||
}
|
||||
|
||||
/* Expand a call to one of the builtin math functions (sin, cos, or sqrt).
|
||||
Return 0 if a normal call should be emitted rather than expanding the
|
||||
function in-line. EXP is the expression that is a call to the builtin
|
||||
|
@ -1756,7 +1925,7 @@ expand_builtin_strstr (arglist, target, mode)
|
|||
if (p2[1] != '\0')
|
||||
return 0;
|
||||
|
||||
fn = built_in_decls[BUILT_IN_STRCHR];
|
||||
fn = implicit_built_in_decls[BUILT_IN_STRCHR];
|
||||
if (!fn)
|
||||
return 0;
|
||||
|
||||
|
@ -1860,7 +2029,7 @@ expand_builtin_strrchr (arglist, target, mode)
|
|||
if (! integer_zerop (s2))
|
||||
return 0;
|
||||
|
||||
fn = built_in_decls[BUILT_IN_STRCHR];
|
||||
fn = implicit_built_in_decls[BUILT_IN_STRCHR];
|
||||
if (!fn)
|
||||
return 0;
|
||||
|
||||
|
@ -1918,7 +2087,7 @@ expand_builtin_strpbrk (arglist, target, mode)
|
|||
if (p2[1] != '\0')
|
||||
return 0; /* Really call strpbrk. */
|
||||
|
||||
fn = built_in_decls[BUILT_IN_STRCHR];
|
||||
fn = implicit_built_in_decls[BUILT_IN_STRCHR];
|
||||
if (!fn)
|
||||
return 0;
|
||||
|
||||
|
@ -2057,7 +2226,7 @@ expand_builtin_strcpy (exp, target, mode)
|
|||
if (!validate_arglist (arglist, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
|
||||
return 0;
|
||||
|
||||
fn = built_in_decls[BUILT_IN_MEMCPY];
|
||||
fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
|
||||
if (!fn)
|
||||
return 0;
|
||||
|
||||
|
@ -2159,7 +2328,7 @@ expand_builtin_strncpy (arglist, target, mode)
|
|||
}
|
||||
|
||||
/* OK transform into builtin memcpy. */
|
||||
fn = built_in_decls[BUILT_IN_MEMCPY];
|
||||
fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
|
||||
if (!fn)
|
||||
return 0;
|
||||
return expand_expr (build_function_call_expr (fn, arglist),
|
||||
|
@ -2575,7 +2744,7 @@ expand_builtin_strcmp (exp, target, mode)
|
|||
if (TREE_SIDE_EFFECTS (len))
|
||||
return 0;
|
||||
|
||||
fn = built_in_decls[BUILT_IN_MEMCMP];
|
||||
fn = implicit_built_in_decls[BUILT_IN_MEMCMP];
|
||||
if (!fn)
|
||||
return 0;
|
||||
|
||||
|
@ -2669,7 +2838,7 @@ expand_builtin_strncmp (exp, target, mode)
|
|||
if (!len)
|
||||
return 0;
|
||||
|
||||
fn = built_in_decls[BUILT_IN_MEMCMP];
|
||||
fn = implicit_built_in_decls[BUILT_IN_MEMCMP];
|
||||
if (!fn)
|
||||
return 0;
|
||||
|
||||
|
@ -2750,7 +2919,7 @@ expand_builtin_strncat (arglist, target, mode)
|
|||
{
|
||||
tree newarglist
|
||||
= tree_cons (NULL_TREE, dst, build_tree_list (NULL_TREE, src));
|
||||
tree fn = built_in_decls[BUILT_IN_STRCAT];
|
||||
tree fn = implicit_built_in_decls[BUILT_IN_STRCAT];
|
||||
|
||||
/* If the replacement _DECL isn't initialized, don't do the
|
||||
transformation. */
|
||||
|
@ -2838,7 +3007,7 @@ expand_builtin_strcspn (arglist, target, mode)
|
|||
if (p2 && *p2 == '\0')
|
||||
{
|
||||
tree newarglist = build_tree_list (NULL_TREE, s1),
|
||||
fn = built_in_decls[BUILT_IN_STRLEN];
|
||||
fn = implicit_built_in_decls[BUILT_IN_STRLEN];
|
||||
|
||||
/* If the replacement _DECL isn't initialized, don't do the
|
||||
transformation. */
|
||||
|
@ -3445,10 +3614,10 @@ expand_builtin_fputs (arglist, ignore, unlocked)
|
|||
int unlocked;
|
||||
{
|
||||
tree len, fn;
|
||||
tree fn_fputc = unlocked ? built_in_decls[BUILT_IN_FPUTC_UNLOCKED]
|
||||
: built_in_decls[BUILT_IN_FPUTC];
|
||||
tree fn_fwrite = unlocked ? built_in_decls[BUILT_IN_FWRITE_UNLOCKED]
|
||||
: built_in_decls[BUILT_IN_FWRITE];
|
||||
tree fn_fputc = unlocked ? implicit_built_in_decls[BUILT_IN_FPUTC_UNLOCKED]
|
||||
: implicit_built_in_decls[BUILT_IN_FPUTC];
|
||||
tree fn_fwrite = unlocked ? implicit_built_in_decls[BUILT_IN_FWRITE_UNLOCKED]
|
||||
: implicit_built_in_decls[BUILT_IN_FWRITE];
|
||||
|
||||
/* If the return value is used, or the replacement _DECL isn't
|
||||
initialized, don't do the transformation. */
|
||||
|
|
|
@ -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, ATTRS)
|
||||
FALLBACK_P, NONANSI_P, ATTRS, IMPLICIT)
|
||||
|
||||
This macro will be called once for each builtin function. The
|
||||
ENUM will be of type `enum built_in_function', and will indicate
|
||||
|
@ -53,7 +53,13 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
|||
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. */
|
||||
describes the attributes of this builtin function.
|
||||
|
||||
IMPLICIT specifies condition when the builtin can be produced by
|
||||
compiler. For instance C90 reserves floorf function, but does not
|
||||
define it's meaning. When user uses floorf we may assume that the
|
||||
floorf has the meaning we expect, but we can't produce floorf by
|
||||
simplifing floor((double)float) since runtime don't need to implement it. */
|
||||
|
||||
/* A GCC builtin (like __builtin_saveregs) is provided by the
|
||||
compiler, but does not correspond to a function in the standard
|
||||
|
@ -61,7 +67,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
|||
#undef DEF_GCC_BUILTIN
|
||||
#define DEF_GCC_BUILTIN(ENUM, NAME, TYPE, ATTRS) \
|
||||
DEF_BUILTIN (ENUM, NAME, BUILT_IN_NORMAL, TYPE, BT_LAST, \
|
||||
false, false, false, ATTRS)
|
||||
false, false, false, ATTRS, true)
|
||||
|
||||
|
||||
/* A fallback builtin is a builtin (like __builtin_puts) that falls
|
||||
|
@ -71,7 +77,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
|||
#undef DEF_FALLBACK_BUILTIN
|
||||
#define DEF_FALLBACK_BUILTIN(ENUM, NAME, TYPE, ATTRS) \
|
||||
DEF_BUILTIN (ENUM, NAME, BUILT_IN_NORMAL, TYPE, TYPE, \
|
||||
false, true, false, ATTRS)
|
||||
false, true, false, ATTRS, true)
|
||||
|
||||
/* 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
|
||||
|
@ -80,7 +86,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, ATTR_NOTHROW_LIST)
|
||||
false, true, true, ATTR_NOTHROW_LIST, true)
|
||||
|
||||
/* A library builtin (like __builtin_strchr) is a builtin equivalent
|
||||
of an ANSI/ISO standard library function. In addition to the
|
||||
|
@ -91,14 +97,14 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
|||
#undef DEF_LIB_BUILTIN
|
||||
#define DEF_LIB_BUILTIN(ENUM, NAME, TYPE, ATTRS) \
|
||||
DEF_BUILTIN (ENUM, NAME, BUILT_IN_NORMAL, TYPE, TYPE, \
|
||||
true, true, false, ATTRS)
|
||||
true, true, false, ATTRS, true)
|
||||
|
||||
/* 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, ATTR_CONST_NOTHROW_LIST)
|
||||
true, false, true, ATTR_CONST_NOTHROW_LIST, true)
|
||||
|
||||
/* 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
|
||||
|
@ -107,21 +113,29 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
|||
#undef DEF_EXT_LIB_BUILTIN
|
||||
#define DEF_EXT_LIB_BUILTIN(ENUM, NAME, TYPE, ATTRS) \
|
||||
DEF_BUILTIN (ENUM, NAME, BUILT_IN_NORMAL, TYPE, TYPE, \
|
||||
true, true, true, ATTRS)
|
||||
true, true, true, ATTRS, false)
|
||||
|
||||
/* 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, ATTRS) \
|
||||
DEF_BUILTIN (ENUM, NAME, BUILT_IN_NORMAL, TYPE, TYPE, \
|
||||
true, true, !flag_isoc99, ATTRS)
|
||||
true, true, !flag_isoc99, ATTRS, TARGET_C99_FUNCTIONS)
|
||||
|
||||
/* Builtin that is specified by C99 and C90 reserve the name for future use.
|
||||
We can still recognize the builtin in C90 mode but we can't produce it
|
||||
implicitly. */
|
||||
#undef DEF_C99_C90RES_BUILTIN
|
||||
#define DEF_C99_C90RES_BUILTIN(ENUM, NAME, TYPE, ATTRS) \
|
||||
DEF_BUILTIN (ENUM, NAME, BUILT_IN_NORMAL, TYPE, TYPE, \
|
||||
true, true, !flag_isoc99, ATTRS, TARGET_C99_FUNCTIONS)
|
||||
|
||||
/* 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, ATTRS) \
|
||||
DEF_BUILTIN (ENUM, NAME, BUILT_IN_FRONTEND, TYPE, TYPE, \
|
||||
true, true, false, ATTRS)
|
||||
true, true, false, ATTRS, true)
|
||||
|
||||
/* 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
|
||||
|
@ -130,13 +144,13 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
|||
#undef DEF_EXT_FRONT_END_LIB_BUILTIN
|
||||
#define DEF_EXT_FRONT_END_LIB_BUILTIN(ENUM, NAME, TYPE, ATTRS) \
|
||||
DEF_BUILTIN (ENUM, NAME, BUILT_IN_FRONTEND, TYPE, TYPE, \
|
||||
true, true, true, ATTRS)
|
||||
true, true, true, ATTRS, true)
|
||||
|
||||
/* 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, ATTR_NOTHROW_LIST)
|
||||
BT_LAST, false, false, false, ATTR_NOTHROW_LIST, false)
|
||||
|
||||
/* If SMALL_STACK is defined, then `alloca' is only defined in its
|
||||
`__builtin' form. */
|
||||
|
@ -173,11 +187,11 @@ DEF_LIB_BUILTIN(BUILT_IN_FLOOR,
|
|||
"__builtin_floor",
|
||||
BT_FN_DOUBLE_DOUBLE,
|
||||
ATTR_CONST_NOTHROW_LIST)
|
||||
DEF_LIB_BUILTIN(BUILT_IN_FLOORF,
|
||||
DEF_C99_C90RES_BUILTIN(BUILT_IN_FLOORF,
|
||||
"__builtin_floorf",
|
||||
BT_FN_FLOAT_FLOAT,
|
||||
ATTR_CONST_NOTHROW_LIST)
|
||||
DEF_LIB_BUILTIN(BUILT_IN_FLOORL,
|
||||
DEF_C99_C90RES_BUILTIN(BUILT_IN_FLOORL,
|
||||
"__builtin_floorl",
|
||||
BT_FN_LONG_DOUBLE_LONG_DOUBLE,
|
||||
ATTR_CONST_NOTHROW_LIST)
|
||||
|
@ -186,11 +200,11 @@ DEF_LIB_BUILTIN(BUILT_IN_CEIL,
|
|||
"__builtin_ceil",
|
||||
BT_FN_DOUBLE_DOUBLE,
|
||||
ATTR_CONST_NOTHROW_LIST)
|
||||
DEF_LIB_BUILTIN(BUILT_IN_CEILF,
|
||||
DEF_C99_C90RES_BUILTIN(BUILT_IN_CEILF,
|
||||
"__builtin_ceilf",
|
||||
BT_FN_FLOAT_FLOAT,
|
||||
ATTR_CONST_NOTHROW_LIST)
|
||||
DEF_LIB_BUILTIN(BUILT_IN_CEILL,
|
||||
DEF_C99_C90RES_BUILTIN(BUILT_IN_CEILL,
|
||||
"__builtin_ceill",
|
||||
BT_FN_LONG_DOUBLE_LONG_DOUBLE,
|
||||
ATTR_CONST_NOTHROW_LIST)
|
||||
|
@ -295,14 +309,14 @@ DEF_BUILTIN (BUILT_IN_BZERO,
|
|||
BT_FN_VOID_PTR_SIZE,
|
||||
BT_FN_VOID_VAR,
|
||||
true, true, true,
|
||||
ATTR_NOTHROW_LIST)
|
||||
ATTR_NOTHROW_LIST, false)
|
||||
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,
|
||||
ATTR_PURE_NOTHROW_LIST)
|
||||
ATTR_PURE_NOTHROW_LIST, false)
|
||||
|
||||
DEF_EXT_LIB_BUILTIN(BUILT_IN_FFS,
|
||||
"__builtin_ffs",
|
||||
|
@ -414,62 +428,62 @@ DEF_LIB_BUILTIN(BUILT_IN_LOG,
|
|||
: (flag_unsafe_math_optimizations
|
||||
? ATTR_CONST_NOTHROW_LIST
|
||||
: ATTR_PURE_NOTHROW_LIST))
|
||||
DEF_LIB_BUILTIN(BUILT_IN_SQRTF,
|
||||
DEF_C99_C90RES_BUILTIN(BUILT_IN_SQRTF,
|
||||
"__builtin_sqrtf",
|
||||
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,
|
||||
DEF_C99_C90RES_BUILTIN(BUILT_IN_SINF,
|
||||
"__builtin_sinf",
|
||||
BT_FN_FLOAT_FLOAT,
|
||||
flag_unsafe_math_optimizations ? ATTR_CONST_NOTHROW_LIST
|
||||
: ATTR_PURE_NOTHROW_LIST)
|
||||
DEF_LIB_BUILTIN(BUILT_IN_COSF,
|
||||
DEF_C99_C90RES_BUILTIN(BUILT_IN_COSF,
|
||||
"__builtin_cosf",
|
||||
BT_FN_FLOAT_FLOAT,
|
||||
flag_unsafe_math_optimizations ? ATTR_CONST_NOTHROW_LIST
|
||||
: ATTR_PURE_NOTHROW_LIST)
|
||||
DEF_LIB_BUILTIN(BUILT_IN_EXPF,
|
||||
DEF_C99_C90RES_BUILTIN(BUILT_IN_EXPF,
|
||||
"__builtin_expf",
|
||||
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_LOGF,
|
||||
DEF_C99_C90RES_BUILTIN(BUILT_IN_LOGF,
|
||||
"__builtin_logf",
|
||||
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_SQRTL,
|
||||
DEF_C99_C90RES_BUILTIN(BUILT_IN_SQRTL,
|
||||
"__builtin_sqrtl",
|
||||
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,
|
||||
DEF_C99_C90RES_BUILTIN(BUILT_IN_SINL,
|
||||
"__builtin_sinl",
|
||||
BT_FN_LONG_DOUBLE_LONG_DOUBLE,
|
||||
flag_unsafe_math_optimizations ? ATTR_CONST_NOTHROW_LIST
|
||||
: ATTR_PURE_NOTHROW_LIST)
|
||||
DEF_LIB_BUILTIN(BUILT_IN_COSL,
|
||||
DEF_C99_C90RES_BUILTIN(BUILT_IN_COSL,
|
||||
"__builtin_cosl",
|
||||
BT_FN_LONG_DOUBLE_LONG_DOUBLE,
|
||||
flag_unsafe_math_optimizations ? ATTR_CONST_NOTHROW_LIST
|
||||
: ATTR_PURE_NOTHROW_LIST)
|
||||
DEF_LIB_BUILTIN(BUILT_IN_EXPL,
|
||||
DEF_C99_C90RES_BUILTIN(BUILT_IN_EXPL,
|
||||
"__builtin_expl",
|
||||
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_LOGL,
|
||||
DEF_C99_C90RES_BUILTIN(BUILT_IN_LOGL,
|
||||
"__builtin_logl",
|
||||
BT_FN_LONG_DOUBLE_LONG_DOUBLE,
|
||||
flag_errno_math ? ATTR_NOTHROW_LIST
|
||||
|
@ -616,7 +630,7 @@ DEF_BUILTIN (BUILT_IN_FPUTS,
|
|||
BUILT_IN_NORMAL,
|
||||
BT_FN_INT_CONST_STRING_PTR,
|
||||
BT_FN_INT_VAR,
|
||||
true, true, false, ATTR_NOTHROW_LIST)
|
||||
true, true, false, ATTR_NOTHROW_LIST, true)
|
||||
DEF_FALLBACK_BUILTIN(BUILT_IN_FWRITE,
|
||||
"__builtin_fwrite",
|
||||
BT_FN_SIZE_CONST_PTR_SIZE_SIZE_PTR,
|
||||
|
@ -650,7 +664,7 @@ DEF_BUILTIN (BUILT_IN_FPUTS_UNLOCKED,
|
|||
BUILT_IN_NORMAL,
|
||||
BT_FN_INT_CONST_STRING_PTR,
|
||||
BT_FN_INT_VAR,
|
||||
true, true, true, ATTR_NOTHROW_LIST)
|
||||
true, true, true, ATTR_NOTHROW_LIST, true)
|
||||
DEF_EXT_FALLBACK_BUILTIN(BUILT_IN_FWRITE_UNLOCKED,
|
||||
"__builtin_fwrite_unlocked",
|
||||
BT_FN_SIZE_CONST_PTR_SIZE_SIZE_PTR)
|
||||
|
@ -755,7 +769,7 @@ DEF_BUILTIN (BUILT_IN_ABORT,
|
|||
BT_FN_VOID,
|
||||
BT_FN_VOID,
|
||||
1, 0, 0,
|
||||
ATTR_NORETURN_NOTHROW_LIST)
|
||||
ATTR_NORETURN_NOTHROW_LIST, true)
|
||||
|
||||
DEF_BUILTIN (BUILT_IN_EXIT,
|
||||
"__builtin_exit",
|
||||
|
@ -763,7 +777,7 @@ DEF_BUILTIN (BUILT_IN_EXIT,
|
|||
BT_FN_VOID_INT,
|
||||
BT_FN_VOID_INT,
|
||||
1, 0, 0,
|
||||
ATTR_NORETURN_NOTHROW_LIST)
|
||||
ATTR_NORETURN_NOTHROW_LIST, true)
|
||||
|
||||
DEF_BUILTIN (BUILT_IN__EXIT,
|
||||
"__builtin__exit",
|
||||
|
@ -771,7 +785,7 @@ DEF_BUILTIN (BUILT_IN__EXIT,
|
|||
BT_FN_VOID_INT,
|
||||
BT_FN_VOID_INT,
|
||||
1, 0, 1,
|
||||
ATTR_NORETURN_NOTHROW_LIST)
|
||||
ATTR_NORETURN_NOTHROW_LIST, false)
|
||||
|
||||
DEF_BUILTIN (BUILT_IN__EXIT2,
|
||||
"__builtin__Exit",
|
||||
|
@ -779,5 +793,5 @@ DEF_BUILTIN (BUILT_IN__EXIT2,
|
|||
BT_FN_VOID_INT,
|
||||
BT_FN_VOID_INT,
|
||||
1, 0, !flag_isoc99,
|
||||
ATTR_NORETURN_NOTHROW_LIST)
|
||||
ATTR_NORETURN_NOTHROW_LIST, false)
|
||||
|
||||
|
|
|
@ -3549,7 +3549,7 @@ c_common_nodes_and_builtins ()
|
|||
c_init_attributes ();
|
||||
|
||||
#define DEF_BUILTIN(ENUM, NAME, CLASS, TYPE, LIBTYPE, \
|
||||
BOTH_P, FALLBACK_P, NONANSI_P, ATTRS) \
|
||||
BOTH_P, FALLBACK_P, NONANSI_P, ATTRS, IMPLICIT) \
|
||||
if (NAME) \
|
||||
{ \
|
||||
tree decl; \
|
||||
|
@ -3576,6 +3576,8 @@ c_common_nodes_and_builtins ()
|
|||
built_in_attributes[(int) ATTRS]); \
|
||||
\
|
||||
built_in_decls[(int) ENUM] = decl; \
|
||||
if (IMPLICIT) \
|
||||
implicit_built_in_decls[(int) ENUM] = decl; \
|
||||
}
|
||||
#include "builtins.def"
|
||||
#undef DEF_BUILTIN
|
||||
|
@ -4507,9 +4509,9 @@ c_expand_builtin_printf (arglist, target, tmode, modifier, ignore, unlocked)
|
|||
int unlocked;
|
||||
{
|
||||
tree fn_putchar = unlocked ?
|
||||
built_in_decls[BUILT_IN_PUTCHAR_UNLOCKED] : built_in_decls[BUILT_IN_PUTCHAR];
|
||||
implicit_built_in_decls[BUILT_IN_PUTCHAR_UNLOCKED] : implicit_built_in_decls[BUILT_IN_PUTCHAR];
|
||||
tree fn_puts = unlocked ?
|
||||
built_in_decls[BUILT_IN_PUTS_UNLOCKED] : built_in_decls[BUILT_IN_PUTS];
|
||||
implicit_built_in_decls[BUILT_IN_PUTS_UNLOCKED] : implicit_built_in_decls[BUILT_IN_PUTS];
|
||||
tree fn, format_arg, stripped_string;
|
||||
|
||||
/* If the return value is used, or the replacement _DECL isn't
|
||||
|
@ -4611,9 +4613,9 @@ c_expand_builtin_fprintf (arglist, target, tmode, modifier, ignore, unlocked)
|
|||
int unlocked;
|
||||
{
|
||||
tree fn_fputc = unlocked ?
|
||||
built_in_decls[BUILT_IN_FPUTC_UNLOCKED] : built_in_decls[BUILT_IN_FPUTC];
|
||||
implicit_built_in_decls[BUILT_IN_FPUTC_UNLOCKED] : implicit_built_in_decls[BUILT_IN_FPUTC];
|
||||
tree fn_fputs = unlocked ?
|
||||
built_in_decls[BUILT_IN_FPUTS_UNLOCKED] : built_in_decls[BUILT_IN_FPUTS];
|
||||
implicit_built_in_decls[BUILT_IN_FPUTS_UNLOCKED] : implicit_built_in_decls[BUILT_IN_FPUTS];
|
||||
tree fn, format_arg, stripped_string;
|
||||
|
||||
/* If the return value is used, or the replacement _DECL isn't
|
||||
|
|
|
@ -110,3 +110,10 @@ Boston, MA 02111-1307, USA. */
|
|||
|
||||
/* Define this so we can compile MS code for use with WINE. */
|
||||
#define HANDLE_PRAGMA_PACK_PUSH_POP
|
||||
|
||||
|
||||
/* Determine whether the the entire c99 runtime
|
||||
is present in the runtime library. */
|
||||
#ifndef USE_GNULIBC_1
|
||||
#define TARGET_C99_FUNCTIONS 1
|
||||
#endif
|
||||
|
|
|
@ -638,4 +638,10 @@ You Lose! You must define PREFERRED_DEBUGGING_TYPE!
|
|||
#define EXTRA_CONSTRAINT_STR(OP, C,STR) EXTRA_CONSTRAINT (OP, C)
|
||||
#endif
|
||||
|
||||
/* Determine whether the the entire c99 runtime
|
||||
is present in the runtime library. */
|
||||
#ifndef TARGET_C99_FUNCTIONS
|
||||
#define TARGET_C99_FUNCTIONS 0
|
||||
#endif
|
||||
|
||||
#endif /* ! GCC_DEFAULTS_H */
|
||||
|
|
|
@ -4779,6 +4779,15 @@ Define this macro if GCC should generate calls to the ISO C
|
|||
(and System V) library functions @code{memcpy}, @code{memmove} and
|
||||
@code{memset} rather than the BSD functions @code{bcopy} and @code{bzero}.
|
||||
|
||||
@findex TARGET_C99_FUNCTIONS
|
||||
@cindex C99 math functions, implicit usage
|
||||
@item TARGET_C99_FUNCTIONS
|
||||
When this macro is nonzero, GCC will implicitly optimize @code{sin} calls into
|
||||
@code{sinf} and similary for other functions defined by C99 standard. The
|
||||
default is nonzero that should be proper value for most modern systems, however
|
||||
number of existing systems lacks support for these functions in the runtime so
|
||||
they needs this macro to be redefined to 0.
|
||||
|
||||
@findex LIBGCC_NEEDS_DOUBLE
|
||||
@item LIBGCC_NEEDS_DOUBLE
|
||||
Define this macro if @code{float} arguments cannot be passed to library
|
||||
|
|
|
@ -70,7 +70,7 @@ static tree sqrt_builtin (tree, tree);
|
|||
|
||||
static tree java_build_function_call_expr (tree, tree);
|
||||
static void define_builtin (enum built_in_function, const char *,
|
||||
enum built_in_class, tree, int);
|
||||
enum built_in_class, tree, int, int);
|
||||
static tree define_builtin_type (int, int, int, int, int);
|
||||
|
||||
|
||||
|
@ -189,7 +189,8 @@ define_builtin (enum built_in_function val,
|
|||
const char *name,
|
||||
enum built_in_class class,
|
||||
tree type,
|
||||
int fallback_p)
|
||||
int fallback_p,
|
||||
int implicit)
|
||||
{
|
||||
tree decl;
|
||||
|
||||
|
@ -209,6 +210,8 @@ define_builtin (enum built_in_function val,
|
|||
DECL_BUILT_IN_CLASS (decl) = class;
|
||||
DECL_FUNCTION_CODE (decl) = val;
|
||||
built_in_decls[val] = decl;
|
||||
if (implicit)
|
||||
implicit_built_in_decls[val] = decl;
|
||||
}
|
||||
|
||||
/* Compute the type for a builtin. */
|
||||
|
@ -306,8 +309,8 @@ initialize_builtins (void)
|
|||
#include "builtin-types.def"
|
||||
|
||||
#define DEF_BUILTIN(ENUM, NAME, CLASS, TYPE, LIBTYPE, BOTH_P, \
|
||||
FALLBACK_P, NONANSI_P, ATTRS) \
|
||||
define_builtin (ENUM, NAME, CLASS, builtin_types[TYPE], FALLBACK_P);
|
||||
FALLBACK_P, NONANSI_P, ATTRS, IMPLICIT) \
|
||||
define_builtin (ENUM, NAME, CLASS, builtin_types[TYPE], FALLBACK_P, IMPLICIT);
|
||||
#include "builtins.def"
|
||||
}
|
||||
|
||||
|
|
|
@ -84,7 +84,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, AT) ENUM,
|
||||
#define DEF_BUILTIN(ENUM, N, C, T, LT, B, F, NA, AT, IM) ENUM,
|
||||
enum built_in_function
|
||||
{
|
||||
#include "builtins.def"
|
||||
|
@ -99,6 +99,7 @@ extern const char *const built_in_names[(int) END_BUILTINS];
|
|||
|
||||
/* An array of _DECL trees for the above. */
|
||||
extern GTY(()) tree built_in_decls[(int) END_BUILTINS];
|
||||
extern GTY(()) tree implicit_built_in_decls[(int) END_BUILTINS];
|
||||
|
||||
/* The definition of tree nodes fills the next several pages. */
|
||||
|
||||
|
@ -2928,6 +2929,8 @@ extern tree invert_truthvalue PARAMS ((tree));
|
|||
extern tree fold_builtin PARAMS ((tree));
|
||||
extern enum built_in_function builtin_mathfn_code PARAMS ((tree));
|
||||
extern tree build_function_call_expr PARAMS ((tree, tree));
|
||||
extern tree mathfn_built_in PARAMS ((tree, enum built_in_function fn));
|
||||
extern tree strip_float_extensions PARAMS ((tree));
|
||||
|
||||
/* In convert.c */
|
||||
extern tree strip_float_extensions PARAMS ((tree));
|
||||
|
|
Loading…
Reference in New Issue