]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
symtab.c (section_hash): New hash.
authorJan Hubicka <hubicka@ucw.cz>
Thu, 12 Jun 2014 04:03:49 +0000 (06:03 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Thu, 12 Jun 2014 04:03:49 +0000 (04:03 +0000)
* 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

46 files changed:
gcc/ChangeLog
gcc/ada/ChangeLog
gcc/ada/gcc-interface/utils.c
gcc/asan.c
gcc/c-family/ChangeLog
gcc/c-family/c-common.c
gcc/c/c-decl.c
gcc/cgraph.h
gcc/config/alpha/alpha.c
gcc/config/arc/arc.c
gcc/config/arm/unknown-elf.h
gcc/config/bfin/bfin.c
gcc/config/c6x/c6x.c
gcc/config/darwin.c
gcc/config/frv/frv.c
gcc/config/h8300/h8300.c
gcc/config/i386/i386.c
gcc/config/i386/winnt.c
gcc/config/ia64/ia64.c
gcc/config/lm32/lm32.c
gcc/config/m32r/m32r.c
gcc/config/mcore/mcore.c
gcc/config/mep/mep.c
gcc/config/microblaze/microblaze.c
gcc/config/mips/mips.c
gcc/config/nios2/nios2.c
gcc/config/pa/pa.c
gcc/config/pa/pa.h
gcc/config/rs6000/rs6000.c
gcc/config/rx/rx.c
gcc/config/score/score.c
gcc/config/v850/v850.c
gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/cp/vtable-class-hierarchy.c
gcc/dwarf2out.c
gcc/java/ChangeLog
gcc/java/class.c
gcc/lto-cgraph.c
gcc/sdbout.c
gcc/symtab.c
gcc/tree-emutls.c
gcc/tree-vect-data-refs.c
gcc/tree.c
gcc/tree.h
gcc/varasm.c

index f394ca46798b35531177d90bb6ff838d815c83a2..04736b8cd9f98ce6b4fff74e594c4f294802efec 100644 (file)
@@ -1,3 +1,71 @@
+2014-06-11  Jan Hubicka  <hubicka@ucw.cz>
+
+       * 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  <dj@redhat.com>
 
        * config/rx/rx.h (FUNCTION_BOUNDARY): Adjust for RX100/200 4-byte
index 57b9ce962a92f5d0b9e3aa6f7833262e2458854a..d6b86461567e1fb59e5a75077f056be8ecb8fc75 100644 (file)
@@ -1,3 +1,8 @@
+2014-06-11  Jan Hubicka  <hubicka@ucw.cz>
+
+       * gcc-interface/utils.c:  Update handling for section names
+       that are no longer trees.
+
 2014-06-11  Robert Dewar  <dewar@adacore.com>
 
        * sem_ch13.adb: Minor reformatting.
index 5b32f208e722bf81121177821a55b9b04b596455..bb4d513db8c73bed0df31a690ba74bef3db3f1c4 100644 (file)
@@ -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
index faa609d7673a84085fe7414f6d1555961f25e46d..651cfedc0707c37dd1313090e2a69a9b15c7fc0d 100644 (file)
@@ -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 b976f21988dfaab3a3dff01fb8d536a5f85d81f7..e7c87db04565edfba13a931303a67c41ea46dc95 100644 (file)
@@ -1,3 +1,8 @@
+2014-06-11  Jan Hubicka  <hubicka@ucw.cz>
+
+       * c-family/c-common.c (handle_section_attribute): Update handling for
+       section names that are no longer trees.
+
 2014-06-10  Jakub Jelinek  <jakub@redhat.com>
 
        PR fortran/60928
index 4f480b04adecf94a479add8949e0c83ee10a0cea..b010653ddcc439892b11246747a800a943a053a5 100644 (file)
@@ -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
        {
index 524b0647432e82a13142e08203e4641c519492a8..4acb4f9f50dfa36b0a74d5682e977064be951e8f 100644 (file)
@@ -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));
 
