This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Turn DECL_SECTION_NAME into string


> On Thu, Jun 12, 2014 at 6:33 AM, Jan Hubicka <hubicka@ucw.cz> wrote:
> > Hi,
> > this lenghtly patch makes the legwork to put section names out of tree representation.
> > Originally they were STRING_CST. I ended up implementing on-side reference counted
> > string voclabulary that is done in bit baroque way to be GGC and PCH safe (uff).
> > The memory savings on Firefox are about 60MB, becuase while reading symbol table we
> > now unify the many duplicated comdat group strings and also we free them after we bring
> > those local.
> >
> > The old representation probably made sense when most of string came via __section__
> > attribute where they was readily parsed as string constants.
> 
> I wonder why you didn't use IDENTIFIER_NODEs?  (ok, still trees ...)
> At least those are already GGC and PCH safe.

To be able to discard it effectively during LTO by ref counting.
IDENTIFIER_NODEs makes sense for assembler names (sorta) since they may match
identifier and thus also to COMDAT_GROUPS that are taken from assembler names.
Section names do not match those, so having a separate pool for them seemed to work
best.

What happens is at LTO is that we read all the sections for comdat groups and then
ipa-visibility dismantles them.

Anyway, it is now hidden by the API, so we can change it easily.

Honza
> 
> Richard.
> 
> > Bootstrapped/regtested x86_64-linux, comitted.
> >
> > Honza
> >
> >         * 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.
> > Index: sdbout.c
> > ===================================================================
> > --- sdbout.c    (revision 211433)
> > +++ sdbout.c    (working copy)
> > @@ -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 ());
> > Index: tree-vect-data-refs.c
> > ===================================================================
> > --- tree-vect-data-refs.c       (revision 211434)
> > +++ tree-vect-data-refs.c       (working copy)
> > @@ -5214,7 +5214,7 @@ vect_can_force_dr_alignment_p (const_tre
> >       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;
> >
> > Index: varasm.c
> > ===================================================================
> > --- varasm.c    (revision 211434)
> > +++ varasm.c    (working copy)
> > @@ -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
> >    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 forc
> >
> >  #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 de
> >  {
> >    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 r
> >
> >    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
> > Index: symtab.c
> > ===================================================================
> > --- symtab.c    (revision 211434)
> > +++ symtab.c    (working copy)
> > @@ -57,6 +57,10 @@ const char * const ld_plugin_symbol_reso
> >    "prevailing_def_ironly_exp"
> >  };
> >
> > +
> > +/* Hash table used to hold sections.  */
> > +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 *nod
> >    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->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,
> >        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);
> > Index: config/c6x/c6x.c
> > ===================================================================
> > --- config/c6x/c6x.c    (revision 211433)
> > +++ config/c6x/c6x.c    (working copy)
> > @@ -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 r
> >
> >        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);
> > Index: config/nios2/nios2.c
> > ===================================================================
> > --- config/nios2/nios2.c        (revision 211433)
> > +++ config/nios2/nios2.c        (working copy)
> > @@ -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;
> > Index: config/pa/pa.c
> > ===================================================================
> > --- config/pa/pa.c      (revision 211433)
> > +++ config/pa/pa.c      (working copy)
> > @@ -10262,10 +10262,10 @@ pa_function_section (tree decl, enum nod
> >    /* 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.  */
> > Index: config/pa/pa.h
> > ===================================================================
> > --- config/pa/pa.h      (revision 211433)
> > +++ config/pa/pa.h      (working copy)
> > @@ -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
> > Index: config/ia64/ia64.c
> > ===================================================================
> > --- config/ia64/ia64.c  (revision 211433)
> > +++ config/ia64/ia64.c  (working copy)
> > @@ -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
> > Index: config/arc/arc.c
> > ===================================================================
> > --- config/arc/arc.c    (revision 211433)
> > +++ config/arc/arc.c    (working copy)
> > @@ -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;
> >
> > Index: config/arm/unknown-elf.h
> > ===================================================================
> > --- config/arm/unknown-elf.h    (revision 211433)
> > +++ config/arm/unknown-elf.h    (working copy)
> > @@ -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)          \
> > Index: config/mcore/mcore.c
> > ===================================================================
> > --- config/mcore/mcore.c        (revision 211433)
> > +++ config/mcore/mcore.c        (working copy)
> > @@ -3089,7 +3089,7 @@ mcore_unique_section (tree decl, int rel
> >
> >    sprintf (string, "%s%s", prefix, name);
> >
> > -  set_decl_section_name (decl, build_string (len, string));
> > +  set_decl_section_name (decl, string);
> >  }
> >
> >  int
> > Index: config/mips/mips.c
> > ===================================================================
> > --- config/mips/mips.c  (revision 211433)
> > +++ config/mips/mips.c  (working copy)
> > @@ -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
> >                              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;
> >
> > Index: config/score/score.c
> > ===================================================================
> > --- config/score/score.c        (revision 211433)
> > +++ config/score/score.c        (working copy)
> > @@ -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;
> > Index: config/rx/rx.c
> > ===================================================================
> > --- config/rx/rx.c      (revision 211433)
> > +++ config/rx/rx.c      (working copy)
> > @@ -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));
> >
> > Index: config/rs6000/rs6000.c
> > ===================================================================
> > --- config/rs6000/rs6000.c      (revision 211433)
> > +++ config/rs6000/rs6000.c      (working copy)
> > @@ -28508,7 +28508,7 @@ rs6000_elf_in_small_data_p (const_tree d
> >
> >    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 ch
> >
> >  #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,
> >
> >    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.
> > Index: config/frv/frv.c
> > ===================================================================
> > --- config/frv/frv.c    (revision 211433)
> > +++ config/frv/frv.c    (working copy)
> > @@ -263,7 +263,7 @@ static frv_stack_t *frv_stack_cache = (f
> >  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
> > Index: config/v850/v850.c
> > ===================================================================
> > --- config/v850/v850.c  (revision 211433)
> > +++ config/v850/v850.c  (working copy)
> > @@ -2190,7 +2190,7 @@ v850_encode_data_area (tree decl, rtx sy
> >      {
> >        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);
> > Index: config/bfin/bfin.c
> > ===================================================================
> > --- config/bfin/bfin.c  (revision 211433)
> > +++ config/bfin/bfin.c  (working copy)
> > @@ -4760,8 +4760,8 @@ bfin_handle_l1_text_attribute (tree *nod
> >
> >    /* 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 *nod
> >        *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 *nod
> >
> >        /* 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 *nod
> >           *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, tr
> >
> >    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, tr
> >           *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, tr
> >           *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;
> > Index: config/mep/mep.c
> > ===================================================================
> > --- config/mep/mep.c    (revision 211433)
> > +++ config/mep/mep.c    (working copy)
> > @@ -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
> > Index: config/microblaze/microblaze.c
> > ===================================================================
> > --- config/microblaze/microblaze.c      (revision 211433)
> > +++ config/microblaze/microblaze.c      (working copy)
> > @@ -3067,7 +3067,7 @@ microblaze_elf_in_small_data_p (const_tr
> >
> >    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
> > Index: config/h8300/h8300.c
> > ===================================================================
> > --- config/h8300/h8300.c        (revision 211433)
> > +++ config/h8300/h8300.c        (working copy)
> > @@ -5461,7 +5461,7 @@ h8300_handle_eightbit_data_attribute (tr
> >
> >    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 *
> >
> >    if (TREE_STATIC (decl) || DECL_EXTERNAL (decl))
> >      {
> > -      set_decl_section_name (decl, build_string (6, ".tiny"));
> > +      set_decl_section_name (decl, ".tiny");
> >      }
> >    else
> >      {
> > Index: config/m32r/m32r.c
> > ===================================================================
> > --- config/m32r/m32r.c  (revision 211433)
> > +++ config/m32r/m32r.c  (working copy)
> > @@ -463,7 +463,7 @@ m32r_encode_section_info (tree decl, rtx
> >  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
> > Index: config/alpha/alpha.c
> > ===================================================================
> > --- config/alpha/alpha.c        (revision 211433)
> > +++ config/alpha/alpha.c        (working copy)
> > @@ -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;
> > Index: config/i386/i386.c
> > ===================================================================
> > --- config/i386/i386.c  (revision 211433)
> > +++ config/i386/i386.c  (working copy)
> > @@ -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, in
> >
> >           string = ACONCAT ((linkonce, prefix, ".", name, NULL));
> >
> > -         set_decl_section_name (decl, build_string (strlen (string), string));
> > +         set_decl_section_name (decl, string);
> >           return;
> >         }
> >      }
> > Index: config/i386/winnt.c
> > ===================================================================
> > --- config/i386/winnt.c (revision 211433)
> > +++ config/i386/winnt.c (working copy)
> > @@ -438,7 +438,7 @@ i386_pe_unique_section (tree decl, int r
> >    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
> > Index: config/darwin.c
> > ===================================================================
> > --- config/darwin.c     (revision 211433)
> > +++ config/darwin.c     (working copy)
> > @@ -3604,7 +3604,7 @@ darwin_function_section (tree decl, enum
> >
> >    /* 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.  */
> > Index: config/lm32/lm32.c
> > ===================================================================
> > --- config/lm32/lm32.c  (revision 211433)
> > +++ config/lm32/lm32.c  (working copy)
> > @@ -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;
> >      }
> > Index: c-family/c-common.c
> > ===================================================================
> > --- c-family/c-common.c (revision 211433)
> > +++ c-family/c-common.c (working copy)
> > @@ -7426,8 +7426,8 @@ handle_section_attribute (tree *node, tr
> >
> >           /* 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, tr
> >               *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
> >         {
> > Index: java/class.c
> > ===================================================================
> > --- java/class.c        (revision 211433)
> > +++ java/class.c        (working copy)
> > @@ -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 (vo
> >    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);
> > Index: c/c-decl.c
> > ===================================================================
> > --- c/c-decl.c  (revision 211433)
> > +++ c/c-decl.c  (working copy)
> > @@ -2305,7 +2305,7 @@ merge_decls (tree newdecl, tree olddecl,
> >          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));
> >
> > Index: cgraph.h
> > ===================================================================
> > --- cgraph.h    (revision 211434)
> > +++ cgraph.h    (working copy)
> > @@ -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
> > Index: tree.c
> > ===================================================================
> > --- tree.c      (revision 211434)
> > +++ tree.c      (working copy)
> > @@ -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;
> >
> > Index: tree.h
> > ===================================================================
> > --- tree.h      (revision 211434)
> > +++ tree.h      (working copy)
> > @@ -3427,8 +3427,8 @@ tree_operand_check_code (const_tree __t,
> >  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.  */
> > Index: tree-emutls.c
> > ===================================================================
> > --- tree-emutls.c       (revision 211433)
> > +++ tree-emutls.c       (working copy)
> > @@ -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_o
> >    /* 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
> > Index: cp/vtable-class-hierarchy.c
> > ===================================================================
> > --- cp/vtable-class-hierarchy.c (revision 211434)
> > +++ cp/vtable-class-hierarchy.c (working copy)
> > @@ -1247,8 +1247,7 @@ vtable_find_or_create_map_decl (tree bas
> >        /* 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;
> >
> > Index: cp/decl.c
> > ===================================================================
> > --- cp/decl.c   (revision 211433)
> > +++ cp/decl.c   (working copy)
> > @@ -2020,8 +2020,8 @@ duplicate_decls (tree newdecl, tree oldd
> >          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)
> > Index: lto-cgraph.c
> > ===================================================================
> > --- lto-cgraph.c        (revision 211434)
> > +++ lto-cgraph.c        (working copy)
> > @@ -504,7 +504,6 @@ lto_output_node (struct lto_simple_outpu
> >    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_outpu
> >    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
> >    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->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 *f
> >    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 *f
> >    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 *f
> >      }
> >    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
> >    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
> >      }
> >    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,
> > Index: dwarf2out.c
> > ===================================================================
> > --- dwarf2out.c (revision 211433)
> > +++ dwarf2out.c (working copy)
> > @@ -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
> > Index: ada/gcc-interface/utils.c
> > ===================================================================
> > --- ada/gcc-interface/utils.c   (revision 211433)
> > +++ ada/gcc-interface/utils.c   (working copy)
> > @@ -2476,9 +2476,7 @@ process_attributes (tree *node, struct a
> >        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
> > Index: asan.c
> > ===================================================================
> > --- asan.c      (revision 211434)
> > +++ asan.c      (working copy)
> > @@ -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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]