summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormarxin <marxin@138bc75d-0d04-0410-961f-82ee72b054a4>2018-01-17 11:46:31 +0000
committermarxin <marxin@138bc75d-0d04-0410-961f-82ee72b054a4>2018-01-17 11:46:31 +0000
commit09c9f2e5d9648a01ff6ff1e206a92cc2b1ddaee9 (patch)
treeb2a014441828238e2567b74420e3991184590d74
parent470a1124f822114ae73e4f257cf095726013dab9 (diff)
Backport r256226
2018-01-17 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-01-17 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-7-branch@256789 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/ipa-icf.c11
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/g++.dg/ipa/pr82352.C93
4 files changed, 120 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7cc7dc8d20d8..0879364d4a46 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,6 +1,14 @@
2018-01-17 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-01-17 Martin Liska <mliska@suse.cz>
+
+ Backport from mainline
2018-01-03 Martin Liska <mliska@suse.cz>
PR ipa/83549
diff --git a/gcc/ipa-icf.c b/gcc/ipa-icf.c
index b9a5b4f2546f..95fad30e83a0 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 394690eba3bf..796e30c74c6e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,6 +1,14 @@
2018-01-17 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-01-17 Martin Liska <mliska@suse.cz>
+
+ Backport from mainline
2018-01-03 Martin Liska <mliska@suse.cz>
PR ipa/83549
diff --git a/gcc/testsuite/g++.dg/ipa/pr82352.C b/gcc/testsuite/g++.dg/ipa/pr82352.C
new file mode 100644
index 000000000000..c044345a486c
--- /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);
+}