Message ID | 4bc9ff0d-18e0-4a36-a5e2-abdc8c9bde7c@suse.cz |
---|---|
State | New |
Headers | show |
Series | Release function and edge summaries allocated with GGC. | expand |
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? Thanks, Martin
> 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 <mliska@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 <mliska@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 <mliska@suse.cz> > sub RSA 2048/1C617839 2019-10-29 >
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..65414a6aaf6 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,14 @@ 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 +528,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 +570,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 +613,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 +691,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 +780,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 +856,14 @@ 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>