> Hi. > > There's updated version that puts back vec_free to destructors. > It's necessary to properly release memory. > > Patch can bootstrap on x86_64-linux-gnu and survives regression tests. > > Ready to be installed? OK, thanks! (I will also check it on firefox memory stats) Honza > Thanks, > Martin
> From 8faffc371e5cc3610f18ff1e65f7f14af397233a Mon Sep 17 00:00:00 2001 > From: Martin Liska <mli...@suse.cz> > Date: Tue, 29 Oct 2019 10:03:49 +0100 > Subject: [PATCH] Release function and edge summaries allocated with GGC. > > gcc/ChangeLog: > > 2019-10-29 Martin Liska <mli...@suse.cz> > > * ggc.h (ggc_alloc_no_dtor): New function. > * ipa-fnsummary.c (ipa_free_fn_summary): Call > destructor and ggc_free. > (ipa_free_size_summary): Call delete instead > of release. > * ipa-fnsummary.h: Use new function ggc_alloc_no_dtor. > * ipa-prop.c (ipa_check_create_edge_args): Likewise. > (ipa_free_all_edge_args): Call destructor and ggc_free. > (ipa_free_all_node_params): Likewise. > (ipcp_free_transformation_sum): Likewise. > * ipa-prop.h (ipa_check_create_node_params): > Call new ggc_alloc_no_dtor. > * ipa-sra.c (ipa_sra_generate_summary): Likewise. > (ipa_sra_analysis): Call destructor and ggc_free. > Replace release with delete operator. > * symbol-summary.h (release): Remove .. > (V>::~fast_function_summary): and move logic here. > Likewise for other classes. > --- > gcc/ggc.h | 12 +++++++ > gcc/ipa-fnsummary.c | 6 ++-- > gcc/ipa-fnsummary.h | 4 +-- > gcc/ipa-prop.c | 11 ++++--- > gcc/ipa-prop.h | 4 +-- > gcc/ipa-sra.c | 9 ++--- > gcc/symbol-summary.h | 78 ++++++-------------------------------------- > 7 files changed, 41 insertions(+), 83 deletions(-) > > diff --git a/gcc/ggc.h b/gcc/ggc.h > index 31606dc843f..ede36c42eb3 100644 > --- a/gcc/ggc.h > +++ b/gcc/ggc.h > @@ -185,6 +185,18 @@ ggc_alloc (ALONE_CXX_MEM_STAT_INFO) > PASS_MEM_STAT)); > } > > +/* GGC allocation function that does not call finalizer for type > + that have need_finalization_p equal to true. User is responsible > + for calling of the destructor. */ > + > +template<typename T> > +inline T * > +ggc_alloc_no_dtor (ALONE_CXX_MEM_STAT_INFO) > +{ > + return static_cast<T *> (ggc_internal_alloc (sizeof (T), NULL, 0, 1 > + PASS_MEM_STAT)); > +} > + > template<typename T> > inline T * > ggc_cleared_alloc (ALONE_CXX_MEM_STAT_INFO) > diff --git a/gcc/ipa-fnsummary.c b/gcc/ipa-fnsummary.c > index 0d38e42546d..f01709caf28 100644 > --- a/gcc/ipa-fnsummary.c > +++ b/gcc/ipa-fnsummary.c > @@ -3873,9 +3873,9 @@ ipa_free_fn_summary (void) > { > if (!ipa_call_summaries) > return; > - ipa_fn_summaries->release (); > + ipa_fn_summaries->~fast_function_summary <ipa_fn_summary *, va_gc> (); > + ggc_free (ipa_fn_summaries); > ipa_fn_summaries = NULL; > - ipa_call_summaries->release (); > delete ipa_call_summaries; > ipa_call_summaries = NULL; > edge_predicate_pool.release (); > @@ -3891,7 +3891,7 @@ ipa_free_size_summary (void) > { > if (!ipa_size_summaries) > return; > - ipa_size_summaries->release (); > + delete ipa_size_summaries; > ipa_size_summaries = NULL; > } > > diff --git a/gcc/ipa-fnsummary.h b/gcc/ipa-fnsummary.h > index f6457303689..525d4b70207 100644 > --- a/gcc/ipa-fnsummary.h > +++ b/gcc/ipa-fnsummary.h > @@ -194,8 +194,8 @@ public: > > static ipa_fn_summary_t *create_ggc (symbol_table *symtab) > { > - class ipa_fn_summary_t *summary = new (ggc_alloc <ipa_fn_summary_t> ()) > - ipa_fn_summary_t (symtab); > + class ipa_fn_summary_t *summary > + = new (ggc_alloc_no_dtor<ipa_fn_summary_t> ()) ipa_fn_summary_t > (symtab); > summary->disable_insertion_hook (); > return summary; > } > diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c > index 0dd73561419..9dfbe1a12d6 100644 > --- a/gcc/ipa-prop.c > +++ b/gcc/ipa-prop.c > @@ -3719,7 +3719,7 @@ ipa_check_create_edge_args (void) > { > if (!ipa_edge_args_sum) > ipa_edge_args_sum > - = (new (ggc_cleared_alloc <ipa_edge_args_sum_t> ()) > + = (new (ggc_alloc_no_dtor<ipa_edge_args_sum_t> ()) > ipa_edge_args_sum_t (symtab, true)); > if (!ipa_bits_hash_table) > ipa_bits_hash_table = hash_table<ipa_bit_ggc_hash_traits>::create_ggc > (37); > @@ -3735,7 +3735,8 @@ ipa_free_all_edge_args (void) > if (!ipa_edge_args_sum) > return; > > - ipa_edge_args_sum->release (); > + ipa_edge_args_sum->~ipa_edge_args_sum_t (); > + ggc_free (ipa_edge_args_sum); > ipa_edge_args_sum = NULL; > } > > @@ -3744,7 +3745,8 @@ ipa_free_all_edge_args (void) > void > ipa_free_all_node_params (void) > { > - ipa_node_params_sum->release (); > + ipa_node_params_sum->~ipa_node_params_t (); > + ggc_free (ipa_node_params_sum); > ipa_node_params_sum = NULL; > } > > @@ -3770,7 +3772,8 @@ ipcp_free_transformation_sum (void) > if (!ipcp_transformation_sum) > return; > > - ipcp_transformation_sum->release (); > + ipcp_transformation_sum->~function_summary<ipcp_transformation *> (); > + ggc_free (ipcp_transformation_sum); > ipcp_transformation_sum = NULL; > } > > diff --git a/gcc/ipa-prop.h b/gcc/ipa-prop.h > index 6811ed765df..07a7eea9249 100644 > --- a/gcc/ipa-prop.h > +++ b/gcc/ipa-prop.h > @@ -672,7 +672,7 @@ public: > static ipcp_transformation_t *create_ggc (symbol_table *symtab) > { > ipcp_transformation_t *summary > - = new (ggc_cleared_alloc <ipcp_transformation_t> ()) > + = new (ggc_alloc_no_dtor <ipcp_transformation_t> ()) > ipcp_transformation_t (symtab, true); > return summary; > } > @@ -710,7 +710,7 @@ ipa_check_create_node_params (void) > { > if (!ipa_node_params_sum) > ipa_node_params_sum > - = (new (ggc_cleared_alloc <ipa_node_params_t> ()) > + = (new (ggc_alloc_no_dtor <ipa_node_params_t> ()) > ipa_node_params_t (symtab, true)); > } > > diff --git a/gcc/ipa-sra.c b/gcc/ipa-sra.c > index 836db401588..038f38b912a 100644 > --- a/gcc/ipa-sra.c > +++ b/gcc/ipa-sra.c > @@ -2546,7 +2546,7 @@ ipa_sra_generate_summary (void) > gcc_checking_assert (!func_sums); > gcc_checking_assert (!call_sums); > func_sums > - = (new (ggc_cleared_alloc <ipa_sra_function_summaries> ()) > + = (new (ggc_alloc_no_dtor <ipa_sra_function_summaries> ()) > ipa_sra_function_summaries (symtab, true)); > call_sums = new ipa_sra_call_summaries (symtab); > > @@ -2805,7 +2805,7 @@ ipa_sra_read_summary (void) > gcc_checking_assert (!func_sums); > gcc_checking_assert (!call_sums); > func_sums > - = (new (ggc_cleared_alloc <ipa_sra_function_summaries> ()) > + = (new (ggc_alloc_no_dtor <ipa_sra_function_summaries> ()) > ipa_sra_function_summaries (symtab, true)); > call_sums = new ipa_sra_call_summaries (symtab); > > @@ -3989,9 +3989,10 @@ ipa_sra_analysis (void) > process_isra_node_results (node, clone_num_suffixes); > > delete clone_num_suffixes; > - func_sums->release (); > + func_sums->~ipa_sra_function_summaries (); > + ggc_free (func_sums); > func_sums = NULL; > - call_sums->release (); > + delete call_sums; > call_sums = NULL; > > if (dump_file) > diff --git a/gcc/symbol-summary.h b/gcc/symbol-summary.h > index a0bacadb63b..6b26b604b38 100644 > --- a/gcc/symbol-summary.h > +++ b/gcc/symbol-summary.h > @@ -29,7 +29,7 @@ class function_summary_base > public: > /* Default construction takes SYMTAB as an argument. */ > function_summary_base (symbol_table *symtab): m_symtab (symtab), > - m_insertion_enabled (true), m_released (false) > + m_insertion_enabled (true) > {} > > /* Basic implementation of insert operation. */ > @@ -88,8 +88,6 @@ protected: > > /* Indicates if insertion hook is enabled. */ > bool m_insertion_enabled; > - /* Indicates if the summary is released. */ > - bool m_released; > > private: > /* Return true when the summary uses GGC memory for allocation. */ > @@ -134,14 +132,7 @@ public: > function_summary (symbol_table *symtab, bool ggc = false); > > /* Destructor. */ > - virtual ~function_summary () > - { > - release (); > - } > - > - /* Destruction method that can be called for GGC purpose. */ > - using function_summary_base<T>::release; > - void release (); > + virtual ~function_summary (); > > /* Traverses all summarys with a function F called with > ARG as argument. */ > @@ -237,20 +228,14 @@ function_summary<T *>::function_summary (symbol_table > *symtab, bool ggc): > } > > template <typename T> > -void > -function_summary<T *>::release () > +function_summary<T *>::~function_summary () > { > - if (this->m_released) > - return; > - > this->unregister_hooks (); > > /* Release all summaries. */ > typedef typename hash_map <map_hash, T *>::iterator map_iterator; > for (map_iterator it = m_map.begin (); it != m_map.end (); ++it) > this->release ((*it).second); > - > - this->m_released = true; > } > > template <typename T> > @@ -343,14 +328,7 @@ public: > fast_function_summary (symbol_table *symtab); > > /* Destructor. */ > - virtual ~fast_function_summary () > - { > - release (); > - } > - > - /* Destruction method that can be called for GGC purpose. */ > - using function_summary_base<T>::release; > - void release (); > + virtual ~fast_function_summary (); > > /* Traverses all summarys with a function F called with > ARG as argument. */ > @@ -445,22 +423,15 @@ fast_function_summary<T *, V>::fast_function_summary > (symbol_table *symtab): > } > > template <typename T, typename V> > -void > -fast_function_summary<T *, V>::release () > +fast_function_summary<T *, V>::~fast_function_summary () > { > - if (this->m_released) > - return; > - > this->unregister_hooks (); > > /* Release all summaries. */ > for (unsigned i = 0; i < m_vector->length (); i++) > if ((*m_vector)[i] != NULL) > this->release ((*m_vector)[i]); > - > vec_free (m_vector); > - > - this->m_released = true; > } > > template <typename T, typename V> > @@ -558,7 +529,7 @@ class call_summary_base > public: > /* Default construction takes SYMTAB as an argument. */ > call_summary_base (symbol_table *symtab): m_symtab (symtab), > - m_initialize_when_cloning (true), m_released (false) > + m_initialize_when_cloning (true) > {} > > /* Basic implementation of removal operation. */ > @@ -600,8 +571,6 @@ protected: > cgraph_2edge_hook_list *m_symtab_duplication_hook; > /* Initialize summary for an edge that is cloned. */ > bool m_initialize_when_cloning; > - /* Indicates if the summary is released. */ > - bool m_released; > > private: > /* Return true when the summary uses GGC memory for allocation. */ > @@ -645,14 +614,7 @@ public: > } > > /* Destructor. */ > - virtual ~call_summary () > - { > - release (); > - } > - > - /* Destruction method that can be called for GGC purpose. */ > - using call_summary_base<T>::release; > - void release (); > + virtual ~call_summary (); > > /* Traverses all summarys with an edge E called with > ARG as argument. */ > @@ -730,20 +692,14 @@ private: > }; > > template <typename T> > -void > -call_summary<T *>::release () > +call_summary<T *>::~call_summary () > { > - if (this->m_released) > - return; > - > this->unregister_hooks (); > > /* Release all summaries. */ > typedef typename hash_map <map_hash, T *>::iterator map_iterator; > for (map_iterator it = m_map.begin (); it != m_map.end (); ++it) > this->release ((*it).second); > - > - this->m_released = true; > } > > template <typename T> > @@ -825,14 +781,7 @@ public: > } > > /* Destructor. */ > - virtual ~fast_call_summary () > - { > - release (); > - } > - > - /* Destruction method that can be called for GGC purpose. */ > - using call_summary_base<T>::release; > - void release (); > + virtual ~fast_call_summary (); > > /* Traverses all summarys with an edge F called with > ARG as argument. */ > @@ -908,22 +857,15 @@ private: > }; > > template <typename T, typename V> > -void > -fast_call_summary<T *, V>::release () > +fast_call_summary<T *, V>::~fast_call_summary () > { > - if (this->m_released) > - return; > - > this->unregister_hooks (); > > /* Release all summaries. */ > for (unsigned i = 0; i < m_vector->length (); i++) > if ((*m_vector)[i] != NULL) > this->release ((*m_vector)[i]); > - > vec_free (m_vector); > - > - this->m_released = true; > } > > template <typename T, typename V> > -- > 2.23.0 > pub RSA 2048/A22D152C 2019-10-29 Martin Liška <mli...@suse.cz> > sub RSA 2048/1C617839 2019-10-29 >