Fix memory leaks in IPA CP (PR ipa/79337).
2017-02-03 Martin Liska <mliska@suse.cz> PR ipa/79337 * ipa-prop.c (ipa_node_params_t::insert): Remove current implementation. (ipa_node_params_t::remove): Likewise. * ipa-prop.h (ipa_node_params::ipa_node_params): Make default initialization from removed ipa_node_params_t::insert. (ipa_node_params::~ipa_node_params): Move from removed ipa_node_params_t::release. * symbol-summary.h (symbol_summary::m_released): New member. Do not release a summary twice. Do not allow to call finalizer for types of a summary that live in GGC memory. From-SVN: r245145
This commit is contained in:
parent
6d5b4f9e71
commit
e806796de0
4 changed files with 52 additions and 49 deletions
|
@ -1,3 +1,17 @@
|
|||
2017-02-03 Martin Liska <mliska@suse.cz>
|
||||
|
||||
PR ipa/79337
|
||||
* ipa-prop.c (ipa_node_params_t::insert): Remove current
|
||||
implementation.
|
||||
(ipa_node_params_t::remove): Likewise.
|
||||
* ipa-prop.h (ipa_node_params::ipa_node_params): Make default
|
||||
initialization from removed ipa_node_params_t::insert.
|
||||
(ipa_node_params::~ipa_node_params): Move from removed
|
||||
ipa_node_params_t::release.
|
||||
* symbol-summary.h (symbol_summary::m_released): New member.
|
||||
Do not release a summary twice. Do not allow to call finalizer
|
||||
for types of a summary that live in GGC memory.
|
||||
|
||||
2017-02-02 Naveen H.S <Naveen.Hurugalawadi@cavium.com>
|
||||
|
||||
* config/aarch64/aarch64.c (thunderx2t99_tunings): Enable AES and
|
||||
|
|
|
@ -3736,38 +3736,6 @@ ipa_add_new_function (cgraph_node *node, void *data ATTRIBUTE_UNUSED)
|
|||
ipa_analyze_node (node);
|
||||
}
|
||||
|
||||
/* Initialize a newly created param info. */
|
||||
|
||||
void
|
||||
ipa_node_params_t::insert (cgraph_node *, ipa_node_params *info)
|
||||
{
|
||||
info->lattices = NULL;
|
||||
info->ipcp_orig_node = NULL;
|
||||
info->known_csts = vNULL;
|
||||
info->known_contexts = vNULL;
|
||||
info->analysis_done = 0;
|
||||
info->node_enqueued = 0;
|
||||
info->do_clone_for_all_contexts = 0;
|
||||
info->is_all_contexts_clone = 0;
|
||||
info->node_dead = 0;
|
||||
info->node_within_scc = 0;
|
||||
info->node_calling_single_call = 0;
|
||||
info->versionable = 0;
|
||||
}
|
||||
|
||||
/* Frees all dynamically allocated structures that the param info points
|
||||
to. */
|
||||
|
||||
void
|
||||
ipa_node_params_t::remove (cgraph_node *, ipa_node_params *info)
|
||||
{
|
||||
free (info->lattices);
|
||||
/* Lattice values and their sources are deallocated with their alocation
|
||||
pool. */
|
||||
info->known_csts.release ();
|
||||
info->known_contexts.release ();
|
||||
}
|
||||
|
||||
/* Hook that is called by summary when a node is duplicated. */
|
||||
|
||||
void
|
||||
|
|
|
@ -320,6 +320,12 @@ struct GTY(()) ipa_param_descriptor
|
|||
|
||||
struct GTY((for_user)) ipa_node_params
|
||||
{
|
||||
/* Default constructor. */
|
||||
ipa_node_params ();
|
||||
|
||||
/* Default destructor. */
|
||||
~ipa_node_params ();
|
||||
|
||||
/* Information about individual formal parameters that are gathered when
|
||||
summaries are generated. */
|
||||
vec<ipa_param_descriptor, va_gc> *descriptors;
|
||||
|
@ -356,6 +362,24 @@ struct GTY((for_user)) ipa_node_params
|
|||
unsigned versionable : 1;
|
||||
};
|
||||
|
||||
inline
|
||||
ipa_node_params::ipa_node_params ()
|
||||
: descriptors (NULL), lattices (NULL), ipcp_orig_node (NULL),
|
||||
known_csts (vNULL), known_contexts (vNULL), analysis_done (0),
|
||||
node_enqueued (0), do_clone_for_all_contexts (0), is_all_contexts_clone (0),
|
||||
node_dead (0), node_within_scc (0), node_calling_single_call (0),
|
||||
versionable (0)
|
||||
{
|
||||
}
|
||||
|
||||
inline
|
||||
ipa_node_params::~ipa_node_params ()
|
||||
{
|
||||
free (lattices);
|
||||
known_csts.release ();
|
||||
known_contexts.release ();
|
||||
}
|
||||
|
||||
/* Intermediate information that we get from alias analysis about a particular
|
||||
parameter in a particular basic_block. When a parameter or the memory it
|
||||
references is marked modified, we use that information in all dominated
|
||||
|
@ -579,10 +603,6 @@ public:
|
|||
ipa_node_params_t (symbol_table *table, bool ggc):
|
||||
function_summary<ipa_node_params *> (table, ggc) { }
|
||||
|
||||
/* Hook that is called by summary when a node is deleted. */
|
||||
virtual void insert (cgraph_node *, ipa_node_params *info);
|
||||
/* Hook that is called by summary when a node is deleted. */
|
||||
virtual void remove (cgraph_node *, ipa_node_params *info);
|
||||
/* Hook that is called by summary when a node is duplicated. */
|
||||
virtual void duplicate (cgraph_node *node,
|
||||
cgraph_node *node2,
|
||||
|
|
|
@ -37,7 +37,8 @@ class GTY((user)) function_summary <T *>
|
|||
public:
|
||||
/* Default construction takes SYMTAB as an argument. */
|
||||
function_summary (symbol_table *symtab, bool ggc = false): m_ggc (ggc),
|
||||
m_map (13, ggc), m_insertion_enabled (true), m_symtab (symtab)
|
||||
m_map (13, ggc), m_insertion_enabled (true), m_released (false),
|
||||
m_symtab (symtab)
|
||||
{
|
||||
m_symtab_insertion_hook =
|
||||
symtab->add_cgraph_insertion_hook
|
||||
|
@ -60,23 +61,19 @@ public:
|
|||
/* Destruction method that can be called for GGT purpose. */
|
||||
void release ()
|
||||
{
|
||||
if (m_symtab_insertion_hook)
|
||||
m_symtab->remove_cgraph_insertion_hook (m_symtab_insertion_hook);
|
||||
if (m_released)
|
||||
return;
|
||||
|
||||
if (m_symtab_removal_hook)
|
||||
m_symtab->remove_cgraph_removal_hook (m_symtab_removal_hook);
|
||||
|
||||
if (m_symtab_duplication_hook)
|
||||
m_symtab->remove_cgraph_duplication_hook (m_symtab_duplication_hook);
|
||||
|
||||
m_symtab_insertion_hook = NULL;
|
||||
m_symtab_removal_hook = NULL;
|
||||
m_symtab_duplication_hook = NULL;
|
||||
m_symtab->remove_cgraph_insertion_hook (m_symtab_insertion_hook);
|
||||
m_symtab->remove_cgraph_removal_hook (m_symtab_removal_hook);
|
||||
m_symtab->remove_cgraph_duplication_hook (m_symtab_duplication_hook);
|
||||
|
||||
/* 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)
|
||||
release ((*it).second);
|
||||
|
||||
m_released = true;
|
||||
}
|
||||
|
||||
/* Traverses all summarys with a function F called with
|
||||
|
@ -99,7 +96,9 @@ public:
|
|||
/* Allocates new data that are stored within map. */
|
||||
T* allocate_new ()
|
||||
{
|
||||
return m_ggc ? new (ggc_alloc <T> ()) T() : new T () ;
|
||||
/* Call gcc_internal_because we do not want to call finalizer for
|
||||
a type T. We call dtor explicitly. */
|
||||
return m_ggc ? new (ggc_internal_alloc (sizeof (T))) T () : new T () ;
|
||||
}
|
||||
|
||||
/* Release an item that is stored within map. */
|
||||
|
@ -216,6 +215,8 @@ private:
|
|||
cgraph_2node_hook_list *m_symtab_duplication_hook;
|
||||
/* Indicates if insertion hook is enabled. */
|
||||
bool m_insertion_enabled;
|
||||
/* Indicates if the summary is released. */
|
||||
bool m_released;
|
||||
/* Symbol table the summary is registered to. */
|
||||
symbol_table *m_symtab;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue