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
This commit is contained in:
Richard Sandiford 2005-12-15 12:40:33 +00:00 committed by Richard Sandiford
parent 8d46ce6095
commit c543ca49c2
6 changed files with 61 additions and 50 deletions

View File

@ -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

View File

@ -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 ());

View File

@ -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);
}

View File

@ -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:

View File

@ -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 *);

View File

@ -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)
{