aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2012-02-02 14:29:31 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2012-02-02 13:29:31 +0000
commit5ee770bf9e6941a2d1f8d59e9e663fa08c818b42 (patch)
tree612c65dfb166b3f5da06ecbb2601952b92d2abb1
parente5b8c090111e81d8297514ea7bc283bd4472ef75 (diff)
downloadgcc-5ee770bf9e6941a2d1f8d59e9e663fa08c818b42.zip
gcc-5ee770bf9e6941a2d1f8d59e9e663fa08c818b42.tar.gz
gcc-5ee770bf9e6941a2d1f8d59e9e663fa08c818b42.tar.bz2
re PR middle-end/51998 (compiler hangs on self-recursive alias attribute)
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. Co-Authored-By: Tom de Vries <tom@codesourcery.com> From-SVN: r183836
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/cgraphunit.c10
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gcc.dg/alias-12.c9
-rw-r--r--gcc/testsuite/gcc.dg/alias-13.c9
-rw-r--r--gcc/varpool.c10
6 files changed, 52 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c85aa65..9bb5517 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2012-02-02 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.
+
2012-02-02 Sumanth G <sumanth.gundapaneni@kpitcummins.com>
Jayant R Sonar <jayant.sonar@kpitcummins.com>
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
index 8f96d38..ddc0261 100644
--- a/gcc/cgraphunit.c
+++ b/gcc/cgraphunit.c
@@ -836,6 +836,16 @@ cgraph_analyze_function (struct cgraph_node *node)
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)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index bad0b70..2e97e5b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2012-02-02 Jan Hubicka <jh@suse.cz>
+ Tom de Vries <tom@codesourcery.com>
+
+ PR middle-end/51998
+ * testsuite/gcc.dg/alias-12.c: New testcase.
+ * testsuite/gcc.dg/alias-13.c: New testcase.
+
2012-02-02 Jakub Jelinek <jakub@redhat.com>
PR target/52086
diff --git a/gcc/testsuite/gcc.dg/alias-12.c b/gcc/testsuite/gcc.dg/alias-12.c
new file mode 100644
index 0000000..721716c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/alias-12.c
@@ -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 ();
+}
diff --git a/gcc/testsuite/gcc.dg/alias-13.c b/gcc/testsuite/gcc.dg/alias-13.c
new file mode 100644
index 0000000..a8390d4
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/alias-13.c
@@ -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 ();
+}
diff --git a/gcc/varpool.c b/gcc/varpool.c
index e01accb..c2d88c3 100644
--- a/gcc/varpool.c
+++ b/gcc/varpool.c
@@ -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. */