Commit fcb6fced by Martin Liska Committed by Martin Liska

Be careful about comdat boundary in ICF (PR ipa/82352).

2018-01-04  Martin Liska  <mliska@suse.cz>

	PR ipa/82352
	* ipa-icf.c (sem_function::merge): Do not cross comdat boundary.
2018-01-04  Martin Liska  <mliska@suse.cz>

	PR ipa/82352
	* g++.dg/ipa/pr82352.C: New test.

From-SVN: r256226
parent 517d4896
2018-01-04 Martin Liska <mliska@suse.cz>
PR ipa/82352
* ipa-icf.c (sem_function::merge): Do not cross comdat boundary.
2018-01-04 Jakub Jelinek <jakub@redhat.com>
* gimple-ssa-sprintf.c (parse_directive): Cast second dir.len to uhwi.
......
......@@ -1113,6 +1113,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. */
......
2018-01-04 Martin Liska <mliska@suse.cz>
PR ipa/82352
* g++.dg/ipa/pr82352.C: New test.
2018-01-04 Jakub Jelinek <jakub@redhat.com>
* gcc.dg/vect-opt-info-1.c: Moved to ...
......
// 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);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment