diff options
author | marxin <marxin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2018-03-08 08:56:20 +0000 |
---|---|---|
committer | marxin <marxin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2018-03-08 08:56:20 +0000 |
commit | 5a9269406aa5a0afa9513ed799e82a646e08e0fc (patch) | |
tree | ba8e42e8ce636f5c5013d2da19f00b87c58f6eff | |
parent | 46868340aa78744eb47b7b3073f09bb6a331e43d (diff) | |
download | gcc-5a9269406aa5a0afa9513ed799e82a646e08e0fc.tar.gz |
Backport r256226
2018-03-08 Martin Liska <mliska@suse.cz>
Backport from mainline
2018-01-04 Martin Liska <mliska@suse.cz>
PR ipa/82352
* ipa-icf.c (sem_function::merge): Do not cross comdat boundary.
2018-03-08 Martin Liska <mliska@suse.cz>
Backport from mainline
2018-01-04 Martin Liska <mliska@suse.cz>
PR ipa/82352
* g++.dg/ipa/pr82352.C: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-6-branch@258358 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/ipa-icf.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ipa/pr82352.C | 93 |
4 files changed, 120 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 55ee561efdc..38fd8214b4e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,14 @@ 2018-03-08 Martin Liska <mliska@suse.cz> Backport from mainline + 2018-01-04 Martin Liska <mliska@suse.cz> + + PR ipa/82352 + * ipa-icf.c (sem_function::merge): Do not cross comdat boundary. + +2018-03-08 Martin Liska <mliska@suse.cz> + + Backport from mainline 2017-10-31 Martin Liska <mliska@suse.cz> PR gcov-profile/82633 diff --git a/gcc/ipa-icf.c b/gcc/ipa-icf.c index d14314188e0..aa5ba454323 100644 --- a/gcc/ipa-icf.c +++ b/gcc/ipa-icf.c @@ -1116,6 +1116,17 @@ sem_function::merge (sem_item *alias_item) return false; } + if (!original->in_same_comdat_group_p (alias) + || original->comdat_local_p ()) + { + if (dump_file) + fprintf (dump_file, + "Not unifying; alias nor wrapper cannot be created; " + "across comdat group boundary\n\n"); + + return false; + } + /* See if original is in a section that can be discarded if the main symbol is not used. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8eaa7830fd3..90133666620 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2018-03-08 Martin Liska <mliska@suse.cz> + + Backport from mainline + 2018-01-04 Martin Liska <mliska@suse.cz> + + PR ipa/82352 + * g++.dg/ipa/pr82352.C: New test. + 2018-03-07 Andreas Krebbel <krebbel@linux.vnet.ibm.com> Backport from mainline diff --git a/gcc/testsuite/g++.dg/ipa/pr82352.C b/gcc/testsuite/g++.dg/ipa/pr82352.C new file mode 100644 index 00000000000..c044345a486 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pr82352.C @@ -0,0 +1,93 @@ +// PR ipa/82352 +// { dg-do compile } +// { dg-options "-O2" } + +typedef long unsigned int size_t; + +class A +{ +public : + typedef enum { Zero = 0, One = 1 } tA; + A(tA a) { m_a = a; } + +private : + tA m_a; +}; + +class B +{ +public : + void *operator new(size_t t) { return (void*)(42); }; +}; + +class C +{ +public: + virtual void ffff () = 0; +}; + +class D +{ + public : + virtual void g() = 0; + virtual void h() = 0; +}; + +template<class T> class IIII: public T, public D +{ +public: + void ffff() + { + if (!m_i2) throw A(A::One); + }; + + void h() + { + if (m_i2) throw A(A::Zero); + } + +protected: + virtual void g() + { + if (m_i1 !=0) throw A(A::Zero); + }; + +private : + int m_i1; + void *m_i2; +}; + +class E +{ +private: + size_t m_e; + static const size_t Max; + +public: + E& i(size_t a, size_t b, size_t c) + { + if ((a > Max) || (c > Max)) throw A(A::Zero ); + if (a + b > m_e) throw A(A::One ); + return (*this); + } + + inline E& j(const E &s) + { + return i(0,0,s.m_e); + } +}; + +class F : public C { }; +class G : public C { }; +class HHHH : public B, public F, public G { }; + +void k() +{ + new IIII<HHHH>(); +} + +void l() +{ + E e1, e2; + e1.j(e2); +} |