diff options
author | Richard Sandiford <richard@codesourcery.com> | 2005-12-15 12:40:33 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2005-12-15 12:40:33 +0000 |
commit | c543ca49c257b3e7fcb123014395cfc7d298d28c (patch) | |
tree | f594f73f80f290828e87bb828d14e3f19d1ad80e /gcc/varasm.c | |
parent | 8d46ce6095853cebc4ea306fe0d00a4aa9758610 (diff) | |
download | gcc-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/varasm.c')
-rw-r--r-- | gcc/varasm.c | 54 |
1 files changed, 29 insertions, 25 deletions
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) { |