aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2020-10-26 15:11:59 +0100
committerMartin Liska <mliska@suse.cz>2020-10-27 08:25:50 +0100
commit251c9aea8f621afafe0632a034b4405e0d652660 (patch)
tree1ad2ca88d3ed349c2d7b277f9a51f53dba29d284 /gcc
parent18cb6195fda69ea8ab8b8a5290dd8c9f8d52b0e6 (diff)
downloadgcc-251c9aea8f621afafe0632a034b4405e0d652660.zip
gcc-251c9aea8f621afafe0632a034b4405e0d652660.tar.gz
gcc-251c9aea8f621afafe0632a034b4405e0d652660.tar.bz2
call_summary: modify cgraph hooks.
gcc/ChangeLog: * symbol-summary.h (function_summary_base::unregister_hooks): Call disable_insertion_hook and disable_duplication_hook. (function_summary_base::symtab_insertion): New field. (function_summary_base::symtab_removal): Likewise. (function_summary_base::symtab_duplication): Likewise. Register hooks in function_summary_base and directly register (or unregister) hooks.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/symbol-summary.h127
1 files changed, 65 insertions, 62 deletions
diff --git a/gcc/symbol-summary.h b/gcc/symbol-summary.h
index af5f4e6..97106c7 100644
--- a/gcc/symbol-summary.h
+++ b/gcc/symbol-summary.h
@@ -28,12 +28,22 @@ class function_summary_base
{
public:
/* Default construction takes SYMTAB as an argument. */
- function_summary_base (symbol_table *symtab CXX_MEM_STAT_INFO):
- m_symtab (symtab),
- m_insertion_enabled (true),
- m_duplication_enabled (true),
+ function_summary_base (symbol_table *symtab,
+ cgraph_node_hook symtab_insertion,
+ cgraph_node_hook symtab_removal,
+ cgraph_2node_hook symtab_duplication
+ CXX_MEM_STAT_INFO):
+ m_symtab (symtab), m_symtab_insertion (symtab_insertion),
+ m_symtab_removal (symtab_removal),
+ m_symtab_duplication (symtab_duplication),
+ m_symtab_insertion_hook (NULL), m_symtab_duplication_hook (NULL),
m_allocator ("function summary" PASS_MEM_STAT)
- {}
+ {
+ enable_insertion_hook ();
+ m_symtab_removal_hook
+ = m_symtab->add_cgraph_removal_hook (m_symtab_removal, this);
+ enable_duplication_hook ();
+ }
/* Basic implementation of insert operation. */
virtual void insert (cgraph_node *, T *)
@@ -56,25 +66,37 @@ public:
/* Enable insertion hook invocation. */
void enable_insertion_hook ()
{
- m_insertion_enabled = true;
+ if (m_symtab_insertion_hook == NULL)
+ m_symtab_insertion_hook
+ = m_symtab->add_cgraph_insertion_hook (m_symtab_insertion, this);
}
/* Enable insertion hook invocation. */
void disable_insertion_hook ()
{
- m_insertion_enabled = false;
+ if (m_symtab_insertion_hook != NULL)
+ {
+ m_symtab->remove_cgraph_insertion_hook (m_symtab_insertion_hook);
+ m_symtab_insertion_hook = NULL;
+ }
}
/* 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_cgraph_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_cgraph_duplication_hook (m_symtab_duplication_hook);
+ m_symtab_duplication_hook = NULL;
+ }
}
protected:
@@ -99,19 +121,22 @@ protected:
/* Unregister all call-graph hooks. */
void unregister_hooks ();
+ /* Symbol table the summary is registered to. */
+ symbol_table *m_symtab;
+
+ /* Insertion function defined by a summary. */
+ cgraph_node_hook m_symtab_insertion;
+ /* Removal function defined by a summary. */
+ cgraph_node_hook m_symtab_removal;
+ /* Duplication function defined by a summary. */
+ cgraph_2node_hook m_symtab_duplication;
+
/* Internal summary insertion hook pointer. */
cgraph_node_hook_list *m_symtab_insertion_hook;
/* Internal summary removal hook pointer. */
cgraph_node_hook_list *m_symtab_removal_hook;
/* Internal summary duplication hook pointer. */
cgraph_2node_hook_list *m_symtab_duplication_hook;
- /* Symbol table the summary is registered to. */
- symbol_table *m_symtab;
-
- /* Indicates if insertion hook is enabled. */
- bool m_insertion_enabled;
- /* Indicates if duplication hook is enabled. */
- bool m_duplication_enabled;
private:
/* Return true when the summary uses GGC memory for allocation. */
@@ -125,9 +150,9 @@ template <typename T>
void
function_summary_base<T>::unregister_hooks ()
{
- m_symtab->remove_cgraph_insertion_hook (m_symtab_insertion_hook);
+ disable_insertion_hook ();
m_symtab->remove_cgraph_removal_hook (m_symtab_removal_hook);
- m_symtab->remove_cgraph_duplication_hook (m_symtab_duplication_hook);
+ disable_duplication_hook ();
}
/* We want to pass just pointer types as argument for function_summary
@@ -242,19 +267,11 @@ private:
template <typename T>
function_summary<T *>::function_summary (symbol_table *symtab, bool ggc
MEM_STAT_DECL):
- function_summary_base<T> (symtab PASS_MEM_STAT), m_ggc (ggc),
- m_map (13, ggc, true, GATHER_STATISTICS PASS_MEM_STAT)
-{
- this->m_symtab_insertion_hook
- = this->m_symtab->add_cgraph_insertion_hook (function_summary::symtab_insertion,
- this);
- this->m_symtab_removal_hook
- = this->m_symtab->add_cgraph_removal_hook (function_summary::symtab_removal,
- this);
- this->m_symtab_duplication_hook
- = this->m_symtab->add_cgraph_duplication_hook (function_summary::symtab_duplication,
- this);
-}
+ function_summary_base<T> (symtab, function_summary::symtab_insertion,
+ function_summary::symtab_removal,
+ function_summary::symtab_duplication
+ PASS_MEM_STAT),
+ m_ggc (ggc), m_map (13, ggc, true, GATHER_STATISTICS PASS_MEM_STAT) {}
template <typename T>
function_summary<T *>::~function_summary ()
@@ -273,9 +290,7 @@ function_summary<T *>::symtab_insertion (cgraph_node *node, void *data)
{
gcc_checking_assert (node->get_uid ());
function_summary *summary = (function_summary <T *> *) (data);
-
- if (summary->m_insertion_enabled)
- summary->insert (node, summary->get_create (node));
+ summary->insert (node, summary->get_create (node));
}
template <typename T>
@@ -293,13 +308,10 @@ function_summary<T *>::symtab_duplication (cgraph_node *node,
cgraph_node *node2, void *data)
{
function_summary *summary = (function_summary <T *> *) (data);
- if (summary->m_duplication_enabled)
- {
- T *v = summary->get (node);
+ T *v = summary->get (node);
- if (v)
- summary->duplicate (node, node2, v, summary->get_create (node2));
- }
+ if (v)
+ summary->duplicate (node, node2, v, summary->get_create (node2));
}
template <typename T>
@@ -439,19 +451,15 @@ private:
};
template <typename T, typename V>
-fast_function_summary<T *, V>::fast_function_summary (symbol_table *symtab MEM_STAT_DECL):
- function_summary_base<T> (symtab PASS_MEM_STAT), m_vector (NULL)
+fast_function_summary<T *, V>::fast_function_summary (symbol_table *symtab
+ MEM_STAT_DECL):
+ function_summary_base<T> (symtab,
+ fast_function_summary::symtab_insertion,
+ fast_function_summary::symtab_removal,
+ fast_function_summary::symtab_duplication
+ PASS_MEM_STAT), m_vector (NULL)
{
vec_alloc (m_vector, 13 PASS_MEM_STAT);
- this->m_symtab_insertion_hook
- = this->m_symtab->add_cgraph_insertion_hook (fast_function_summary::symtab_insertion,
- this);
- this->m_symtab_removal_hook
- = this->m_symtab->add_cgraph_removal_hook (fast_function_summary::symtab_removal,
- this);
- this->m_symtab_duplication_hook
- = this->m_symtab->add_cgraph_duplication_hook (fast_function_summary::symtab_duplication,
- this);
}
template <typename T, typename V>
@@ -472,9 +480,7 @@ fast_function_summary<T *, V>::symtab_insertion (cgraph_node *node, void *data)
{
gcc_checking_assert (node->get_uid ());
fast_function_summary *summary = (fast_function_summary <T *, V> *) (data);
-
- if (summary->m_insertion_enabled)
- summary->insert (node, summary->get_create (node));
+ summary->insert (node, summary->get_create (node));
}
template <typename T, typename V>
@@ -495,15 +501,12 @@ fast_function_summary<T *, V>::symtab_duplication (cgraph_node *node,
void *data)
{
fast_function_summary *summary = (fast_function_summary <T *, V> *) (data);
- if (summary->m_duplication_enabled)
- {
- T *v = summary->get (node);
+ T *v = summary->get (node);
- if (v)
- {
- T *duplicate = summary->get_create (node2);
- summary->duplicate (node, node2, v, duplicate);
- }
+ if (v)
+ {
+ T *duplicate = summary->get_create (node2);
+ summary->duplicate (node, node2, v, duplicate);
}
}