https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64313

--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> ---
So sth like

Index: gcc/c-family/c-gimplify.c
===================================================================
--- gcc/c-family/c-gimplify.c   (revision 219839)
+++ gcc/c-family/c-gimplify.c   (working copy)
@@ -300,6 +300,20 @@ c_gimplify_expr (tree *expr_p, gimple_se
        break;
       }

+    case ADDR_EXPR:
+      {
+       /* If we see a call to a declared builtin or see its address
+          being taken (we can unify those cases) then we can mark
+          the builtin for implicit generation by GCC.  */
+       tree fndecl = TREE_OPERAND (*expr_p, 0);
+       if (TREE_CODE (fndecl) == FUNCTION_DECL
+           && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
+           /* C_DECL_DECLARED_BUILTIN */
+           && DECL_LANG_FLAG_3 (fndecl))
+         set_builtin_decl_implicit_p (DECL_FUNCTION_CODE (fndecl), true);
+       break;
+      }
+
     case CILK_SPAWN_STMT:
       gcc_assert
        (fn_contains_cilk_spawn_p (cfun)

works for C (yeah, that flag check needs to become a new langhook due to the
way we share c_gimplify across frontends... :/).  For C++ there isn't anything
similar to C_DECL_DECLARED_BUILTIN, but of course the testcase is only
exercised for C.  Alternatively we can add a flag to the middle-end that FEs
can set to treat a builtin as candidate for implicit use if it is used
(but that way we can't distinguish uses of __builtin_log10 from declared
log10).
Thus, similar to [set_]builtin_decl_implicit_p have a
[set_]builtin_decl_declared_p - then we can handle the above in generic
gimplifier routines.

Reply via email to