From c543ca49c257b3e7fcb123014395cfc7d298d28c Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Thu, 15 Dec 2005 12:40:33 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 22 ++++++++++++++++++ gcc/config/darwin.c | 4 +--- gcc/dwarf2out.c | 10 ++++----- gcc/final.c | 19 +++------------- gcc/output.h | 2 +- gcc/varasm.c | 54 ++++++++++++++++++++++++--------------------- 6 files changed, 61 insertions(+), 50 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ecf6ad43195..e6a02e1cde1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,25 @@ +2005-12-15 Richard Sandiford + + * 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 Second part of MS1->MT renaming diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c index badc0d388fe..930e6cd16cd 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 0f52184cd61..f5860f213ec 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 7ccc8f5debe..2b13fb907b9 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 c61edce4b56..38278b768ad 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 fe5231476f0..32890c8d96f 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) {