diff options
author | Trevor Saunders <tsaunders@mozilla.com> | 2015-02-10 02:23:11 +0000 |
---|---|---|
committer | Trevor Saunders <tbsaunde@gcc.gnu.org> | 2015-02-10 02:23:11 +0000 |
commit | a9e083cc43d5e4c5917bfb1663fb1a34b7c2b065 (patch) | |
tree | 1699b24128dd908579747103dec52a2df2dc1a50 /gcc | |
parent | 32721b2cb51a60291f8a3bbc0d26ffaa14ee63cf (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/ipa-visibility.c | 18 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lto/pr64076.H | 20 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lto/pr64076_0.C | 10 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lto/pr64076_1.C | 5 |
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() { } |