diff options
author | Jan Hubicka <hubicka@ucw.cz> | 2014-06-12 06:03:49 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2014-06-12 04:03:49 +0000 |
commit | f961457f887a965ecca2f35b81e33c077759c347 (patch) | |
tree | 40360d8b10e6d2d13c2b1ae77545f00bc6f2121b /gcc/symtab.c | |
parent | e35889871c9e5e6f8ea0d8c10f3d6d9fe2d9c854 (diff) | |
download | gcc-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.c | 86 |
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); |