This is the backport patch to gcc-9-branch, please ignore the previous mail.
Backport r274411 of "Enable math functions linking with static library for LTO" from mainline to gcc-9-branch. Bootstrapped/Regression-tested on Linux POWER8 LE. gcc/ChangeLog 2019-08-26 Xiong Hu Luo <luo...@linux.ibm.com> Backport r274411 from trunk to gcc-9-branch. 2019-08-14 Xiong Hu Luo <luo...@linux.ibm.com> PR lto/91287 * builtins.c (builtin_with_linkage_p): New function. * builtins.h (builtin_with_linkage_p): New function. * symtab.c (write_symbol): Remove redundant assert. * lto-streamer-out.c (symtab_node::output_to_lto_symbol_table_p): Remove FIXME and use builtin_with_linkage_p. --- gcc/builtins.c | 87 ++++++++++++++++++++++++++++++++++++++++++ gcc/builtins.h | 1 + gcc/lto-streamer-out.c | 6 --- gcc/symtab.c | 16 ++++++-- 4 files changed, 100 insertions(+), 10 deletions(-) diff --git a/gcc/builtins.c b/gcc/builtins.c index 9bcb310c015..ed11f79ff0b 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -11236,3 +11236,90 @@ target_char_cst_p (tree t, char *p) *p = (char)tree_to_uhwi (t); return true; } + +/* Return true if the builtin DECL is implemented in a standard library. + Otherwise returns false which doesn't guarantee it is not (thus the list of + handled builtins below may be incomplete). */ + +bool +builtin_with_linkage_p (tree decl) +{ + if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL) + switch (DECL_FUNCTION_CODE (decl)) + { + CASE_FLT_FN (BUILT_IN_ACOS): + CASE_FLT_FN (BUILT_IN_ACOSH): + CASE_FLT_FN (BUILT_IN_ASIN): + CASE_FLT_FN (BUILT_IN_ASINH): + CASE_FLT_FN (BUILT_IN_ATAN): + CASE_FLT_FN (BUILT_IN_ATANH): + CASE_FLT_FN (BUILT_IN_ATAN2): + CASE_FLT_FN (BUILT_IN_CBRT): + CASE_FLT_FN (BUILT_IN_CEIL): + CASE_FLT_FN_FLOATN_NX (BUILT_IN_CEIL): + CASE_FLT_FN (BUILT_IN_COPYSIGN): + CASE_FLT_FN_FLOATN_NX (BUILT_IN_COPYSIGN): + CASE_FLT_FN (BUILT_IN_COS): + CASE_FLT_FN (BUILT_IN_COSH): + CASE_FLT_FN (BUILT_IN_ERF): + CASE_FLT_FN (BUILT_IN_ERFC): + CASE_FLT_FN (BUILT_IN_EXP): + CASE_FLT_FN (BUILT_IN_EXP2): + CASE_FLT_FN (BUILT_IN_EXPM1): + CASE_FLT_FN (BUILT_IN_FABS): + CASE_FLT_FN_FLOATN_NX (BUILT_IN_FABS): + CASE_FLT_FN (BUILT_IN_FDIM): + CASE_FLT_FN (BUILT_IN_FLOOR): + CASE_FLT_FN_FLOATN_NX (BUILT_IN_FLOOR): + CASE_FLT_FN (BUILT_IN_FMA): + CASE_FLT_FN_FLOATN_NX (BUILT_IN_FMA): + CASE_FLT_FN (BUILT_IN_FMAX): + CASE_FLT_FN_FLOATN_NX (BUILT_IN_FMAX): + CASE_FLT_FN (BUILT_IN_FMIN): + CASE_FLT_FN_FLOATN_NX (BUILT_IN_FMIN): + CASE_FLT_FN (BUILT_IN_FMOD): + CASE_FLT_FN (BUILT_IN_FREXP): + CASE_FLT_FN (BUILT_IN_HYPOT): + CASE_FLT_FN (BUILT_IN_ILOGB): + CASE_FLT_FN (BUILT_IN_LDEXP): + CASE_FLT_FN (BUILT_IN_LGAMMA): + CASE_FLT_FN (BUILT_IN_LLRINT): + CASE_FLT_FN (BUILT_IN_LLROUND): + CASE_FLT_FN (BUILT_IN_LOG): + CASE_FLT_FN (BUILT_IN_LOG10): + CASE_FLT_FN (BUILT_IN_LOG1P): + CASE_FLT_FN (BUILT_IN_LOG2): + CASE_FLT_FN (BUILT_IN_LOGB): + CASE_FLT_FN (BUILT_IN_LRINT): + CASE_FLT_FN (BUILT_IN_LROUND): + CASE_FLT_FN (BUILT_IN_MODF): + CASE_FLT_FN (BUILT_IN_NAN): + CASE_FLT_FN (BUILT_IN_NEARBYINT): + CASE_FLT_FN_FLOATN_NX (BUILT_IN_NEARBYINT): + CASE_FLT_FN (BUILT_IN_NEXTAFTER): + CASE_FLT_FN (BUILT_IN_NEXTTOWARD): + CASE_FLT_FN (BUILT_IN_POW): + CASE_FLT_FN (BUILT_IN_REMAINDER): + CASE_FLT_FN (BUILT_IN_REMQUO): + CASE_FLT_FN (BUILT_IN_RINT): + CASE_FLT_FN_FLOATN_NX (BUILT_IN_RINT): + CASE_FLT_FN (BUILT_IN_ROUND): + CASE_FLT_FN_FLOATN_NX (BUILT_IN_ROUND): + CASE_FLT_FN (BUILT_IN_SCALBLN): + CASE_FLT_FN (BUILT_IN_SCALBN): + CASE_FLT_FN (BUILT_IN_SIN): + CASE_FLT_FN (BUILT_IN_SINH): + CASE_FLT_FN (BUILT_IN_SINCOS): + CASE_FLT_FN (BUILT_IN_SQRT): + CASE_FLT_FN_FLOATN_NX (BUILT_IN_SQRT): + CASE_FLT_FN (BUILT_IN_TAN): + CASE_FLT_FN (BUILT_IN_TANH): + CASE_FLT_FN (BUILT_IN_TGAMMA): + CASE_FLT_FN (BUILT_IN_TRUNC): + CASE_FLT_FN_FLOATN_NX (BUILT_IN_TRUNC): + return true; + default: + break; + } + return false; +} diff --git a/gcc/builtins.h b/gcc/builtins.h index 1ffb491d785..66c9295ff4a 100644 --- a/gcc/builtins.h +++ b/gcc/builtins.h @@ -150,5 +150,6 @@ extern internal_fn replacement_internal_fn (gcall *); extern void warn_string_no_nul (location_t, const char *, tree, tree); extern tree unterminated_array (tree, tree * = NULL, bool * = NULL); +extern bool builtin_with_linkage_p (tree); #endif /* GCC_BUILTINS_H */ diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c index b6e395b53fd..e07085770a5 100644 --- a/gcc/lto-streamer-out.c +++ b/gcc/lto-streamer-out.c @@ -2617,12 +2617,6 @@ write_symbol (struct streamer_tree_cache_d *cache, const char *comdat; unsigned char c; - gcc_checking_assert (TREE_PUBLIC (t) - && (TREE_CODE (t) != FUNCTION_DECL - || !fndecl_built_in_p (t)) - && !DECL_ABSTRACT_P (t) - && (!VAR_P (t) || !DECL_HARD_REGISTER (t))); - gcc_assert (VAR_OR_FUNCTION_DECL_P (t)); name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (t)); diff --git a/gcc/symtab.c b/gcc/symtab.c index 29f6cdc4667..33b4be79c0f 100644 --- a/gcc/symtab.c +++ b/gcc/symtab.c @@ -2328,10 +2328,18 @@ symtab_node::output_to_lto_symbol_table_p (void) 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)) + { + /* Builtins like those for most math functions have actual implementations + in libraries so make sure to output references into the symbol table to + make those libraries referenced. Note this is incomplete handling for + now and only covers math functions. */ + if (builtin_with_linkage_p (decl)) + return true; + else + 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 -- 2.21.0.777.g83232e3864