Refactor copying decl section names
authorStrager Neds <strager.nds@gmail.com>
Tue, 10 Nov 2020 18:42:01 +0000 (11:42 -0700)
committerJeff Law <law@redhat.com>
Tue, 10 Nov 2020 18:44:15 +0000 (11:44 -0700)
gcc/

* cgraph.h (symtab_node::get_section): Constify.
(symtab_node::set_section): Declare new overload.
* symtab.c (symtab_node::set_section): Define new overload.
(symtab_node::copy_visibility_from): Use new overload of
symtab_node::set_section.
(symtab_node::resolve_alias): Same.
* tree.h (set_decl_section_name): Declare new overload.
* tree.c (set_decl_section_name): Define new overload.
* tree-emutls.c (get_emutls_init_templ_addr): Same.
* cgraphclones.c (cgraph_node::create_virtual_clone): Use new
overload of symtab_node::set_section.
(cgraph_node::create_version_clone_with_body): Same.
* trans-mem.c (ipa_tm_create_version): Same.

gcc/c
* c-decl.c (merge_decls): Use new overload of
set_decl_section_name.

gcc/cp
* decl.c (duplicate_decls): Use new overload of
set_decl_section_name.
* method.c (use_thunk): Same.
* optimize.c (maybe_clone_body): Same.
* coroutines.cc (act_des_fn): Same.

gcc/d
* decl.cc (finish_thunk): Use new overload of
set_decl_section_name

13 files changed:
gcc/c/c-decl.c
gcc/cgraph.h
gcc/cgraphclones.c
gcc/cp/coroutines.cc
gcc/cp/decl.c
gcc/cp/method.c
gcc/cp/optimize.c
gcc/d/decl.cc
gcc/symtab.c
gcc/trans-mem.c
gcc/tree-emutls.c
gcc/tree.c
gcc/tree.h

index f19c82c81dda1855ba509db45317d651677b27c6..d348e39c27a1f1c6641a5dbcd756ec19746e3230 100644 (file)
@@ -2884,7 +2884,7 @@ merge_decls (tree newdecl, tree olddecl, tree newtype, tree oldtype)
               || TREE_PUBLIC (olddecl)
               || TREE_STATIC (olddecl))
              && DECL_SECTION_NAME (newdecl) != NULL)
-           set_decl_section_name (olddecl, DECL_SECTION_NAME (newdecl));
+           set_decl_section_name (olddecl, newdecl);
 
          /* This isn't quite correct for something like
                int __thread x attribute ((tls_model ("local-exec")));
index 73c37d8807da0e59117248f011765159e5599200..2e62db2a33b40927dd0889a5d0cffbcb5887ccb6 100644 (file)
@@ -263,7 +263,7 @@ public:
     }
 
   /* Return section as string.  */
