call_summary: move hooks to base.
gcc/ChangeLog: * symbol-summary.h (call_summary_base): Pass symtab hooks to base and register (or unregister) hooks directly.
This commit is contained in:
parent
251c9aea8f
commit
953a9d63d4
1 changed files with 48 additions and 50 deletions
|
@ -566,12 +566,17 @@ class call_summary_base
|
|||
{
|
||||
public:
|
||||
/* Default construction takes SYMTAB as an argument. */
|
||||
call_summary_base (symbol_table *symtab CXX_MEM_STAT_INFO):
|
||||
m_symtab (symtab),
|
||||
call_summary_base (symbol_table *symtab, cgraph_edge_hook symtab_removal,
|
||||
cgraph_2edge_hook symtab_duplication CXX_MEM_STAT_INFO):
|
||||
m_symtab (symtab), m_symtab_removal (symtab_removal),
|
||||
m_symtab_duplication (symtab_duplication), m_symtab_duplication_hook (NULL),
|
||||
m_initialize_when_cloning (false),
|
||||
m_duplication_enabled (true),
|
||||
m_allocator ("call summary" PASS_MEM_STAT)
|
||||
{}
|
||||
{
|
||||
m_symtab_removal_hook
|
||||
= m_symtab->add_edge_removal_hook (m_symtab_removal, this);
|
||||
enable_duplication_hook ();
|
||||
}
|
||||
|
||||
/* Basic implementation of removal operation. */
|
||||
virtual void remove (cgraph_edge *, T *) {}
|
||||
|
@ -585,13 +590,20 @@ public:
|
|||
/* Enable duplication hook invocation. */
|
||||
void enable_duplication_hook ()
|
||||
{
|
||||
m_duplication_enabled = true;
|
||||
if (m_symtab_duplication_hook == NULL)
|
||||
m_symtab_duplication_hook
|
||||
= m_symtab->add_edge_duplication_hook (m_symtab_duplication,
|
||||
this);
|
||||
}
|
||||
|
||||
/* Enable duplication hook invocation. */
|
||||
void disable_duplication_hook ()
|
||||
{
|
||||
m_duplication_enabled = false;
|
||||
if (m_symtab_duplication_hook != NULL)
|
||||
{
|
||||
m_symtab->remove_edge_duplication_hook (m_symtab_duplication_hook);
|
||||
m_symtab_duplication_hook = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
|
@ -619,14 +631,17 @@ protected:
|
|||
/* Symbol table the summary is registered to. */
|
||||
symbol_table *m_symtab;
|
||||
|
||||
/* Removal function defined by a summary. */
|
||||
cgraph_edge_hook m_symtab_removal;
|
||||
/* Duplication function defined by a summary. */
|
||||
cgraph_2edge_hook m_symtab_duplication;
|
||||
|
||||
/* Internal summary removal hook pointer. */
|
||||
cgraph_edge_hook_list *m_symtab_removal_hook;
|
||||
/* Internal summary duplication hook pointer. */
|
||||
cgraph_2edge_hook_list *m_symtab_duplication_hook;
|
||||
/* Initialize summary for an edge that is cloned. */
|
||||
bool m_initialize_when_cloning;
|
||||
/* Indicates if duplication hook is enabled. */
|
||||
bool m_duplication_enabled;
|
||||
|
||||
private:
|
||||
/* Return true when the summary uses GGC memory for allocation. */
|
||||
|
@ -641,7 +656,7 @@ void
|
|||
call_summary_base<T>::unregister_hooks ()
|
||||
{
|
||||
m_symtab->remove_edge_removal_hook (m_symtab_removal_hook);
|
||||
m_symtab->remove_edge_duplication_hook (m_symtab_duplication_hook);
|
||||
disable_duplication_hook ();
|
||||
}
|
||||
|
||||
/* An impossible class templated by non-pointers so, which makes sure that only
|
||||
|
@ -663,16 +678,9 @@ public:
|
|||
/* Default construction takes SYMTAB as an argument. */
|
||||
call_summary (symbol_table *symtab, bool ggc = false
|
||||
CXX_MEM_STAT_INFO)
|
||||
: call_summary_base<T> (symtab PASS_MEM_STAT), m_ggc (ggc),
|
||||
m_map (13, ggc, true, GATHER_STATISTICS PASS_MEM_STAT)
|
||||
{
|
||||
this->m_symtab_removal_hook
|
||||
= this->m_symtab->add_edge_removal_hook (call_summary::symtab_removal,
|
||||
this);
|
||||
this->m_symtab_duplication_hook
|
||||
= this->m_symtab->add_edge_duplication_hook (call_summary::symtab_duplication,
|
||||
this);
|
||||
}
|
||||
: call_summary_base<T> (symtab, call_summary::symtab_removal,
|
||||
call_summary::symtab_duplication PASS_MEM_STAT),
|
||||
m_ggc (ggc), m_map (13, ggc, true, GATHER_STATISTICS PASS_MEM_STAT) {}
|
||||
|
||||
/* Destructor. */
|
||||
virtual ~call_summary ();
|
||||
|
@ -777,19 +785,16 @@ call_summary<T *>::symtab_duplication (cgraph_edge *edge1,
|
|||
cgraph_edge *edge2, void *data)
|
||||
{
|
||||
call_summary *summary = (call_summary <T *> *) (data);
|
||||
if (summary->m_duplication_enabled)
|
||||
{
|
||||
T *edge1_summary = NULL;
|
||||
T *edge1_summary = NULL;
|
||||
|
||||
if (summary->m_initialize_when_cloning)
|
||||
edge1_summary = summary->get_create (edge1);
|
||||
else
|
||||
edge1_summary = summary->get (edge1);
|
||||
if (summary->m_initialize_when_cloning)
|
||||
edge1_summary = summary->get_create (edge1);
|
||||
else
|
||||
edge1_summary = summary->get (edge1);
|
||||
|
||||
if (edge1_summary)
|
||||
summary->duplicate (edge1, edge2, edge1_summary,
|
||||
summary->get_create (edge2));
|
||||
}
|
||||
if (edge1_summary)
|
||||
summary->duplicate (edge1, edge2, edge1_summary,
|
||||
summary->get_create (edge2));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
|
@ -833,15 +838,11 @@ class GTY((user)) fast_call_summary <T *, V>: public call_summary_base<T>
|
|||
public:
|
||||
/* Default construction takes SYMTAB as an argument. */
|
||||
fast_call_summary (symbol_table *symtab CXX_MEM_STAT_INFO)
|
||||
: call_summary_base<T> (symtab PASS_MEM_STAT), m_vector (NULL)
|
||||
: call_summary_base<T> (symtab, fast_call_summary::symtab_removal,
|
||||
fast_call_summary::symtab_duplication PASS_MEM_STAT),
|
||||
m_vector (NULL)
|
||||
{
|
||||
vec_alloc (m_vector, 13 PASS_MEM_STAT);
|
||||
this->m_symtab_removal_hook
|
||||
= this->m_symtab->add_edge_removal_hook (fast_call_summary::symtab_removal,
|
||||
this);
|
||||
this->m_symtab_duplication_hook
|
||||
= this->m_symtab->add_edge_duplication_hook (fast_call_summary::symtab_duplication,
|
||||
this);
|
||||
}
|
||||
|
||||
/* Destructor. */
|
||||
|
@ -946,20 +947,17 @@ fast_call_summary<T *, V>::symtab_duplication (cgraph_edge *edge1,
|
|||
cgraph_edge *edge2, void *data)
|
||||
{
|
||||
fast_call_summary *summary = (fast_call_summary <T *, V> *) (data);
|
||||
if (summary->m_duplication_enabled)
|
||||
T *edge1_summary = NULL;
|
||||
|
||||
if (summary->m_initialize_when_cloning)
|
||||
edge1_summary = summary->get_create (edge1);
|
||||
else
|
||||
edge1_summary = summary->get (edge1);
|
||||
|
||||
if (edge1_summary)
|
||||
{
|
||||
T *edge1_summary = NULL;
|
||||
|
||||
if (summary->m_initialize_when_cloning)
|
||||
edge1_summary = summary->get_create (edge1);
|
||||
else
|
||||
edge1_summary = summary->get (edge1);
|
||||
|
||||
if (edge1_summary)
|
||||
{
|
||||
T *duplicate = summary->get_create (edge2);
|
||||
summary->duplicate (edge1, edge2, edge1_summary, duplicate);
|
||||
}
|
||||
T *duplicate = summary->get_create (edge2);
|
||||
summary->duplicate (edge1, edge2, edge1_summary, duplicate);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue