aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2015-02-09 11:31:14 +0100
committerMartin Liska <marxin@gcc.gnu.org>2015-02-09 10:31:14 +0000
commite3e968e90602ffd3ccbff201b8202b0d4075b4e9 (patch)
tree98c5f1bf15588bc3ef2c03d7a88ed5a45eb843d9
parent62e0e086d37e81581648631aa0ad3e6af3814cad (diff)
downloadgcc-e3e968e90602ffd3ccbff201b8202b0d4075b4e9.zip
gcc-e3e968e90602ffd3ccbff201b8202b0d4075b4e9.tar.gz
gcc-e3e968e90602ffd3ccbff201b8202b0d4075b4e9.tar.bz2
IPA ICF: Fix late initialization of callgraph hooks.
* g++.dg/ipa/pr64858.C: New test. * ipa-icf.c (sem_item_optimizer::register_hooks): Register hooks just if not yet registered. (ipa_icf_generate_summary): Register callgraph hooks. From-SVN: r220531
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/ipa-icf.c11
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/ipa/pr64858.C93
4 files changed, 110 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bd74326..202a815 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2015-02-09 Martin Liska <mliska@suse.cz>
+
+ * ipa-icf.c (sem_item_optimizer::register_hooks): Register hooks
+ just if not yet registered.
+ (ipa_icf_generate_summary): Register callgraph hooks.
+
2015-02-08 Andrew Pinski <apinski@cavium.com>
* config/aarch64/aarch64.c (gty_dummy): Delete.
diff --git a/gcc/ipa-icf.c b/gcc/ipa-icf.c
index cf5e5d9..d19ddc3 100644
--- a/gcc/ipa-icf.c
+++ b/gcc/ipa-icf.c
@@ -1562,11 +1562,13 @@ sem_item_optimizer::read_summary (void)
void
sem_item_optimizer::register_hooks (void)
{
- m_cgraph_node_hooks = symtab->add_cgraph_removal_hook
- (&sem_item_optimizer::cgraph_removal_hook, this);
+ if (!m_cgraph_node_hooks)
+ m_cgraph_node_hooks = symtab->add_cgraph_removal_hook
+ (&sem_item_optimizer::cgraph_removal_hook, this);
- m_varpool_node_hooks = symtab->add_varpool_removal_hook
- (&sem_item_optimizer::varpool_removal_hook, this);
+ if (!m_varpool_node_hooks)
+ m_varpool_node_hooks = symtab->add_varpool_removal_hook
+ (&sem_item_optimizer::varpool_removal_hook, this);
}
/* Unregister callgraph and varpool hooks. */
@@ -2438,6 +2440,7 @@ ipa_icf_generate_summary (void)
if (!optimizer)
optimizer = new sem_item_optimizer ();
+ optimizer->register_hooks ();
optimizer->parse_funcs_and_vars ();
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index bef2f19..020b9be 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2015-02-09 Martin Liska <mliska@suse.cz>
+
+ * g++.dg/ipa/pr64858.C: New test.
+
2015-02-09 Tom de Vries <tom@codesourcery.com>
* gcc.dg/uninit-19.c: Fix warning line for fpic.
diff --git a/gcc/testsuite/g++.dg/ipa/pr64858.C b/gcc/testsuite/g++.dg/ipa/pr64858.C
new file mode 100644
index 0000000..c03feaf
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ipa/pr64858.C
@@ -0,0 +1,93 @@
+// { dg-do compile }
+// { dg-options "-O2 -std=gnu++11" }
+
+template <class reference_type> class A
+{
+ reference_type *m_pBody;
+public:
+ A (const A &) { m_pBody->acquire (); }
+};
+class B;
+class C
+{
+protected:
+ B *_pInterface;
+};
+template <class interface_type> class I : C
+{
+public:
+ I (interface_type *);
+};
+class B
+{
+public:
+ virtual void acquire ();
+};
+class D
+{
+protected:
+ void acquire ();
+};
+template <class Ifc1> class J : D, public Ifc1
+{
+ void
+ acquire ()
+ {
+ D::acquire ();
+ }
+};
+class K : B
+{
+};
+class L;
+class F
+{
+ A<L> m_pDocument;
+ F (A<L> const &, int &&);
+};
+class XUnoTunnel;
+class XEventTarget;
+template <class, class> class WeakImplHelper3 : D, B
+{
+ void
+ acquire ()
+ {
+ D::acquire ();
+ }
+};
+template <class> class G
+{
+public:
+ void
+ acquire ()
+ {
+ WeakImplHelper3<XUnoTunnel, XEventTarget> ();
+ }
+};
+struct H
+{
+ H ()
+ : mxAttribList (new J<B>), mxCurrentHandler (0), mxDocHandler (0),
+ mxTokenHandler (0)
+ {
+ }
+ I<J<B> > mxAttribList;
+ I<int> mxCurrentHandler;
+ I<int> mxDocHandler;
+ I<int> mxTokenHandler;
+};
+class L : public G<int>
+{
+};
+class M : public J<K>
+{
+public:
+ M ();
+};
+template <class interface_type> I<interface_type>::I (interface_type *p1)
+{
+ B *a = static_cast<B *> (static_cast<void *> (p1));
+ _pInterface = a;
+ _pInterface->acquire ();
+}
+F::F (A<L> const &p1, int &&) : m_pDocument (p1) { I<K> (new M); }