index dc286d9e68552df19bbebbff958b6cd157534d15..1a5e85e2a6acb8e03ef819cf85543221d73dbcf4 100644 (file)
@@ -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 77ba003add5954943ff8d3154b87286b36f7948d..b06a5aafa6dca62d55de3df76106415d5c9b2ed6 100644 (file)
@@ -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 0aa43c2ce2e73ce3baafa58fef3bacef09456ad4..6e558cb76bcd6eb17900ac7d6123221c7e19e415 100644 (file)
@@ -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 ec6f9a48894afc02471a4ee40e9c6cebfba6b678..56aa166272f9c568cdcfd699ada54f8a90efdccd 100644 (file)
@@ -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 3c6ed7b9a11e1f43a030ffbace7fcf999c68dc8a..35bbace4c079ab4583d382b192c1266aade5c759 100644 (file)
@@ -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;
index 90a37481290e02f11aa2e2d87ae20e8c368256fb..7fa60b96e1d0a260e9c421908bce1a03236eec79 100644 (file)
@@ -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);
index a2c87491d215794e11f4a4525173e1bd82345002..d13983ce811d5cf38f69bcdc9ab7d0297a044711 100644 (file)
@@ -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.  */
index 98992b29db8a18fc271b6924247842aa116a713e..98a5336a9951596417335f83e4bd5f1a5a900f1d 100644 (file)
@@ -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);
 }
 \f
 /* 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 3c90340aaed644de10cee5048b342656ead5abfe..998afd510be03c5aef663a11ea2aa6b83454ec2f 100644 (file)
@@ -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
     {
index 2050aaf005c9f96f9d3c65f388c723d5aeb2cdb2..41f1b7f84bc7969c684ed0a482c4c209bd34ea7b 100644 (file)
@@ -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;
        }
     }
index ee22375c227fe41c7ebf5c16545e2c1dfc9d1859..10c0b003f8d532a5c82dc4a944b5f3fc908b4a20 100644 (file)
@@ -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
index cb9a9ca8af8269242577f278f43c4977b287ea6b..de486c6dfac33d54c08ccc56f0fc7b721dcce5c8 100644 (file)
@@ -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 fe3dcf4057f7bc2507e19238f3ef0fcbfe0cd8c5..bfba048997484e4e71986b75e91c0acc1f5d191b 100644 (file)
@@ -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 2286a8574398001469558046a6539f4bdf373178..35c136edb994a59f963c48b9a79afc43deb38fac 100644 (file)
@@ -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
index f9af66b5b59cef1d0275030505caf6be5f9de45d..5ff8daf015e111295620f490444229c92152714a 100644 (file)
@@ -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
index 2f2d0faee272f05a43e079677ce93c71deed6a12..853821c877141e98697daa95c1035b4cb7f5d20d 100644 (file)
@@ -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 cf2dc74cccc07b99201b62e133213feab4a34529..0c2aec84ac2d49055ad530fecc8911a9b35095a1 100644 (file)
@@ -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
index 73b6963ba659f546aed16e081be8842a0f7520e4..585b7555765783a10e04739c197e58da9fd7adf6 100644 (file)
@@ -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;
 
index ff3536d1c2177e5a47e39cd8cdddbe8c620a88b3..354e3d9a6e66e0f4841ec3ce1c50d24ce2becb11 100644 (file)
@@ -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 fe3881e8092397c03594a75e69d91f04e51e7917..e13674143fe7957f42790e4416a2951ca7b4b537 100644 (file)
@@ -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.  */
index ac3f0ebe74e9a834c461d50d0424ee5addbb4abd..3f9f06bb6f280031040b6840d1b7e647e51f4706 100644 (file)
@@ -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 3e3a48784284618392d066f80266c61936e2f925..98abcf211b4015b83bfd7b3f953032820411c142 100644 (file)
@@ -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.
index 2a525f33580482fff7a98f9afc3178a86456719e..3fc2847ac60cbf2e416df1b92a0ba7f1d7f3a3b5 100644 (file)
@@ -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 576a2a0cde9d178c433a4bcc61fe382ad11170e2..d65684c45e49a64f0dbeb88c3d33da2f286dca2b 100644 (file)
@@ -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 070a5cbd7d16ee629c4858e3ea9f5cb865db23e0..f736c44bae8cf51ea310ed5abdb413018f78d4d8 100644 (file)
@@ -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);
index 70156ebe16adaa8b4fd28712f39f6a28d134c35e..df9f3b9b10a2b0a4fd517e1992835935e547456f 100644 (file)
@@ -1,3 +1,9 @@
+2014-06-11  Jan Hubicka  <hubicka@ucw.cz>
+
+       * vtable-class-hierarchy.c: Update handling for section names
+       that are no longer trees.
+       * decl.c (duplicate_decls): Likewise.
+
 2014-06-11  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/19200
