Commit c3c822d5 by Caroline Tice

Revert patch from April 9.

From-SVN: r98039
parent b0d9bc9b
...@@ -1241,24 +1241,27 @@ find_rarely_executed_basic_blocks_and_crossing_edges (edge *crossing_edges, ...@@ -1241,24 +1241,27 @@ find_rarely_executed_basic_blocks_and_crossing_edges (edge *crossing_edges,
/* Mark every edge that crosses between sections. */ /* Mark every edge that crosses between sections. */
i = 0; i = 0;
FOR_EACH_BB (bb) if (targetm.have_named_sections)
FOR_EACH_EDGE (e, ei, bb->succs)
{ {
if (e->src != ENTRY_BLOCK_PTR FOR_EACH_BB (bb)
&& e->dest != EXIT_BLOCK_PTR FOR_EACH_EDGE (e, ei, bb->succs)
&& BB_PARTITION (e->src) != BB_PARTITION (e->dest)) {
{ if (e->src != ENTRY_BLOCK_PTR
e->flags |= EDGE_CROSSING; && e->dest != EXIT_BLOCK_PTR
if (i == *max_idx) && BB_PARTITION (e->src) != BB_PARTITION (e->dest))
{ {
*max_idx *= 2; e->flags |= EDGE_CROSSING;
crossing_edges = xrealloc (crossing_edges, if (i == *max_idx)
(*max_idx) * sizeof (edge)); {
} *max_idx *= 2;
crossing_edges[i++] = e; crossing_edges = xrealloc (crossing_edges,
} (*max_idx) * sizeof (edge));
else }
e->flags &= ~EDGE_CROSSING; crossing_edges[i++] = e;
}
else
e->flags &= ~EDGE_CROSSING;
}
} }
*n_crossing_edges = i; *n_crossing_edges = i;
} }
...@@ -1822,26 +1825,36 @@ fix_edges_for_rarely_executed_code (edge *crossing_edges, ...@@ -1822,26 +1825,36 @@ fix_edges_for_rarely_executed_code (edge *crossing_edges,
fix_up_fall_thru_edges (); fix_up_fall_thru_edges ();
/* If the architecture does not have conditional branches that can /* Only do the parts necessary for writing separate sections if
span all of memory, convert crossing conditional branches into the target architecture has the ability to write separate sections
crossing unconditional branches. */ (i.e. it has named sections). Otherwise, the hot/cold partitioning
information will be used when reordering blocks to try to put all
if (!HAS_LONG_COND_BRANCH) the hot blocks together, then all the cold blocks, but no actual
fix_crossing_conditional_branches (); section partitioning will be done. */
if (targetm.have_named_sections)
{
/* If the architecture does not have conditional branches that can
span all of memory, convert crossing conditional branches into
crossing unconditional branches. */
/* If the architecture does not have unconditional branches that if (!HAS_LONG_COND_BRANCH)
can span all of memory, convert crossing unconditional branches fix_crossing_conditional_branches ();
into indirect jumps. Since adding an indirect jump also adds
a new register usage, update the register usage information as
well. */
if (!HAS_LONG_UNCOND_BRANCH) /* If the architecture does not have unconditional branches that
{ can span all of memory, convert crossing unconditional branches
fix_crossing_unconditional_branches (); into indirect jumps. Since adding an indirect jump also adds
reg_scan (get_insns(), max_reg_num ()); a new register usage, update the register usage information as
well. */
if (!HAS_LONG_UNCOND_BRANCH)
{
fix_crossing_unconditional_branches ();
reg_scan (get_insns(), max_reg_num ());
}
add_reg_crossing_jump_notes ();
} }
add_reg_crossing_jump_notes ();
} }
/* Verify, in the basic block chain, that there is at most one switch /* Verify, in the basic block chain, that there is at most one switch
...@@ -1933,8 +1946,7 @@ reorder_basic_blocks (unsigned int flags) ...@@ -1933,8 +1946,7 @@ reorder_basic_blocks (unsigned int flags)
dump_flow_info (dump_file); dump_flow_info (dump_file);
cfg_layout_finalize (); cfg_layout_finalize ();
if (flag_reorder_blocks_and_partition) verify_hot_cold_block_grouping ();
verify_hot_cold_block_grouping ();
timevar_pop (TV_REORDER_BLOCKS); timevar_pop (TV_REORDER_BLOCKS);
} }
...@@ -1954,7 +1966,8 @@ insert_section_boundary_note (void) ...@@ -1954,7 +1966,8 @@ insert_section_boundary_note (void)
rtx new_note; rtx new_note;
int first_partition = 0; int first_partition = 0;
if (flag_reorder_blocks_and_partition) if (flag_reorder_blocks_and_partition
&& targetm.have_named_sections)
FOR_EACH_BB (bb) FOR_EACH_BB (bb)
{ {
if (!first_partition) if (!first_partition)
......
...@@ -938,14 +938,11 @@ dbxout_function_end (tree decl) ...@@ -938,14 +938,11 @@ dbxout_function_end (tree decl)
#else #else
if (flag_reorder_blocks_and_partition) if (flag_reorder_blocks_and_partition)
{ {
struct function *cfun = DECL_STRUCT_FUNCTION (decl);
dbxout_begin_empty_stabs (N_FUN); dbxout_begin_empty_stabs (N_FUN);
dbxout_stab_value_label_diff (cfun->hot_section_end_label, dbxout_stab_value_label_diff (hot_section_end_label, hot_section_label);
cfun->hot_section_label);
dbxout_begin_empty_stabs (N_FUN); dbxout_begin_empty_stabs (N_FUN);
dbxout_stab_value_label_diff (cfun->cold_section_end_label, dbxout_stab_value_label_diff (cold_section_end_label,
cfun->cold_section_label); unlikely_section_label);
} }
else else
{ {
......
...@@ -4122,9 +4122,6 @@ static int maybe_emit_file (int); ...@@ -4122,9 +4122,6 @@ static int maybe_emit_file (int);
#ifndef TEXT_SECTION_LABEL #ifndef TEXT_SECTION_LABEL
#define TEXT_SECTION_LABEL "Ltext" #define TEXT_SECTION_LABEL "Ltext"
#endif #endif
#ifndef COLD_TEXT_SECTION_LABEL
#define COLD_TEXT_SECTION_LABEL "Ltext_cold"
#endif
#ifndef DEBUG_LINE_SECTION_LABEL #ifndef DEBUG_LINE_SECTION_LABEL
#define DEBUG_LINE_SECTION_LABEL "Ldebug_line" #define DEBUG_LINE_SECTION_LABEL "Ldebug_line"
#endif #endif
...@@ -4152,8 +4149,6 @@ static int maybe_emit_file (int); ...@@ -4152,8 +4149,6 @@ static int maybe_emit_file (int);
static char text_end_label[MAX_ARTIFICIAL_LABEL_BYTES]; static char text_end_label[MAX_ARTIFICIAL_LABEL_BYTES];
static char text_section_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 abbrev_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
static char debug_info_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]; static char debug_line_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
...@@ -4164,9 +4159,6 @@ static char ranges_section_label[2 * MAX_ARTIFICIAL_LABEL_BYTES]; ...@@ -4164,9 +4159,6 @@ static char ranges_section_label[2 * MAX_ARTIFICIAL_LABEL_BYTES];
#ifndef TEXT_END_LABEL #ifndef TEXT_END_LABEL
#define TEXT_END_LABEL "Letext" #define TEXT_END_LABEL "Letext"
#endif #endif
#ifndef COLD_END_LABEL
#define COLD_END_LABEL "Letext_cold"
#endif
#ifndef BLOCK_BEGIN_LABEL #ifndef BLOCK_BEGIN_LABEL
#define BLOCK_BEGIN_LABEL "LBB" #define BLOCK_BEGIN_LABEL "LBB"
#endif #endif
...@@ -6807,14 +6799,13 @@ static void ...@@ -6807,14 +6799,13 @@ static void
dwarf2out_switch_text_section (void) dwarf2out_switch_text_section (void)
{ {
dw_fde_ref fde; dw_fde_ref fde;
struct function *cfun = DECL_STRUCT_FUNCTION (current_function_decl);
fde = &fde_table[fde_table_in_use - 1]; fde = &fde_table[fde_table_in_use - 1];
fde->dw_fde_switched_sections = true; fde->dw_fde_switched_sections = true;
fde->dw_fde_hot_section_label = cfun->hot_section_label; fde->dw_fde_hot_section_label = xstrdup (hot_section_label);
fde->dw_fde_hot_section_end_label = cfun->hot_section_end_label; fde->dw_fde_hot_section_end_label = xstrdup (hot_section_end_label);
fde->dw_fde_unlikely_section_label = cfun->cold_section_label; fde->dw_fde_unlikely_section_label = xstrdup (unlikely_section_label);
fde->dw_fde_unlikely_section_end_label = cfun->cold_section_end_label; fde->dw_fde_unlikely_section_end_label = xstrdup (cold_section_end_label);
separate_line_info_table_in_use++; separate_line_info_table_in_use++;
} }
...@@ -7244,15 +7235,14 @@ output_aranges (void) ...@@ -7244,15 +7235,14 @@ output_aranges (void)
} }
dw2_asm_output_addr (DWARF2_ADDR_SIZE, text_section_label, "Address"); dw2_asm_output_addr (DWARF2_ADDR_SIZE, text_section_label, "Address");
dw2_asm_output_delta (DWARF2_ADDR_SIZE, text_end_label, if (last_text_section == in_unlikely_executed_text
text_section_label, "Length"); || (last_text_section == in_named
if (flag_reorder_blocks_and_partition) && last_text_section_name == unlikely_text_section_name))
{ dw2_asm_output_delta (DWARF2_ADDR_SIZE, text_end_label,
dw2_asm_output_addr (DWARF2_ADDR_SIZE, cold_text_section_label, unlikely_section_label, "Length");
"Address"); else
dw2_asm_output_delta (DWARF2_ADDR_SIZE, cold_end_label, dw2_asm_output_delta (DWARF2_ADDR_SIZE, text_end_label,
cold_text_section_label, "Length"); text_section_label, "Length");
}
for (i = 0; i < arange_table_in_use; i++) for (i = 0; i < arange_table_in_use; i++)
{ {
...@@ -7342,11 +7332,24 @@ output_ranges (void) ...@@ -7342,11 +7332,24 @@ output_ranges (void)
base of the text section. */ base of the text section. */
if (separate_line_info_table_in_use == 0) if (separate_line_info_table_in_use == 0)
{ {
dw2_asm_output_delta (DWARF2_ADDR_SIZE, blabel, if (last_text_section == in_unlikely_executed_text
text_section_label, || (last_text_section == in_named
fmt, i * 2 * DWARF2_ADDR_SIZE); && last_text_section_name == unlikely_text_section_name))
dw2_asm_output_delta (DWARF2_ADDR_SIZE, elabel, {
text_section_label, NULL); 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);
}
} }
/* Otherwise, we add a DW_AT_entry_pc attribute to force the /* Otherwise, we add a DW_AT_entry_pc attribute to force the
...@@ -7662,7 +7665,6 @@ output_line_info (void) ...@@ -7662,7 +7665,6 @@ output_line_info (void)
long line_delta; long line_delta;
unsigned long current_file; unsigned long current_file;
unsigned long function; unsigned long function;
struct function *cfun;
ASM_GENERATE_INTERNAL_LABEL (l1, LINE_NUMBER_BEGIN_LABEL, 0); ASM_GENERATE_INTERNAL_LABEL (l1, LINE_NUMBER_BEGIN_LABEL, 0);
ASM_GENERATE_INTERNAL_LABEL (l2, LINE_NUMBER_END_LABEL, 0); ASM_GENERATE_INTERNAL_LABEL (l2, LINE_NUMBER_END_LABEL, 0);
...@@ -7733,14 +7735,10 @@ output_line_info (void) ...@@ -7733,14 +7735,10 @@ output_line_info (void)
current_file = 1; current_file = 1;
current_line = 1; current_line = 1;
if (current_function_decl)
cfun = DECL_STRUCT_FUNCTION (current_function_decl);
else
cfun = NULL;
if (last_text_section == in_unlikely_executed_text if (last_text_section == in_unlikely_executed_text
|| (last_text_section == in_named || (last_text_section == in_named
&& last_text_section_name == cfun->unlikely_text_section_name)) && last_text_section_name == unlikely_text_section_name))
strcpy (prev_line_label, cfun->cold_section_label); strcpy (prev_line_label, unlikely_section_label);
else else
strcpy (prev_line_label, text_section_label); strcpy (prev_line_label, text_section_label);
for (lt_index = 1; lt_index < line_info_table_in_use; ++lt_index) for (lt_index = 1; lt_index < line_info_table_in_use; ++lt_index)
...@@ -10113,7 +10111,6 @@ add_location_or_const_value_attribute (dw_die_ref die, tree decl, ...@@ -10113,7 +10111,6 @@ add_location_or_const_value_attribute (dw_die_ref die, tree decl,
const char *endname; const char *endname;
dw_loc_list_ref list; dw_loc_list_ref list;
rtx varloc; rtx varloc;
struct function *cfun = DECL_STRUCT_FUNCTION (current_function_decl);
/* We need to figure out what section we should use as the base /* We need to figure out what section we should use as the base
...@@ -10139,8 +10136,8 @@ add_location_or_const_value_attribute (dw_die_ref die, tree decl, ...@@ -10139,8 +10136,8 @@ add_location_or_const_value_attribute (dw_die_ref die, tree decl,
} }
else if (last_text_section == in_unlikely_executed_text else if (last_text_section == in_unlikely_executed_text
|| (last_text_section == in_named || (last_text_section == in_named
&& last_text_section_name == cfun->unlikely_text_section_name)) && last_text_section_name == unlikely_text_section_name))
secname = cfun->cold_section_label; secname = unlikely_section_label;
else else
secname = text_section_label; secname = text_section_label;
...@@ -13233,7 +13230,6 @@ dwarf2out_var_location (rtx loc_note) ...@@ -13233,7 +13230,6 @@ dwarf2out_var_location (rtx loc_note)
static rtx last_insn; static rtx last_insn;
static const char *last_label; static const char *last_label;
tree decl; tree decl;
struct function *cfun = DECL_STRUCT_FUNCTION (current_function_decl);
if (!DECL_P (NOTE_VAR_LOCATION_DECL (loc_note))) if (!DECL_P (NOTE_VAR_LOCATION_DECL (loc_note)))
return; return;
...@@ -13262,8 +13258,8 @@ dwarf2out_var_location (rtx loc_note) ...@@ -13262,8 +13258,8 @@ dwarf2out_var_location (rtx loc_note)
if (last_text_section == in_unlikely_executed_text if (last_text_section == in_unlikely_executed_text
|| (last_text_section == in_named || (last_text_section == in_named
&& last_text_section_name == cfun->unlikely_text_section_name)) && last_text_section_name == unlikely_text_section_name))
newloc->section_label = cfun->cold_section_label; newloc->section_label = unlikely_section_label;
else else
newloc->section_label = text_section_label; newloc->section_label = text_section_label;
...@@ -13501,9 +13497,6 @@ dwarf2out_init (const char *filename ATTRIBUTE_UNUSED) ...@@ -13501,9 +13497,6 @@ dwarf2out_init (const char *filename ATTRIBUTE_UNUSED)
ASM_GENERATE_INTERNAL_LABEL (abbrev_section_label, ASM_GENERATE_INTERNAL_LABEL (abbrev_section_label,
DEBUG_ABBREV_SECTION_LABEL, 0); DEBUG_ABBREV_SECTION_LABEL, 0);
ASM_GENERATE_INTERNAL_LABEL (text_section_label, TEXT_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, ASM_GENERATE_INTERNAL_LABEL (debug_info_section_label,
DEBUG_INFO_SECTION_LABEL, 0); DEBUG_INFO_SECTION_LABEL, 0);
...@@ -13528,11 +13521,6 @@ dwarf2out_init (const char *filename ATTRIBUTE_UNUSED) ...@@ -13528,11 +13521,6 @@ dwarf2out_init (const char *filename ATTRIBUTE_UNUSED)
text_section (); text_section ();
ASM_OUTPUT_LABEL (asm_out_file, text_section_label); 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 /* A helper function for dwarf2out_finish called through
...@@ -13864,11 +13852,6 @@ dwarf2out_finish (const char *filename) ...@@ -13864,11 +13852,6 @@ dwarf2out_finish (const char *filename)
/* Output a terminator label for the .text section. */ /* Output a terminator label for the .text section. */
text_section (); text_section ();
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)
{
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 /* Output the source line correspondence table. We must do this
even if there is no line information. Otherwise, on an empty even if there is no line information. Otherwise, on an empty
......
...@@ -349,20 +349,6 @@ struct function GTY(()) ...@@ -349,20 +349,6 @@ struct function GTY(())
/* The variables unexpanded so far. */ /* The variables unexpanded so far. */
tree unexpanded_var_list; tree unexpanded_var_list;
/* Assembly labels for the hot and cold text sections, to
be used by debugger functions for determining the size of text
sections. */
const char * hot_section_label;
const char * cold_section_label;
const char * hot_section_end_label;
const char * cold_section_end_label;
/* String to be used for name of cold text sections, via
targetm.asm_out.named_section. */
const char *unlikely_text_section_name;
/* Collected bit flags. */ /* Collected bit flags. */
/* Nonzero if function being compiled needs to be given an address /* Nonzero if function being compiled needs to be given an address
......
...@@ -678,15 +678,6 @@ decode_options (unsigned int argc, const char **argv) ...@@ -678,15 +678,6 @@ decode_options (unsigned int argc, const char **argv)
flag_reorder_blocks_and_partition = 0; flag_reorder_blocks_and_partition = 0;
flag_reorder_blocks = 1; flag_reorder_blocks = 1;
} }
if (flag_reorder_blocks_and_partition
&& !targetm.have_named_sections)
{
inform
("-freorder-blocks-and-partition does not work on this architecture.");
flag_reorder_blocks_and_partition = 0;
flag_reorder_blocks = 1;
}
} }
/* Handle target- and language-independent options. Return zero to /* Handle target- and language-independent options. Return zero to
......
...@@ -453,6 +453,11 @@ enum in_section { no_section, in_text, in_unlikely_executed_text, in_data, ...@@ -453,6 +453,11 @@ enum in_section { no_section, in_text, in_unlikely_executed_text, in_data,
#endif #endif
}; };
extern char *unlikely_section_label;
extern char *hot_section_label;
extern char *hot_section_end_label;
extern char *cold_section_end_label;
extern char *unlikely_text_section_name;
extern const char *last_text_section_name; extern const char *last_text_section_name;
extern enum in_section last_text_section; extern enum in_section last_text_section;
extern bool first_function_block_is_cold; extern bool first_function_block_is_cold;
......
...@@ -329,6 +329,8 @@ rest_of_handle_final (void) ...@@ -329,6 +329,8 @@ rest_of_handle_final (void)
timevar_push (TV_SYMOUT); timevar_push (TV_SYMOUT);
(*debug_hooks->function_decl) (current_function_decl); (*debug_hooks->function_decl) (current_function_decl);
if (unlikely_text_section_name)
free (unlikely_text_section_name);
timevar_pop (TV_SYMOUT); timevar_pop (TV_SYMOUT);
ggc_collect (); ggc_collect ();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment