diff options
author | Martin Liska <mliska@suse.cz> | 2015-02-09 11:31:14 +0100 |
---|---|---|
committer | Martin Liska <marxin@gcc.gnu.org> | 2015-02-09 10:31:14 +0000 |
commit | e3e968e90602ffd3ccbff201b8202b0d4075b4e9 (patch) | |
tree | 98c5f1bf15588bc3ef2c03d7a88ed5a45eb843d9 | |
parent | 62e0e086d37e81581648631aa0ad3e6af3814cad (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/ipa-icf.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ipa/pr64858.C | 93 |
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); } |