index 08f621ad2bd0f4533b621ad7be5725d32dc9677b..fba0cc958ee97e07e8c57db15557085d5ed98b4f 100644 (file)
@@ -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)
index 15a8a1ce0332b1bd8fe62afadc50c401912c4555..b481273ae8506643ea88a22c2b31e83e17c841bd 100644 (file)
@@ -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;
 
index b38243f91d52491a413c4f72223666d0e795ac48..7b17d4c9203b1496437a594cfce56f683642db4b 100644 (file)
@@ -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 55210830645784c2b1b25e5c55dbeba6573b8446..09e7978d942873e73f6a4db35c80b215962beaab 100644 (file)
@@ -1,3 +1,9 @@
+2014-06-11  Jan Hubicka  <hubicka@ucw.cz>
+
+       * 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  <hubicka@ucw.cz>
 
        * class.c (build_utf8_ref): Use set_decl_section_name.
index fb0c0d45b456b27db4112fd7aa2f27a4f77abdde..dae321890f8fc516b9834b6b459accb8c3be6ee4 100644 (file)
@@ -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);
index 70e813dcbaabb713fe5b7b3b70b389c690d3efa3..803b66a2c4ce09c5ad8700a091ba07ad038a3ca8 100644 (file)
@@ -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,
index b07824bbe9092d4e9aa72e28e8f595f289bda0ea..144caa96a7dfa385890ebdf2015087a6e8de02d7 100644 (file)
@@ -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 d7977f1e8d41c65c15fc1efb6ac3eeb4b64fe64e..8158acc5bda8acb9d04e7acf52bd0ee771ad7279 100644 (file)
@@ -57,6 +57,10 @@ const char * const ld_plugin_symbol_resolution_names[]=
   "prevailing_def_ironly_exp"
 };
 
+
+/* Hash table used to hold sectoons.  */
+static GTY((param_is (section_hash_entry))) htab_t section_hash;
+
 /* Hash table used to convert assembler names into nodes.  */
 static GTY((param_is (symtab_node))) htab_t assembler_name_hash;
 
@@ -307,6 +311,9 @@ symtab_unregister_node (symtab_node *node)
   ipa_remove_all_references (&node->ref_list);
   ipa_remove_all_referring (&node->ref_list);
 
+  /* Remove reference to section.  */
+  node->set_section_for_node (NULL);
+
   symtab_remove_from_same_comdat_group (node);
 
   if (node->previous)
@@ -1081,22 +1088,92 @@ fixup_same_cpp_alias_visibility (symtab_node *node, symtab_node *target)
   node->externally_visible = target->externally_visible;
 }
 
