From f961457f887a965ecca2f35b81e33c077759c347 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Thu, 12 Jun 2014 06:03:49 +0200 Subject: [PATCH] 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 --- gcc/ChangeLog | 68 +++++++++++++++++++++++ gcc/ada/ChangeLog | 5 ++ gcc/ada/gcc-interface/utils.c | 4 +- gcc/asan.c | 2 +- gcc/c-family/ChangeLog | 5 ++ gcc/c-family/c-common.c | 7 +-- gcc/c/c-decl.c | 2 +- gcc/cgraph.h | 51 +++++++++--------- gcc/config/alpha/alpha.c | 2 +- gcc/config/arc/arc.c | 2 +- gcc/config/arm/unknown-elf.h | 2 +- gcc/config/bfin/bfin.c | 25 +++++---- gcc/config/c6x/c6x.c | 4 +- gcc/config/darwin.c | 2 +- gcc/config/frv/frv.c | 9 ++-- gcc/config/h8300/h8300.c | 4 +- gcc/config/i386/i386.c | 4 +- gcc/config/i386/winnt.c | 2 +- gcc/config/ia64/ia64.c | 2 +- gcc/config/lm32/lm32.c | 2 +- gcc/config/m32r/m32r.c | 5 +- gcc/config/mcore/mcore.c | 2 +- gcc/config/mep/mep.c | 2 +- gcc/config/microblaze/microblaze.c | 2 +- gcc/config/mips/mips.c | 8 +-- gcc/config/nios2/nios2.c | 2 +- gcc/config/pa/pa.c | 4 +- gcc/config/pa/pa.h | 2 +- gcc/config/rs6000/rs6000.c | 6 +-- gcc/config/rx/rx.c | 8 +-- gcc/config/score/score.c | 2 +- gcc/config/v850/v850.c | 2 +- gcc/cp/ChangeLog | 6 +++ gcc/cp/decl.c | 4 +- gcc/cp/vtable-class-hierarchy.c | 3 +- gcc/dwarf2out.c | 10 +--- gcc/java/ChangeLog | 6 +++ gcc/java/class.c | 5 +- gcc/lto-cgraph.c | 22 ++++---- gcc/sdbout.c | 2 +- gcc/symtab.c | 86 ++++++++++++++++++++++++++++-- gcc/tree-emutls.c | 10 +--- gcc/tree-vect-data-refs.c | 2 +- gcc/tree.c | 6 +-- gcc/tree.h | 4 +- gcc/varasm.c | 24 ++++----- 46 files changed, 291 insertions(+), 148 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f394ca46798b..04736b8cd9f9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,71 @@ +2014-06-11 Jan Hubicka + + * 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. + 2014-06-11 DJ Delorie * config/rx/rx.h (FUNCTION_BOUNDARY): Adjust for RX100/200 4-byte diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 57b9ce962a92..d6b86461567e 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2014-06-11 Jan Hubicka + + * gcc-interface/utils.c: Update handling for section names + that are no longer trees. + 2014-06-11 Robert Dewar * sem_ch13.adb: Minor reformatting. diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c index 5b32f208e722..bb4d513db8c7 100644 --- a/gcc/ada/gcc-interface/utils.c +++ b/gcc/ada/gcc-interface/utils.c @@ -2476,9 +2476,7 @@ process_attributes (tree *node, struct attrib **attr_list, bool in_place, case ATTR_LINK_SECTION: if (targetm_common.have_named_sections) { - tree name = build_string (IDENTIFIER_LENGTH (attr->name), - IDENTIFIER_POINTER (attr->name)); - set_decl_section_name (*node, name); + set_decl_section_name (*node, attr->name); DECL_COMMON (*node) = 0; } else diff --git a/gcc/asan.c b/gcc/asan.c index faa609d7673a..651cfedc0707 100644 --- a/gcc/asan.c +++ b/gcc/asan.c @@ -1288,7 +1288,7 @@ asan_protect_global (tree decl) into user section from multiple TUs are then assumed to be an array of such vars, putting padding in there breaks this assumption. */ - || (DECL_SECTION_NAME (decl) != NULL_TREE + || (DECL_SECTION_NAME (decl) != NULL && !symtab_get_node (decl)->implicit_section) || DECL_SIZE (decl) == 0 || ASAN_RED_ZONE_SIZE * BITS_PER_UNIT > MAX_OFILE_ALIGNMENT diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index b976f21988df..e7c87db04565 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,8 @@ +2014-06-11 Jan Hubicka + + * c-family/c-common.c (handle_section_attribute): Update handling for + section names that are no longer trees. + 2014-06-10 Jakub Jelinek PR fortran/60928 diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index 4f480b04adec..b010653ddcc4 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -7426,8 +7426,8 @@ handle_section_attribute (tree *node, tree ARG_UNUSED (name), tree args, /* The decl may have already been given a section attribute from a previous declaration. Ensure they match. */ - else if (DECL_SECTION_NAME (decl) != NULL_TREE - && strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)), + else if (DECL_SECTION_NAME (decl) != NULL + && strcmp (DECL_SECTION_NAME (decl), TREE_STRING_POINTER (TREE_VALUE (args))) != 0) { error ("section of %q+D conflicts with previous declaration", @@ -7442,7 +7442,8 @@ handle_section_attribute (tree *node, tree ARG_UNUSED (name), tree args, *no_add_attrs = true; } else - set_decl_section_name (decl, TREE_VALUE (args)); + set_decl_section_name (decl, + TREE_STRING_POINTER (TREE_VALUE (args))); } else { diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c index 524b0647432e..4acb4f9f50df 100644 --- a/gcc/c/c-decl.c +++ b/gcc/c/c-decl.c @@ -2305,7 +2305,7 @@ merge_decls (tree newdecl, tree olddecl, tree newtype, tree oldtype) must be done later in decl_attributes since we are called before attributes are assigned. */ if ((DECL_EXTERNAL (olddecl) || TREE_PUBLIC (olddecl) || TREE_STATIC (olddecl)) - && DECL_SECTION_NAME (newdecl) == NULL_TREE + && DECL_SECTION_NAME (newdecl) == NULL && DECL_SECTION_NAME (olddecl)) set_decl_section_name (newdecl, DECL_SECTION_NAME (olddecl)); diff --git a/gcc/cgraph.h b/gcc/cgraph.h index dc286d9e6855..1a5e85e2a6ac 100644 --- a/gcc/cgraph.h +++ b/gcc/cgraph.h @@ -37,6 +37,19 @@ enum symtab_type SYMTAB_VARIABLE }; +/* Section names are stored as reference counted strings in GGC safe hashtable + (to make them survive through PCH). */ + +struct GTY(()) section_hash_entry_d +{ + int ref_count; + char *name; /* As long as this datastructure stays in GGC, we can not put + string at the tail of structure of GGC dies in horrible + way */ +}; + +typedef struct section_hash_entry_d section_hash_entry; + /* Base of all entries in the symbol table. The symtab_node is inherited by cgraph and varpol nodes. */ class GTY((desc ("%h.type"), tag ("SYMTAB_SYMBOL"), @@ -147,14 +160,14 @@ public: /* Return comdat group. */ tree get_comdat_group () { - return comdat_group_; + return x_comdat_group; } tree get_comdat_group_id () { - if (comdat_group_ && TREE_CODE (comdat_group_) != IDENTIFIER_NODE) - comdat_group_ = DECL_ASSEMBLER_NAME (comdat_group_); - return comdat_group_; + if (x_comdat_group && TREE_CODE (x_comdat_group) != IDENTIFIER_NODE) + x_comdat_group = DECL_ASSEMBLER_NAME (x_comdat_group); + return x_comdat_group; } /* Set comdat group. */ @@ -162,32 +175,15 @@ public: { gcc_checking_assert (!group || TREE_CODE (group) == IDENTIFIER_NODE || DECL_P (group)); - comdat_group_ = group; - } - - /* Return section as STRING_CST. */ - tree get_section_name () - { - return section_; + x_comdat_group = group; } /* Return section as string. */ const char * get_section () { - if (!section_) + if (!x_section) return NULL; - return TREE_STRING_POINTER (section_); - } - - /* Set section, do not recurse into aliases. - When one wants to change section of symbol and its aliases, - use set_section */ - void set_section_for_node (tree section) - { - gcc_checking_assert (!section || TREE_CODE (section) == STRING_CST); - section_ = section; - if (!section) - implicit_section = false; + return x_section->name; } /* Vectors of referring and referenced entities. */ @@ -204,13 +200,14 @@ public: PTR GTY ((skip)) aux; /* Comdat group the symbol is in. Can be private if GGC allowed that. */ - tree comdat_group_; + tree x_comdat_group; /* Section name. Again can be private, if allowed. */ - tree section_; + section_hash_entry *x_section; /* Set section for symbol and its aliases. */ - void set_section (tree section); + void set_section (const char *section); + void set_section_for_node (const char *section); }; enum availability diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c index 77ba003add59..b06a5aafa6dc 100644 --- a/gcc/config/alpha/alpha.c +++ b/gcc/config/alpha/alpha.c @@ -682,7 +682,7 @@ alpha_in_small_data_p (const_tree exp) if (TREE_CODE (exp) == VAR_DECL && DECL_SECTION_NAME (exp)) { - const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (exp)); + const char *section = DECL_SECTION_NAME (exp); if (strcmp (section, ".sdata") == 0 || strcmp (section, ".sbss") == 0) return true; diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c index 0aa43c2ce2e7..6e558cb76bcd 100644 --- a/gcc/config/arc/arc.c +++ b/gcc/config/arc/arc.c @@ -6277,7 +6277,7 @@ arc_in_small_data_p (const_tree decl) const char *name; /* Reject anything that isn't in a known small-data section. */ - name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl)); + name = DECL_SECTION_NAME (decl); if (strcmp (name, ".sdata") != 0 && strcmp (name, ".sbss") != 0) return false; diff --git a/gcc/config/arm/unknown-elf.h b/gcc/config/arm/unknown-elf.h index ec6f9a48894a..56aa166272f9 100644 --- a/gcc/config/arm/unknown-elf.h +++ b/gcc/config/arm/unknown-elf.h @@ -50,7 +50,7 @@ /* Return a nonzero value if DECL has a section attribute. */ #define IN_NAMED_SECTION_P(DECL) \ ((TREE_CODE (DECL) == FUNCTION_DECL || TREE_CODE (DECL) == VAR_DECL) \ - && DECL_SECTION_NAME (DECL) != NULL_TREE) + && DECL_SECTION_NAME (DECL) != NULL) #undef ASM_OUTPUT_ALIGNED_BSS #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \ diff --git a/gcc/config/bfin/bfin.c b/gcc/config/bfin/bfin.c index 3c6ed7b9a11e..35bbace4c079 100644 --- a/gcc/config/bfin/bfin.c +++ b/gcc/config/bfin/bfin.c @@ -4760,8 +4760,8 @@ bfin_handle_l1_text_attribute (tree *node, tree name, tree ARG_UNUSED (args), /* The decl may have already been given a section attribute from a previous declaration. Ensure they match. */ - else if (DECL_SECTION_NAME (decl) != NULL_TREE - && strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)), + else if (DECL_SECTION_NAME (decl) != NULL + && strcmp (DECL_SECTION_NAME (decl), ".l1.text") != 0) { error ("section of %q+D conflicts with previous declaration", @@ -4769,7 +4769,7 @@ bfin_handle_l1_text_attribute (tree *node, tree name, tree ARG_UNUSED (args), *no_add_attrs = true; } else - set_decl_section_name (decl, build_string (9, ".l1.text")); + set_decl_section_name (decl, ".l1.text"); return NULL_TREE; } @@ -4811,8 +4811,8 @@ bfin_handle_l1_data_attribute (tree *node, tree name, tree ARG_UNUSED (args), /* The decl may have already been given a section attribute from a previous declaration. Ensure they match. */ - if (DECL_SECTION_NAME (decl) != NULL_TREE - && strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)), + if (DECL_SECTION_NAME (decl) != NULL + && strcmp (DECL_SECTION_NAME (decl), section_name) != 0) { error ("section of %q+D conflicts with previous declaration", @@ -4820,8 +4820,7 @@ bfin_handle_l1_data_attribute (tree *node, tree name, tree ARG_UNUSED (args), *no_add_attrs = true; } else - DECL_SECTION_NAME (decl) - = build_string (strlen (section_name) + 1, section_name); + set_decl_section_name (decl, section_name); } return NULL_TREE; @@ -4838,8 +4837,8 @@ bfin_handle_l2_attribute (tree *node, tree ARG_UNUSED (name), if (TREE_CODE (decl) == FUNCTION_DECL) { - if (DECL_SECTION_NAME (decl) != NULL_TREE - && strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)), + if (DECL_SECTION_NAME (decl) != NULL + && strcmp (DECL_SECTION_NAME (decl), ".l2.text") != 0) { error ("section of %q+D conflicts with previous declaration", @@ -4847,12 +4846,12 @@ bfin_handle_l2_attribute (tree *node, tree ARG_UNUSED (name), *no_add_attrs = true; } else - set_decl_section_name (decl, build_string (9, ".l2.text")); + set_decl_section_name (decl, ".l2.text"); } else if (TREE_CODE (decl) == VAR_DECL) { - if (DECL_SECTION_NAME (decl) != NULL_TREE - && strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)), + if (DECL_SECTION_NAME (decl) != NULL + && strcmp (DECL_SECTION_NAME (decl), ".l2.data") != 0) { error ("section of %q+D conflicts with previous declaration", @@ -4860,7 +4859,7 @@ bfin_handle_l2_attribute (tree *node, tree ARG_UNUSED (name), *no_add_attrs = true; } else - set_decl_section_name (decl, build_string (9, ".l2.data")); + set_decl_section_name (decl, ".l2.data"); } return NULL_TREE; diff --git a/gcc/config/c6x/c6x.c b/gcc/config/c6x/c6x.c index 90a37481290e..7fa60b96e1d0 100644 --- a/gcc/config/c6x/c6x.c +++ b/gcc/config/c6x/c6x.c @@ -868,7 +868,7 @@ c6x_in_small_data_p (const_tree exp) if (TREE_CODE (exp) == VAR_DECL && DECL_SECTION_NAME (exp)) { - const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (exp)); + const char *section = DECL_SECTION_NAME (exp); if (strcmp (section, ".neardata") == 0 || strncmp (section, ".neardata.", 10) == 0 @@ -1060,7 +1060,7 @@ c6x_elf_unique_section (tree decl, int reloc) string = ACONCAT ((linkonce, prefix, ".", name, NULL)); - set_decl_section_name (decl, build_string (strlen (string), string)); + set_decl_section_name (decl, string); return; } default_unique_section (decl, reloc); diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c index a2c87491d215..d13983ce811d 100644 --- a/gcc/config/darwin.c +++ b/gcc/config/darwin.c @@ -3604,7 +3604,7 @@ darwin_function_section (tree decl, enum node_frequency freq, /* If there is a specified section name, we should not be trying to override. */ - if (decl && DECL_SECTION_NAME (decl) != NULL_TREE) + if (decl && DECL_SECTION_NAME (decl) != NULL) return get_named_section (decl, NULL, 0); /* We always put unlikely executed stuff in the cold section. */ diff --git a/gcc/config/frv/frv.c b/gcc/config/frv/frv.c index 98992b29db8a..98a5336a9951 100644 --- a/gcc/config/frv/frv.c +++ b/gcc/config/frv/frv.c @@ -263,7 +263,7 @@ static frv_stack_t *frv_stack_cache = (frv_stack_t *)0; static void frv_option_override (void); static bool frv_legitimate_address_p (enum machine_mode, rtx, bool); static int frv_default_flags_for_cpu (void); -static int frv_string_begins_with (const_tree, const char *); +static int frv_string_begins_with (const char *, const char *); static FRV_INLINE bool frv_small_data_reloc_p (rtx, int); static void frv_print_operand (FILE *, rtx, int); static void frv_print_operand_address (FILE *, rtx); @@ -773,13 +773,12 @@ frv_option_override (void) /* Return true if NAME (a STRING_CST node) begins with PREFIX. */ static int -frv_string_begins_with (const_tree name, const char *prefix) +frv_string_begins_with (const char *name, const char *prefix) { const int prefix_len = strlen (prefix); /* Remember: NAME's length includes the null terminator. */ - return (TREE_STRING_LENGTH (name) > prefix_len - && strncmp (TREE_STRING_POINTER (name), prefix, prefix_len) == 0); + return (strncmp (name, prefix, prefix_len) == 0); } /* Implement TARGET_CONDITIONAL_REGISTER_USAGE. */ @@ -9475,7 +9474,7 @@ static bool frv_in_small_data_p (const_tree decl) { HOST_WIDE_INT size; - const_tree section_name; + const char *section_name; /* Don't apply the -G flag to internal compiler structures. We should leave such structures in the main data section, partly diff --git a/gcc/config/h8300/h8300.c b/gcc/config/h8300/h8300.c index 3c90340aaed6..998afd510be0 100644 --- a/gcc/config/h8300/h8300.c +++ b/gcc/config/h8300/h8300.c @@ -5461,7 +5461,7 @@ h8300_handle_eightbit_data_attribute (tree *node, tree name, if (TREE_STATIC (decl) || DECL_EXTERNAL (decl)) { - set_decl_section_name (decl, build_string (7, ".eight")); + set_decl_section_name (decl, ".eight"); } else { @@ -5485,7 +5485,7 @@ h8300_handle_tiny_data_attribute (tree *node, tree name, if (TREE_STATIC (decl) || DECL_EXTERNAL (decl)) { - set_decl_section_name (decl, build_string (6, ".tiny")); + set_decl_section_name (decl, ".tiny"); } else { diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 2050aaf005c9..41f1b7f84bc7 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -5028,7 +5028,7 @@ ix86_in_large_data_p (tree exp) if (TREE_CODE (exp) == VAR_DECL && DECL_SECTION_NAME (exp)) { - const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (exp)); + const char *section = DECL_SECTION_NAME (exp); if (strcmp (section, ".ldata") == 0 || strcmp (section, ".lbss") == 0) return true; @@ -5193,7 +5193,7 @@ x86_64_elf_unique_section (tree decl, int reloc) string = ACONCAT ((linkonce, prefix, ".", name, NULL)); - set_decl_section_name (decl, build_string (strlen (string), string)); + set_decl_section_name (decl, string); return; } } diff --git a/gcc/config/i386/winnt.c b/gcc/config/i386/winnt.c index ee22375c227f..10c0b003f8d5 100644 --- a/gcc/config/i386/winnt.c +++ b/gcc/config/i386/winnt.c @@ -438,7 +438,7 @@ i386_pe_unique_section (tree decl, int reloc) string = XALLOCAVEC (char, len + 1); sprintf (string, "%s%s", prefix, name); - set_decl_section_name (decl, build_string (len, string)); + set_decl_section_name (decl, string); } /* Local and global relocs can be placed always into readonly memory for diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index cb9a9ca8af82..de486c6dfac3 100644 --- a/gcc/config/ia64/ia64.c +++ b/gcc/config/ia64/ia64.c @@ -9893,7 +9893,7 @@ ia64_in_small_data_p (const_tree exp) if (TREE_CODE (exp) == VAR_DECL && DECL_SECTION_NAME (exp)) { - const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (exp)); + const char *section = DECL_SECTION_NAME (exp); if (strcmp (section, ".sdata") == 0 || strncmp (section, ".sdata.", 7) == 0 diff --git a/gcc/config/lm32/lm32.c b/gcc/config/lm32/lm32.c index fe3dcf4057f7..bfba04899748 100644 --- a/gcc/config/lm32/lm32.c +++ b/gcc/config/lm32/lm32.c @@ -791,7 +791,7 @@ lm32_in_small_data_p (const_tree exp) if (TREE_CODE (exp) == VAR_DECL && DECL_SECTION_NAME (exp)) { - const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (exp)); + const char *section = DECL_SECTION_NAME (exp); if (strcmp (section, ".sdata") == 0 || strcmp (section, ".sbss") == 0) return true; } diff --git a/gcc/config/m32r/m32r.c b/gcc/config/m32r/m32r.c index 2286a8574398..35c136edb994 100644 --- a/gcc/config/m32r/m32r.c +++ b/gcc/config/m32r/m32r.c @@ -463,7 +463,7 @@ m32r_encode_section_info (tree decl, rtx rtl, int first) static bool m32r_in_small_data_p (const_tree decl) { - const_tree section; + const char *section; if (TREE_CODE (decl) != VAR_DECL) return false; @@ -474,8 +474,7 @@ m32r_in_small_data_p (const_tree decl) section = DECL_SECTION_NAME (decl); if (section) { - const char *const name = TREE_STRING_POINTER (section); - if (strcmp (name, ".sdata") == 0 || strcmp (name, ".sbss") == 0) + if (strcmp (section, ".sdata") == 0 || strcmp (section, ".sbss") == 0) return true; } else diff --git a/gcc/config/mcore/mcore.c b/gcc/config/mcore/mcore.c index f9af66b5b59c..5ff8daf015e1 100644 --- a/gcc/config/mcore/mcore.c +++ b/gcc/config/mcore/mcore.c @@ -3089,7 +3089,7 @@ mcore_unique_section (tree decl, int reloc ATTRIBUTE_UNUSED) sprintf (string, "%s%s", prefix, name); - set_decl_section_name (decl, build_string (len, string)); + set_decl_section_name (decl, string); } int diff --git a/gcc/config/mep/mep.c b/gcc/config/mep/mep.c index 2f2d0faee272..853821c87714 100644 --- a/gcc/config/mep/mep.c +++ b/gcc/config/mep/mep.c @@ -4658,7 +4658,7 @@ mep_unique_section (tree decl, int reloc) sprintf (string, "%s%s", prefix, name); - set_decl_section_name (decl, build_string (len, string)); + set_decl_section_name (decl, string); } /* Given a decl, a section name, and whether the decl initializer diff --git a/gcc/config/microblaze/microblaze.c b/gcc/config/microblaze/microblaze.c index cf2dc74cccc0..0c2aec84ac2d 100644 --- a/gcc/config/microblaze/microblaze.c +++ b/gcc/config/microblaze/microblaze.c @@ -3067,7 +3067,7 @@ microblaze_elf_in_small_data_p (const_tree decl) if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl)) { - const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (decl)); + const char *section = DECL_SECTION_NAME (decl); if (strcmp (section, ".sdata") == 0 || strcmp (section, ".sdata2") == 0 || strcmp (section, ".sbss") == 0 diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index 73b6963ba659..585b75557657 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -6618,7 +6618,7 @@ mips16_build_function_stub (void) stubdecl = build_decl (BUILTINS_LOCATION, FUNCTION_DECL, get_identifier (stubname), build_function_type_list (void_type_node, NULL_TREE)); - set_decl_section_name (stubdecl, build_string (strlen (secname), secname)); + set_decl_section_name (stubdecl, secname); DECL_RESULT (stubdecl) = build_decl (BUILTINS_LOCATION, RESULT_DECL, NULL_TREE, void_type_node); @@ -6872,7 +6872,7 @@ mips16_build_call_stub (rtx retval, rtx *fn_ptr, rtx args_size, int fp_code) FUNCTION_DECL, stubid, build_function_type_list (void_type_node, NULL_TREE)); - set_decl_section_name (stubdecl, build_string (strlen (secname), secname)); + set_decl_section_name (stubdecl, secname); DECL_RESULT (stubdecl) = build_decl (BUILTINS_LOCATION, RESULT_DECL, NULL_TREE, void_type_node); @@ -8490,7 +8490,7 @@ mips_function_rodata_section (tree decl) if (decl && DECL_SECTION_NAME (decl)) { - const char *name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl)); + const char *name = DECL_SECTION_NAME (decl); if (DECL_COMDAT_GROUP (decl) && strncmp (name, ".gnu.linkonce.t.", 16) == 0) { char *rname = ASTRDUP (name); @@ -8530,7 +8530,7 @@ mips_in_small_data_p (const_tree decl) const char *name; /* Reject anything that isn't in a known small-data section. */ - name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl)); + name = DECL_SECTION_NAME (decl); if (strcmp (name, ".sdata") != 0 && strcmp (name, ".sbss") != 0) return false; diff --git a/gcc/config/nios2/nios2.c b/gcc/config/nios2/nios2.c index ff3536d1c217..354e3d9a6e66 100644 --- a/gcc/config/nios2/nios2.c +++ b/gcc/config/nios2/nios2.c @@ -1628,7 +1628,7 @@ nios2_in_small_data_p (const_tree exp) { if (DECL_SECTION_NAME (exp)) { - const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (exp)); + const char *section = DECL_SECTION_NAME (exp); if (nios2_section_threshold > 0 && nios2_small_section_name_p (section)) return true; diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c index fe3881e80923..e13674143fe7 100644 --- a/gcc/config/pa/pa.c +++ b/gcc/config/pa/pa.c @@ -10262,10 +10262,10 @@ pa_function_section (tree decl, enum node_frequency freq, /* Force nested functions into the same section as the containing function. */ if (decl - && DECL_SECTION_NAME (decl) == NULL_TREE + && DECL_SECTION_NAME (decl) == NULL && DECL_CONTEXT (decl) != NULL_TREE && TREE_CODE (DECL_CONTEXT (decl)) == FUNCTION_DECL - && DECL_SECTION_NAME (DECL_CONTEXT (decl)) == NULL_TREE) + && DECL_SECTION_NAME (DECL_CONTEXT (decl)) == NULL) return function_section (DECL_CONTEXT (decl)); /* Otherwise, use the default function section. */ diff --git a/gcc/config/pa/pa.h b/gcc/config/pa/pa.h index ac3f0ebe74e9..3f9f06bb6f28 100644 --- a/gcc/config/pa/pa.h +++ b/gcc/config/pa/pa.h @@ -955,7 +955,7 @@ do { \ /* Return a nonzero value if DECL has a section attribute. */ #define IN_NAMED_SECTION_P(DECL) \ ((TREE_CODE (DECL) == FUNCTION_DECL || TREE_CODE (DECL) == VAR_DECL) \ - && DECL_SECTION_NAME (DECL) != NULL_TREE) + && DECL_SECTION_NAME (DECL) != NULL) /* Define this macro if references to a symbol must be treated differently depending on something about the variable or diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 3e3a48784284..98abcf211b40 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -28508,7 +28508,7 @@ rs6000_elf_in_small_data_p (const_tree decl) if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl)) { - const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (decl)); + const char *section = DECL_SECTION_NAME (decl); if (compare_section_name (section, ".sdata") || compare_section_name (section, ".sdata2") || compare_section_name (section, ".gnu.linkonce.s") @@ -29277,7 +29277,7 @@ rs6000_xcoff_asm_named_section (const char *name, unsigned int flags, #define IN_NAMED_SECTION(DECL) \ ((TREE_CODE (DECL) == FUNCTION_DECL || TREE_CODE (DECL) == VAR_DECL) \ - && DECL_SECTION_NAME (DECL) != NULL_TREE) + && DECL_SECTION_NAME (DECL) != NULL) static section * rs6000_xcoff_select_section (tree decl, int reloc, @@ -29342,7 +29342,7 @@ rs6000_xcoff_unique_section (tree decl, int reloc ATTRIBUTE_UNUSED) name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); name = (*targetm.strip_name_encoding) (name); - set_decl_section_name (decl, build_string (strlen (name), name)); + set_decl_section_name (decl, name); } /* Select section for constant in constant pool. diff --git a/gcc/config/rx/rx.c b/gcc/config/rx/rx.c index 2a525f335804..3fc2847ac60c 100644 --- a/gcc/config/rx/rx.c +++ b/gcc/config/rx/rx.c @@ -2219,7 +2219,7 @@ static bool rx_in_small_data (const_tree decl) { int size; - const_tree section; + const char * section; if (rx_small_data_limit == 0) return false; @@ -2238,11 +2238,7 @@ rx_in_small_data (const_tree decl) section = DECL_SECTION_NAME (decl); if (section) - { - const char * const name = TREE_STRING_POINTER (section); - - return (strcmp (name, "D_2") == 0) || (strcmp (name, "B_2") == 0); - } + return (strcmp (section, "D_2") == 0) || (strcmp (section, "B_2") == 0); size = int_size_in_bytes (TREE_TYPE (decl)); diff --git a/gcc/config/score/score.c b/gcc/config/score/score.c index 576a2a0cde9d..d65684c45e49 100644 --- a/gcc/config/score/score.c +++ b/gcc/config/score/score.c @@ -668,7 +668,7 @@ score_in_small_data_p (const_tree decl) if (TREE_CODE (decl) == VAR_DECL && DECL_SECTION_NAME (decl) != 0) { const char *name; - name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl)); + name = DECL_SECTION_NAME (decl); if (strcmp (name, ".sdata") != 0 && strcmp (name, ".sbss") != 0) return true; diff --git a/gcc/config/v850/v850.c b/gcc/config/v850/v850.c index 070a5cbd7d16..f736c44bae8c 100644 --- a/gcc/config/v850/v850.c +++ b/gcc/config/v850/v850.c @@ -2190,7 +2190,7 @@ v850_encode_data_area (tree decl, rtx symbol) { if (DECL_SECTION_NAME (decl)) { - const char *name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl)); + const char *name = DECL_SECTION_NAME (decl); if (streq (name, ".zdata") || streq (name, ".zbss")) v850_set_data_area (decl, DATA_AREA_ZDA); diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 70156ebe16ad..df9f3b9b10a2 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2014-06-11 Jan Hubicka + + * vtable-class-hierarchy.c: Update handling for section names + that are no longer trees. + * decl.c (duplicate_decls): Likewise. + 2014-06-11 Paolo Carlini PR c++/19200 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 08f621ad2bd0..fba0cc958ee9 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -2020,8 +2020,8 @@ duplicate_decls (tree newdecl, tree olddecl, bool newdecl_is_friend) done later in decl_attributes since we are called before attributes are assigned. */ if ((DECL_EXTERNAL (olddecl) || TREE_PUBLIC (olddecl) || TREE_STATIC (olddecl)) - && DECL_SECTION_NAME (newdecl) == NULL_TREE - && DECL_SECTION_NAME (olddecl) != NULL_TREE) + && DECL_SECTION_NAME (newdecl) == NULL + && DECL_SECTION_NAME (olddecl) != NULL) set_decl_section_name (newdecl, DECL_SECTION_NAME (olddecl)); if (TREE_CODE (newdecl) == FUNCTION_DECL) diff --git a/gcc/cp/vtable-class-hierarchy.c b/gcc/cp/vtable-class-hierarchy.c index 15a8a1ce0332..b481273ae850 100644 --- a/gcc/cp/vtable-class-hierarchy.c +++ b/gcc/cp/vtable-class-hierarchy.c @@ -1247,8 +1247,7 @@ vtable_find_or_create_map_decl (tree base_type) /* Put these mmap variables in thr .vtable_map_vars section, so we can find and protect them. */ - set_decl_section_name (var_decl, build_string (strlen (".vtable_map_vars"), - ".vtable_map_vars")); + set_decl_section_name (var_decl, ".vtable_map_vars"); symtab_get_node (var_decl)->implicit_section = true; DECL_INITIAL (var_decl) = initial_value; diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index b38243f91d52..7b17d4c9203b 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -13614,15 +13614,9 @@ secname_for_decl (const_tree decl) if (VAR_OR_FUNCTION_DECL_P (decl) && (DECL_EXTERNAL (decl) || TREE_PUBLIC (decl) || TREE_STATIC (decl)) && DECL_SECTION_NAME (decl)) - { - tree sectree = DECL_SECTION_NAME (decl); - secname = TREE_STRING_POINTER (sectree); - } + secname = DECL_SECTION_NAME (decl); else if (current_function_decl && DECL_SECTION_NAME (current_function_decl)) - { - tree sectree = DECL_SECTION_NAME (current_function_decl); - secname = TREE_STRING_POINTER (sectree); - } + secname = DECL_SECTION_NAME (current_function_decl); else if (cfun && in_cold_section_p) secname = crtl->subsections.cold_section_label; else diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 552108306457..09e7978d9428 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,9 @@ +2014-06-11 Jan Hubicka + + * java/class.c (build_utf8_ref): Update handling for section names + that are no longer trees. + (emit_register_classes_in_jcr_section): Update. + 2014-06-07 Jan Hubicka * class.c (build_utf8_ref): Use set_decl_section_name. diff --git a/gcc/java/class.c b/gcc/java/class.c index fb0c0d45b456..dae321890f8f 100644 --- a/gcc/java/class.c +++ b/gcc/java/class.c @@ -991,7 +991,7 @@ build_utf8_ref (tree name) | SECTION_MERGE | (SECTION_ENTSIZE & decl_size)); sprintf (buf, ".rodata.jutf8.%d", decl_size); switch_to_section (get_section (buf, flags, NULL)); - set_decl_section_name (decl, build_string (strlen (buf), buf)); + set_decl_section_name (decl, buf); } } @@ -2815,8 +2815,7 @@ emit_register_classes_in_jcr_section (void) DECL_ARTIFICIAL (cdecl) = 1; DECL_IGNORED_P (cdecl) = 1; DECL_PRESERVE_P (cdecl) = 1; - set_decl_section_name (cdecl, build_string (strlen (JCR_SECTION_NAME), - JCR_SECTION_NAME)); + set_decl_section_name (cdecl, JCR_SECTION_NAME); pushdecl_top_level (cdecl); relayout_decl (cdecl); rest_of_decl_compilation (cdecl, 1, 0); diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c index 70e813dcbaab..803b66a2c4ce 100644 --- a/gcc/lto-cgraph.c +++ b/gcc/lto-cgraph.c @@ -504,7 +504,6 @@ lto_output_node (struct lto_simple_output_block *ob, struct cgraph_node *node, section = node->get_section (); if (!section) section = ""; - lto_output_data_stream (ob->main_stream, section, strlen (section) + 1); streamer_write_hwi_stream (ob->main_stream, node->tp_first_run); @@ -546,6 +545,7 @@ lto_output_node (struct lto_simple_output_block *ob, struct cgraph_node *node, bp_pack_enum (&bp, ld_plugin_symbol_resolution, LDPR_NUM_KNOWN, node->resolution); streamer_write_bitpack (&bp); + lto_output_data_stream (ob->main_stream, section, strlen (section) + 1); if (node->thunk.thunk_p && !boundary_p) { @@ -1006,13 +1006,13 @@ read_identifier (struct lto_input_block *ib) return id; } -/* Return identifier encoded in IB as a plain string. */ +/* Return string encoded in IB, NULL if string is empty. */ -static tree -read_string_cst (struct lto_input_block *ib) +static const char * +read_string (struct lto_input_block *ib) { unsigned int len = strnlen (ib->data + ib->p, ib->len - ib->p - 1); - tree id; + const char *str; if (ib->data[ib->p + len]) lto_section_overrun (ib); @@ -1021,9 +1021,9 @@ read_string_cst (struct lto_input_block *ib) ib->p++; return NULL; } - id = build_string (len, ib->data + ib->p); + str = ib->data + ib->p; ib->p += len + 1; - return id; + return str; } /* Overwrite the information in NODE based on FILE_DATA, TAG, FLAGS, @@ -1116,7 +1116,7 @@ input_node (struct lto_file_decl_data *file_data, int order; int i, count; tree group; - tree section; + const char *section; order = streamer_read_hwi (ib) + order_base; clone_ref = streamer_read_hwi (ib); @@ -1165,7 +1165,6 @@ input_node (struct lto_file_decl_data *file_data, group = read_identifier (ib); if (group) ref2 = streamer_read_hwi (ib); - section = read_string_cst (ib); /* Make sure that we have not read this node before. Nodes that have already been read will have their tag stored in the 'aux' @@ -1192,6 +1191,7 @@ input_node (struct lto_file_decl_data *file_data, } else node->same_comdat_group = (symtab_node *) (intptr_t) LCC_NOT_FOUND; + section = read_string (ib); if (section) node->set_section_for_node (section); @@ -1226,7 +1226,7 @@ input_varpool_node (struct lto_file_decl_data *file_data, int ref = LCC_NOT_FOUND; int order; tree group; - tree section; + const char *section; order = streamer_read_hwi (ib) + order_base; decl_index = streamer_read_uhwi (ib); @@ -1275,7 +1275,7 @@ input_varpool_node (struct lto_file_decl_data *file_data, } else node->same_comdat_group = (symtab_node *) (intptr_t) LCC_NOT_FOUND; - section = read_string_cst (ib); + section = read_string (ib); if (section) node->set_section_for_node (section); node->resolution = streamer_read_enum (ib, ld_plugin_symbol_resolution, diff --git a/gcc/sdbout.c b/gcc/sdbout.c index b07824bbe909..144caa96a7df 100644 --- a/gcc/sdbout.c +++ b/gcc/sdbout.c @@ -1017,7 +1017,7 @@ static void sdbout_one_type (tree type) { if (current_function_decl != NULL_TREE - && DECL_SECTION_NAME (current_function_decl) != NULL_TREE) + && DECL_SECTION_NAME (current_function_decl) != NULL) ; /* Don't change section amid function. */ else switch_to_section (current_function_section ()); diff --git a/gcc/symtab.c b/gcc/symtab.c index d7977f1e8d41..8158acc5bda8 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 (); + x_section->name = ggc_vec_alloc (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(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(target->get_section ()), true); if (target->implicit_section) symtab_for_node_and_aliases (node, set_implicit_section, NULL, true); diff --git a/gcc/tree-emutls.c b/gcc/tree-emutls.c index d7969bc266c7..5bb96ce0b557 100644 --- a/gcc/tree-emutls.c +++ b/gcc/tree-emutls.c @@ -264,10 +264,7 @@ get_emutls_init_templ_addr (tree decl) if (targetm.emutls.tmpl_section) { - set_decl_section_name - (to, - build_string (strlen (targetm.emutls.tmpl_section), - targetm.emutls.tmpl_section)); + set_decl_section_name (to, targetm.emutls.tmpl_section); } else set_decl_section_name (to, DECL_SECTION_NAME (decl)); @@ -325,10 +322,7 @@ new_emutls_decl (tree decl, tree alias_of) /* If the target wants the control variables grouped, do so. */ if (!DECL_COMMON (to) && targetm.emutls.var_section) { - set_decl_section_name - (to, - build_string (strlen (targetm.emutls.var_section), - targetm.emutls.var_section)); + set_decl_section_name (to, targetm.emutls.var_section); } /* If this variable is defined locally, then we need to initialize the diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c index b23046964c13..3c5a3b3bc6f3 100644 --- a/gcc/tree-vect-data-refs.c +++ b/gcc/tree-vect-data-refs.c @@ -5339,7 +5339,7 @@ vect_can_force_dr_alignment_p (const_tree decl, unsigned int alignment) section name is also used. This is a common idiom used by many software projects. */ if (TREE_STATIC (decl) - && DECL_SECTION_NAME (decl) != NULL_TREE + && DECL_SECTION_NAME (decl) != NULL && !symtab_get_node (decl)->implicit_section) return false; diff --git a/gcc/tree.c b/gcc/tree.c index 040433e02d57..62477c3b1b36 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -628,19 +628,19 @@ decl_comdat_group_id (const_tree node) /* When the target supports named section, return its name as IDENTIFIER_NODE or NULL if it is in no section. */ -tree +const char * decl_section_name (const_tree node) { struct symtab_node *snode = symtab_get_node (node); if (!snode) return NULL; - return snode->get_section_name (); + return snode->get_section (); } /* Set section section name of NODE to VALUE (that is expected to be identifier node) */ void -set_decl_section_name (tree node, tree value) +set_decl_section_name (tree node, const char *value) { struct symtab_node *snode; diff --git a/gcc/tree.h b/gcc/tree.h index 981a2c557d73..31a9a87d2d17 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -3427,8 +3427,8 @@ tree_operand_check_code (const_tree __t, enum tree_code __code, int __i, extern tree decl_assembler_name (tree); extern tree decl_comdat_group (const_tree); extern tree decl_comdat_group_id (const_tree); -extern tree decl_section_name (const_tree); -extern void set_decl_section_name (tree, tree); +extern const char *decl_section_name (const_tree); +extern void set_decl_section_name (tree, const char *); /* Compute the number of bytes occupied by 'node'. This routine only looks at TREE_CODE and, if the code is TREE_VEC, TREE_VEC_LENGTH. */ diff --git a/gcc/varasm.c b/gcc/varasm.c index d56e67a2d449..7be56f1e1eef 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -173,7 +173,7 @@ static GTY(()) section *unnamed_sections; /* Return a nonzero value if DECL has a section attribute. */ #define IN_NAMED_SECTION(DECL) \ ((TREE_CODE (DECL) == FUNCTION_DECL || TREE_CODE (DECL) == VAR_DECL) \ - && DECL_SECTION_NAME (DECL) != NULL_TREE) + && DECL_SECTION_NAME (DECL) != NULL) /* Hash table of named sections. */ static GTY((param_is (section))) htab_t section_htab; @@ -411,7 +411,7 @@ get_named_section (tree decl, const char *name, int reloc) if (name == NULL) { gcc_assert (decl && DECL_P (decl) && DECL_SECTION_NAME (decl)); - name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl)); + name = DECL_SECTION_NAME (decl); } flags = targetm.section_type_flags (decl, name, reloc); @@ -433,7 +433,7 @@ void resolve_unique_section (tree decl, int reloc ATTRIBUTE_UNUSED, int flag_function_or_data_sections) { - if (DECL_SECTION_NAME (decl) == NULL_TREE + if (DECL_SECTION_NAME (decl) == NULL && targetm_common.have_named_sections && (flag_function_or_data_sections || DECL_COMDAT_GROUP (decl))) @@ -483,7 +483,7 @@ static section * hot_function_section (tree decl) { if (decl != NULL_TREE - && DECL_SECTION_NAME (decl) != NULL_TREE + && DECL_SECTION_NAME (decl) != NULL && targetm_common.have_named_sections) return get_named_section (decl, NULL, 0); else @@ -508,13 +508,13 @@ get_named_text_section (tree decl, { if (named_section_suffix) { - tree dsn = DECL_SECTION_NAME (decl); + const char *dsn = DECL_SECTION_NAME (decl); const char *stripped_name; char *name, *buffer; - name = (char *) alloca (TREE_STRING_LENGTH (dsn) + 1); - memcpy (name, TREE_STRING_POINTER (dsn), - TREE_STRING_LENGTH (dsn) + 1); + name = (char *) alloca (strlen (dsn) + 1); + memcpy (name, dsn, + strlen (dsn) + 1); stripped_name = targetm.strip_name_encoding (name); @@ -620,7 +620,7 @@ function_section_1 (tree decl, bool force_cold) #ifdef USE_SELECT_SECTION_FOR_FUNCTIONS if (decl != NULL_TREE - && DECL_SECTION_NAME (decl) != NULL_TREE) + && DECL_SECTION_NAME (decl) != NULL) { if (targetm.asm_out.function_section) section = targetm.asm_out.function_section (decl, freq, @@ -694,7 +694,7 @@ default_function_rodata_section (tree decl) { if (decl != NULL_TREE && DECL_SECTION_NAME (decl)) { - const char *name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl)); + const char *name = DECL_SECTION_NAME (decl); if (DECL_COMDAT_GROUP (decl) && HAVE_COMDAT_GROUP) { @@ -1380,7 +1380,7 @@ make_decl_rtl (tree decl) we take care of recomputing the DECL_RTL after visibility is changed. */ if (TREE_CODE (decl) == VAR_DECL && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)) - && DECL_SECTION_NAME (decl) != NULL_TREE + && DECL_SECTION_NAME (decl) != NULL && DECL_INITIAL (decl) == NULL_TREE && DECL_COMMON (decl)) DECL_COMMON (decl) = 0; @@ -6471,7 +6471,7 @@ default_unique_section (tree decl, int reloc) string = ACONCAT ((linkonce, prefix, ".", name, NULL)); - set_decl_section_name (decl, build_string (strlen (string), string)); + set_decl_section_name (decl, string); } /* Like compute_reloc_for_constant, except for an RTX. The return value -- 2.43.5