Refactor copying decl section names
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
This commit is contained in:
parent
5e41e7f092
commit
8b9a92f794
@ -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")));
|
||||
|
@ -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. */
|
||||
|
@ -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)
|
||||
|
@ -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));
|
||||
|
@ -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))
|
||||
{
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
14
gcc/symtab.c
14
gcc/symtab.c
@ -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);
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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. */
|
||||
|
27
gcc/tree.c
27
gcc/tree.c
@ -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)
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user