From cbf5d0e70c98103d28c869305043d9889bb36c8f Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 21 Jan 2015 09:04:53 +0000 Subject: [PATCH] re PR middle-end/64313 (gcc.dg/torture/builtin-explog-1.c fails on bare-metal targets) 2015-01-21 Richard Biener PR middle-end/64313 * tree-core.h (builtin_info, builtin_info_type): Turn from an object with two arrays into an array of an object with decl and two flags, implicit_p and declared_p. * tree.h (builtin_decl_explicit, builtin_decl_implicit, set_builtin_decl, set_builtin_decl_implicit_p, builtin_decl_explicit_p, builtin_decl_implicit_p): Adjust. (set_builtin_decl_declared_p, builtin_decl_declared_p): New functions. * builtins.c (builtin_info): Adjust. * gimplify.c (gimplify_addr_expr): References to builtins that have been declared by the user makes them eligible for use by the compiler. Call set_builtin_decl_implicit_p on them. c/ * c-decl.c (merge_decls): Call set_builtin_decl_declared_p for builtins the user declared correctly. cp/ * decl.c (duplicate_decls): Call set_builtin_decl_declared_p for builtins the user declared correctly. From-SVN: r219928 --- gcc/ChangeLog | 15 +++++++++++++++ gcc/builtins.c | 4 ++-- gcc/c/ChangeLog | 6 ++++++ gcc/c/c-decl.c | 2 ++ gcc/cp/ChangeLog | 6 ++++++ gcc/cp/decl.c | 2 ++ gcc/gimplify.c | 8 ++++++++ gcc/tree-core.h | 13 ++++++++----- gcc/tree.h | 46 ++++++++++++++++++++++++++++++++++++---------- 9 files changed, 85 insertions(+), 17 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9e4ad22d7ff..c6600d9bb1e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,18 @@ +2015-01-21 Richard Biener + + PR middle-end/64313 + * tree-core.h (builtin_info, builtin_info_type): Turn from + an object with two arrays into an array of an object with + decl and two flags, implicit_p and declared_p. + * tree.h (builtin_decl_explicit, builtin_decl_implicit, + set_builtin_decl, set_builtin_decl_implicit_p, + builtin_decl_explicit_p, builtin_decl_implicit_p): Adjust. + (set_builtin_decl_declared_p, builtin_decl_declared_p): New functions. + * builtins.c (builtin_info): Adjust. + * gimplify.c (gimplify_addr_expr): References to builtins + that have been declared by the user makes them eligible for + use by the compiler. Call set_builtin_decl_implicit_p on them. + 2015-01-20 Jeff Law PR target/59946 diff --git a/gcc/builtins.c b/gcc/builtins.c index bf5acbcc228..3ddaddc1ab0 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -105,9 +105,9 @@ const char * built_in_names[(int) END_BUILTINS] = }; #undef DEF_BUILTIN -/* Setup an array of _DECL trees, make sure each element is +/* Setup an array of builtin_info_type, make sure each element decl is initialized to NULL_TREE. */ -builtin_info_type builtin_info; +builtin_info_type builtin_info[(int)END_BUILTINS]; /* Non-zero if __builtin_constant_p should be folded right away. */ bool force_folding_builtin_constant_p; diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 46524098eef..33cc2bd3a20 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,9 @@ +2015-01-21 Richard Biener + + PR middle-end/64313 + * c-decl.c (merge_decls): Call set_builtin_decl_declared_p + for builtins the user declared correctly. + 2015-01-15 Thomas Schwinge Bernd Schmidt Cesar Philippidis diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c index b9424b5f154..48c2bcbf8bb 100644 --- a/gcc/c/c-decl.c +++ b/gcc/c/c-decl.c @@ -2582,6 +2582,8 @@ merge_decls (tree newdecl, tree olddecl, tree newtype, tree oldtype) set_builtin_decl_implicit_p (fncode, true); break; default: + if (builtin_decl_explicit_p (fncode)) + set_builtin_decl_declared_p (fncode, true); break; } } diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ff5fb7a16e7..d5b3cd8ad43 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2015-01-21 Richard Biener + + PR middle-end/64313 + * decl.c (duplicate_decls): Call set_builtin_decl_declared_p + for builtins the user declared correctly. + 2015-01-16 Paolo Carlini PR c++/58614 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 35f483363d8..5119964dea9 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -2309,6 +2309,8 @@ duplicate_decls (tree newdecl, tree olddecl, bool newdecl_is_friend) set_builtin_decl_implicit_p (fncode, true); break; default: + if (builtin_decl_explicit_p (fncode)) + set_builtin_decl_declared_p (fncode, true); break; } } diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 3a34f9224dc..947b0af8d56 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -4956,6 +4956,14 @@ gimplify_addr_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p) break; default: + /* If we see a call to a declared builtin or see its address + being taken (we can unify those cases here) then we can mark + the builtin for implicit generation by GCC. */ + if (TREE_CODE (op0) == FUNCTION_DECL + && DECL_BUILT_IN_CLASS (op0) == BUILT_IN_NORMAL + && builtin_decl_declared_p (DECL_FUNCTION_CODE (op0))) + set_builtin_decl_implicit_p (DECL_FUNCTION_CODE (op0), true); + /* We use fb_either here because the C frontend sometimes takes the address of a call that returns a struct; see gcc.dg/c99-array-lval-1.c. The gimplifier will correctly make diff --git a/gcc/tree-core.h b/gcc/tree-core.h index 735ce5cf307..c7a21b5c353 100644 --- a/gcc/tree-core.h +++ b/gcc/tree-core.h @@ -1853,11 +1853,14 @@ struct const_call_expr_arg_iterator { }; /* The builtin_info structure holds the FUNCTION_DECL of the standard builtin - function, and a flag that says if the function is available implicitly, or - whether the user has to code explicit calls to __builtin_. */ + function, and flags. */ struct GTY(()) builtin_info_type { - tree decl[(int)END_BUILTINS]; - bool implicit_p[(int)END_BUILTINS]; + tree decl; + /* Whether the user can use instead of explicitly using calls + to __builtin_. */ + unsigned implicit_p : 1; + /* Whether the user has provided a declaration of . */ + unsigned declared_p : 1; }; @@ -1913,7 +1916,7 @@ extern int tree_node_sizes[]; extern bool in_gimple_form; /* Functional interface to the builtin functions. */ -extern GTY(()) builtin_info_type builtin_info; +extern GTY(()) builtin_info_type builtin_info[(int)END_BUILTINS]; /* If nonzero, an upper limit on alignment of structure fields, in bits, */ extern unsigned int maximum_field_alignment; diff --git a/gcc/tree.h b/gcc/tree.h index 4f83b38103b..d8eaff67851 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -4606,7 +4606,7 @@ builtin_decl_explicit (enum built_in_function fncode) { gcc_checking_assert (BUILTIN_VALID_P (fncode)); - return builtin_info.decl[(size_t)fncode]; + return builtin_info[(size_t)fncode].decl; } /* Return the tree node for an implicit builtin function or NULL. */ @@ -4616,10 +4616,10 @@ builtin_decl_implicit (enum built_in_function fncode) size_t uns_fncode = (size_t)fncode; gcc_checking_assert (BUILTIN_VALID_P (fncode)); - if (!builtin_info.implicit_p[uns_fncode]) + if (!builtin_info[uns_fncode].implicit_p) return NULL_TREE; - return builtin_info.decl[uns_fncode]; + return builtin_info[uns_fncode].decl; } /* Set explicit builtin function nodes and whether it is an implicit @@ -4633,8 +4633,9 @@ set_builtin_decl (enum built_in_function fncode, tree decl, bool implicit_p) gcc_checking_assert (BUILTIN_VALID_P (fncode) && (decl != NULL_TREE || !implicit_p)); - builtin_info.decl[ufncode] = decl; - builtin_info.implicit_p[ufncode] = implicit_p; + builtin_info[ufncode].decl = decl; + builtin_info[ufncode].implicit_p = implicit_p; + builtin_info[ufncode].declared_p = false; } /* Set the implicit flag for a builtin function. */ @@ -4645,9 +4646,22 @@ set_builtin_decl_implicit_p (enum built_in_function fncode, bool implicit_p) size_t uns_fncode = (size_t)fncode; gcc_checking_assert (BUILTIN_VALID_P (fncode) - && builtin_info.decl[uns_fncode] != NULL_TREE); + && builtin_info[uns_fncode].decl != NULL_TREE); - builtin_info.implicit_p[uns_fncode] = implicit_p; + builtin_info[uns_fncode].implicit_p = implicit_p; +} + +/* Set the declared flag for a builtin function. */ + +static inline void +set_builtin_decl_declared_p (enum built_in_function fncode, bool declared_p) +{ + size_t uns_fncode = (size_t)fncode; + + gcc_checking_assert (BUILTIN_VALID_P (fncode) + && builtin_info[uns_fncode].decl != NULL_TREE); + + builtin_info[uns_fncode].declared_p = declared_p; } /* Return whether the standard builtin function can be used as an explicit @@ -4657,7 +4671,7 @@ static inline bool builtin_decl_explicit_p (enum built_in_function fncode) { gcc_checking_assert (BUILTIN_VALID_P (fncode)); - return (builtin_info.decl[(size_t)fncode] != NULL_TREE); + return (builtin_info[(size_t)fncode].decl != NULL_TREE); } /* Return whether the standard builtin function can be used implicitly. */ @@ -4668,8 +4682,20 @@ builtin_decl_implicit_p (enum built_in_function fncode) size_t uns_fncode = (size_t)fncode; gcc_checking_assert (BUILTIN_VALID_P (fncode)); - return (builtin_info.decl[uns_fncode] != NULL_TREE - && builtin_info.implicit_p[uns_fncode]); + return (builtin_info[uns_fncode].decl != NULL_TREE + && builtin_info[uns_fncode].implicit_p); +} + +/* Return whether the standard builtin function was declared. */ + +static inline bool +builtin_decl_declared_p (enum built_in_function fncode) +{ + size_t uns_fncode = (size_t)fncode; + + gcc_checking_assert (BUILTIN_VALID_P (fncode)); + return (builtin_info[uns_fncode].decl != NULL_TREE + && builtin_info[uns_fncode].declared_p); } /* Return true if T (assumed to be a DECL) is a global variable. -- 2.30.2