This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Cyclis aliases hangs GCC


Hi,
this patch adds logic to detect cycles and cgraph and varpool aliases.
Prevoiusly we just output them into asm file and let gas to complain, but now we catch ourselves
in infinite loop.  I assumed that this is already tested in varasm but it is not.

Bootstrapped/regtested x86_64-linux, will commit it shortly.
	Jan Hubicka  <jh@suse.cz>
	Tom de Vries  <tom@codesourcery.com>
	PR middle-end/51998
	* cgraphunit.c (cgraph_analyze_function): Break cyclic aliases.
	* varpool.c (varpool_analyze_pending_decls): Likewise.

	* testsuite/gcc.dg/alias-12.c: New testcase.
	* testsuite/gcc.dg/alias-13.c: New testcase.
Index: cgraphunit.c
===================================================================
--- cgraphunit.c	(revision 183757)
+++ cgraphunit.c	(working copy)
@@ -836,6 +836,16 @@ cgraph_analyze_function (struct cgraph_n
   if (node->alias && node->thunk.alias)
     {
       struct cgraph_node *tgt = cgraph_get_node (node->thunk.alias);
+      struct cgraph_node *n;
+
+      for (n = tgt; n && n->alias;
+	   n = n->analyzed ? cgraph_alias_aliased_node (n) : NULL)
+	if (n == node)
+	  {
+	    error ("function %q+D part of alias cycle", node->decl);
+	    node->alias = false;
+	    return;
+	  }
       if (!VEC_length (ipa_ref_t, node->ref_list.references))
         ipa_record_reference (node, NULL, tgt, NULL, IPA_REF_ALIAS, NULL);
       if (node->same_body_alias)
Index: testsuite/gcc.dg/alias-12.c
===================================================================
--- testsuite/gcc.dg/alias-12.c	(revision 0)
+++ testsuite/gcc.dg/alias-12.c	(revision 0)
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-require-alias "" } */
+/* { dg-options "-O2" } */
+static void f (void) __attribute__((alias("f"))); // { dg-error "part of alias cycle" "" }
+
+void g ()
+{
+  f ();
+}
Index: testsuite/gcc.dg/alias-13.c
===================================================================
--- testsuite/gcc.dg/alias-13.c	(revision 0)
+++ testsuite/gcc.dg/alias-13.c	(revision 0)
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-require-alias "" } */
+/* { dg-options "-O2" } */
+static void f (void) __attribute__((alias("g"))); static void g (void) __attribute__((alias("f"))); // { dg-error "part of alias cycle" "" }
+
+void h ()
+{
+  f ();
+}
Index: varpool.c
===================================================================
--- varpool.c	(revision 183757)
+++ varpool.c	(working copy)
@@ -477,6 +477,16 @@ varpool_analyze_pending_decls (void)
       if (node->alias && node->alias_of)
 	{
 	  struct varpool_node *tgt = varpool_node (node->alias_of);
+          struct varpool_node *n;
+
+	  for (n = tgt; n && n->alias;
+	       n = n->analyzed ? varpool_alias_aliased_node (n) : NULL)
+	    if (n == node)
+	      {
+		error ("variable %q+D part of alias cycle", node->decl);
+		node->alias = false;
+		continue;
+	      }
 	  if (!VEC_length (ipa_ref_t, node->ref_list.references))
 	    ipa_record_reference (NULL, node, NULL, tgt, IPA_REF_ALIAS, NULL);
 	  /* C++ FE sometimes change linkage flags after producing same body aliases.  */


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]