PR tree-optmization/46469 (cgraph verifier ICE)

Submitted by Jan Hubicka on Jan. 8, 2011, 4:35 p.m.

Details

Message ID 20110108163547.GA28524@kam.mff.cuni.cz
State New
Headers show

Commit Message

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

Comments

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 hide | download patch | download mbox

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 ();
+}