OSDN Git Service

Revert patch from April 9.
authorctice <ctice@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 12 Apr 2005 20:39:09 +0000 (20:39 +0000)
committerctice <ctice@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 12 Apr 2005 20:39:09 +0000 (20:39 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@98039 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/bb-reorder.c
gcc/dbxout.c
gcc/dwarf2out.c
gcc/function.h
gcc/opts.c
gcc/output.h
gcc/passes.c
gcc/varasm.c

index 4936ca4..6925114 100644 (file)
@@ -1241,24 +1241,27 @@ find_rarely_executed_basic_blocks_and_crossing_edges (edge *crossing_edges,
   /* Mark every edge that crosses between sections.  */
 
   i = 0;
-  FOR_EACH_BB (bb)
-    FOR_EACH_EDGE (e, ei, bb->succs)
+  if (targetm.have_named_sections)
     {
-      if (e->src != ENTRY_BLOCK_PTR
-         && e->dest != EXIT_BLOCK_PTR
-         && BB_PARTITION (e->src) != BB_PARTITION (e->dest))
-       {
-         e->flags |= EDGE_CROSSING;
-         if (i == *max_idx)
-           {
-             *max_idx *= 2;
-             crossing_edges = xrealloc (crossing_edges,
-                                        (*max_idx) * sizeof (edge));
-           }
-         crossing_edges[i++] = e;
-       }
-      else
-       e->flags &= ~EDGE_CROSSING;
+      FOR_EACH_BB (bb)
+        FOR_EACH_EDGE (e, ei, bb->succs)
+         {
+           if (e->src != ENTRY_BLOCK_PTR
+               && e->dest != EXIT_BLOCK_PTR
+               && BB_PARTITION (e->src) != BB_PARTITION (e->dest))
+             {
+               e->flags |= EDGE_CROSSING;
+               if (i == *max_idx)
+                 {
+                   *max_idx *= 2;
+                   crossing_edges = xrealloc (crossing_edges,
+                                              (*max_idx) * sizeof (edge));
+                 }
+               crossing_edges[i++] = e;
+             }
+           else
+             e->flags &= ~EDGE_CROSSING;
+         }
     }
   *n_crossing_edges = i;
 }
@@ -1822,26 +1825,36 @@ fix_edges_for_rarely_executed_code (edge *crossing_edges,
   
   fix_up_fall_thru_edges ();
   
-  /* If the architecture does not have conditional branches that can
-     span all of memory, convert crossing conditional branches into
-     crossing unconditional branches.  */
-  
-  if (!HAS_LONG_COND_BRANCH)
-    fix_crossing_conditional_branches ();
+  /* Only do the parts necessary for writing separate sections if
+     the target architecture has the ability to write separate sections
+     (i.e. it has named sections).  Otherwise, the hot/cold partitioning
+     information will be used when reordering blocks to try to put all
+     the hot blocks together, then all the cold blocks, but no actual
+     section partitioning will be done.  */
+
+  if (targetm.have_named_sections)
+    {
+      /* If the architecture does not have conditional branches that can
+        span all of memory, convert crossing conditional branches into
+        crossing unconditional branches.  */
   
-  /* If the architecture does not have unconditional branches that
-     can span all of memory, convert crossing unconditional branches
-     into indirect jumps.  Since adding an indirect jump also adds
-     a new register usage, update the register usage information as
-     well.  */
+      if (!HAS_LONG_COND_BRANCH)
+       fix_crossing_conditional_branches ();
   
-  if (!HAS_LONG_UNCOND_BRANCH)
-    {
-      fix_crossing_unconditional_branches ();
-      reg_scan (get_insns(), max_reg_num ());
+      /* If the architecture does not have unconditional branches that
+        can span all of memory, convert crossing unconditional branches
+        into indirect jumps.  Since adding an indirect jump also adds
+        a new register usage, update the register usage information as
+        well.  */
+      
+      if (!HAS_LONG_UNCOND_BRANCH)
+       {
+         fix_crossing_unconditional_branches ();
+         reg_scan (get_insns(), max_reg_num ());
+       }
+
+      add_reg_crossing_jump_notes ();
     }
-  
-  add_reg_crossing_jump_notes ();
 }
 
 /* Verify, in the basic block chain, that there is at most one switch
@@ -1933,8 +1946,7 @@ reorder_basic_blocks (unsigned int flags)
     dump_flow_info (dump_file);
 
   cfg_layout_finalize ();
-  if (flag_reorder_blocks_and_partition)
-    verify_hot_cold_block_grouping ();
+  verify_hot_cold_block_grouping ();
 
   timevar_pop (TV_REORDER_BLOCKS);
 }
@@ -1954,7 +1966,8 @@ insert_section_boundary_note (void)
   rtx new_note;
   int first_partition = 0;
   
-  if (flag_reorder_blocks_and_partition)
+  if (flag_reorder_blocks_and_partition
+      && targetm.have_named_sections)
     FOR_EACH_BB (bb)
     {
       if (!first_partition)
index 33bbd71..c645edb 100644 (file)
@@ -938,14 +938,11 @@ dbxout_function_end (tree decl)
 #else
   if (flag_reorder_blocks_and_partition)
     {
-      struct function *cfun = DECL_STRUCT_FUNCTION (decl);
-
       dbxout_begin_empty_stabs (N_FUN);
-      dbxout_stab_value_label_diff (cfun->hot_section_end_label, 
-                                   cfun->hot_section_label);
+      dbxout_stab_value_label_diff (hot_section_end_label, hot_section_label);
       dbxout_begin_empty_stabs (N_FUN);
-      dbxout_stab_value_label_diff (cfun->cold_section_end_label, 
-                                   cfun->cold_section_label);
+      dbxout_stab_value_label_diff (cold_section_end_label, 
+                                   unlikely_section_label);
     }
   else
     {
index aebefd4..b750ff8 100644 (file)
@@ -4122,9 +4122,6 @@ static int maybe_emit_file (int);
 #ifndef TEXT_SECTION_LABEL
 #define TEXT_SECTION_LABEL             "Ltext"
 #endif
-#ifndef COLD_TEXT_SECTION_LABEL
-#define COLD_TEXT_SECTION_LABEL         "Ltext_cold"
-#endif
 #ifndef DEBUG_LINE_SECTION_LABEL
 #define DEBUG_LINE_SECTION_LABEL       "Ldebug_line"
 #endif
@@ -4152,8 +4149,6 @@ static int maybe_emit_file (int);
 
 static char text_end_label[MAX_ARTIFICIAL_LABEL_BYTES];
 static char text_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
-static char cold_text_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
-static char cold_end_label[MAX_ARTIFICIAL_LABEL_BYTES]; 
 static char abbrev_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
 static char debug_info_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
 static char debug_line_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
@@ -4164,9 +4159,6 @@ static char ranges_section_label[2 * MAX_ARTIFICIAL_LABEL_BYTES];
 #ifndef TEXT_END_LABEL
 #define TEXT_END_LABEL         "Letext"
 #endif
-#ifndef COLD_END_LABEL
-#define COLD_END_LABEL          "Letext_cold"
-#endif
 #ifndef BLOCK_BEGIN_LABEL
 #define BLOCK_BEGIN_LABEL      "LBB"
 #endif
@@ -6807,14 +6799,13 @@ static void
 dwarf2out_switch_text_section (void)
 {
   dw_fde_ref fde;
-  struct function *cfun = DECL_STRUCT_FUNCTION (current_function_decl);
 
   fde = &fde_table[fde_table_in_use - 1];
   fde->dw_fde_switched_sections = true;
-  fde->dw_fde_hot_section_label = cfun->hot_section_label;
-  fde->dw_fde_hot_section_end_label = cfun->hot_section_end_label;
-  fde->dw_fde_unlikely_section_label = cfun->cold_section_label;
-  fde->dw_fde_unlikely_section_end_label = cfun->cold_section_end_label;
+  fde->dw_fde_hot_section_label = xstrdup (hot_section_label);
+  fde->dw_fde_hot_section_end_label = xstrdup (hot_section_end_label);
+  fde->dw_fde_unlikely_section_label = xstrdup (unlikely_section_label);
+  fde->dw_fde_unlikely_section_end_label = xstrdup (cold_section_end_label);
   separate_line_info_table_in_use++;
 }
 
@@ -7244,15 +7235,14 @@ output_aranges (void)
     }
 
   dw2_asm_output_addr (DWARF2_ADDR_SIZE, text_section_label, "Address");
-  dw2_asm_output_delta (DWARF2_ADDR_SIZE, text_end_label,
-                       text_section_label, "Length");
-  if (flag_reorder_blocks_and_partition)
-    {
-      dw2_asm_output_addr (DWARF2_ADDR_SIZE, cold_text_section_label, 
-                          "Address");
-      dw2_asm_output_delta (DWARF2_ADDR_SIZE, cold_end_label,
-                           cold_text_section_label, "Length");
-    }
+  if (last_text_section == in_unlikely_executed_text
+      || (last_text_section == in_named
+         && last_text_section_name == unlikely_text_section_name))
+    dw2_asm_output_delta (DWARF2_ADDR_SIZE, text_end_label,
+                         unlikely_section_label, "Length");
+  else
+    dw2_asm_output_delta (DWARF2_ADDR_SIZE, text_end_label,
+                         text_section_label, "Length");
 
   for (i = 0; i < arange_table_in_use; i++)
     {
@@ -7342,11 +7332,24 @@ output_ranges (void)
             base of the text section.  */
          if (separate_line_info_table_in_use == 0)
            {
-             dw2_asm_output_delta (DWARF2_ADDR_SIZE, blabel,
-                                   text_section_label,
-                                   fmt, i * 2 * DWARF2_ADDR_SIZE);
-             dw2_asm_output_delta (DWARF2_ADDR_SIZE, elabel,
-                                   text_section_label, NULL);
+             if (last_text_section == in_unlikely_executed_text
+                 || (last_text_section == in_named
+                     && last_text_section_name == unlikely_text_section_name))
+               {
+                 dw2_asm_output_delta (DWARF2_ADDR_SIZE, blabel,
+                                       unlikely_section_label,
+                                       fmt, i * 2 * DWARF2_ADDR_SIZE);
+                 dw2_asm_output_delta (DWARF2_ADDR_SIZE, elabel,
+                                       unlikely_section_label, NULL);
+               }
+             else
+               {
+                 dw2_asm_output_delta (DWARF2_ADDR_SIZE, blabel,
+                                       text_section_label,
+                                       fmt, i * 2 * DWARF2_ADDR_SIZE);
+                 dw2_asm_output_delta (DWARF2_ADDR_SIZE, elabel,
+                                       text_section_label, NULL);
+               }
            }
 
          /* Otherwise, we add a DW_AT_entry_pc attribute to force the
@@ -7662,7 +7665,6 @@ output_line_info (void)
   long line_delta;
   unsigned long current_file;
   unsigned long function;
-  struct function *cfun;
 
   ASM_GENERATE_INTERNAL_LABEL (l1, LINE_NUMBER_BEGIN_LABEL, 0);
   ASM_GENERATE_INTERNAL_LABEL (l2, LINE_NUMBER_END_LABEL, 0);
@@ -7733,14 +7735,10 @@ output_line_info (void)
   current_file = 1;
   current_line = 1;
   
-  if (current_function_decl)
-    cfun = DECL_STRUCT_FUNCTION (current_function_decl);
-  else
-    cfun = NULL;
   if (last_text_section == in_unlikely_executed_text
       || (last_text_section == in_named
-         && last_text_section_name == cfun->unlikely_text_section_name))
-    strcpy (prev_line_label, cfun->cold_section_label);
+         && last_text_section_name == unlikely_text_section_name))
+    strcpy (prev_line_label, unlikely_section_label);
   else
     strcpy (prev_line_label, text_section_label);
   for (lt_index = 1; lt_index < line_info_table_in_use; ++lt_index)
@@ -10113,7 +10111,6 @@ add_location_or_const_value_attribute (dw_die_ref die, tree decl,
       const char *endname;
       dw_loc_list_ref list;
       rtx varloc;
-      struct function *cfun = DECL_STRUCT_FUNCTION (current_function_decl);
 
 
       /* We need to figure out what section we should use as the base
@@ -10139,8 +10136,8 @@ add_location_or_const_value_attribute (dw_die_ref die, tree decl,
        }
       else if (last_text_section == in_unlikely_executed_text
               || (last_text_section == in_named
-                  && last_text_section_name == cfun->unlikely_text_section_name))
-       secname = cfun->cold_section_label;
+                  && last_text_section_name == unlikely_text_section_name))
+       secname = unlikely_section_label;
       else
        secname = text_section_label;
 
@@ -13233,7 +13230,6 @@ dwarf2out_var_location (rtx loc_note)
   static rtx last_insn;
   static const char *last_label;
   tree decl;
-  struct function *cfun = DECL_STRUCT_FUNCTION (current_function_decl);
 
   if (!DECL_P (NOTE_VAR_LOCATION_DECL (loc_note)))
     return;
@@ -13262,8 +13258,8 @@ dwarf2out_var_location (rtx loc_note)
 
   if (last_text_section == in_unlikely_executed_text
       || (last_text_section == in_named
-         && last_text_section_name == cfun->unlikely_text_section_name))
-    newloc->section_label = cfun->cold_section_label;
+         && last_text_section_name == unlikely_text_section_name))
+    newloc->section_label = unlikely_section_label;
   else
     newloc->section_label = text_section_label;
 
@@ -13501,9 +13497,6 @@ dwarf2out_init (const char *filename ATTRIBUTE_UNUSED)
   ASM_GENERATE_INTERNAL_LABEL (abbrev_section_label,
                               DEBUG_ABBREV_SECTION_LABEL, 0);
   ASM_GENERATE_INTERNAL_LABEL (text_section_label, TEXT_SECTION_LABEL, 0);
-  ASM_GENERATE_INTERNAL_LABEL (cold_text_section_label, 
-                              COLD_TEXT_SECTION_LABEL, 0);
-  ASM_GENERATE_INTERNAL_LABEL (cold_end_label, COLD_END_LABEL, 0);
 
   ASM_GENERATE_INTERNAL_LABEL (debug_info_section_label,
                               DEBUG_INFO_SECTION_LABEL, 0);
@@ -13528,11 +13521,6 @@ dwarf2out_init (const char *filename ATTRIBUTE_UNUSED)
 
   text_section ();
   ASM_OUTPUT_LABEL (asm_out_file, text_section_label);
-  if (flag_reorder_blocks_and_partition)
-    {
-      unlikely_text_section ();
-      ASM_OUTPUT_LABEL (asm_out_file, cold_text_section_label);
-    }
 }
 
 /* A helper function for dwarf2out_finish called through
@@ -13864,11 +13852,6 @@ dwarf2out_finish (const char *filename)
   /* Output a terminator label for the .text section.  */
   text_section ();
   targetm.asm_out.internal_label (asm_out_file, TEXT_END_LABEL, 0);
-  if (flag_reorder_blocks_and_partition)
-    {
-      unlikely_text_section ();
-      targetm.asm_out.internal_label (asm_out_file, COLD_END_LABEL, 0);
-    }
 
   /* Output the source line correspondence table.  We must do this
      even if there is no line information.  Otherwise, on an empty
index d1f006b..b772752 100644 (file)
@@ -349,20 +349,6 @@ struct function GTY(())
   /* The variables unexpanded so far.  */
   tree unexpanded_var_list;
 
-  /* Assembly labels for the hot and cold text sections, to
-     be used by debugger functions for determining the size of text
-     sections.  */
-
-  const char * hot_section_label;
-  const char * cold_section_label;
-  const char * hot_section_end_label;
-  const char * cold_section_end_label;
-
-  /* String to be used for name of cold text sections, via
-     targetm.asm_out.named_section.  */
-
-  const char *unlikely_text_section_name;
-
   /* Collected bit flags.  */
 
   /* Nonzero if function being compiled needs to be given an address
index c2cf125..70a9b22 100644 (file)
@@ -678,15 +678,6 @@ decode_options (unsigned int argc, const char **argv)
       flag_reorder_blocks_and_partition = 0;
       flag_reorder_blocks = 1;
     }
-
-  if (flag_reorder_blocks_and_partition
-      && !targetm.have_named_sections)
-    {
-      inform 
-       ("-freorder-blocks-and-partition does not work on this architecture.");
-      flag_reorder_blocks_and_partition = 0;
-      flag_reorder_blocks = 1;
-    }
 }
 
 /* Handle target- and language-independent options.  Return zero to
index ac90908..4d9eabb 100644 (file)
@@ -453,6 +453,11 @@ enum in_section { no_section, in_text, in_unlikely_executed_text, in_data,
 #endif
 };
 
+extern char *unlikely_section_label;
+extern char *hot_section_label;
+extern char *hot_section_end_label;
+extern char *cold_section_end_label;
+extern char *unlikely_text_section_name;
 extern const char *last_text_section_name;
 extern enum in_section last_text_section;
 extern bool first_function_block_is_cold;
index fa9bc22..a34c975 100644 (file)
@@ -329,6 +329,8 @@ rest_of_handle_final (void)
 
   timevar_push (TV_SYMOUT);
   (*debug_hooks->function_decl) (current_function_decl);
+  if (unlikely_text_section_name)
+    free (unlikely_text_section_name);
   timevar_pop (TV_SYMOUT);
 
   ggc_collect ();
index a185983..b8c9826 100644 (file)
@@ -101,6 +101,40 @@ tree last_assemble_variable_decl;
 
 bool first_function_block_is_cold;
 
+/* The following global variable indicates the label name to be put at
+   the start of the first cold section within each function, when
+   partitioning basic blocks into hot and cold sections.  Used for
+   debug info.  */
+
+char *unlikely_section_label;
+
+/* The following global variable indicates the label name to be put at
+   the start of the first hot section within each function, when
+   partitioning basic blocks into hot and cold sections.  Used for
+   debug info.  */
+
+char *hot_section_label;
+
+/* The following global variable indicates the label name to be put at
+   the end of the last hot section within each function, when
+   partitioning basic blocks into hot and cold sections.  Used for
+   debug info.  */
+
+char *hot_section_end_label;
+
+/* The following global variable indicates the label name to be put at
+   the end of the last cold section within each function, when
+   partitioning basic blocks into hot and cold sections.  Used for 
+   debug info.*/
+
+char *cold_section_end_label;
+/* The following global variable indicates the seciton name to be used
+   for the current cold section, when partitiong hot and cold basic 
+   blocks into separate sections.  */
+
+char *unlikely_text_section_name;
+
 /* We give all constants their own alias set.  Perhaps redundant with
    MEM_READONLY_P, but pre-dates it.  */
 
@@ -177,37 +211,28 @@ static void
 initialize_cold_section_name (void)
 {
   const char *name;
-  const char *stripped_name;
-  char *buffer;
   int len;
-  struct function *cfun;
 
-  if (current_function_decl)
+  if (! unlikely_text_section_name)
     {
-      cfun = DECL_STRUCT_FUNCTION (current_function_decl);
-      if (!cfun->unlikely_text_section_name)
+      if (DECL_SECTION_NAME (current_function_decl)
+         && (strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME
+                                          (current_function_decl)),
+                     HOT_TEXT_SECTION_NAME) != 0)
+         && (strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME
+                                          (current_function_decl)),
+                     UNLIKELY_EXECUTED_TEXT_SECTION_NAME) != 0))
        {
-         if (flag_function_sections
-             && DECL_SECTION_NAME (current_function_decl))
-           {
-             name = xstrdup (TREE_STRING_POINTER (DECL_SECTION_NAME 
-                                                  (current_function_decl)));
-             stripped_name = targetm.strip_name_encoding (name);
-             len = strlen (stripped_name);
-             buffer = (char *) xmalloc (len + 10);
-             sprintf (buffer, "%s%s", stripped_name, "_unlikely");
-             cfun->unlikely_text_section_name = ggc_strdup (buffer);
-             free (buffer);
-             free ((char *) name);
-           }
-         else
-           cfun->unlikely_text_section_name = 
-                                       UNLIKELY_EXECUTED_TEXT_SECTION_NAME;
+         name = TREE_STRING_POINTER (DECL_SECTION_NAME 
+                                                  (current_function_decl));
+         len = strlen (name);
+         unlikely_text_section_name = xmalloc (len + 10);
+         sprintf (unlikely_text_section_name, "%s%s", name, "_unlikely");
        }
