aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Sandiford <richard@codesourcery.com>2005-12-15 12:40:33 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2005-12-15 12:40:33 +0000
commitc543ca49c257b3e7fcb123014395cfc7d298d28c (patch)
treef594f73f80f290828e87bb828d14e3f19d1ad80e /gcc
parent8d46ce6095853cebc4ea306fe0d00a4aa9758610 (diff)
downloadgcc-c543ca49c257b3e7fcb123014395cfc7d298d28c.zip
gcc-c543ca49c257b3e7fcb123014395cfc7d298d28c.tar.gz
gcc-c543ca49c257b3e7fcb123014395cfc7d298d28c.tar.bz2
final.c (final_scan_insn): Flip in_cold_section_p when changing between the hot and cold sections.
* final.c (final_scan_insn): Flip in_cold_section_p when changing between the hot and cold sections. Use current_function_section to get the new section. * dwarf2out.c (output_line_info): Use in_cold_section_p to determine whether we are assembling hot or cold code. (secname_for_decl, dwarf2out_var_location): Likewise. (dwarf2out_init, dwarf2out_finish): Use switch_to_section. * varasm.c (last_text_section): Delete. (in_cold_section_p): New variable. (hot_function_section): New function. (current_function_section): Pass in_cold_section_p as the reloc argument to select_section. Use it to decide between unlikely_function_section and hot_function_section. (assemble_start_function): Use switch_to_section. Set in_cold_section_p instead of last_text_section. (assemble_end_function): Use switch_to_section. (switch_to_section): Don't set last_text_section. * config/darwin/darwin.c (machopic_select_section): Trust the reloc argument to make the right choice between hot and cold sections. From-SVN: r108572
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog22
-rw-r--r--gcc/config/darwin.c4
-rw-r--r--gcc/dwarf2out.c10
-rw-r--r--gcc/final.c19
-rw-r--r--gcc/output.h2
-rw-r--r--gcc/varasm.c54
6 files changed, 61 insertions, 50 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ecf6ad4..e6a02e1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,25 @@
+2005-12-15 Richard Sandiford <richard@codesourcery.com>
+
+ * final.c (final_scan_insn): Flip in_cold_section_p when changing
+ between the hot and cold sections. Use current_function_section
+ to get the new section.
+ * dwarf2out.c (output_line_info): Use in_cold_section_p to
+ determine whether we are assembling hot or cold code.
+ (secname_for_decl, dwarf2out_var_location): Likewise.
+ (dwarf2out_init, dwarf2out_finish): Use switch_to_section.
+ * varasm.c (last_text_section): Delete.
+ (in_cold_section_p): New variable.
+ (hot_function_section): New function.
+ (current_function_section): Pass in_cold_section_p as the
+ reloc argument to select_section. Use it to decide between
+ unlikely_function_section and hot_function_section.
+ (assemble_start_function): Use switch_to_section. Set
+ in_cold_section_p instead of last_text_section.
+ (assemble_end_function): Use switch_to_section.
+ (switch_to_section): Don't set last_text_section.
+ * config/darwin/darwin.c (machopic_select_section): Trust the reloc
+ argument to make the right choice between hot and cold sections.
+
2005-12-15 Nathan Sidwell <nathan@codesourcery.com>
Second part of MS1->MT renaming
diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c
index badc0d3..930e6cd 100644
--- a/gcc/config/darwin.c
+++ b/gcc/config/darwin.c
@@ -1093,9 +1093,7 @@ machopic_select_section (tree exp, int reloc,
if (TREE_CODE (exp) == FUNCTION_DECL)
{
- if (reloc == 1
- || unlikely_text_section_p (last_text_section)
- || last_text_section == text_unlikely_coal_section)
+ if (reloc == 1)
base_section = (weak_p
? text_unlikely_coal_section
: unlikely_text_section ());
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 0f52184c..f5860f2 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -7837,7 +7837,7 @@ output_line_info (void)
current_file = 1;
current_line = 1;
- if (cfun && unlikely_text_section_p (last_text_section))
+ if (cfun && in_cold_section_p)
strcpy (prev_line_label, cfun->cold_section_label);
else
strcpy (prev_line_label, text_section_label);
@@ -10182,7 +10182,7 @@ secname_for_decl (tree decl)
tree sectree = DECL_SECTION_NAME (current_function_decl);
secname = TREE_STRING_POINTER (sectree);
}
- else if (cfun && unlikely_text_section_p (last_text_section))
+ else if (cfun && in_cold_section_p)
secname = cfun->cold_section_label;
else
secname = text_section_label;
@@ -13552,7 +13552,7 @@ dwarf2out_var_location (rtx loc_note)
newloc->var_loc_note = loc_note;
newloc->next = NULL;
- if (cfun && unlikely_text_section_p (last_text_section))
+ if (cfun && in_cold_section_p)
newloc->section_label = cfun->cold_section_label;
else
newloc->section_label = text_section_label;
@@ -13841,7 +13841,7 @@ dwarf2out_init (const char *filename ATTRIBUTE_UNUSED)
ASM_OUTPUT_LABEL (asm_out_file, text_section_label);
if (flag_reorder_blocks_and_partition)
{
- unlikely_text_section ();
+ switch_to_section (unlikely_text_section ());
ASM_OUTPUT_LABEL (asm_out_file, cold_text_section_label);
}
}
@@ -14177,7 +14177,7 @@ dwarf2out_finish (const char *filename)
targetm.asm_out.internal_label (asm_out_file, TEXT_END_LABEL, 0);
if (flag_reorder_blocks_and_partition)
{
- unlikely_text_section ();
+ switch_to_section (unlikely_text_section ());
targetm.asm_out.internal_label (asm_out_file, COLD_END_LABEL, 0);
}
diff --git a/gcc/final.c b/gcc/final.c
index 7ccc8f5..2b13fb9 100644
--- a/gcc/final.c
+++ b/gcc/final.c
@@ -1708,22 +1708,9 @@ final_scan_insn (rtx insn, FILE *file, int optimize ATTRIBUTE_UNUSED,
break;
case NOTE_INSN_SWITCH_TEXT_SECTIONS:
-
- /* The presence of this note indicates that this basic block
- belongs in the "cold" section of the .o file. If we are
- not already writing to the cold section we need to change
- to it. */
-
- if (last_text_section == text_section)
- {
- (*debug_hooks->switch_text_section) ();
- switch_to_section (unlikely_text_section ());
- }
- else
- {
- (*debug_hooks->switch_text_section) ();
- switch_to_section (text_section);
- }
+ in_cold_section_p = !in_cold_section_p;
+ (*debug_hooks->switch_text_section) ();
+ switch_to_section (current_function_section ());
break;
case NOTE_INSN_BASIC_BLOCK:
diff --git a/gcc/output.h b/gcc/output.h
index c61edce..38278b7 100644
--- a/gcc/output.h
+++ b/gcc/output.h
@@ -499,7 +499,7 @@ extern GTY(()) section *exception_section;
extern GTY(()) section *eh_frame_section;
extern GTY(()) section *in_section;
-extern GTY(()) section *last_text_section;
+extern GTY(()) bool in_cold_section_p;
extern section *get_unnamed_section (unsigned int, void (*) (const void *),
const void *);
diff --git a/gcc/varasm.c b/gcc/varasm.c
index fe52314..32890c8 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -167,8 +167,9 @@ section *eh_frame_section;
been selected or if we lose track of what the current section is. */
section *in_section;
-/* The last text section used by asm_out_file. */
-section *last_text_section;
+/* True if code for the current function is currently being directed
+ at the cold section. */
+bool in_cold_section_p;
/* A linked list of all the unnamed sections. */
static GTY(()) section *unnamed_sections;
@@ -411,6 +412,22 @@ asm_output_aligned_bss (FILE *file, tree decl ATTRIBUTE_UNUSED,
#endif /* BSS_SECTION_ASM_OP */
+#ifndef USE_SELECT_SECTION_FOR_FUNCTIONS
+/* Return the hot section for function DECL. Return text_section for
+ null DECLs. */
+
+static section *
+hot_function_section (tree decl)
+{
+ if (decl != NULL_TREE
+ && DECL_SECTION_NAME (decl) != NULL_TREE
+ && targetm.have_named_sections)
+ return get_named_section (decl, NULL, 0);
+ else
+ return text_section;
+}
+#endif
+
/* Return the section for function DECL.
If DECL is NULL_TREE, return the text section. We can be passed
@@ -427,12 +444,7 @@ function_section (tree decl)
#ifdef USE_SELECT_SECTION_FOR_FUNCTIONS
return targetm.asm_out.select_section (decl, reloc, DECL_ALIGN (decl));
#else
- if (decl != NULL_TREE
- && DECL_SECTION_NAME (decl) != NULL_TREE
- && targetm.have_named_sections)
- return get_named_section (decl, NULL, 0);
- else
- return text_section;
+ return hot_function_section (decl);
#endif
}
@@ -440,17 +452,13 @@ section *
current_function_section (void)
{
#ifdef USE_SELECT_SECTION_FOR_FUNCTIONS
- int reloc = 0;
-
- if (unlikely_text_section_p (last_text_section))
- reloc = 1;
-
- return targetm.asm_out.select_section (current_function_decl, reloc,
+ return targetm.asm_out.select_section (current_function_decl,
+ in_cold_section_p,
DECL_ALIGN (current_function_decl));
#else
- if (last_text_section)
- return last_text_section;
- return function_section (current_function_decl);
+ return (in_cold_section_p
+ ? unlikely_text_section ()
+ : hot_function_section (current_function_decl));
#endif
}
@@ -1083,7 +1091,7 @@ assemble_start_function (tree decl, const char *fnname)
if (flag_reorder_blocks_and_partition)
{
- unlikely_text_section ();
+ switch_to_section (unlikely_text_section ());
assemble_align (FUNCTION_BOUNDARY);
ASM_OUTPUT_LABEL (asm_out_file, cfun->cold_section_label);
@@ -1115,7 +1123,7 @@ assemble_start_function (tree decl, const char *fnname)
first_function_block_is_cold = true;
}
- last_text_section = NULL;
+ in_cold_section_p = first_function_block_is_cold;
/* Switch to the correct text section for the start of the function. */
@@ -1200,7 +1208,7 @@ assemble_end_function (tree decl, const char *fnname)
section *save_text_section;
save_text_section = in_section;
- unlikely_text_section ();
+ switch_to_section (unlikely_text_section ());
ASM_OUTPUT_LABEL (asm_out_file, cfun->cold_section_end_label);
if (first_function_block_is_cold)
switch_to_section (text_section);
@@ -5586,11 +5594,7 @@ switch_to_section (section *new_section)
if (new_section->common.flags & SECTION_FORGET)
in_section = NULL;
else
- {
- in_section = new_section;
- if (new_section->common.flags & SECTION_CODE)
- last_text_section = in_section;
- }
+ in_section = new_section;
if (new_section->common.flags & SECTION_NAMED)
{