aboutsummaryrefslogtreecommitdiff
path: root/gcc/symtab.c
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2014-06-12 06:03:49 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2014-06-12 04:03:49 +0000
commitf961457f887a965ecca2f35b81e33c077759c347 (patch)
tree40360d8b10e6d2d13c2b1ae77545f00bc6f2121b /gcc/symtab.c
parente35889871c9e5e6f8ea0d8c10f3d6d9fe2d9c854 (diff)
downloadgcc-f961457f887a965ecca2f35b81e33c077759c347.zip
gcc-f961457f887a965ecca2f35b81e33c077759c347.tar.gz
gcc-f961457f887a965ecca2f35b81e33c077759c347.tar.bz2
symtab.c (section_hash): New hash.
* symtab.c (section_hash): New hash. (symtab_unregister_node): Clear section before freeing. (hash_section_hash_entry): New haser. (eq_sections): New function. (symtab_node::set_section_for_node): New method. (set_section_1): Update. (symtab_node::set_section): Take string instead of tree as parameter. (symtab_resolve_alias): Update. * cgraph.h (section_hash_entry_d): New structure. (section_hash_entry): New typedef. (cgraph_node): Change comdat_group_ to x_comdat_group, change section_ to x_section and turn into section_hash_entry; update accestors; put set_section_for_node offline. * tree.c (decl_section_name): Turn into string. (set_decl_section_name): Change parameter to be string. * tree.h (decl_section_name, set_decl_section_name): Update prototypes. * sdbout.c (sdbout_one_type): Update. * tree-vect-data-refs.c (vect_can_force_dr_alignment_p): Update. * varasm.c (IN_NAMED_SECTION, get_named_section, resolve_unique_section, hot_function_section, get_named_text_section, USE_SELECT_SECTION_FOR_FUNCTIONS, default_function_rodata_section, make_decl_rtl, default_unique_section): Update. * config/c6x/c6x.c (c6x_in_small_data_p): Update. (c6x_elf_unique_section): Update. * config/nios2/nios2.c (nios2_in_small_data_p): Update. * config/pa/pa.c (pa_function_section): Update. * config/pa/pa.h (IN_NAMED_SECTION_P): Update. * config/ia64/ia64.c (ia64_in_small_data_p): Update. * config/arc/arc.c (arc_in_small_data_p): Update. * config/arm/unknown-elf.h (IN_NAMED_SECTION_P): Update. * config/mcore/mcore.c (mcore_unique_section): Update. * config/mips/mips.c (mips16_build_function_stub): Update. (mips16_build_call_stub): Update. (mips_function_rodata_section): Update. (mips_in_small_data_p): Update. * config/score/score.c (score_in_small_data_p): Update. * config/rx/rx.c (rx_in_small_data): Update. * config/rs6000/rs6000.c (rs6000_elf_in_small_data_p): Update. (rs6000_xcoff_asm_named_section): Update. (rs6000_xcoff_unique_section): Update. * config/frv/frv.c (frv_string_begins_with): Update. (frv_in_small_data_p): Update. * config/v850/v850.c (v850_encode_data_area): Update. * config/bfin/bfin.c (DECL_SECTION_NAME): Update. (bfin_handle_l1_data_attribute): Update. (bfin_handle_l2_attribute): Update. * config/mep/mep.c (mep_unique_section): Update. * config/microblaze/microblaze.c (microblaze_elf_in_small_data_p): Update. * config/h8300/h8300.c (h8300_handle_eightbit_data_attribute): Update. (h8300_handle_tiny_data_attribute): Update. * config/m32r/m32r.c (m32r_in_small_data_p): Update. (m32r_in_small_data_p): Update. * config/alpha/alpha.c (alpha_in_small_data_p): Update. * config/i386/i386.c (ix86_in_large_data_p): Update. * config/i386/winnt.c (i386_pe_unique_section): Update. * config/darwin.c (darwin_function_section): Update. * config/lm32/lm32.c (lm32_in_small_data_p): Update. * tree-emutls.c (get_emutls_init_templ_addr): Update. (new_emutls_decl): Update. * lto-cgraph.c (lto_output_node, input_node, input_varpool_node, input_varpool_node): Update. (ead_string_cst): Turn to ... (read_string): ... this one. * dwarf2out.c (secname_for_decl): Update. * asan.c (asan_protect_global): Update. * c-family/c-common.c (handle_section_attribute): Update handling for section names that are no longer trees. * java/class.c (build_utf8_ref): Update handling for section names that are no longer trees. (emit_register_classes_in_jcr_section): Update. * vtable-class-hierarchy.c: Update handling for section names that are no longer trees. * decl.c (duplicate_decls): Likewise. * gcc-interface/utils.c: Update handling for section names that are no longer trees. From-SVN: r211489
Diffstat (limited to 'gcc/symtab.c')
-rw-r--r--gcc/symtab.c86
1 files changed, 82 insertions, 4 deletions
diff --git a/gcc/symtab.c b/gcc/symtab.c
index d7977f1..8158acc 100644
--- a/gcc/symtab.c
+++ b/gcc/symtab.c
@@ -57,6 +57,10 @@ const char * const ld_plugin_symbol_resolution_names[]=
"prevailing_def_ironly_exp"
};
+
+/* Hash table used to hold sectoons. */
+static GTY((param_is (section_hash_entry))) htab_t section_hash;
+
/* Hash table used to convert assembler names into nodes. */
static GTY((param_is (symtab_node))) htab_t assembler_name_hash;
@@ -307,6 +311,9 @@ symtab_unregister_node (symtab_node *node)
ipa_remove_all_references (&node->ref_list);
ipa_remove_all_referring (&node->ref_list);
+ /* Remove reference to section. */
+ node->set_section_for_node (NULL);
+
symtab_remove_from_same_comdat_group (node);
if (node->previous)
@@ -1081,22 +1088,92 @@ fixup_same_cpp_alias_visibility (symtab_node *node, symtab_node *target)
node->externally_visible = target->externally_visible;
}
+/* Hash sections by their names. */
+
+static hashval_t
+hash_section_hash_entry (const void *p)
+{
+ const section_hash_entry *n = (const section_hash_entry *) p;
+ return htab_hash_string (n->name);
+}
+
+/* Return true if section P1 name equals to P2. */
+
+static int
+eq_sections (const void *p1, const void *p2)
+{
+ const section_hash_entry *n1 = (const section_hash_entry *) p1;
+ const char *name = (const char *)p2;
+ return n1->name == name || !strcmp (n1->name, name);
+}
+
+/* Set section, do not recurse into aliases.
+ When one wants to change section of symbol and its aliases,
+ use set_section */
+
+void
+symtab_node::set_section_for_node (const char *section)
+{
+ const char *current = get_section ();
+ void **slot;
+
+ if (current == section
+ || (current && section
+ && !strcmp (current, section)))
+ return;
+
+ if (current)
+ {
+ x_section->ref_count--;
+ if (!x_section->ref_count)
+ {
+ slot = htab_find_slot_with_hash (section_hash, x_section->name,
+ htab_hash_string (x_section->name),
+ INSERT);
+ ggc_free (x_section);
+ htab_clear_slot (section_hash, slot);
+ }
+ x_section = NULL;
+ }
+ if (!section)
+ {
+ implicit_section = false;
+ return;
+ }
+ if (!section_hash)
+ section_hash = htab_create_ggc (10, hash_section_hash_entry,
+ eq_sections, NULL);
+ slot = htab_find_slot_with_hash (section_hash, section,
+ htab_hash_string (section),
+ INSERT);
+ if (*slot)
+ x_section = (section_hash_entry *)*slot;
+ else
+ {
+ int len = strlen (section);
+ *slot = x_section = ggc_cleared_alloc<section_hash_entry> ();
+ x_section->name = ggc_vec_alloc<char> (len + 1);
+ memcpy (x_section->name, section, len + 1);
+ }
+ x_section->ref_count++;
+}
+
/* Worker for set_section. */
static bool
set_section_1 (struct symtab_node *n, void *s)
{
- n->set_section_for_node ((tree)s);
+ n->set_section_for_node ((char *)s);
return false;
}
/* Set section of symbol and its aliases. */
void
-symtab_node::set_section (tree section)
+symtab_node::set_section (const char *section)
{
gcc_assert (!this->alias);
- symtab_for_node_and_aliases (this, set_section_1, section, true);
+ symtab_for_node_and_aliases (this, set_section_1, const_cast<char *>(section), true);
}
/* Worker for symtab_resolve_alias. */
@@ -1156,7 +1233,8 @@ symtab_resolve_alias (symtab_node *node, symtab_node *target)
error ("section of alias %q+D must match section of its target",
node->decl);
}
- symtab_for_node_and_aliases (node, set_section_1, target->get_section_name (), true);
+ symtab_for_node_and_aliases (node, set_section_1,
+ const_cast<char *>(target->get_section ()), true);
if (target->implicit_section)
symtab_for_node_and_aliases (node,
set_implicit_section, NULL, true);