]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
* gcc.dg/localalias.c: New testcase.
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 21 Jun 2014 02:39:49 +0000 (02:39 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 21 Jun 2014 02:39:49 +0000 (02:39 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@211864 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/ipa-visibility.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/globalalias-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/globalalias.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/localalias-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/localalias.c [new file with mode: 0644]

index 43b9939c010bf691b477184e3da7f10565b620df..3a52961fecb75de60088622149c8e1f712b6768d 100644 (file)
@@ -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.
index 4e0fd9e0b405056a38723e6883a0465566f27c19..9e4d8c38f4b62edbeae7ee6cb040dccaeae17760 100644 (file)
@@ -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));
 
index 7b80a8b2af02ab2471dcf05e4059178a476fb436..d1a798a231091d87b45529403b887ff5eaabc626 100644 (file)
@@ -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 (file)
index 0000000..213fea6
--- /dev/null
@@ -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 (file)
index 0000000..eaca713
--- /dev/null
@@ -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 (file)
index 0000000..43d59e4
--- /dev/null
@@ -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 (file)
index 0000000..3391c3a
--- /dev/null
@@ -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;
+}