Tolerate different definitions of symbols in lto
authorTrevor Saunders <tsaunders@mozilla.com>
Tue, 10 Feb 2015 02:23:11 +0000 (02:23 +0000)
committerTrevor Saunders <tbsaunde@gcc.gnu.org>
Tue, 10 Feb 2015 02:23:11 +0000 (02:23 +0000)
gcc/

PR lto/64076
* ipa-visibility.c (update_visibility_by_resolution_info): Only
assert when not in lto mode.

From-SVN: r220561

gcc/ChangeLog
gcc/ipa-visibility.c
gcc/testsuite/g++.dg/lto/pr64076.H [new file with mode: 0644]
gcc/testsuite/g++.dg/lto/pr64076_0.C [new file with mode: 0644]
gcc/testsuite/g++.dg/lto/pr64076_1.C [new file with mode: 0644]

index 83bc9112535bf33cb0a3e1609fee2cdae243f822..d98276b80b3bfb858b72dfbf2e7d7a8f73f9450e 100644 (file)
@@ -1,3 +1,9 @@
+2015-02-09  Trevor Saunders  <tsaunders@mozilla.com>
+
+       PR lto/64076
+       * ipa-visibility.c (update_visibility_by_resolution_info): Only
+       assert when not in lto mode.
+
 2015-02-09  Zhouyi Zhou   <yizhouzhou@ict.ac.cn>
 
        * ira-color.c (setup_left_conflict_sizes_p): Simplify
index 00b28e6e89c02c3572004266330b2885d3f1f2b4..a8ac971b848068cd754f21876e130f960e3e349d 100644 (file)
@@ -424,11 +424,19 @@ update_visibility_by_resolution_info (symtab_node * node)
   if (node->same_comdat_group)
     for (symtab_node *next = node->same_comdat_group;
         next != node; next = next->same_comdat_group)
-      gcc_assert (!next->externally_visible
-                 || define == (next->resolution == LDPR_PREVAILING_DEF_IRONLY
-                               || next->resolution == LDPR_PREVAILING_DEF
-                               || next->resolution == LDPR_UNDEF
-                               || next->resolution == LDPR_PREVAILING_DEF_IRONLY_EXP));
+      {
+       if (!next->externally_visible)
+         continue;
+
+       bool same_def
+         = define == (next->resolution == LDPR_PREVAILING_DEF_IRONLY
+                      || next->resolution == LDPR_PREVAILING_DEF
+                      || next->resolution == LDPR_UNDEF
+                      || next->resolution == LDPR_PREVAILING_DEF_IRONLY_EXP);
+       gcc_assert (in_lto_p || same_def);
+       if (!same_def)
+         return;
+      }
 
   if (node->same_comdat_group)
     for (symtab_node *next = node->same_comdat_group;
diff --git a/gcc/testsuite/g++.dg/lto/pr64076.H b/gcc/testsuite/g++.dg/lto/pr64076.H
new file mode 100644 (file)
index 0000000..6afe37a
--- /dev/null
@@ -0,0 +1,20 @@
+struct Base {
+  virtual void f() = 0;
+};
+
+struct X : public Base { };
+struct Y : public Base { };
+struct Z : public Base { };
+struct T : public Base { };
+
+struct S : public X, public Y, public Z
+#ifdef XXX
+, public T
+#endif
+{
+  void f()
+#ifdef XXX
+  { }
+#endif
+  ;
+};
diff --git a/gcc/testsuite/g++.dg/lto/pr64076_0.C b/gcc/testsuite/g++.dg/lto/pr64076_0.C
new file mode 100644 (file)
index 0000000..fb9b060
--- /dev/null
@@ -0,0 +1,10 @@
+// { dg-lto-do link }
+
+#define XXX
+#include "pr64076.H"
+
+int main()
+{
+  S s;
+  return 0;
+}
diff --git a/gcc/testsuite/g++.dg/lto/pr64076_1.C b/gcc/testsuite/g++.dg/lto/pr64076_1.C
new file mode 100644 (file)
index 0000000..4bd0081
--- /dev/null
@@ -0,0 +1,5 @@
+// { dg-options -fno-lto }
+
+#include "pr64076.H"
+
+void S::f() { }