Patchwork Fix PR54702 and LTO bootstrap (for me)

login
register
mail settings
Submitter Richard Guenther
Date Sept. 25, 2012, 3 p.m.
Message ID <alpine.LNX.2.00.1209251700050.4063@zhemvz.fhfr.qr>
Download mbox | patch
Permalink /patch/186835/
State New
Headers show

Comments

Richard Guenther - Sept. 25, 2012, 3 p.m.
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  <rguenther@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;
+ }
+

Patch

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));