|| 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")));
}
/* Return section as string. */
- const char * get_section ()
+ const char * get_section () const
{
if (!x_section)
return NULL;
/* 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. */
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)
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)
/* 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));
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))
{
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;
}
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);
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;
}
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;
(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
{
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);
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)
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. */
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)
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);