+      else
+       unlikely_text_section_name = 
+                             xstrdup (UNLIKELY_EXECUTED_TEXT_SECTION_NAME);
     }
-  else
-   internal_error 
-     ("initialize_cold_section_name called without valid current_function_decl.");
 }
 
 /* Tell assembler to switch to text section.  */
@@ -228,25 +253,14 @@ text_section (void)
 void
 unlikely_text_section (void)
 {
-  if (current_function_decl)
-    {
-      struct function *cfun = DECL_STRUCT_FUNCTION (current_function_decl);
+  if (! unlikely_text_section_name)
+    initialize_cold_section_name ();
 
-      if (!cfun->unlikely_text_section_name)
-       initialize_cold_section_name ();
-
-      if ((in_section != in_unlikely_executed_text)
-         &&  (in_section != in_named 
-              || strcmp (in_named_name, cfun->unlikely_text_section_name) != 0))
-       {
-         named_section (NULL_TREE, cfun->unlikely_text_section_name, 0);
-         in_section = in_unlikely_executed_text;
-         last_text_section = in_unlikely_executed_text;
-       }
-    }
-  else
+  if ((in_section != in_unlikely_executed_text)
+      &&  (in_section != in_named 
+          || strcmp (in_named_name, unlikely_text_section_name) != 0))
     {
-      named_section (NULL_TREE, UNLIKELY_EXECUTED_TEXT_SECTION_NAME, 0);
+      named_section (NULL_TREE, unlikely_text_section_name, 0);
       in_section = in_unlikely_executed_text;
       last_text_section = in_unlikely_executed_text;
     }
@@ -300,25 +314,11 @@ int
 in_unlikely_text_section (void)
 {
   bool ret_val;
-  struct function *cfun;
-
-  if (current_function_decl)
-    {
-      cfun = DECL_STRUCT_FUNCTION (current_function_decl);
 
-      ret_val = ((in_section == in_unlikely_executed_text)
-                || (in_section == in_named
-                    && cfun->unlikely_text_section_name
-                    && strcmp (in_named_name, 
-                               cfun->unlikely_text_section_name) == 0));
-    }
-  else
-    {
-      ret_val = ((in_section == in_unlikely_executed_text)
-                || (in_section == in_named
-                    && strcmp (in_named_name,
-                               UNLIKELY_EXECUTED_TEXT_SECTION_NAME) == 0));
-    }
+  ret_val = ((in_section == in_unlikely_executed_text)
+            || (in_section == in_named
+                && unlikely_text_section_name
+                && strcmp (in_named_name, unlikely_text_section_name) == 0));
 
   return ret_val;
 }
@@ -463,12 +463,9 @@ named_section (tree decl, const char *name, int reloc)
     name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
 
   if (strcmp (name, UNLIKELY_EXECUTED_TEXT_SECTION_NAME) == 0
-      && current_function_decl
-      && !(DECL_STRUCT_FUNCTION (current_function_decl))->unlikely_text_section_name)
-    {
-      struct function *cfun = DECL_STRUCT_FUNCTION (current_function_decl);
-      cfun->unlikely_text_section_name = UNLIKELY_EXECUTED_TEXT_SECTION_NAME;
-    }
+      && !unlikely_text_section_name)
+      unlikely_text_section_name =
+       xstrdup (UNLIKELY_EXECUTED_TEXT_SECTION_NAME);
 
   flags = targetm.section_type_flags (decl, name, reloc);
 
