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

--- Comment #28 from Xiong Hu XS Luo <luoxhu at cn dot ibm.com> ---
(In reply to Richard Biener from comment #24)
> Btw, this is controlled by symtab_node::output_to_lto_symbol_table_p which
> has
> 
>   /* FIXME: Builtins corresponding to real functions probably should have
>      symbol table entries.  */
>   if (TREE_CODE (decl) == FUNCTION_DECL && fndecl_built_in_p (decl))
>     return false;
> 
> we could try to do sth like
> 
>   if (TREE_CODE (decl) == FUNCTION_DECL
>       && (fndecl_built_in_p (decl, BUILT_IN_MD)
>           || (fndecl_built_in_p (decl, BUILT_IN_NORMAL)
>               && !associated_internal_fn (decl))))
>     return false;
> 
> but that would still leave us with too many undefineds I guess
> (gcc_unreachable for one).
> 
> We do not currently track builtins that do have a library implementation
> (whether that it is used in the end is another thing, but less important).
> 
> What we definitely can do is put a whitelist above like via the following
> which also catches the case of definitions of builtins.
> 
> Index: gcc/symtab.c
> ===================================================================
> --- gcc/symtab.c        (revision 273968)
> +++ gcc/symtab.c        (working copy)
> @@ -2375,10 +2375,24 @@ symtab_node::output_to_lto_symbol_table_
>       first place.  */
>    if (VAR_P (decl) && DECL_HARD_REGISTER (decl))
>      return false;
> +
>    /* FIXME: Builtins corresponding to real functions probably should have
>       symbol table entries.  */
> -  if (TREE_CODE (decl) == FUNCTION_DECL && fndecl_built_in_p (decl))
> -    return false;
> +  if (TREE_CODE (decl) == FUNCTION_DECL
> +      && !definition
> +      && fndecl_built_in_p (decl))
> +    {
> +      if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL)
> +       switch (DECL_FUNCTION_CODE (decl))
> +         {
> +         CASE_FLT_FN (BUILT_IN_ATAN2):
> +         CASE_FLT_FN (BUILT_IN_SIN):
> +           return true;
> +         default:
> +           break;
> +         }
> +      return false;
> +    }
>  
>    /* We have real symbol that should be in symbol table.  However try to
> trim
>       down the refernces to libraries bit more because linker will otherwise

Hi Richard, no undefineds generated with below code, what's your opinion about
the updated code, please? Thanks.

diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c
index 47a9143ae26..9d42a57b4b6 100644
--- a/gcc/lto-streamer-out.c
+++ b/gcc/lto-streamer-out.c
@@ -2644,7 +2644,10 @@ write_symbol (struct streamer_tree_cache_d *cache,

   gcc_checking_assert (TREE_PUBLIC (t)
                       && (TREE_CODE (t) != FUNCTION_DECL
-                          || !fndecl_built_in_p (t))
+                          || !fndecl_built_in_p (t, BUILT_IN_MD))
+                      && (TREE_CODE (t) != FUNCTION_DECL
+                          || !fndecl_built_in_p (t, BUILT_IN_NORMAL)
+                          || associated_internal_fn (t) != IFN_LAST)
                       && !DECL_ABSTRACT_P (t)
                       && (!VAR_P (t) || !DECL_HARD_REGISTER (t)));

diff --git a/gcc/symtab.c b/gcc/symtab.c
index 63e2820eb93..ce74589b291 100644
--- a/gcc/symtab.c
+++ b/gcc/symtab.c
@@ -2377,7 +2377,10 @@ symtab_node::output_to_lto_symbol_table_p (void)
     return false;
   /* FIXME: Builtins corresponding to real functions probably should have
      symbol table entries.  */
-  if (TREE_CODE (decl) == FUNCTION_DECL && fndecl_built_in_p (decl))
+  if (TREE_CODE (decl) == FUNCTION_DECL
+      && (fndecl_built_in_p (decl, BUILT_IN_MD)
+         || (fndecl_built_in_p (decl, BUILT_IN_NORMAL)
+             && IFN_LAST == associated_internal_fn (decl))))
     return false;

   /* We have real symbol that should be in symbol table.  However try to trim

Reply via email to