Patchwork PR tree-optmization/46469 (cgraph verifier ICE)

login
register
mail settings
Submitter Jan Hubicka
Date Jan. 8, 2011, 4:35 p.m.
Message ID <20110108163547.GA28524@kam.mff.cuni.cz>
Download mbox | patch
Permalink /patch/77964/
State New
Headers show

Comments

Jan Hubicka - Jan. 8, 2011, 4:35 p.m.
Hi,
the problem here is that cgraph verifier chokes on needed inline clones.  Those
can be created now with extern inline functions.  There is no point to drop
needed flag on extern declarations, so this patch clears it in
function_and_variable_visibility.

For 4.7 I hope to finally move away from needed flag - it is now used only for aliases
and C++ ABI weirdnesses.

Bootstrapped/regtested x86_64-linux, comitted.
Honza
H.J. Lu - Jan. 13, 2011, 3:52 p.m.
On Sat, Jan 8, 2011 at 8:35 AM, Jan Hubicka <hubicka@ucw.cz> wrote:
> Hi,
> the problem here is that cgraph verifier chokes on needed inline clones.  Those
> can be created now with extern inline functions.  There is no point to drop
> needed flag on extern declarations, so this patch clears it in
> function_and_variable_visibility.
>
> For 4.7 I hope to finally move away from needed flag - it is now used only for aliases
> and C++ ABI weirdnesses.
>
> Bootstrapped/regtested x86_64-linux, comitted.
> Honza
>
> Index: ChangeLog
> ===================================================================
> --- ChangeLog   (revision 168597)
> +++ ChangeLog   (working copy)
> @@ -1,3 +1,9 @@
> +2011-01-07  Jan Hubicka  <jh@suse.cz>
> +
> +       PR tree-optmization/46469
> +       * ipa.c (function_and_variable_visibility): Clear needed flags on
> +       nodes with external decls; handle weakrefs merging correctly.
> +

This caused:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47276

Patch

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 168597)
+++ ChangeLog	(working copy)
@@ -1,3 +1,9 @@ 
+2011-01-07  Jan Hubicka  <jh@suse.cz>
+
+	PR tree-optmization/46469
+	* ipa.c (function_and_variable_visibility): Clear needed flags on
+	nodes with external decls; handle weakrefs merging correctly.
+
 2011-01-07  Joseph Myers  <joseph@codesourcery.com>
 
 	* opts.c (finish_options): Set opts->x_flag_opts_finished to true,
Index: ipa.c
===================================================================
--- ipa.c	(revision 168597)
+++ ipa.c	(working copy)
@@ -844,16 +844,32 @@  function_and_variable_visibility (bool w
 		IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (p->decl)),
 		IDENTIFIER_POINTER (p->target));
 		
-      if ((node = cgraph_node_for_asm (p->target)) != NULL)
+      if ((node = cgraph_node_for_asm (p->target)) != NULL
+	  && !DECL_EXTERNAL (node->decl))
         {
+	  /* Weakrefs alias symbols from other compilation unit.  In the case
+	     the destination of weakref became available because of LTO, we must
+	     mark it as needed.  */
+	  if (in_lto_p
+	      && lookup_attribute ("weakref", DECL_ATTRIBUTES (p->decl))
+	      && !node->needed)
+	    cgraph_mark_needed_node (node);
 	  gcc_assert (node->needed);
 	  pointer_set_insert (aliased_nodes, node);
 	  if (dump_file)
 	    fprintf (dump_file, "  node %s/%i",
 		     cgraph_node_name (node), node->uid);
         }
-      else if ((vnode = varpool_node_for_asm (p->target)) != NULL)
+      else if ((vnode = varpool_node_for_asm (p->target)) != NULL
+	       && !DECL_EXTERNAL (vnode->decl))
         {
+	  /* Weakrefs alias symbols from other compilation unit.  In the case
+	     the destination of weakref became available because of LTO, we must
+	     mark it as needed.  */
+	  if (in_lto_p
+	      && lookup_attribute ("weakref", DECL_ATTRIBUTES (p->decl))
+	      && !vnode->needed)
+	    varpool_mark_needed_node (vnode);
 	  gcc_assert (vnode->needed);
 	  pointer_set_insert (aliased_vnodes, vnode);
 	  if (dump_file)
@@ -867,6 +883,8 @@  function_and_variable_visibility (bool w
   for (node = cgraph_nodes; node; node = node->next)
     {
       int flags = flags_from_decl_or_type (node->decl);
+
+      /* Optimize away PURE and CONST constructors and destructors.  */
       if (optimize
 	  && (flags & (ECF_CONST | ECF_PURE))
 	  && !(flags & ECF_LOOPING_CONST_OR_PURE))
@@ -875,6 +893,13 @@  function_and_variable_visibility (bool w
 	  DECL_STATIC_DESTRUCTOR (node->decl) = 0;
 	}
 
+      /* Frontends and alias code marks nodes as needed before parsing is finished.
+	 We may end up marking as node external nodes where this flag is meaningless
+	 strip it.  */
+      if (node->needed
+	  && (DECL_EXTERNAL (node->decl) || !node->analyzed))
+	node->needed = 0;
+
       /* C++ FE on lack of COMDAT support create local COMDAT functions
 	 (that ought to be shared but can not due to object format
 	 limitations).  It is neccesary to keep the flag to make rest of C++ FE
Index: testsuite/ChangeLog
===================================================================
--- testsuite/ChangeLog	(revision 168597)
+++ testsuite/ChangeLog	(working copy)
@@ -1,3 +1,8 @@ 
+2011-01-08  Jan Hubicka  <jh@suse.cz>
+
+	PR tree-optmization/46469
+	* g++.dg/torture/pr46469.C: New testcase.
+
 2011-01-08  Iain Sandoe  <iains@gcc.gnu.org>
 
 	* objc-obj-c++-shared/next-mapping.h: Move code and definitions for
Index: testsuite/g++.dg/torture/pr46469.C
===================================================================
--- testsuite/g++.dg/torture/pr46469.C	(revision 0)
+++ testsuite/g++.dg/torture/pr46469.C	(revision 0)
@@ -0,0 +1,13 @@ 
+extern "C"  __inline __attribute__ ((__gnu_inline__)) int pthread_equal ()
+  {
+  }
+
+static
+  __typeof
+  (pthread_equal)
+  __gthrw_pthread_equal __attribute__ ((__weakref__ ("pthread_equal")));
+
+int identifierByPthreadHandle ()
+{
+  pthread_equal ();
+}