diff options
Diffstat (limited to 'gcc/dwarf2out.c')
-rw-r--r-- | gcc/dwarf2out.c | 85 |
1 files changed, 49 insertions, 36 deletions
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 6b08ab6..a7b2b86 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -4122,6 +4122,9 @@ static int maybe_emit_file (int); #ifndef TEXT_SECTION_LABEL #define TEXT_SECTION_LABEL "Ltext" #endif +#ifndef COLD_TEXT_SECTION_LABEL +#define COLD_TEXT_SECTION_LABEL "Ltext_cold" +#endif #ifndef DEBUG_LINE_SECTION_LABEL #define DEBUG_LINE_SECTION_LABEL "Ldebug_line" #endif @@ -4149,6 +4152,8 @@ static int maybe_emit_file (int); static char text_end_label[MAX_ARTIFICIAL_LABEL_BYTES]; static char text_section_label[MAX_ARTIFICIAL_LABEL_BYTES]; +static char cold_text_section_label[MAX_ARTIFICIAL_LABEL_BYTES]; +static char cold_end_label[MAX_ARTIFICIAL_LABEL_BYTES]; static char abbrev_section_label[MAX_ARTIFICIAL_LABEL_BYTES]; static char debug_info_section_label[MAX_ARTIFICIAL_LABEL_BYTES]; static char debug_line_section_label[MAX_ARTIFICIAL_LABEL_BYTES]; @@ -4159,6 +4164,9 @@ static char ranges_section_label[2 * MAX_ARTIFICIAL_LABEL_BYTES]; #ifndef TEXT_END_LABEL #define TEXT_END_LABEL "Letext" #endif +#ifndef COLD_END_LABEL +#define COLD_END_LABEL "Letext_cold" +#endif #ifndef BLOCK_BEGIN_LABEL #define BLOCK_BEGIN_LABEL "LBB" #endif @@ -6799,13 +6807,14 @@ static void dwarf2out_switch_text_section (void) { dw_fde_ref fde; + struct function *cfun = DECL_STRUCT_FUNCTION (current_function_decl); fde = &fde_table[fde_table_in_use - 1]; fde->dw_fde_switched_sections = true; - fde->dw_fde_hot_section_label = xstrdup (hot_section_label); - fde->dw_fde_hot_section_end_label = xstrdup (hot_section_end_label); - fde->dw_fde_unlikely_section_label = xstrdup (unlikely_section_label); - fde->dw_fde_unlikely_section_end_label = xstrdup (cold_section_end_label); + fde->dw_fde_hot_section_label = cfun->hot_section_label; + fde->dw_fde_hot_section_end_label = cfun->hot_section_end_label; + fde->dw_fde_unlikely_section_label = cfun->cold_section_label; + fde->dw_fde_unlikely_section_end_label = cfun->cold_section_end_label; separate_line_info_table_in_use++; } @@ -7235,14 +7244,15 @@ output_aranges (void) } dw2_asm_output_addr (DWARF2_ADDR_SIZE, text_section_label, "Address"); - if (last_text_section == in_unlikely_executed_text - || (last_text_section == in_named - && last_text_section_name == unlikely_text_section_name)) - dw2_asm_output_delta (DWARF2_ADDR_SIZE, text_end_label, - unlikely_section_label, "Length"); - else - dw2_asm_output_delta (DWARF2_ADDR_SIZE, text_end_label, - text_section_label, "Length"); + dw2_asm_output_delta (DWARF2_ADDR_SIZE, text_end_label, + text_section_label, "Length"); + if (flag_reorder_blocks_and_partition) + { + dw2_asm_output_addr (DWARF2_ADDR_SIZE, cold_text_section_label, + "Address"); + dw2_asm_output_delta (DWARF2_ADDR_SIZE, cold_end_label, + cold_text_section_label, "Length"); + } for (i = 0; i < arange_table_in_use; i++) { @@ -7332,24 +7342,11 @@ output_ranges (void) base of the text section. */ if (separate_line_info_table_in_use == 0) { - if (last_text_section == in_unlikely_executed_text - || (last_text_section == in_named - && last_text_section_name == unlikely_text_section_name)) - { - dw2_asm_output_delta (DWARF2_ADDR_SIZE, blabel, - unlikely_section_label, - fmt, i * 2 * DWARF2_ADDR_SIZE); - dw2_asm_output_delta (DWARF2_ADDR_SIZE, elabel, - unlikely_section_label, NULL); - } - else - { - dw2_asm_output_delta (DWARF2_ADDR_SIZE, blabel, - text_section_label, - fmt, i * 2 * DWARF2_ADDR_SIZE); - dw2_asm_output_delta (DWARF2_ADDR_SIZE, elabel, - text_section_label, NULL); - } + dw2_asm_output_delta (DWARF2_ADDR_SIZE, blabel, + text_section_label, + fmt, i * 2 * DWARF2_ADDR_SIZE); + dw2_asm_output_delta (DWARF2_ADDR_SIZE, elabel, + text_section_label, NULL); } /* Otherwise, we add a DW_AT_entry_pc attribute to force the @@ -7665,6 +7662,7 @@ output_line_info (void) long line_delta; unsigned long current_file; unsigned long function; + struct function *cfun = DECL_STRUCT_FUNCTION (current_function_decl); ASM_GENERATE_INTERNAL_LABEL (l1, LINE_NUMBER_BEGIN_LABEL, 0); ASM_GENERATE_INTERNAL_LABEL (l2, LINE_NUMBER_END_LABEL, 0); @@ -7736,8 +7734,8 @@ output_line_info (void) current_line = 1; if (last_text_section == in_unlikely_executed_text || (last_text_section == in_named - && last_text_section_name == unlikely_text_section_name)) - strcpy (prev_line_label, unlikely_section_label); + && last_text_section_name == cfun->unlikely_text_section_name)) + strcpy (prev_line_label, cfun->cold_section_label); else strcpy (prev_line_label, text_section_label); for (lt_index = 1; lt_index < line_info_table_in_use; ++lt_index) @@ -10110,6 +10108,7 @@ add_location_or_const_value_attribute (dw_die_ref die, tree decl, const char *endname; dw_loc_list_ref list; rtx varloc; + struct function *cfun = DECL_STRUCT_FUNCTION (current_function_decl); /* We need to figure out what section we should use as the base @@ -10135,8 +10134,8 @@ add_location_or_const_value_attribute (dw_die_ref die, tree decl, } else if (last_text_section == in_unlikely_executed_text || (last_text_section == in_named - && last_text_section_name == unlikely_text_section_name)) - secname = unlikely_section_label; + && last_text_section_name == cfun->unlikely_text_section_name)) + secname = cfun->cold_section_label; else secname = text_section_label; @@ -13229,6 +13228,7 @@ dwarf2out_var_location (rtx loc_note) static rtx last_insn; static const char *last_label; tree decl; + struct function *cfun = DECL_STRUCT_FUNCTION (current_function_decl); if (!DECL_P (NOTE_VAR_LOCATION_DECL (loc_note))) return; @@ -13257,8 +13257,8 @@ dwarf2out_var_location (rtx loc_note) if (last_text_section == in_unlikely_executed_text || (last_text_section == in_named - && last_text_section_name == unlikely_text_section_name)) - newloc->section_label = unlikely_section_label; + && last_text_section_name == cfun->unlikely_text_section_name)) + newloc->section_label = cfun->cold_section_label; else newloc->section_label = text_section_label; @@ -13496,6 +13496,9 @@ dwarf2out_init (const char *filename ATTRIBUTE_UNUSED) ASM_GENERATE_INTERNAL_LABEL (abbrev_section_label, DEBUG_ABBREV_SECTION_LABEL, 0); ASM_GENERATE_INTERNAL_LABEL (text_section_label, TEXT_SECTION_LABEL, 0); + ASM_GENERATE_INTERNAL_LABEL (cold_text_section_label, + COLD_TEXT_SECTION_LABEL, 0); + ASM_GENERATE_INTERNAL_LABEL (cold_end_label, COLD_END_LABEL, 0); ASM_GENERATE_INTERNAL_LABEL (debug_info_section_label, DEBUG_INFO_SECTION_LABEL, 0); @@ -13520,6 +13523,11 @@ dwarf2out_init (const char *filename ATTRIBUTE_UNUSED) text_section (); ASM_OUTPUT_LABEL (asm_out_file, text_section_label); + if (flag_reorder_blocks_and_partition) + { + unlikely_text_section (); + ASM_OUTPUT_LABEL (asm_out_file, cold_text_section_label); + } } /* A helper function for dwarf2out_finish called through @@ -13851,6 +13859,11 @@ dwarf2out_finish (const char *filename) /* Output a terminator label for the .text section. */ text_section (); targetm.asm_out.internal_label (asm_out_file, TEXT_END_LABEL, 0); + if (flag_reorder_blocks_and_partition) + { + unlikely_text_section (); + targetm.asm_out.internal_label (asm_out_file, COLD_END_LABEL, 0); + } /* Output the source line correspondence table. We must do this even if there is no line information. Otherwise, on an empty |