call_summary: move hooks to base.
authorMartin Liska <mliska@suse.cz>
Mon, 26 Oct 2020 14:24:28 +0000 (15:24 +0100)
committerMartin Liska <mliska@suse.cz>
Tue, 27 Oct 2020 07:25:51 +0000 (08:25 +0100)
gcc/ChangeLog:

* symbol-summary.h (call_summary_base): Pass symtab hooks to
base and register (or unregister) hooks directly.

gcc/symbol-summary.h

index 97106c7c25b1673767e920fd8d477369f25ebc22..3944f11c78a7858c06d612ddf23049c014da8384 100644 (file)
@@ -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);
     }
 }