mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			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:
		
							parent
							
								
									8d46ce6095
								
							
						
					
					
						commit
						c543ca49c2
					
				|  | @ -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> | 2005-12-15  Nathan Sidwell  <nathan@codesourcery.com> | ||||||
| 
 | 
 | ||||||
| 	Second part of MS1->MT renaming | 	Second part of MS1->MT renaming | ||||||
|  |  | ||||||
|  | @ -1093,9 +1093,7 @@ machopic_select_section (tree exp, int reloc, | ||||||
| 
 | 
 | ||||||
|   if (TREE_CODE (exp) == FUNCTION_DECL) |   if (TREE_CODE (exp) == FUNCTION_DECL) | ||||||
|     { |     { | ||||||
|       if (reloc == 1 |       if (reloc == 1) | ||||||
| 	  || unlikely_text_section_p (last_text_section) |  | ||||||
| 	  || last_text_section == text_unlikely_coal_section) |  | ||||||
| 	base_section = (weak_p | 	base_section = (weak_p | ||||||
| 			? text_unlikely_coal_section | 			? text_unlikely_coal_section | ||||||
| 			: unlikely_text_section ()); | 			: unlikely_text_section ()); | ||||||
|  |  | ||||||
|  | @ -7837,7 +7837,7 @@ output_line_info (void) | ||||||
|   current_file = 1; |   current_file = 1; | ||||||
|   current_line = 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); |     strcpy (prev_line_label, cfun->cold_section_label); | ||||||
|   else |   else | ||||||
|     strcpy (prev_line_label, text_section_label); |     strcpy (prev_line_label, text_section_label); | ||||||
|  | @ -10182,7 +10182,7 @@ secname_for_decl (tree decl) | ||||||
|       tree sectree = DECL_SECTION_NAME (current_function_decl); |       tree sectree = DECL_SECTION_NAME (current_function_decl); | ||||||
|       secname = TREE_STRING_POINTER (sectree); |       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; |     secname = cfun->cold_section_label; | ||||||
|   else |   else | ||||||
|     secname = text_section_label; |     secname = text_section_label; | ||||||
|  | @ -13552,7 +13552,7 @@ dwarf2out_var_location (rtx loc_note) | ||||||
|   newloc->var_loc_note = loc_note; |   newloc->var_loc_note = loc_note; | ||||||
|   newloc->next = NULL; |   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; |     newloc->section_label = cfun->cold_section_label; | ||||||
|   else |   else | ||||||
|     newloc->section_label = text_section_label; |     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); |   ASM_OUTPUT_LABEL (asm_out_file, text_section_label); | ||||||
|   if (flag_reorder_blocks_and_partition) |   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); |       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); |   targetm.asm_out.internal_label (asm_out_file, TEXT_END_LABEL, 0); | ||||||
|   if (flag_reorder_blocks_and_partition) |   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); |       targetm.asm_out.internal_label (asm_out_file, COLD_END_LABEL, 0); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										17
									
								
								gcc/final.c
								
								
								
								
							
							
						
						
									
										17
									
								
								gcc/final.c
								
								
								
								
							|  | @ -1708,22 +1708,9 @@ final_scan_insn (rtx insn, FILE *file, int optimize ATTRIBUTE_UNUSED, | ||||||
| 	  break; | 	  break; | ||||||
| 
 | 
 | ||||||
| 	case NOTE_INSN_SWITCH_TEXT_SECTIONS: | 	case NOTE_INSN_SWITCH_TEXT_SECTIONS: | ||||||
| 	   | 	  in_cold_section_p = !in_cold_section_p; | ||||||
| 	  /* 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) (); | 	  (*debug_hooks->switch_text_section) (); | ||||||
| 	      switch_to_section (unlikely_text_section ()); | 	  switch_to_section (current_function_section ()); | ||||||
| 	    } |  | ||||||
| 	  else |  | ||||||
| 	    { |  | ||||||
| 	      (*debug_hooks->switch_text_section) (); |  | ||||||
| 	      switch_to_section (text_section); |  | ||||||
| 	    } |  | ||||||
| 	  break; | 	  break; | ||||||
| 	   | 	   | ||||||
| 	case NOTE_INSN_BASIC_BLOCK: | 	case NOTE_INSN_BASIC_BLOCK: | ||||||
|  |  | ||||||
|  | @ -499,7 +499,7 @@ extern GTY(()) section *exception_section; | ||||||
| extern GTY(()) section *eh_frame_section; | extern GTY(()) section *eh_frame_section; | ||||||
| 
 | 
 | ||||||
| extern GTY(()) section *in_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 *), | extern section *get_unnamed_section (unsigned int, void (*) (const void *), | ||||||
| 				     const void *); | 				     const void *); | ||||||
|  |  | ||||||
							
								
								
									
										52
									
								
								gcc/varasm.c
								
								
								
								
							
							
						
						
									
										52
									
								
								gcc/varasm.c
								
								
								
								
							|  | @ -167,8 +167,9 @@ section *eh_frame_section; | ||||||
|    been selected or if we lose track of what the current section is.  */ |    been selected or if we lose track of what the current section is.  */ | ||||||
| section *in_section; | section *in_section; | ||||||
| 
 | 
 | ||||||
| /* The last text section used by asm_out_file.  */ | /* True if code for the current function is currently being directed
 | ||||||
| section *last_text_section; |    at the cold section.  */ | ||||||
|  | bool in_cold_section_p; | ||||||
| 
 | 
 | ||||||
| /* A linked list of all the unnamed sections.  */ | /* A linked list of all the unnamed sections.  */ | ||||||
| static GTY(()) section *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 */ | #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.
 | /* Return the section for function DECL.
 | ||||||
| 
 | 
 | ||||||
|    If DECL is NULL_TREE, return the text section.  We can be passed |    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 | #ifdef USE_SELECT_SECTION_FOR_FUNCTIONS | ||||||
|   return targetm.asm_out.select_section (decl, reloc, DECL_ALIGN (decl)); |   return targetm.asm_out.select_section (decl, reloc, DECL_ALIGN (decl)); | ||||||
| #else | #else | ||||||
|   if (decl != NULL_TREE |   return hot_function_section (decl); | ||||||
|       && DECL_SECTION_NAME (decl) != NULL_TREE |  | ||||||
|       && targetm.have_named_sections) |  | ||||||
|     return get_named_section (decl, NULL, 0); |  | ||||||
|   else |  | ||||||
|     return text_section; |  | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -440,17 +452,13 @@ section * | ||||||
| current_function_section (void) | current_function_section (void) | ||||||
| { | { | ||||||
| #ifdef USE_SELECT_SECTION_FOR_FUNCTIONS | #ifdef USE_SELECT_SECTION_FOR_FUNCTIONS | ||||||
|   int reloc = 0;  |   return targetm.asm_out.select_section (current_function_decl, | ||||||
| 
 | 					 in_cold_section_p, | ||||||
|   if (unlikely_text_section_p (last_text_section)) |  | ||||||
|     reloc = 1; |  | ||||||
|   |  | ||||||
|   return targetm.asm_out.select_section (current_function_decl, reloc, |  | ||||||
| 					 DECL_ALIGN (current_function_decl)); | 					 DECL_ALIGN (current_function_decl)); | ||||||
| #else | #else | ||||||
|   if (last_text_section) |   return (in_cold_section_p | ||||||
|     return last_text_section; | 	  ? unlikely_text_section () | ||||||
|   return function_section (current_function_decl); | 	  : hot_function_section (current_function_decl)); | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -1083,7 +1091,7 @@ assemble_start_function (tree decl, const char *fnname) | ||||||
| 
 | 
 | ||||||
|   if (flag_reorder_blocks_and_partition) |   if (flag_reorder_blocks_and_partition) | ||||||
|     { |     { | ||||||
|       unlikely_text_section (); |       switch_to_section (unlikely_text_section ()); | ||||||
|       assemble_align (FUNCTION_BOUNDARY); |       assemble_align (FUNCTION_BOUNDARY); | ||||||
|       ASM_OUTPUT_LABEL (asm_out_file, cfun->cold_section_label); |       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; | 	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.  */ |   /* 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; |       section *save_text_section; | ||||||
| 
 | 
 | ||||||
|       save_text_section = in_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); |       ASM_OUTPUT_LABEL (asm_out_file, cfun->cold_section_end_label); | ||||||
|       if (first_function_block_is_cold) |       if (first_function_block_is_cold) | ||||||
| 	switch_to_section (text_section); | 	switch_to_section (text_section); | ||||||
|  | @ -5586,11 +5594,7 @@ switch_to_section (section *new_section) | ||||||
|   if (new_section->common.flags & SECTION_FORGET) |   if (new_section->common.flags & SECTION_FORGET) | ||||||
|     in_section = NULL; |     in_section = NULL; | ||||||
|   else |   else | ||||||
|     { |  | ||||||
|     in_section = new_section; |     in_section = new_section; | ||||||
|       if (new_section->common.flags & SECTION_CODE) |  | ||||||
| 	last_text_section = in_section; |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|   if (new_section->common.flags & SECTION_NAMED) |   if (new_section->common.flags & SECTION_NAMED) | ||||||
|     { |     { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Richard Sandiford
						Richard Sandiford