This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[3.4-bib] Updated patch for FP conversions part 2
- From: Jan Hubicka <jh at suse dot cz>
- To: gcc-patches at gcc dot gnu dot org, rth at cygnus dot com
- Date: Sat, 9 Nov 2002 21:07:33 +0100
- Subject: [3.4-bib] Updated patch for FP conversions part 2
Hi,
this patch adds some infrastructure for implicitly producing builtins
that may fallback into library function that may not be present in
runtime for pre-c99 systems.
I've added new flag to DEF_BUILTIN to specify when the library call must
exist and created implicit_built_in_decls that contain eighter the
declaration or NULL when it is not possible to produce it. I hope this
gives frontend enought control on what to do.
I've also implemented floor/round/trunc/ceil/nearbyint folding to test
the framework and added testcase.
OK for BIB branch?
/* Will trigger link error when the builtins are not properly simplified. */
/* { dg-options "-O2 -std=c99" } */
double floor (double);
double ceil (double);
double trunc (double);
double round (double);
float a;
double
t()
{
float x = floor(a);
x += ceil(a);
x += trunc(a);
x += round(a);
return x;
}
float floorf (float x)
{
return 1;
}
float ceilf (float x)
{
return 1;
}
float truncf (float x)
{
return 1;
}
float roundf (float x)
{
return 1;
}
Sat Nov 9 20:53:56 CET 2002 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.
Index: builtins.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/builtins.c,v
retrieving revision 1.159.4.5
diff -c -3 -p -r1.159.4.5 builtins.c
*** builtins.c 8 Nov 2002 12:02:44 -0000 1.159.4.5
--- builtins.c 9 Nov 2002 19:51:08 -0000
*************** Software Foundation, 59 Temple Place - S
*** 62,68 ****
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),
const char *const built_in_names[(int) END_BUILTINS] =
{
#include "builtins.def"
--- 62,68 ----
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, IM) STRINGX(X),
const char *const built_in_names[(int) END_BUILTINS] =
{
#include "builtins.def"
*************** const char *const built_in_names[(int) E
*** 72,77 ****
--- 72,81 ----
/* 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));
*************** static tree fold_builtin_classify_type P
*** 151,156 ****
--- 155,161 ----
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.
*************** expand_builtin_constant_p (exp)
*** 1467,1472 ****
--- 1472,1641 ----
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
*************** expand_builtin_strstr (arglist, target,
*** 1754,1760 ****
if (p2[1] != '\0')
return 0;
! fn = built_in_decls[BUILT_IN_STRCHR];
if (!fn)
return 0;
--- 1923,1929 ----
if (p2[1] != '\0')
return 0;
! fn = implicit_built_in_decls[BUILT_IN_STRCHR];
if (!fn)
return 0;
*************** expand_builtin_strrchr (arglist, target,
*** 1858,1864 ****
if (! integer_zerop (s2))
return 0;
! fn = built_in_decls[BUILT_IN_STRCHR];
if (!fn)
return 0;
--- 2027,2033 ----
if (! integer_zerop (s2))
return 0;
! fn = implicit_built_in_decls[BUILT_IN_STRCHR];
if (!fn)
return 0;
*************** expand_builtin_strpbrk (arglist, target,
*** 1916,1922 ****
if (p2[1] != '\0')
return 0; /* Really call strpbrk. */
! fn = built_in_decls[BUILT_IN_STRCHR];
if (!fn)
return 0;
--- 2085,2091 ----
if (p2[1] != '\0')
return 0; /* Really call strpbrk. */
! fn = implicit_built_in_decls[BUILT_IN_STRCHR];
if (!fn)
return 0;
*************** expand_builtin_strcpy (exp, target, mode
*** 2055,2061 ****
if (!validate_arglist (arglist, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
return 0;
! fn = built_in_decls[BUILT_IN_MEMCPY];
if (!fn)
return 0;
--- 2224,2230 ----
if (!validate_arglist (arglist, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
return 0;
! fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
if (!fn)
return 0;
*************** expand_builtin_strncpy (arglist, target,
*** 2157,2163 ****
}
/* OK transform into builtin memcpy. */
! fn = built_in_decls[BUILT_IN_MEMCPY];
if (!fn)
return 0;
return expand_expr (build_function_call_expr (fn, arglist),
--- 2326,2332 ----
}
/* OK transform into builtin memcpy. */
! fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
if (!fn)
return 0;
return expand_expr (build_function_call_expr (fn, arglist),
*************** expand_builtin_strcmp (exp, target, mode
*** 2573,2579 ****
if (TREE_SIDE_EFFECTS (len))
return 0;
! fn = built_in_decls[BUILT_IN_MEMCMP];
if (!fn)
return 0;
--- 2742,2748 ----
if (TREE_SIDE_EFFECTS (len))
return 0;
! fn = implicit_built_in_decls[BUILT_IN_MEMCMP];
if (!fn)
return 0;
*************** expand_builtin_strncmp (exp, target, mod
*** 2667,2673 ****
if (!len)
return 0;
! fn = built_in_decls[BUILT_IN_MEMCMP];
if (!fn)
return 0;
--- 2836,2842 ----
if (!len)
return 0;
! fn = implicit_built_in_decls[BUILT_IN_MEMCMP];
if (!fn)
return 0;
*************** expand_builtin_strncat (arglist, target,
*** 2748,2754 ****
{
tree newarglist
= tree_cons (NULL_TREE, dst, build_tree_list (NULL_TREE, src));
! tree fn = built_in_decls[BUILT_IN_STRCAT];
/* If the replacement _DECL isn't initialized, don't do the
transformation. */
--- 2917,2923 ----
{
tree newarglist
= tree_cons (NULL_TREE, dst, build_tree_list (NULL_TREE, src));
! tree fn = implicit_built_in_decls[BUILT_IN_STRCAT];
/* If the replacement _DECL isn't initialized, don't do the
transformation. */
*************** expand_builtin_strcspn (arglist, target,
*** 2836,2842 ****
if (p2 && *p2 == '\0')
{
tree newarglist = build_tree_list (NULL_TREE, s1),
! fn = built_in_decls[BUILT_IN_STRLEN];
/* If the replacement _DECL isn't initialized, don't do the
transformation. */
--- 3005,3011 ----
if (p2 && *p2 == '\0')
{
tree newarglist = build_tree_list (NULL_TREE, s1),
! fn = implicit_built_in_decls[BUILT_IN_STRLEN];
/* If the replacement _DECL isn't initialized, don't do the
transformation. */
*************** expand_builtin_fputs (arglist, ignore, u
*** 3443,3452 ****
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];
/* If the return value is used, or the replacement _DECL isn't
initialized, don't do the transformation. */
--- 3612,3621 ----
int unlocked;
{
tree len, fn;
! 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. */
*************** fold_builtin_nan (arglist, type, quiet)
*** 4252,4257 ****
--- 4421,4452 ----
return build_real (type, real);
}
+ static tree
+ fold_trunc_transparent_mathfn (exp)
+ tree exp;
+ {
+ tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
+ tree arglist = TREE_OPERAND (exp, 1);
+ enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
+
+ if (optimize && validate_arglist (arglist, REAL_TYPE, VOID_TYPE))
+ {
+ tree arg0 = strip_float_extensions (TREE_VALUE (arglist));
+ tree ftype = TREE_TYPE (exp);
+ tree newtype = TREE_TYPE (arg0);
+ tree decl;
+
+ if (TYPE_PRECISION (newtype) < TYPE_PRECISION (ftype)
+ && (decl = mathfn_built_in (newtype, fcode)))
+ {
+ arglist =
+ build_tree_list (NULL_TREE, fold (convert (newtype, arg0)));
+ return convert (ftype,
+ build_function_call_expr (decl, arglist));
+ }
+ }
+ return 0;
+ }
/* Used by constant folding to eliminate some builtin calls early. EXP is
the CALL_EXPR of a call to a builtin function. */
*************** fold_builtin (exp)
*** 4405,4410 ****
--- 4600,4622 ----
case BUILT_IN_NANSF:
case BUILT_IN_NANSL:
return fold_builtin_nan (arglist, TREE_TYPE (TREE_TYPE (fndecl)), false);
+
+ case BUILT_IN_FLOOR:
+ case BUILT_IN_FLOORF:
+ case BUILT_IN_FLOORL:
+ case BUILT_IN_CEIL:
+ case BUILT_IN_CEILF:
+ case BUILT_IN_CEILL:
+ case BUILT_IN_TRUNC:
+ case BUILT_IN_TRUNCF:
+ case BUILT_IN_TRUNCL:
+ case BUILT_IN_ROUND:
+ case BUILT_IN_ROUNDF:
+ case BUILT_IN_ROUNDL:
+ case BUILT_IN_NEARBYINT:
+ case BUILT_IN_NEARBYINTF:
+ case BUILT_IN_NEARBYINTL:
+ return fold_trunc_transparent_mathfn (exp);
default:
break;
Index: builtins.def
===================================================================
RCS file: /cvs/gcc/egcs/gcc/builtins.def,v
retrieving revision 1.34.4.4
diff -c -3 -p -r1.34.4.4 builtins.def
*** builtins.def 8 Nov 2002 12:02:44 -0000 1.34.4.4
--- builtins.def 9 Nov 2002 19:51:08 -0000
*************** Software Foundation, 59 Temple Place - S
*** 22,28 ****
/* Before including this file, you should define a macro:
DEF_BUILTIN (ENUM, NAME, CLASS, TYPE, LIBTYPE, BOTH_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
--- 22,28 ----
/* Before including this file, you should define a macro:
DEF_BUILTIN (ENUM, NAME, CLASS, TYPE, LIBTYPE, BOTH_P,
! 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
*************** Software Foundation, 59 Temple Place - S
*** 53,59 ****
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
--- 53,65 ----
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.
!
! 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
*************** Software Foundation, 59 Temple Place - S
*** 61,67 ****
#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)
/* A fallback builtin is a builtin (like __builtin_puts) that falls
--- 67,73 ----
#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, true)
/* A fallback builtin is a builtin (like __builtin_puts) that falls
*************** Software Foundation, 59 Temple Place - S
*** 71,77 ****
#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)
/* 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,83 ----
#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, 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
*************** Software Foundation, 59 Temple Place - S
*** 80,86 ****
#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)
/* A library builtin (like __builtin_strchr) is a builtin equivalent
of an ANSI/ISO standard library function. In addition to the
--- 86,92 ----
#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, true)
/* A library builtin (like __builtin_strchr) is a builtin equivalent
of an ANSI/ISO standard library function. In addition to the
*************** Software Foundation, 59 Temple Place - S
*** 91,104 ****
#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)
/* 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)
/* 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
--- 97,110 ----
#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)
/* 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)
/* 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
*************** Software Foundation, 59 Temple Place - S
*** 107,127 ****
#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)
/* 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, !flag_isoc99, true, ATTRS)
/* 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)
/* 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
--- 113,142 ----
#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, 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, \
! flag_isoc99, true, !flag_isoc99, ATTRS, flag_isoc99)
!
! /* 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, false, ATTRS, flag_isoc99)
!
/* 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)
/* 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
*************** Software Foundation, 59 Temple Place - S
*** 130,142 ****
#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)
/* 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)
/* If SMALL_STACK is defined, then `alloca' is only defined in its
`__builtin' form. */
--- 145,157 ----
#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)
/* 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, false)
/* If SMALL_STACK is defined, then `alloca' is only defined in its
`__builtin' form. */
*************** DEF_LIB_BUILTIN(BUILT_IN_FLOOR,
*** 173,199 ****
"__builtin_floor",
BT_FN_DOUBLE_DOUBLE,
ATTR_CONST_NOTHROW_LIST)
! DEF_LIB_BUILTIN(BUILT_IN_FLOORF,
! "__builtin_floorf",
! BT_FN_FLOAT_FLOAT,
! ATTR_CONST_NOTHROW_LIST)
! DEF_LIB_BUILTIN(BUILT_IN_FLOORL,
! "__builtin_floorl",
! BT_FN_LONG_DOUBLE_LONG_DOUBLE,
! ATTR_CONST_NOTHROW_LIST)
DEF_LIB_BUILTIN(BUILT_IN_CEIL,
"__builtin_ceil",
BT_FN_DOUBLE_DOUBLE,
ATTR_CONST_NOTHROW_LIST)
! DEF_LIB_BUILTIN(BUILT_IN_CEILF,
! "__builtin_ceilf",
! BT_FN_FLOAT_FLOAT,
! ATTR_CONST_NOTHROW_LIST)
! DEF_LIB_BUILTIN(BUILT_IN_CEILL,
! "__builtin_ceill",
! BT_FN_LONG_DOUBLE_LONG_DOUBLE,
! ATTR_CONST_NOTHROW_LIST)
DEF_C99_BUILTIN(BUILT_IN_ROUND,
"__builtin_round",
--- 188,214 ----
"__builtin_floor",
BT_FN_DOUBLE_DOUBLE,
ATTR_CONST_NOTHROW_LIST)
! DEF_C99_C90RES_BUILTIN(BUILT_IN_FLOORF,
! "__builtin_floorf",
! BT_FN_FLOAT_FLOAT,
! ATTR_CONST_NOTHROW_LIST)
! DEF_C99_C90RES_BUILTIN(BUILT_IN_FLOORL,
! "__builtin_floorl",
! BT_FN_LONG_DOUBLE_LONG_DOUBLE,
! ATTR_CONST_NOTHROW_LIST)
DEF_LIB_BUILTIN(BUILT_IN_CEIL,
"__builtin_ceil",
BT_FN_DOUBLE_DOUBLE,
ATTR_CONST_NOTHROW_LIST)
! DEF_C99_C90RES_BUILTIN(BUILT_IN_CEILF,
! "__builtin_ceilf",
! BT_FN_FLOAT_FLOAT,
! ATTR_CONST_NOTHROW_LIST)
! DEF_C99_C90RES_BUILTIN(BUILT_IN_CEILL,
! "__builtin_ceill",
! BT_FN_LONG_DOUBLE_LONG_DOUBLE,
! ATTR_CONST_NOTHROW_LIST)
DEF_C99_BUILTIN(BUILT_IN_ROUND,
"__builtin_round",
*************** DEF_BUILTIN (BUILT_IN_BZERO,
*** 295,308 ****
BT_FN_VOID_PTR_SIZE,
BT_FN_VOID_VAR,
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,
! ATTR_PURE_NOTHROW_LIST)
DEF_EXT_LIB_BUILTIN(BUILT_IN_FFS,
"__builtin_ffs",
--- 310,323 ----
BT_FN_VOID_PTR_SIZE,
BT_FN_VOID_VAR,
true, true, true,
! 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, false)
DEF_EXT_LIB_BUILTIN(BUILT_IN_FFS,
"__builtin_ffs",
*************** DEF_LIB_BUILTIN(BUILT_IN_LOG,
*** 414,481 ****
: (flag_unsafe_math_optimizations
? ATTR_CONST_NOTHROW_LIST
: ATTR_PURE_NOTHROW_LIST))
! DEF_LIB_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,
! "__builtin_sinf",
! 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,
! flag_unsafe_math_optimizations ? ATTR_CONST_NOTHROW_LIST
! : ATTR_PURE_NOTHROW_LIST)
! DEF_LIB_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,
! "__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,
! "__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,
! "__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,
! "__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,
! "__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,
! "__builtin_logl",
! 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_GCC_BUILTIN(BUILT_IN_INF,
"__builtin_inf",
--- 429,496 ----
: (flag_unsafe_math_optimizations
? ATTR_CONST_NOTHROW_LIST
: ATTR_PURE_NOTHROW_LIST))
! 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_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_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_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_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_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_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_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_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_C99_C90RES_BUILTIN(BUILT_IN_LOGL,
! "__builtin_logl",
! 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_GCC_BUILTIN(BUILT_IN_INF,
"__builtin_inf",
*************** DEF_BUILTIN (BUILT_IN_FPUTS,
*** 616,622 ****
BUILT_IN_NORMAL,
BT_FN_INT_CONST_STRING_PTR,
BT_FN_INT_VAR,
! true, true, false, ATTR_NOTHROW_LIST)
DEF_FALLBACK_BUILTIN(BUILT_IN_FWRITE,
"__builtin_fwrite",
BT_FN_SIZE_CONST_PTR_SIZE_SIZE_PTR,
--- 631,637 ----
BUILT_IN_NORMAL,
BT_FN_INT_CONST_STRING_PTR,
BT_FN_INT_VAR,
! true, true, false, ATTR_NOTHROW_LIST, true)
DEF_FALLBACK_BUILTIN(BUILT_IN_FWRITE,
"__builtin_fwrite",
BT_FN_SIZE_CONST_PTR_SIZE_SIZE_PTR,
*************** DEF_BUILTIN (BUILT_IN_FPUTS_UNLOCKED,
*** 650,656 ****
BUILT_IN_NORMAL,
BT_FN_INT_CONST_STRING_PTR,
BT_FN_INT_VAR,
! 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)
--- 665,671 ----
BUILT_IN_NORMAL,
BT_FN_INT_CONST_STRING_PTR,
BT_FN_INT_VAR,
! 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)
*************** DEF_BUILTIN (BUILT_IN_ABORT,
*** 755,761 ****
BT_FN_VOID,
BT_FN_VOID,
1, 0, 0,
! ATTR_NORETURN_NOTHROW_LIST)
DEF_BUILTIN (BUILT_IN_EXIT,
"__builtin_exit",
--- 770,776 ----
BT_FN_VOID,
BT_FN_VOID,
1, 0, 0,
! ATTR_NORETURN_NOTHROW_LIST, true)
DEF_BUILTIN (BUILT_IN_EXIT,
"__builtin_exit",
*************** DEF_BUILTIN (BUILT_IN_EXIT,
*** 763,769 ****
BT_FN_VOID_INT,
BT_FN_VOID_INT,
1, 0, 0,
! ATTR_NORETURN_NOTHROW_LIST)
DEF_BUILTIN (BUILT_IN__EXIT,
"__builtin__exit",
--- 778,784 ----
BT_FN_VOID_INT,
BT_FN_VOID_INT,
1, 0, 0,
! ATTR_NORETURN_NOTHROW_LIST, true)
DEF_BUILTIN (BUILT_IN__EXIT,
"__builtin__exit",
*************** DEF_BUILTIN (BUILT_IN__EXIT,
*** 771,777 ****
BT_FN_VOID_INT,
BT_FN_VOID_INT,
1, 0, 1,
! ATTR_NORETURN_NOTHROW_LIST)
DEF_BUILTIN (BUILT_IN__EXIT2,
"__builtin__Exit",
--- 786,792 ----
BT_FN_VOID_INT,
BT_FN_VOID_INT,
1, 0, 1,
! ATTR_NORETURN_NOTHROW_LIST, false)
DEF_BUILTIN (BUILT_IN__EXIT2,
"__builtin__Exit",
*************** DEF_BUILTIN (BUILT_IN__EXIT2,
*** 779,783 ****
BT_FN_VOID_INT,
BT_FN_VOID_INT,
1, 0, !flag_isoc99,
! ATTR_NORETURN_NOTHROW_LIST)
--- 794,798 ----
BT_FN_VOID_INT,
BT_FN_VOID_INT,
1, 0, !flag_isoc99,
! ATTR_NORETURN_NOTHROW_LIST, false)
Index: c-common.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/c-common.c,v
retrieving revision 1.366.4.7
diff -c -3 -p -r1.366.4.7 c-common.c
*** c-common.c 5 Nov 2002 19:11:51 -0000 1.366.4.7
--- c-common.c 9 Nov 2002 19:51:11 -0000
*************** c_common_nodes_and_builtins ()
*** 3532,3538 ****
c_init_attributes ();
#define DEF_BUILTIN(ENUM, NAME, CLASS, TYPE, LIBTYPE, \
! BOTH_P, FALLBACK_P, NONANSI_P, ATTRS) \
if (NAME) \
{ \
tree decl; \
--- 3532,3538 ----
c_init_attributes ();
#define DEF_BUILTIN(ENUM, NAME, CLASS, TYPE, LIBTYPE, \
! BOTH_P, FALLBACK_P, NONANSI_P, ATTRS, IMPLICIT) \
if (NAME) \
{ \
tree decl; \
*************** c_common_nodes_and_builtins ()
*** 3559,3564 ****
--- 3559,3566 ----
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
*************** c_expand_builtin_printf (arglist, target
*** 4490,4498 ****
int unlocked;
{
tree fn_putchar = unlocked ?
! built_in_decls[BUILT_IN_PUTCHAR_UNLOCKED] : built_in_decls[BUILT_IN_PUTCHAR];
tree fn_puts = unlocked ?
! built_in_decls[BUILT_IN_PUTS_UNLOCKED] : built_in_decls[BUILT_IN_PUTS];
tree fn, format_arg, stripped_string;
/* If the return value is used, or the replacement _DECL isn't
--- 4492,4500 ----
int unlocked;
{
tree fn_putchar = unlocked ?
! implicit_built_in_decls[BUILT_IN_PUTCHAR_UNLOCKED] : implicit_built_in_decls[BUILT_IN_PUTCHAR];
tree fn_puts = unlocked ?
! 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
*************** c_expand_builtin_fprintf (arglist, targe
*** 4594,4602 ****
int unlocked;
{
tree fn_fputc = unlocked ?
! built_in_decls[BUILT_IN_FPUTC_UNLOCKED] : built_in_decls[BUILT_IN_FPUTC];
tree fn_fputs = unlocked ?
! built_in_decls[BUILT_IN_FPUTS_UNLOCKED] : built_in_decls[BUILT_IN_FPUTS];
tree fn, format_arg, stripped_string;
/* If the return value is used, or the replacement _DECL isn't
--- 4596,4604 ----
int unlocked;
{
tree fn_fputc = unlocked ?
! implicit_built_in_decls[BUILT_IN_FPUTC_UNLOCKED] : implicit_built_in_decls[BUILT_IN_FPUTC];
tree fn_fputs = unlocked ?
! 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
Index: convert.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/convert.c,v
retrieving revision 1.19
diff -c -3 -p -r1.19 convert.c
*** convert.c 4 Jul 2002 06:38:54 -0000 1.19
--- convert.c 9 Nov 2002 19:51:11 -0000
*************** convert_to_pointer (type, expr)
*** 71,76 ****
--- 71,100 ----
}
}
+ /* Avoid any floating point extensions from EXP. */
+ tree
+ strip_float_extensions (exp)
+ tree exp;
+ {
+ tree sub, expt, subt;
+
+ if (TREE_CODE (exp) != NOP_EXPR)
+ return exp;
+
+ sub = TREE_OPERAND (exp, 0);
+ subt = TREE_TYPE (sub);
+ expt = TREE_TYPE (exp);
+
+ if (!FLOAT_TYPE_P (subt))
+ return exp;
+
+ if (TYPE_PRECISION (subt) > TYPE_PRECISION (expt))
+ return exp;
+
+ return strip_float_extensions (sub);
+ }
+
+
/* Convert EXPR to some floating-point type TYPE.
EXPR must be float, integer, or enumeral;
Index: tree.h
===================================================================
RCS file: /cvs/gcc/egcs/gcc/tree.h,v
retrieving revision 1.349.4.11
diff -c -3 -p -r1.349.4.11 tree.h
*** tree.h 28 Oct 2002 19:47:10 -0000 1.349.4.11
--- tree.h 9 Nov 2002 19:51:13 -0000
*************** extern const char *const built_in_class_
*** 84,90 ****
/* 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,
enum built_in_function
{
#include "builtins.def"
--- 84,90 ----
/* 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, IM) ENUM,
enum built_in_function
{
#include "builtins.def"
*************** extern const char *const built_in_names[
*** 99,104 ****
--- 99,105 ----
/* An array of _DECL trees for the above. */
extern tree built_in_decls[(int) END_BUILTINS];
+ extern tree implicit_built_in_decls[(int) END_BUILTINS];
/* The definition of tree nodes fills the next several pages. */
*************** extern tree invert_truthvalue PARAMS ((t
*** 2903,2908 ****
--- 2904,2911 ----
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 alias.c */
extern void record_component_aliases PARAMS ((tree));
Index: java/builtins.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/java/builtins.c,v
retrieving revision 1.10
diff -c -3 -p -r1.10 builtins.c
*** java/builtins.c 11 Jul 2002 01:20:22 -0000 1.10
--- java/builtins.c 9 Nov 2002 19:51:17 -0000
*************** static tree build_function_call_expr PAR
*** 70,76 ****
static void define_builtin PARAMS ((enum built_in_function,
const char *,
enum built_in_class,
! tree, int));
static tree define_builtin_type PARAMS ((int, int, int, int, int));
--- 70,76 ----
static void define_builtin PARAMS ((enum built_in_function,
const char *,
enum built_in_class,
! tree, int, int));
static tree define_builtin_type PARAMS ((int, int, int, int, int));
*************** sqrt_builtin (method_return_type, method
*** 191,202 ****
/* Define a single builtin. */
static void
! define_builtin (val, name, class, type, fallback_p)
enum built_in_function val;
const char *name;
enum built_in_class class;
tree type;
int fallback_p;
{
tree decl;
--- 191,203 ----
/* Define a single builtin. */
static void
! define_builtin (val, name, class, type, fallback_p, implicit)
enum built_in_function val;
const char *name;
enum built_in_class class;
tree type;
int fallback_p;
+ int implicit;
{
tree decl;
*************** define_builtin (val, name, class, type,
*** 216,221 ****
--- 217,224 ----
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. */
*************** initialize_builtins ()
*** 314,321 ****
#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);
#include "builtins.def"
}
--- 317,324 ----
#include "builtin-types.def"
#define DEF_BUILTIN(ENUM, NAME, CLASS, TYPE, LIBTYPE, BOTH_P, \
! FALLBACK_P, NONANSI_P, ATTRS, IMPLICIT) \
! define_builtin (ENUM, NAME, CLASS, builtin_types[TYPE], FALLBACK_P, IMPLICIT);
#include "builtins.def"
}