aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTrevor Saunders <tsaunders@mozilla.com>2015-02-10 02:23:11 +0000
committerTrevor Saunders <tbsaunde@gcc.gnu.org>2015-02-10 02:23:11 +0000
commita9e083cc43d5e4c5917bfb1663fb1a34b7c2b065 (patch)
tree1699b24128dd908579747103dec52a2df2dc1a50 /gcc
parent32721b2cb51a60291f8a3bbc0d26ffaa14ee63cf (diff)
downloadgcc-a9e083cc43d5e4c5917bfb1663fb1a34b7c2b065.zip
gcc-a9e083cc43d5e4c5917bfb1663fb1a34b7c2b065.tar.gz
gcc-a9e083cc43d5e4c5917bfb1663fb1a34b7c2b065.tar.bz2
Tolerate different definitions of symbols in lto
gcc/ PR lto/64076 * ipa-visibility.c (update_visibility_by_resolution_info): Only assert when not in lto mode. From-SVN: r220561
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/ipa-visibility.c18
-rw-r--r--gcc/testsuite/g++.dg/lto/pr64076.H20
-rw-r--r--gcc/testsuite/g++.dg/lto/pr64076_0.C10
-rw-r--r--gcc/testsuite/g++.dg/lto/pr64076_1.C5
5 files changed, 54 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 83bc911..d98276b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/ipa-visibility.c b/gcc/ipa-visibility.c
index 00b28e6..a8ac971 100644
--- a/gcc/ipa-visibility.c
+++ b/gcc/ipa-visibility.c
@@ -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
index 0000000..6afe37a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lto/pr64076.H
@@ -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
index 0000000..fb9b060
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lto/pr64076_0.C
@@ -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
index 0000000..4bd0081
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lto/pr64076_1.C
@@ -0,0 +1,5 @@
+// { dg-options -fno-lto }
+
+#include "pr64076.H"
+
+void S::f() { }