@@ -577,17 +574,16 @@ asm_output_aligned_bss (FILE *file, tree decl ATTRIBUTE_UNUSED,
 void
 function_section (tree decl)
 {
-  int reloc = 0;
+  bool unlikely = false;
     
   if (first_function_block_is_cold)
-    reloc = 1;
+    unlikely = true;
   
 #ifdef USE_SELECT_SECTION_FOR_FUNCTIONS
-  targetm.asm_out.select_section (decl, reloc, DECL_ALIGN (decl));
+  targetm.asm_out.select_section (decl, unlikely, DECL_ALIGN (decl));
 #else
   if (decl != NULL_TREE
-      && DECL_SECTION_NAME (decl) != NULL_TREE
-      && targetm.have_named_sections)
+      && DECL_SECTION_NAME (decl) != NULL_TREE)
     named_section (decl, (char *) 0, 0);
   else
     text_section ();
@@ -598,20 +594,16 @@ void
 current_function_section (tree decl)
 {
 #ifdef USE_SELECT_SECTION_FOR_FUNCTIONS
-  int reloc = 0; 
-
-  if (in_unlikely_text_section () 
-      || last_text_section == in_unlikely_executed_text)
-    reloc = 1;
-  targetm.asm_out.select_section (decl, reloc, DECL_ALIGN (decl));
+  bool unlikely = (in_unlikely_text_section () 
+                  || (last_text_section == in_unlikely_executed_text));
+  
+  targetm.asm_out.select_section (decl, unlikely, DECL_ALIGN (decl));
 #else
   if (last_text_section == in_unlikely_executed_text)
     unlikely_text_section ();
   else if (last_text_section == in_text)
     text_section ();
-  else if (last_text_section == in_named
-          && targetm.have_named_sections)
+  else if (last_text_section == in_named)
     named_section (NULL_TREE, last_text_section_name, 0);
   else
     function_section (decl);
@@ -1232,32 +1224,18 @@ void
 assemble_start_function (tree decl, const char *fnname)
 {
   int align;
-  char tmp_label[100];
   bool hot_label_written = false;
-  struct function *cfun = DECL_STRUCT_FUNCTION (decl);
 
-  cfun->unlikely_text_section_name = NULL;
+  unlikely_text_section_name = NULL;
+  
   first_function_block_is_cold = false;
-  if (flag_reorder_blocks_and_partition)
-    {
-      ASM_GENERATE_INTERNAL_LABEL (tmp_label, "HOTB", const_labelno);
-      cfun->hot_section_label = ggc_strdup (tmp_label);
-      ASM_GENERATE_INTERNAL_LABEL (tmp_label, "COLDB", const_labelno);
-      cfun->cold_section_label = ggc_strdup (tmp_label);
-      ASM_GENERATE_INTERNAL_LABEL (tmp_label, "HOTE", const_labelno);
-      cfun->hot_section_end_label = ggc_strdup (tmp_label);
-      ASM_GENERATE_INTERNAL_LABEL (tmp_label, "COLDE", const_labelno);
-      cfun->cold_section_end_label = ggc_strdup (tmp_label);
-      const_labelno++;
-    }
-  else
-    {
-      cfun->hot_section_label = NULL;
-      cfun->cold_section_label = NULL;
-      cfun->hot_section_end_label = NULL;
-      cfun->cold_section_end_label = NULL;
-    }
+  hot_section_label = reconcat (hot_section_label, fnname, ".hot_section", NULL);
+  unlikely_section_label = reconcat (unlikely_section_label, 
+                                    fnname, ".unlikely_section", NULL);
+  hot_section_end_label = reconcat (hot_section_end_label,
+                                   fnname, ".end", NULL);
+  cold_section_end_label = reconcat (cold_section_end_label,
+                                   fnname, ".end.cold", NULL);
 
   /* The following code does not need preprocessing in the assembler.  */
 
@@ -1275,7 +1253,7 @@ assemble_start_function (tree decl, const char *fnname)
     {
       unlikely_text_section ();
       assemble_align (FUNCTION_BOUNDARY);
-      ASM_OUTPUT_LABEL (asm_out_file, cfun->cold_section_label);
+      ASM_OUTPUT_LABEL (asm_out_file, unlikely_section_label);
       if (BB_PARTITION (ENTRY_BLOCK_PTR->next_bb) == BB_COLD_PARTITION)
        {
          /* Since the function starts with a cold section, we need to
@@ -1283,7 +1261,7 @@ assemble_start_function (tree decl, const char *fnname)
             section label.  */
          text_section ();
          assemble_align (FUNCTION_BOUNDARY);
-         ASM_OUTPUT_LABEL (asm_out_file, cfun->hot_section_label);
+         ASM_OUTPUT_LABEL (asm_out_file, hot_section_label);
          hot_label_written = true;
          first_function_block_is_cold = true;
        }
@@ -1313,8 +1291,8 @@ assemble_start_function (tree decl, const char *fnname)
        s[i] = (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)))[i];
       s[len] = '\0';
       
-      if (cfun->unlikely_text_section_name 
-         && (strcmp (s, cfun->unlikely_text_section_name) == 0))
+      if (unlikely_text_section_name 
+         && (strcmp (s, unlikely_text_section_name) == 0))
        first_function_block_is_cold = true;
     }
 
@@ -1325,8 +1303,8 @@ assemble_start_function (tree decl, const char *fnname)
   /* Switch to the correct text section for the start of the function.  */
 
   function_section (decl);
-  if (flag_reorder_blocks_and_partition && !hot_label_written)
-    ASM_OUTPUT_LABEL (asm_out_file, cfun->hot_section_label);
+  if (!hot_label_written)
+    ASM_OUTPUT_LABEL (asm_out_file, hot_section_label);
 
   /* Tell assembler to move to target machine's alignment for functions.  */
   align = floor_log2 (FUNCTION_BOUNDARY / BITS_PER_UNIT);
@@ -1388,6 +1366,7 @@ assemble_start_function (tree decl, const char *fnname)
 void
 assemble_end_function (tree decl, const char *fnname)
 {
+  enum in_section save_text_section;
 #ifdef ASM_DECLARE_FUNCTION_SIZE
   ASM_DECLARE_FUNCTION_SIZE (asm_out_file, fnname, decl);
 #endif
@@ -1398,19 +1377,13 @@ assemble_end_function (tree decl, const char *fnname)
     }
   /* Output labels for end of hot/cold text sections (to be used by
      debug info.)  */
-  if (flag_reorder_blocks_and_partition)
-    {
-      enum in_section save_text_section;
-      struct function *cfun = DECL_STRUCT_FUNCTION (decl);
-
-      save_text_section = in_section;
-      unlikely_text_section ();
-      ASM_OUTPUT_LABEL (asm_out_file, cfun->cold_section_end_label);
-      text_section ();
-      ASM_OUTPUT_LABEL (asm_out_file, cfun->hot_section_end_label);
-      if (save_text_section == in_unlikely_executed_text)
-       unlikely_text_section ();
-    }
+  save_text_section = in_section;
+  unlikely_text_section ();
+  ASM_OUTPUT_LABEL (asm_out_file, cold_section_end_label);
+  text_section ();
+  ASM_OUTPUT_LABEL (asm_out_file, hot_section_end_label);
+  if (save_text_section == in_unlikely_executed_text)
+    unlikely_text_section ();
 }
 \f
 /* Assemble code to leave SIZE bytes of zeros.  */
@@ -4793,23 +4766,14 @@ default_section_type_flags_1 (tree decl, const char *name, int reloc,
                              int shlib)
 {
   unsigned int flags;
-  struct function *cfun = NULL;
-
-  if (current_function_decl)
-    cfun = DECL_STRUCT_FUNCTION (current_function_decl);
 
   if (decl && TREE_CODE (decl) == FUNCTION_DECL)
     flags = SECTION_CODE;
   else if (decl && decl_readonly_section_1 (decl, reloc, shlib))
     flags = 0;
-  else if (current_function_decl
-          && cfun->unlikely_text_section_name
-          && strcmp (name, cfun->unlikely_text_section_name) == 0)
+  else if (unlikely_text_section_name
+          && strcmp (name, unlikely_text_section_name) == 0)
     flags = SECTION_CODE;
-  else if (!decl 
-          && !current_function_decl
-          && strcmp (name, UNLIKELY_EXECUTED_TEXT_SECTION_NAME) == 0)
-    flags = SECTION_CODE; 
   else
     flags = SECTION_WRITE;