-  const char * get_section ()
+  const char * get_section () const
     {
       if (!x_section)
        return NULL;
@@ -322,6 +322,9 @@ public:
   /* Set section for symbol and its aliases.  */
   void set_section (const char *section);
 
+  /* Like set_section, but copying the section name from another node.  */
+  void set_section (const symtab_node &other);
+
   /* Set section, do not recurse into aliases.
      When one wants to change section of symbol and its aliases,
      use set_section.  */
index bc590819f78599e079dabcf3fa45c4efe6ad5acc..2e69689025aa4c0cc78fbb6ec4dc7ee7ec486aef 100644 (file)
@@ -626,7 +626,7 @@ cgraph_node::create_virtual_clone (vec<cgraph_edge *> redirect_callers,
   if (tree_map)
     clone_info::get_create (new_node)->tree_map = tree_map;
   if (!implicit_section)
-    new_node->set_section (get_section ());
+    new_node->set_section (*this);
 
   /* Clones of global symbols or symbols with unique names are unique.  */
   if ((TREE_PUBLIC (old_decl)
@@ -1060,7 +1060,7 @@ cgraph_node::create_version_clone_with_body
   new_version_node->local = 1;
   new_version_node->lowered = true;
   if (!implicit_section)
-    new_version_node->set_section (get_section ());
+    new_version_node->set_section (*this);
   /* Clones of global symbols or symbols with unique names are unique.  */
   if ((TREE_PUBLIC (old_decl)
        && !DECL_EXTERNAL (old_decl)
index 9b9141e51fd59c33caa6e61d4871edbe9e3d5636..fd6cda41991774acaca8c7501d923c0c4407cd18 100644 (file)
@@ -3756,7 +3756,7 @@ act_des_fn (tree orig, tree fn_type, tree coro_frame_ptr, const char* name)
   /* Copy selected attributes from the original function.  */
   TREE_USED (fn) = TREE_USED (orig);
   if (DECL_SECTION_NAME (orig))
-    set_decl_section_name (fn, DECL_SECTION_NAME (orig));
+    set_decl_section_name (fn, orig);
   /* Copy any alignment that the FE added.  */
   if (DECL_ALIGN (orig))
     SET_DECL_ALIGN (fn, DECL_ALIGN (orig));
index 62648841ac3ad14ace2c1696a9250b6354c5b157..42e704e7af295f077aee47eaa3e64778e7edbb49 100644 (file)
@@ -2866,7 +2866,7 @@ duplicate_decls (tree newdecl, tree olddecl, bool hiding, bool was_hidden)
             done later in decl_attributes since we are called before attributes
             are assigned.  */
          if (DECL_SECTION_NAME (newdecl) != NULL)
-           set_decl_section_name (olddecl, DECL_SECTION_NAME (newdecl));
+           set_decl_section_name (olddecl, newdecl);
 
          if (DECL_ONE_ONLY (newdecl))
            {
index 16e76351943fc0c7d17ae7e5194c4566fdc4918d..4de192fac00597c746bef214c39e47d1dbf47199 100644 (file)
@@ -351,7 +351,7 @@ use_thunk (tree thunk_fndecl, bool emit_p)
          resolve_unique_section (thunk_fndecl, 0, flag_function_sections);
 
          /* Output the thunk into the same section as function.  */
-         set_decl_section_name (thunk_fndecl, DECL_SECTION_NAME (fn));
+         set_decl_section_name (thunk_fndecl, fn);
          symtab_node::get (thunk_fndecl)->implicit_section
            = symtab_node::get (fn)->implicit_section;
        }
index 00621d636bf535df62a21030d2cda98c6d61a0dd..127d7fa30fca9adb77f156434dfd3ce9f69a31ee 100644 (file)
@@ -512,7 +512,7 @@ maybe_clone_body (tree fn)
       DECL_DLLIMPORT_P (clone) = DECL_DLLIMPORT_P (fn);
       DECL_ATTRIBUTES (clone) = copy_list (DECL_ATTRIBUTES (fn));
       DECL_DISREGARD_INLINE_LIMITS (clone) = DECL_DISREGARD_INLINE_LIMITS (fn);
-      set_decl_section_name (clone, DECL_SECTION_NAME (fn));
+      set_decl_section_name (clone, fn);
 
       /* Adjust the parameter names and locations.  */
       parm = DECL_ARGUMENTS (fn);
index 457894fbe228eae8e96526e31f8bff8ec2cdb56f..d668715af597194db4d2427d4c6cc4bbfdb916c7 100644 (file)
@@ -1663,7 +1663,7 @@ finish_thunk (tree thunk, tree function)
          resolve_unique_section (thunk, 0, flag_function_sections);
 
          /* Output the thunk into the same section as function.  */
-         set_decl_section_name (thunk, DECL_SECTION_NAME (fn));
+         set_decl_section_name (thunk, fn);
          symtab_node::get (thunk)->implicit_section
            = symtab_node::get (fn)->implicit_section;
        }
index 58b14f321c59c7120373c89affee669d851490ae..883cc3eae0d504efcbc0786b6fe4194e3a18c7e2 100644 (file)
@@ -1484,8 +1484,7 @@ symtab_node::copy_visibility_from (symtab_node *n)
   DECL_DLLIMPORT_P (decl) = DECL_DLLIMPORT_P (n->decl);
   resolution = n->resolution;
   set_comdat_group (n->get_comdat_group ());
-  call_for_symbol_and_aliases (symtab_node::set_section,
-                            const_cast<char *>(n->get_section ()), true);
+  set_section (*n);
   externally_visible = n->externally_visible;
   if (!DECL_RTL_SET_P (decl))
     return;
@@ -1671,6 +1670,14 @@ symtab_node::set_section (const char *section)
     (symtab_node::set_section, const_cast<char *>(section), true);
 }
 
+void
+symtab_node::set_section (const symtab_node &other)
+{
+  const char *section = other.get_section ();
+  call_for_symbol_and_aliases
+    (symtab_node::set_section, const_cast<char *>(section), true);
+}
+
 /* Return the initialization priority.  */
 
 priority_type
@@ -1814,8 +1821,7 @@ symtab_node::resolve_alias (symtab_node *target, bool transparent)
     {
       error ("section of alias %q+D must match section of its target", decl);
     }
-  call_for_symbol_and_aliases (symtab_node::set_section,
-                            const_cast<char *>(target->get_section ()), true);
+  set_section (*target);
   if (target->implicit_section)
     call_for_symbol_and_aliases (set_implicit_section, NULL, true);
 
index e4f264d6ae07a487396ca6e7d790aeb6a51b3851..c078a12ef84d1c3e7e2a738c522588a328ce11f7 100644 (file)
@@ -4998,7 +4998,7 @@ ipa_tm_create_version (struct cgraph_node *old_node)
   new_node->lowered = true;
   new_node->tm_clone = 1;
   if (!old_node->implicit_section)
-    new_node->set_section (old_node->get_section ());
+    new_node->set_section (*old_node);
   get_cg_data (&old_node, true)->clone = new_node;
 
   if (old_node->get_availability () >= AVAIL_INTERPOSABLE)
index 44755dd406aeeed114f047e9583b9ae737f4a9cc..5b55832688c1bb8dfcf2a2d4228e616dfbdf60cc 100644 (file)
@@ -259,7 +259,7 @@ get_emutls_init_templ_addr (tree decl)
   if (targetm.emutls.tmpl_section)
     set_decl_section_name (to, targetm.emutls.tmpl_section);
   else
-    set_decl_section_name (to, DECL_SECTION_NAME (decl));
+    set_decl_section_name (to, decl);
 
   /* Create varpool node for the new variable and finalize it if it is
      not external one.  */
index 9260772b84611da671e34d4a6c5afc5814de01f6..663f3ecfd1239fa8db527f150bde99e8052bc58e 100644 (file)
@@ -773,6 +773,33 @@ set_decl_section_name (tree node, const char *value)
   snode->set_section (value);
 }
 
+/* Set section name of NODE to match the section name of OTHER.
+
+   set_decl_section_name (decl, other) is equivalent to
+   set_decl_section_name (decl, DECL_SECTION_NAME (other)), but possibly more
+   efficient.  */
+void
+set_decl_section_name (tree decl, const_tree other)
+{
+  struct symtab_node *other_node = symtab_node::get (other);
+  if (other_node)
+    {
+      struct symtab_node *decl_node;
+      if (VAR_P (decl))
+    decl_node = varpool_node::get_create (decl);
+      else
+    decl_node = cgraph_node::get_create (decl);
+      decl_node->set_section (*other_node);
+    }
+  else
+    {
+      struct symtab_node *decl_node = symtab_node::get (decl);
+      if (!decl_node)
+    return;
+      decl_node->set_section (NULL);
+    }
+}
+
 /* Return TLS model of a variable NODE.  */
 enum tls_model
 decl_tls_model (const_tree node)
index f8f0a60643961fe16cd1d082ce49105e24185423..684be10b440a7b7617cc284a68ce22d0e7ac216c 100644 (file)
@@ -4281,6 +4281,7 @@ extern tree decl_comdat_group (const_tree);
 extern tree decl_comdat_group_id (const_tree);
 extern const char *decl_section_name (const_tree);
 extern void set_decl_section_name (tree, const char *);
+extern void set_decl_section_name (tree, const_tree);
 extern enum tls_model decl_tls_model (const_tree);
 extern void set_decl_tls_model (tree, enum tls_model);