aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2014-06-21 04:39:49 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2014-06-21 02:39:49 +0000
commitb48972129f88f590aea38bf2617649c61a8424c7 (patch)
tree8ba8fcd6632c9c6760ff6d8527c1b70179fb50b7 /gcc
parentd9ff14ea9b455d7a85ff414724ce6a8fa89b8fc3 (diff)
downloadgcc-b48972129f88f590aea38bf2617649c61a8424c7.zip
gcc-b48972129f88f590aea38bf2617649c61a8424c7.tar.gz
gcc-b48972129f88f590aea38bf2617649c61a8424c7.tar.bz2
localalias.c: New testcase.
* gcc.dg/localalias.c: New testcase. * gcc.dg/localalias-2.c: New testcase. * gcc.dg/globalalias.c: New testcase. * gcc.dg/globalalias-2.c: New testcase. * ipa-visibility.c (function_and_variable_visibility): Disable temporarily local aliases for some targets. From-SVN: r211864
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/ipa-visibility.c6
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gcc.dg/globalalias-2.c20
-rw-r--r--gcc/testsuite/gcc.dg/globalalias.c42
-rw-r--r--gcc/testsuite/gcc.dg/localalias-2.c19
-rw-r--r--gcc/testsuite/gcc.dg/localalias.c42
7 files changed, 140 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 43b9939..3a52961 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2014-06-20 Jan Hubicka <hubicka@ucw.cz>
+
+ * ipa-visibility.c (function_and_variable_visibility): Disable
+ temporarily local aliases for some targets.
+
2014-06-20 Marek Polacek <polacek@redhat.com>
* asan.c (pass_sanopt::execute): Handle IFN_UBSAN_BOUNDS.
diff --git a/gcc/ipa-visibility.c b/gcc/ipa-visibility.c
index 4e0fd9e..9e4d8c3 100644
--- a/gcc/ipa-visibility.c
+++ b/gcc/ipa-visibility.c
@@ -566,7 +566,11 @@ function_and_variable_visibility (bool whole_program)
cheaper and enable more optimization.
TODO: We can also update virtual tables. */
- if (node->callers && can_replace_by_local_alias (node))
+ if (node->callers
+ /* FIXME: currently this optimization breaks on AIX. Disable it for targets
+ without comdat support for now. */
+ && SUPPORTS_ONE_ONLY
+ && can_replace_by_local_alias (node))
{
struct cgraph_node *alias = cgraph (symtab_nonoverwritable_alias (node));
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7b80a8b..d1a798a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2014-06-20 Jan Hubicka <hubicka@ucw.cz>
+
+ * gcc.dg/localalias.c: New testcase.
+ * gcc.dg/localalias-2.c: New testcase.
+ * gcc.dg/globalalias.c: New testcase.
+ * gcc.dg/globalalias-2.c: New testcase.
+
2014-06-20 Jakub Jelinek <jakub@redhat.com>
* gcc.target/arm/lto/lto.exp: Exit immediately if not arm*-*-* target.
diff --git a/gcc/testsuite/gcc.dg/globalalias-2.c b/gcc/testsuite/gcc.dg/globalalias-2.c
new file mode 100644
index 0000000..213fea6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/globalalias-2.c
@@ -0,0 +1,20 @@
+int test2count;
+extern void abort (void);
+static
+void test(void)
+{
+ test2count++;
+}
+__attribute__ ((weak,noinline))
+__attribute ((alias("test")))
+void test2(void);
+
+void tt()
+{
+ int prev = test2count;
+ /* This call must bind locally. */
+ test();
+ if (test2count == prev)
+ abort();
+ test2();
+ }
diff --git a/gcc/testsuite/gcc.dg/globalalias.c b/gcc/testsuite/gcc.dg/globalalias.c
new file mode 100644
index 0000000..eaca713
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/globalalias.c
@@ -0,0 +1,42 @@
+/* This test checks that local aliases behave sanely. This is necessary for code correctness
+ of aliases introduced by ipa-visibility pass.
+
+ This test expose weird behaviour of AIX's .set pseudo-op where the global symbol is created,
+ but all uses of the alias are syntactically replaced by uses of the target. This means that
+ both counters are increased to 2. */
+
+/* { dg-do run }
+ { dg-options "-O2" }
+ { dg-require-alias "" }
+ { dg-xfail-if "" { powerpc-ibm-aix* } { "*" } { "" } }
+ { dg-additional-sources "globalalias-2.c" } */
+extern int test2count;
+extern void abort (void);
+int testcount;
+static
+void test(void)
+{
+ testcount++;
+}
+__attribute__ ((weak,noinline))
+__attribute ((alias("test")))
+void test2(void);
+
+void main()
+{
+ test();
+ /* This call must bind locally. */
+ if (!testcount)
+ abort ();
+ test2();
+ /* Depending on linker choice, this one may bind locally
+ or to the other unit. */
+ if (!testcount && !test2count)
+ abort();
+ tt();
+
+ if ((testcount != 1 || test2count != 3)
+ && (testcount != 3 || test2count != 1))
+ abort ();
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/localalias-2.c b/gcc/testsuite/gcc.dg/localalias-2.c
new file mode 100644
index 0000000..43d59e4
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/localalias-2.c
@@ -0,0 +1,19 @@
+extern void abort (void);
+int test2count;
+__attribute__ ((weak,noinline))
+void test(void)
+{
+ test2count++;
+}
+__attribute ((alias("test")))
+static void test2(void);
+
+void tt()
+{
+ int prev = test2count;
+ /* This call must bind locally. */
+ test2();
+ if (test2count == prev)
+ abort();
+ test();
+ }
diff --git a/gcc/testsuite/gcc.dg/localalias.c b/gcc/testsuite/gcc.dg/localalias.c
new file mode 100644
index 0000000..3391c3a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/localalias.c
@@ -0,0 +1,42 @@
+/* This test checks that local aliases behave sanely. This is necessary for code correctness
+ of aliases introduced by ipa-visibility pass.
+
+ If this test fails either aliases needs to be disabled on given target on aliases with
+ proper semantic needs to be implemented. This is problem with e.g. AIX .set pseudo-op
+ that implementes alias syntactically (by substituting in assembler) rather as alternative
+ symbol defined on a target's location. */
+
+/* { dg-do run }
+ { dg-options "-Wstrict-aliasing=2 -fstrict-aliasing" }
+ { dg-require-alias "" }
+ { dg-xfail-if "" { powerpc-ibm-aix* } { "*" } { "" } }
+ { dg-additional-sources "localalias-2.c" } */
+extern void abort (void);
+extern int test2count;
+int testcount;
+__attribute__ ((weak,noinline))
+void test(void)
+{
+ testcount++;
+}
+__attribute ((alias("test")))
+static void test2(void);
+
+void main()
+{
+ test2();
+ /* This call must bind locally. */
+ if (!testcount)
+ abort ();
+ test();
+ /* Depending on linker choice, this one may bind locally
+ or to the other unit. */
+ if (!testcount && !test2count)
+ abort();
+ tt();
+
+ if ((testcount != 1 || test2count != 3)
+ && (testcount != 3 || test2count != 1))
+ abort ();
+ reutrn 0;
+}