>
> 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.
OK, thanks a lot!
Honza
> ---
> gcc/symbol-summary.h | 127 ++++++++++++++++++++++---------------------
> 1 file changed, 65 insertions(+), 62 deletions(-)
>
> diff --git a/gcc/symbol-summary.h b/gcc/symbol-summary.h
> index af5f4e6da62..97106c7c25b 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);
> }
> }
>
> --
> 2.29.0
>
> From 8bf1464ee2d43a14e4d6ed8d11e3b7e2d15b46e4 Mon Sep 17 00:00:00 2001
> From: Martin Liska <[email protected]>
> Date: Mon, 26 Oct 2020 15:24:28 +0100
> Subject: [PATCH 2/2] 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.
> ---
> gcc/symbol-summary.h | 98 ++++++++++++++++++++++----------------------
> 1 file changed, 48 insertions(+), 50 deletions(-)
>
> diff --git a/gcc/symbol-summary.h b/gcc/symbol-summary.h
> index 97106c7c25b..3944f11c78a 100644
> --- a/gcc/symbol-summary.h
> +++ b/gcc/symbol-summary.h
> @@ -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);
> }
> }
>
> --
> 2.29.0
>