On 03/25/2015 12:37 AM, Jan Hubicka wrote:
On Tue, Mar 24, 2015 at 10:54:25PM +0100, Martin Liška wrote:
--- a/gcc/symbol-summary.h
+++ b/gcc/symbol-summary.h
@@ -81,6 +81,12 @@ public:
m_symtab_insertion_hook = NULL;
m_symtab_removal_hook = NULL;
m_symtab_duplication_hook = NULL;
+
+ /* Release all summaries in case we use non-GGC memory. */
+ typedef typename hash_map <int, T *, summary_hashmap_traits>::iterator
map_iterator;
+ if (!m_ggc)
+ for (map_iterator it = m_map.begin (); it != m_map.end (); ++it)
+ release ((*it).second);
You haven't removed the now unnecessary if (!m_ggc) guard.
@@ -106,6 +112,15 @@ public:
return m_ggc ? new (ggc_alloc <T> ()) T() : new T () ;
}
+ /* Release an item that is stored within map. */
+ void release (T *item)
+ {
+ if (m_ggc)
+ ggc_free (item);
Perhaps run also the item's destructor first? I know that
inline_summary doesn't have a user destructor, so it will expand to nothing,
so it would be just for completeness.
Yep, calling destructors is a good idea. OK with that change
and fix Jakub pointed out.
Honza
+ else
+ delete item;
+ }
+
Jakub
Ok, changes are applied in the final patch I'm going to install.
Thanks,
Martin
>From 6eae938e34e36c461ebec1570ff0f3d2f5e1b8cf Mon Sep 17 00:00:00 2001
From: mliska <mli...@suse.cz>
Date: Tue, 24 Mar 2015 13:58:50 +0100
Subject: [PATCH] Fix PR65538.
gcc/ChangeLog:
2015-03-24 Martin Liska <mli...@suse.cz>
PR tree-optimization/65538
* symbol-summary.h (function_summary::~function_summary):
Relese memory for allocated summaries.
(function_summary::release): New function.
---
gcc/symbol-summary.h | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/gcc/symbol-summary.h b/gcc/symbol-summary.h
index 8d7e42c..0448310 100644
--- a/gcc/symbol-summary.h
+++ b/gcc/symbol-summary.h
@@ -81,6 +81,11 @@ public:
m_symtab_insertion_hook = NULL;
m_symtab_removal_hook = NULL;
m_symtab_duplication_hook = NULL;
+
+ /* Release all summaries. */
+ typedef typename hash_map <int, T *, summary_hashmap_traits>::iterator map_iterator;
+ for (map_iterator it = m_map.begin (); it != m_map.end (); ++it)
+ release ((*it).second);
}
/* Traverses all summarys with a function F called with
@@ -106,6 +111,18 @@ public:
return m_ggc ? new (ggc_alloc <T> ()) T() : new T () ;
}
+ /* Release an item that is stored within map. */
+ void release (T *item)
+ {
+ if (m_ggc)
+ {
+ item->~T ();
+ ggc_free (item);
+ }
+ else
+ delete item;
+ }
+
/* Getter for summary callgraph node pointer. */
T* get (cgraph_node *node)
{
--
2.1.4