re PR middle-end/64313 (gcc.dg/torture/builtin-explog-1.c fails on bare-metal targets)
authorRichard Biener <rguenther@suse.de>
Wed, 21 Jan 2015 09:04:53 +0000 (09:04 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 21 Jan 2015 09:04:53 +0000 (09:04 +0000)
2015-01-21  Richard Biener  <rguenther@suse.de>

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
gcc/builtins.c
gcc/c/ChangeLog
gcc/c/c-decl.c
gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/gimplify.c
gcc/tree-core.h
gcc/tree.h

index 9e4ad22d7ff0e06a1d60f2de6926be385178c7a4..c6600d9bb1e754b82f66033f4a95dbe96e21db94 100644 (file)
@@ -1,3 +1,18 @@
+2015-01-21  Richard Biener  <rguenther@suse.de>
+
+       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  <law@redhat.com>
 
        PR target/59946
index bf5acbcc2288eaf452c6235fed9d354f2ce61330..3ddaddc1ab061815f3a0f12d2850baca6b9deb7a 100644 (file)
@@ -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;
index 46524098eef9db3206a5a0d2ffeda4a8f613e400..33cc2bd3a20326bf1960e6e8d821ebab8658ac51 100644 (file)
@@ -1,3 +1,9 @@
+2015-01-21  Richard Biener  <rguenther@suse.de>
+
+       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  <thomas@codesourcery.com>
            Bernd Schmidt  <bernds@codesourcery.com>
            Cesar Philippidis  <cesar@codesourcery.com>
index b9424b5f154d81ee9cb09728e159cd5c1bb19c2d..48c2bcbf8bb4730c8d9159c6e9859a5b3039d973 100644 (file)
@@ -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;
                    }
                }
index ff5fb7a16e78254ea432eb2c3a92d7e02886b6ed..d5b3cd8ad43b998389e48322fdd2182c5cd566c5 100644 (file)
@@ -1,3 +1,9 @@
+2015-01-21  Richard Biener  <rguenther@suse.de>
+
+       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  <paolo.carlini@oracle.com>
 
        PR c++/58614
index 35f483363d8dce96c186e13f7ac8a5682b089302..5119964dea9a7539bf8fe22db1997aba266446a1 100644 (file)
@@ -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;
                }
            }
index 3a34f9224dc319ef9380f84b0dfbb5a5fc575e8a..947b0af8d566c8b0b29356096d7c07029720453c 100644 (file)
@@ -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
index 735ce5cf30779e61e8fe1cdc11c823a4654d1487..c7a21b5c35350cc1558cb90f58c2c0eaeb15619b 100644 (file)
@@ -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_<xxx>.  */
+   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 <xxx> instead of explicitly using calls
+     to __builtin_<xxx>.  */
+  unsigned implicit_p : 1;
+  /* Whether the user has provided a declaration of <xxx>.  */
+  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;
index 4f83b38103bc66ca523bee203eeb70c7cc29ef33..d8eaff6785181211c4b87dde9a65c5a0b348691b 100644 (file)
@@ -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.