+/* Hash sections by their names.  */
+
+static hashval_t
+hash_section_hash_entry (const void *p)
+{
+  const section_hash_entry *n = (const section_hash_entry *) p;
+  return htab_hash_string (n->name);
+}
+
+/* Return true if section P1 name equals to P2.  */
+
+static int
+eq_sections (const void *p1, const void *p2)
+{
+  const section_hash_entry *n1 = (const section_hash_entry *) p1;
+  const char *name = (const char *)p2;
+  return n1->name == name || !strcmp (n1->name, name);
+}
+
+/* Set section, do not recurse into aliases.
+   When one wants to change section of symbol and its aliases,
+   use set_section  */
+
+void
+symtab_node::set_section_for_node (const char *section)
+{
+  const char *current = get_section ();
+  void **slot;
+
+  if (current == section
+      || (current && section
+         && !strcmp (current, section)))
+    return;
+
+  if (current)
+    {
+      x_section->ref_count--;
+      if (!x_section->ref_count)
+       {
+         slot = htab_find_slot_with_hash (section_hash, x_section->name,
+                                          htab_hash_string (x_section->name),
+                                          INSERT);
+         ggc_free (x_section);
+         htab_clear_slot (section_hash, slot);
+       }
+      x_section = NULL;
+    }
+  if (!section)
+    {
+      implicit_section = false;
+      return;
+    }
+  if (!section_hash)
+    section_hash = htab_create_ggc (10, hash_section_hash_entry,
+                                   eq_sections, NULL);
+  slot = htab_find_slot_with_hash (section_hash, section,
+                                  htab_hash_string (section),
+                                  INSERT);
+  if (*slot)
+    x_section = (section_hash_entry *)*slot;
+  else
+    {
+      int len = strlen (section);
+      *slot = x_section = ggc_cleared_alloc<section_hash_entry> ();
+      x_section->name = ggc_vec_alloc<char> (len + 1);
+      memcpy (x_section->name, section, len + 1);
+    }
+  x_section->ref_count++;
+}
+
 /* Worker for set_section.  */
 
 static bool
 set_section_1 (struct symtab_node *n, void *s)
 {
-  n->set_section_for_node ((tree)s);
+  n->set_section_for_node ((char *)s);
   return false;
 }
 
 /* Set section of symbol and its aliases.  */
 
 void
-symtab_node::set_section (tree section)
+symtab_node::set_section (const char *section)
 {
   gcc_assert (!this->alias);
-  symtab_for_node_and_aliases (this, set_section_1, section, true);
+  symtab_for_node_and_aliases (this, set_section_1, const_cast<char *>(section), true);
 }
 
 /* Worker for symtab_resolve_alias.  */
@@ -1156,7 +1233,8 @@ symtab_resolve_alias (symtab_node *node, symtab_node *target)
       error ("section of alias %q+D must match section of its target",
             node->decl);
     }
-  symtab_for_node_and_aliases (node, set_section_1, target->get_section_name (), true);
+  symtab_for_node_and_aliases (node, set_section_1,
+                              const_cast<char *>(target->get_section ()), true);
   if (target->implicit_section)
     symtab_for_node_and_aliases (node,
                                 set_implicit_section, NULL, true);
index d7969bc266c7388e05ef1092ab347eb8b0a337f5..5bb96ce0b55741e6cd12573e63e4e6fd73300e29 100644 (file)
@@ -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
index b23046964c13d40e66c85bd2118de908b7b9c980..3c5a3b3bc6f383aef6159c328b395e7f931ba09c 100644 (file)
@@ -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;
 
index 040433e02d57728e9d5f7f9fd79493999fcd04b7..62477c3b1b367b1fe3acc2297ae9af0c8a775795 100644 (file)
@@ -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 981a2c557d73a8798ae735ea0ef1ccd817adb0da..31a9a87d2d1771b96d8d7888b1b5438cb610bfc2 100644 (file)
@@ -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.  */
index d56e67a2d4494d387311094f6c63b539ef173a28..7be56f1e1eef50dbd15a6702a808ed8b6acb9004 100644 (file)
@@ -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