On Tue, 25 Sep 2012, Richard Guenther wrote: > > This fixes PR54702 and LTO bootstrap (well, at least I now survive > stage2 cc1 build). We shouldn't enter builtins into the symtab > asm-name hash, too much code seems to be confused by that (at least > we should at most insert builtins with a set assembler name). > > Smells somewhat LTO-ish, but well.
And breaks regular build. The following fixes PR54625 and this one and passes bootstrap & regtest. Committed. Richard. 2012-09-25 Richard Guenther <rguent...@suse.de> PR lto/54625 * lto-symtab.c (lto_symtab_merge_cgraph_nodes_1): Do not merge cgraph nodes for builtins. * gcc.dg/lto/pr54702_0.c: New testcase. * gcc.dg/lto/pr54702_1.c: Likewise. * gcc.dg/lto/pr54625-1_0.c: Likewise. * gcc.dg/lto/pr54625-1_1.C: Likewise. * gcc.dg/lto/pr54625-2_0.c: Likewise. * gcc.dg/lto/pr54625-2_1.C: Likewise. Index: gcc/testsuite/gcc.dg/lto/pr54702_0.c =================================================================== *** gcc/testsuite/gcc.dg/lto/pr54702_0.c (revision 0) --- gcc/testsuite/gcc.dg/lto/pr54702_0.c (working copy) *************** *** 0 **** --- 1,10 ---- + /* { dg-lto-do link } */ + /* { dg-lto-options { { -O2 -flto -w } } } */ + /* { dg-extra-ld-options { -r -nostdlib } } */ + + #include <stdlib.h> + void* f () + { + void* p = malloc (1); + return p; + } Index: gcc/testsuite/gcc.dg/lto/pr54702_1.c =================================================================== *** gcc/testsuite/gcc.dg/lto/pr54702_1.c (revision 0) --- gcc/testsuite/gcc.dg/lto/pr54702_1.c (working copy) *************** *** 0 **** --- 1,16 ---- + int *b; + void *d; + int c; + static int *f1 (); + void f2 () + { + int *a = f1 (0); + } + + int *f1 (j) + { + b = malloc (0); + d = *malloc; + c = j; + } + Index: gcc/testsuite/gcc.dg/lto/pr54625-1_0.c =================================================================== --- gcc/testsuite/gcc.dg/lto/pr54625-1_0.c (revision 0) +++ gcc/testsuite/gcc.dg/lto/pr54625-1_0.c (working copy) @@ -0,0 +1,10 @@ +/* { dg-lto-do link } */ +/* { dg-extra-ld-options { -r -nostdlib } } */ + +float a; +double sin (); +speex_resampler_init_frac () +{ + a = sin (0); +} + Index: gcc/testsuite/gcc.dg/lto/pr54625-1_1.C =================================================================== --- gcc/testsuite/gcc.dg/lto/pr54625-1_1.C (revision 0) +++ gcc/testsuite/gcc.dg/lto/pr54625-1_1.C (working copy) @@ -0,0 +1,19 @@ +extern "C" double sin (double); +typedef double UnaryFunType (double); +class A +{ +public: + int hash (); + double lookup (UnaryFunType p1) + { + int a = hash (); + if (p1) + return 0; + } +}; +A b; +void +math_sin_impl () +{ + b.lookup (sin); +} Index: gcc/testsuite/gcc.dg/lto/pr54625-2_0.c =================================================================== --- gcc/testsuite/gcc.dg/lto/pr54625-2_0.c (revision 0) +++ gcc/testsuite/gcc.dg/lto/pr54625-2_0.c (working copy) @@ -0,0 +1,9 @@ +/* { dg-lto-do link } */ +/* { dg-extra-ld-options { -r -nostdlib } } */ + +float a; +double sin (); +update_filter () +{ + a = sin (0); +} Index: gcc/testsuite/gcc.dg/lto/pr54625-2_1.C =================================================================== --- gcc/testsuite/gcc.dg/lto/pr54625-2_1.C (revision 0) +++ gcc/testsuite/gcc.dg/lto/pr54625-2_1.C (working copy) @@ -0,0 +1,24 @@ +extern "C" double sin (double); +typedef double (*UnaryFunType) (double); +class A +{ +public: + int hash (); + void lookup (UnaryFunType p1) + { + int a = hash (); + p1 (0); + } +}; +A b, c; +void +math_sin_impl () +{ + b.lookup (sin); +} + +void +js_math_sqrt () +{ + c.lookup (0); +} Index: gcc/lto-symtab.c =================================================================== --- gcc/lto-symtab.c (revision 191700) +++ gcc/lto-symtab.c (working copy) @@ -629,7 +629,8 @@ lto_symtab_merge_cgraph_nodes_1 (symtab_ if (!symtab_real_symbol_p (e)) continue; - if (symtab_function_p (e)) + if (symtab_function_p (e) + && !DECL_BUILT_IN (e->symbol.decl)) lto_cgraph_replace_node (cgraph (e), cgraph (prevailing)); if (symtab_variable_p (e)) lto_varpool_replace_node (varpool (e), varpool (prevailing));