Commit 2f8e398b by Paolo Bonzini

coverage.c: Remove argument to rest_of_compilation.

gcc/ChangeLog:
2004-06-16  Paolo Bonzini  <bonzini@gnu.org>

	* coverage.c: Remove argument to rest_of_compilation.
	* expr.c (execute_expand, set_save_expr_context, pass_expand): New.
	* passes.c (rest_of_compilation): Remove argument.
	(pass_rest_of_compilation): New.
	(rest_of_handle_final, rest_of_handle_delay_slots,
	rest_of_handle_stack_regs, rest_of_handle_variable_tracking
	rest_of_handle_machine_reorg, rest_of_handle_regrename
	rest_of_handle_sched, rest_of_handle_sched2, rest_of_handle_gcse2
	rest_of_handle_regmove, rest_of_handle_tracer
	rest_of_handle_if_conversion, rest_of_handle_if_after_combine
	rest_of_handle_web, rest_of_handle_branch_prob
	rest_of_handle_value_profile_transformations, rest_of_handle_cfg
	rest_of_handle_addressof, rest_of_handle_jump_bypass
	rest_of_handle_life, rest_of_handle_cse, rest_of_handle_cse2):
	Check that the two arguments are actually superfluous.
	* toplev.h (rest_of_compilation): Adjust prototype.
	* tree-optimize.c (register_dump_files): Add properties argument.
	Track validity of passes.  Only initialize dump files for
	tree-based passes.  Store the full set of provided passes in
	the pass.
	(init_tree_optimization_passes): Register pass_expand and
	pass_rest_of_compilation.
	(execute_one_pass): Do not track the presence of required properties
	here.  Set in_gimple_form.  Do not update current_properties.
	(current_properties): Remove.
	(set_save_expr_context): Remove.
	(tree_rest_of_compilation): Do not set in_gimple_form.  Do not
	expand to RTL here, and do not call rest_of_compilation.  Push
	GGC context even before gimplification.
	* tree-pass.h (PROP_rtl, PROP_trees): New flags.
	(pass_expand, pass_rest_of_compilation): Declare.

gcc/java/ChangeLog:
2004-06-16  Paolo Bonzini  <bonzini@gnu.org>

	* java/class.c (emit_register_classes): Remove argument to
	rest_of_compilation.
	* java/resource.c (write_resource_constructor): Likewise.

From-SVN: r83225
parent fd660b1b
...@@ -955,7 +955,7 @@ create_coverage (void) ...@@ -955,7 +955,7 @@ create_coverage (void)
DECL_INITIAL (ctor) = make_node (BLOCK); DECL_INITIAL (ctor) = make_node (BLOCK);
TREE_USED (DECL_INITIAL (ctor)) = 1; TREE_USED (DECL_INITIAL (ctor)) = 1;
rest_of_compilation (ctor); rest_of_compilation ();
if (! quiet_flag) if (! quiet_flag)
fflush (asm_out_file); fflush (asm_out_file);
......
...@@ -48,7 +48,10 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA ...@@ -48,7 +48,10 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "intl.h" #include "intl.h"
#include "tm_p.h" #include "tm_p.h"
#include "tree-iterator.h" #include "tree-iterator.h"
#include "tree-pass.h"
#include "tree-flow.h"
#include "target.h" #include "target.h"
#include "timevar.h"
/* Decide whether a function's arguments should be processed /* Decide whether a function's arguments should be processed
from first to last or from last to first. from first to last or from last to first.
...@@ -165,6 +168,7 @@ static void emit_single_push_insn (enum machine_mode, rtx, tree); ...@@ -165,6 +168,7 @@ static void emit_single_push_insn (enum machine_mode, rtx, tree);
#endif #endif
static void do_tablejump (rtx, enum machine_mode, rtx, rtx, rtx); static void do_tablejump (rtx, enum machine_mode, rtx, rtx, rtx);
static rtx const_vector_from_tree (tree); static rtx const_vector_from_tree (tree);
static void execute_expand (void);
/* Record for each mode whether we can move a register directly to or /* Record for each mode whether we can move a register directly to or
from an object of that mode in memory. If we can't, we won't try from an object of that mode in memory. If we can't, we won't try
...@@ -10205,4 +10209,91 @@ const_vector_from_tree (tree exp) ...@@ -10205,4 +10209,91 @@ const_vector_from_tree (tree exp)
return gen_rtx_raw_CONST_VECTOR (mode, v); return gen_rtx_raw_CONST_VECTOR (mode, v);
} }
/* Called to move the SAVE_EXPRs for parameter declarations in a
nested function into the nested function. DATA is really the
nested FUNCTION_DECL. */
static tree
set_save_expr_context (tree *tp,
int *walk_subtrees,
void *data)
{
if (TREE_CODE (*tp) == SAVE_EXPR && !SAVE_EXPR_CONTEXT (*tp))
SAVE_EXPR_CONTEXT (*tp) = (tree) data;
/* Do not walk back into the SAVE_EXPR_CONTEXT; that will cause
circularity. */
else if (DECL_P (*tp))
*walk_subtrees = 0;
return NULL;
}
static void
execute_expand (void)
{
/* If the function has a variably modified type, there may be
SAVE_EXPRs in the parameter types. Their context must be set to
refer to this function; they cannot be expanded in the containing
function. */
if (decl_function_context (current_function_decl) == current_function_decl
&& variably_modified_type_p (TREE_TYPE (current_function_decl)))
walk_tree (&TREE_TYPE (current_function_decl), set_save_expr_context,
current_function_decl, NULL);
/* Expand the variables recorded during gimple lowering. This must
occur before the call to expand_function_start to ensure that
all used variables are expanded before we expand anything on the
PENDING_SIZES list. */
expand_used_vars ();
/* Set up parameters and prepare for return, for the function. */
expand_function_start (current_function_decl, 0);
/* If this function is `main', emit a call to `__main'
to run global initializers, etc. */
if (DECL_NAME (current_function_decl)
&& MAIN_NAME_P (DECL_NAME (current_function_decl))
&& DECL_FILE_SCOPE_P (current_function_decl))
expand_main_function ();
/* Generate the RTL for this function. */
expand_expr_stmt_value (DECL_SAVED_TREE (current_function_decl), 0, 0);
/* We hard-wired immediate_size_expand to zero above.
expand_function_end will decrement this variable. So, we set the
variable to one here, so that after the decrement it will remain
zero. */
immediate_size_expand = 1;
/* Make sure the locus is set to the end of the function, so that
epilogue line numbers and warnings are set properly. */
if (cfun->function_end_locus.file)
input_location = cfun->function_end_locus;
/* The following insns belong to the top scope. */
record_block_change (DECL_INITIAL (current_function_decl));
/* Generate rtl for function exit. */
expand_function_end ();
}
struct tree_opt_pass pass_expand =
{
"expand", /* name */
NULL, /* gate */
execute_expand, /* execute */
NULL, /* sub */
NULL, /* next */
0, /* static_pass_number */
TV_EXPAND, /* tv_id */
/* ??? If TER is enabled, we actually receive GENERIC. */
PROP_gimple_leh, /* properties_required */
PROP_rtl, /* properties_provided */
PROP_cfg | PROP_gimple_leh, /* properties_destroyed */
0, /* todo_flags_start */
0 /* todo_flags_finish */
};
#include "gt-expr.h" #include "gt-expr.h"
...@@ -2316,7 +2316,7 @@ emit_register_classes (void) ...@@ -2316,7 +2316,7 @@ emit_register_classes (void)
input_location = DECL_SOURCE_LOCATION (init_decl); input_location = DECL_SOURCE_LOCATION (init_decl);
expand_function_end (); expand_function_end ();
poplevel (1, 0, 1); poplevel (1, 0, 1);
rest_of_compilation (init_decl); rest_of_compilation ();
current_function_decl = NULL_TREE; current_function_decl = NULL_TREE;
if (targetm.have_ctors_dtors) if (targetm.have_ctors_dtors)
......
...@@ -153,7 +153,7 @@ write_resource_constructor (void) ...@@ -153,7 +153,7 @@ write_resource_constructor (void)
poplevel (1, 0, 1); poplevel (1, 0, 1);
/* rest_of_compilation forces generation even if -finline-functions. */ /* rest_of_compilation forces generation even if -finline-functions. */
rest_of_compilation (init_decl); rest_of_compilation ();
current_function_decl = NULL_TREE; current_function_decl = NULL_TREE;
if (targetm.have_ctors_dtors) if (targetm.have_ctors_dtors)
......
...@@ -80,6 +80,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA ...@@ -80,6 +80,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "coverage.h" #include "coverage.h"
#include "value-prof.h" #include "value-prof.h"
#include "alloc-pool.h" #include "alloc-pool.h"
#include "tree-pass.h"
#if defined (DWARF2_UNWIND_INFO) || defined (DWARF2_DEBUGGING_INFO) #if defined (DWARF2_UNWIND_INFO) || defined (DWARF2_DEBUGGING_INFO)
#include "dwarf2out.h" #include "dwarf2out.h"
...@@ -430,6 +431,9 @@ rest_of_type_compilation (tree type, int toplev) ...@@ -430,6 +431,9 @@ rest_of_type_compilation (tree type, int toplev)
static void static void
rest_of_handle_final (tree decl, rtx insns) rest_of_handle_final (tree decl, rtx insns)
{ {
if (decl != current_function_decl || insns != get_insns ())
abort ();
timevar_push (TV_FINAL); timevar_push (TV_FINAL);
{ {
rtx x; rtx x;
...@@ -483,6 +487,9 @@ rest_of_handle_final (tree decl, rtx insns) ...@@ -483,6 +487,9 @@ rest_of_handle_final (tree decl, rtx insns)
static void static void
rest_of_handle_delay_slots (tree decl, rtx insns) rest_of_handle_delay_slots (tree decl, rtx insns)
{ {
if (decl != current_function_decl || insns != get_insns ())
abort ();
timevar_push (TV_DBR_SCHED); timevar_push (TV_DBR_SCHED);
open_dump_file (DFI_dbr, decl); open_dump_file (DFI_dbr, decl);
...@@ -501,6 +508,9 @@ rest_of_handle_delay_slots (tree decl, rtx insns) ...@@ -501,6 +508,9 @@ rest_of_handle_delay_slots (tree decl, rtx insns)
static void static void
rest_of_handle_stack_regs (tree decl, rtx insns) rest_of_handle_stack_regs (tree decl, rtx insns)
{ {
if (decl != current_function_decl || insns != get_insns ())
abort ();
#if defined (HAVE_ATTR_length) #if defined (HAVE_ATTR_length)
/* If flow2 creates new instructions which need splitting /* If flow2 creates new instructions which need splitting
and scheduling after reload is not done, they might not be and scheduling after reload is not done, they might not be
...@@ -543,6 +553,9 @@ rest_of_handle_stack_regs (tree decl, rtx insns) ...@@ -543,6 +553,9 @@ rest_of_handle_stack_regs (tree decl, rtx insns)
static void static void
rest_of_handle_variable_tracking (tree decl, rtx insns) rest_of_handle_variable_tracking (tree decl, rtx insns)
{ {
if (decl != current_function_decl || insns != get_insns ())
abort ();
timevar_push (TV_VAR_TRACKING); timevar_push (TV_VAR_TRACKING);
open_dump_file (DFI_vartrack, decl); open_dump_file (DFI_vartrack, decl);
...@@ -556,6 +569,9 @@ rest_of_handle_variable_tracking (tree decl, rtx insns) ...@@ -556,6 +569,9 @@ rest_of_handle_variable_tracking (tree decl, rtx insns)
static void static void
rest_of_handle_machine_reorg (tree decl, rtx insns) rest_of_handle_machine_reorg (tree decl, rtx insns)
{ {
if (decl != current_function_decl || insns != get_insns ())
abort ();
timevar_push (TV_MACH_DEP); timevar_push (TV_MACH_DEP);
open_dump_file (DFI_mach, decl); open_dump_file (DFI_mach, decl);
...@@ -575,6 +591,9 @@ rest_of_handle_new_regalloc (tree decl, rtx insns) ...@@ -575,6 +591,9 @@ rest_of_handle_new_regalloc (tree decl, rtx insns)
{ {
int failure; int failure;
if (decl != current_function_decl || insns != get_insns ())
abort ();
delete_trivially_dead_insns (insns, max_reg_num ()); delete_trivially_dead_insns (insns, max_reg_num ());
reg_alloc (); reg_alloc ();
...@@ -622,6 +641,9 @@ rest_of_handle_old_regalloc (tree decl, rtx insns) ...@@ -622,6 +641,9 @@ rest_of_handle_old_regalloc (tree decl, rtx insns)
int failure; int failure;
int rebuild_notes; int rebuild_notes;
if (decl != current_function_decl || insns != get_insns ())
abort ();
/* Allocate the reg_renumber array. */ /* Allocate the reg_renumber array. */
allocate_reg_info (max_regno, FALSE, TRUE); allocate_reg_info (max_regno, FALSE, TRUE);
...@@ -695,6 +717,9 @@ rest_of_handle_old_regalloc (tree decl, rtx insns) ...@@ -695,6 +717,9 @@ rest_of_handle_old_regalloc (tree decl, rtx insns)
static void static void
rest_of_handle_regrename (tree decl, rtx insns) rest_of_handle_regrename (tree decl, rtx insns)
{ {
if (decl != current_function_decl || insns != get_insns ())
abort ();
timevar_push (TV_RENAME_REGISTERS); timevar_push (TV_RENAME_REGISTERS);
open_dump_file (DFI_rnreg, decl); open_dump_file (DFI_rnreg, decl);
...@@ -714,6 +739,9 @@ rest_of_handle_reorder_blocks (tree decl, rtx insns) ...@@ -714,6 +739,9 @@ rest_of_handle_reorder_blocks (tree decl, rtx insns)
bool changed; bool changed;
open_dump_file (DFI_bbro, decl); open_dump_file (DFI_bbro, decl);
if (decl != current_function_decl || insns != get_insns ())
abort ();
/* Last attempt to optimize CFG, as scheduling, peepholing and insn /* Last attempt to optimize CFG, as scheduling, peepholing and insn
splitting possibly introduced more crossjumping opportunities. */ splitting possibly introduced more crossjumping opportunities. */
changed = cleanup_cfg (CLEANUP_EXPENSIVE changed = cleanup_cfg (CLEANUP_EXPENSIVE
...@@ -744,6 +772,9 @@ rest_of_handle_reorder_blocks (tree decl, rtx insns) ...@@ -744,6 +772,9 @@ rest_of_handle_reorder_blocks (tree decl, rtx insns)
static void static void
rest_of_handle_sched (tree decl, rtx insns) rest_of_handle_sched (tree decl, rtx insns)
{ {
if (decl != current_function_decl || insns != get_insns ())
abort ();
timevar_push (TV_SMS); timevar_push (TV_SMS);
if (optimize > 0 && flag_modulo_sched) if (optimize > 0 && flag_modulo_sched)
{ {
...@@ -791,6 +822,9 @@ rest_of_handle_sched (tree decl, rtx insns) ...@@ -791,6 +822,9 @@ rest_of_handle_sched (tree decl, rtx insns)
static void static void
rest_of_handle_sched2 (tree decl, rtx insns) rest_of_handle_sched2 (tree decl, rtx insns)
{ {
if (decl != current_function_decl || insns != get_insns ())
abort ();
timevar_push (TV_SCHED2); timevar_push (TV_SCHED2);
open_dump_file (DFI_sched2, decl); open_dump_file (DFI_sched2, decl);
...@@ -820,6 +854,9 @@ rest_of_handle_sched2 (tree decl, rtx insns) ...@@ -820,6 +854,9 @@ rest_of_handle_sched2 (tree decl, rtx insns)
static void static void
rest_of_handle_gcse2 (tree decl, rtx insns) rest_of_handle_gcse2 (tree decl, rtx insns)
{ {
if (decl != current_function_decl || insns != get_insns ())
abort ();
open_dump_file (DFI_gcse2, decl); open_dump_file (DFI_gcse2, decl);
gcse_after_reload_main (insns, dump_file); gcse_after_reload_main (insns, dump_file);
...@@ -839,6 +876,9 @@ rest_of_handle_gcse2 (tree decl, rtx insns) ...@@ -839,6 +876,9 @@ rest_of_handle_gcse2 (tree decl, rtx insns)
static void static void
rest_of_handle_regmove (tree decl, rtx insns) rest_of_handle_regmove (tree decl, rtx insns)
{ {
if (decl != current_function_decl || insns != get_insns ())
abort ();
timevar_push (TV_REGMOVE); timevar_push (TV_REGMOVE);
open_dump_file (DFI_regmove, decl); open_dump_file (DFI_regmove, decl);
...@@ -855,6 +895,9 @@ rest_of_handle_regmove (tree decl, rtx insns) ...@@ -855,6 +895,9 @@ rest_of_handle_regmove (tree decl, rtx insns)
static void static void
rest_of_handle_tracer (tree decl, rtx insns) rest_of_handle_tracer (tree decl, rtx insns)
{ {
if (decl != current_function_decl || insns != get_insns ())
abort ();
open_dump_file (DFI_tracer, decl); open_dump_file (DFI_tracer, decl);
if (dump_file) if (dump_file)
dump_flow_info (dump_file); dump_flow_info (dump_file);
...@@ -868,6 +911,9 @@ rest_of_handle_tracer (tree decl, rtx insns) ...@@ -868,6 +911,9 @@ rest_of_handle_tracer (tree decl, rtx insns)
static void static void
rest_of_handle_if_conversion (tree decl, rtx insns) rest_of_handle_if_conversion (tree decl, rtx insns)
{ {
if (decl != current_function_decl || insns != get_insns ())
abort ();
open_dump_file (DFI_ce1, decl); open_dump_file (DFI_ce1, decl);
if (flag_if_conversion) if (flag_if_conversion)
{ {
...@@ -891,6 +937,9 @@ rest_of_handle_if_conversion (tree decl, rtx insns) ...@@ -891,6 +937,9 @@ rest_of_handle_if_conversion (tree decl, rtx insns)
static void static void
rest_of_handle_if_after_combine (tree decl, rtx insns) rest_of_handle_if_after_combine (tree decl, rtx insns)
{ {
if (decl != current_function_decl || insns != get_insns ())
abort ();
timevar_push (TV_IFCVT); timevar_push (TV_IFCVT);
open_dump_file (DFI_ce2, decl); open_dump_file (DFI_ce2, decl);
...@@ -905,6 +954,9 @@ rest_of_handle_if_after_combine (tree decl, rtx insns) ...@@ -905,6 +954,9 @@ rest_of_handle_if_after_combine (tree decl, rtx insns)
static void static void
rest_of_handle_web (tree decl, rtx insns) rest_of_handle_web (tree decl, rtx insns)
{ {
if (decl != current_function_decl || insns != get_insns ())
abort ();
open_dump_file (DFI_web, decl); open_dump_file (DFI_web, decl);
timevar_push (TV_WEB); timevar_push (TV_WEB);
web_main (); web_main ();
...@@ -921,6 +973,8 @@ static void ...@@ -921,6 +973,8 @@ static void
rest_of_handle_branch_prob (tree decl, rtx insns) rest_of_handle_branch_prob (tree decl, rtx insns)
{ {
struct loops loops; struct loops loops;
if (decl != current_function_decl || insns != get_insns ())
abort ();
timevar_push (TV_BRANCH_PROB); timevar_push (TV_BRANCH_PROB);
open_dump_file (DFI_bp, decl); open_dump_file (DFI_bp, decl);
...@@ -949,6 +1003,9 @@ rest_of_handle_branch_prob (tree decl, rtx insns) ...@@ -949,6 +1003,9 @@ rest_of_handle_branch_prob (tree decl, rtx insns)
static void static void
rest_of_handle_value_profile_transformations (tree decl, rtx insns) rest_of_handle_value_profile_transformations (tree decl, rtx insns)
{ {
if (decl != current_function_decl || insns != get_insns ())
abort ();
open_dump_file (DFI_vpt, decl); open_dump_file (DFI_vpt, decl);
timevar_push (TV_VPT); timevar_push (TV_VPT);
...@@ -964,6 +1021,9 @@ rest_of_handle_value_profile_transformations (tree decl, rtx insns) ...@@ -964,6 +1021,9 @@ rest_of_handle_value_profile_transformations (tree decl, rtx insns)
static void static void
rest_of_handle_cfg (tree decl, rtx insns) rest_of_handle_cfg (tree decl, rtx insns)
{ {
if (decl != current_function_decl || insns != get_insns ())
abort ();
open_dump_file (DFI_cfg, decl); open_dump_file (DFI_cfg, decl);
if (dump_file) if (dump_file)
dump_flow_info (dump_file); dump_flow_info (dump_file);
...@@ -993,6 +1053,9 @@ rest_of_handle_cfg (tree decl, rtx insns) ...@@ -993,6 +1053,9 @@ rest_of_handle_cfg (tree decl, rtx insns)
static void static void
rest_of_handle_addressof (tree decl, rtx insns) rest_of_handle_addressof (tree decl, rtx insns)
{ {
if (decl != current_function_decl || insns != get_insns ())
abort ();
open_dump_file (DFI_addressof, decl); open_dump_file (DFI_addressof, decl);
purge_addressof (insns); purge_addressof (insns);
...@@ -1007,6 +1070,9 @@ rest_of_handle_addressof (tree decl, rtx insns) ...@@ -1007,6 +1070,9 @@ rest_of_handle_addressof (tree decl, rtx insns)
static void static void
rest_of_handle_jump_bypass (tree decl, rtx insns) rest_of_handle_jump_bypass (tree decl, rtx insns)
{ {
if (decl != current_function_decl || insns != get_insns ())
abort ();
timevar_push (TV_BYPASS); timevar_push (TV_BYPASS);
open_dump_file (DFI_bypass, decl); open_dump_file (DFI_bypass, decl);
...@@ -1036,6 +1102,9 @@ rest_of_handle_combine (tree decl, rtx insns) ...@@ -1036,6 +1102,9 @@ rest_of_handle_combine (tree decl, rtx insns)
{ {
int rebuild_jump_labels_after_combine = 0; int rebuild_jump_labels_after_combine = 0;
if (decl != current_function_decl || insns != get_insns ())
abort ();
timevar_push (TV_COMBINE); timevar_push (TV_COMBINE);
open_dump_file (DFI_combine, decl); open_dump_file (DFI_combine, decl);
...@@ -1064,6 +1133,9 @@ rest_of_handle_combine (tree decl, rtx insns) ...@@ -1064,6 +1133,9 @@ rest_of_handle_combine (tree decl, rtx insns)
static void static void
rest_of_handle_life (tree decl, rtx insns) rest_of_handle_life (tree decl, rtx insns)
{ {
if (decl != current_function_decl || insns != get_insns ())
abort ();
open_dump_file (DFI_life, decl); open_dump_file (DFI_life, decl);
regclass_init (); regclass_init ();
...@@ -1110,6 +1182,8 @@ static void ...@@ -1110,6 +1182,8 @@ static void
rest_of_handle_cse (tree decl, rtx insns) rest_of_handle_cse (tree decl, rtx insns)
{ {
int tem; int tem;
if (decl != current_function_decl || insns != get_insns ())
abort ();
open_dump_file (DFI_cse, decl); open_dump_file (DFI_cse, decl);
if (dump_file) if (dump_file)
...@@ -1142,6 +1216,8 @@ static void ...@@ -1142,6 +1216,8 @@ static void
rest_of_handle_cse2 (tree decl, rtx insns) rest_of_handle_cse2 (tree decl, rtx insns)
{ {
int tem; int tem;
if (decl != current_function_decl || insns != get_insns ())
abort ();
timevar_push (TV_CSE2); timevar_push (TV_CSE2);
open_dump_file (DFI_cse2, decl); open_dump_file (DFI_cse2, decl);
...@@ -1178,6 +1254,8 @@ rest_of_handle_gcse (tree decl, rtx insns) ...@@ -1178,6 +1254,8 @@ rest_of_handle_gcse (tree decl, rtx insns)
{ {
int save_csb, save_cfj; int save_csb, save_cfj;
int tem2 = 0, tem; int tem2 = 0, tem;
if (decl != current_function_decl || insns != get_insns ())
abort ();
timevar_push (TV_GCSE); timevar_push (TV_GCSE);
open_dump_file (DFI_gcse, decl); open_dump_file (DFI_gcse, decl);
...@@ -1241,6 +1319,9 @@ rest_of_handle_loop_optimize (tree decl, rtx insns) ...@@ -1241,6 +1319,9 @@ rest_of_handle_loop_optimize (tree decl, rtx insns)
{ {
int do_unroll, do_prefetch; int do_unroll, do_prefetch;
if (decl != current_function_decl || insns != get_insns ())
abort ();
timevar_push (TV_LOOP); timevar_push (TV_LOOP);
delete_dead_jumptables (); delete_dead_jumptables ();
cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP); cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
...@@ -1294,6 +1375,9 @@ rest_of_handle_loop2 (tree decl, rtx insns) ...@@ -1294,6 +1375,9 @@ rest_of_handle_loop2 (tree decl, rtx insns)
struct loops *loops; struct loops *loops;
basic_block bb; basic_block bb;
if (decl != current_function_decl || insns != get_insns ())
abort ();
if (!flag_unswitch_loops if (!flag_unswitch_loops
&& !flag_peel_loops && !flag_peel_loops
&& !flag_unroll_loops && !flag_unroll_loops
...@@ -1353,11 +1437,15 @@ rest_of_handle_loop2 (tree decl, rtx insns) ...@@ -1353,11 +1437,15 @@ rest_of_handle_loop2 (tree decl, rtx insns)
After we return, the tree storage is freed. */ After we return, the tree storage is freed. */
void void
rest_of_compilation (tree decl) rest_of_compilation (void)
{ {
tree decl = current_function_decl;
rtx insns; rtx insns;
timevar_push (TV_REST_OF_COMPILATION);
/* There's no need to defer outputting this function any more; we
know we want to output it. */
DECL_DEFER_OUTPUT (current_function_decl) = 0;
/* There's no need to defer outputting this function any more; we /* There's no need to defer outputting this function any more; we
know we want to output it. */ know we want to output it. */
...@@ -1935,10 +2023,6 @@ rest_of_compilation (tree decl) ...@@ -1935,10 +2023,6 @@ rest_of_compilation (tree decl)
/* We're done with this function. Free up memory if we can. */ /* We're done with this function. Free up memory if we can. */
free_after_parsing (cfun); free_after_parsing (cfun);
ggc_collect ();
timevar_pop (TV_REST_OF_COMPILATION);
} }
void void
...@@ -2019,3 +2103,21 @@ enable_rtl_dump_file (int letter) ...@@ -2019,3 +2103,21 @@ enable_rtl_dump_file (int letter)
return matched; return matched;
} }
struct tree_opt_pass pass_rest_of_compilation =
{
"rest of compilation", /* name */
NULL, /* gate */
rest_of_compilation, /* execute */
NULL, /* sub */
NULL, /* next */
0, /* static_pass_number */
TV_REST_OF_COMPILATION, /* tv_id */
PROP_rtl, /* properties_required */
0, /* properties_provided */
PROP_rtl, /* properties_destroyed */
0, /* todo_flags_start */
TODO_ggc_collect /* todo_flags_finish */
};
...@@ -210,17 +210,31 @@ register_one_dump_file (struct tree_opt_pass *pass) ...@@ -210,17 +210,31 @@ register_one_dump_file (struct tree_opt_pass *pass)
pass->static_pass_number = dump_register (dot_name, flag_name); pass->static_pass_number = dump_register (dot_name, flag_name);
} }
static void static int
register_dump_files (struct tree_opt_pass *pass) register_dump_files (struct tree_opt_pass *pass, int properties)
{ {
do do
{ {
/* Verify that all required properties are present. */
if (pass->properties_required & ~properties)
abort ();
if (pass->properties_destroyed & pass->properties_provided)
abort ();
pass->properties_required = properties;
pass->properties_provided = properties =
(properties | pass->properties_provided) & ~pass->properties_destroyed;
if (properties & PROP_trees)
register_one_dump_file (pass); register_one_dump_file (pass);
if (pass->sub) if (pass->sub)
register_dump_files (pass->sub); properties = register_dump_files (pass->sub, properties);
pass = pass->next; pass = pass->next;
} }
while (pass); while (pass);
return properties;
} }
/* Duplicate a pass that's to be run more than once. */ /* Duplicate a pass that's to be run more than once. */
...@@ -272,6 +286,8 @@ init_tree_optimization_passes (void) ...@@ -272,6 +286,8 @@ init_tree_optimization_passes (void)
NEXT_PASS (pass_all_optimizations); NEXT_PASS (pass_all_optimizations);
NEXT_PASS (pass_mudflap_2); NEXT_PASS (pass_mudflap_2);
NEXT_PASS (pass_rebuild_bind); NEXT_PASS (pass_rebuild_bind);
NEXT_PASS (pass_expand);
NEXT_PASS (pass_rest_of_compilation);
*p = NULL; *p = NULL;
p = &pass_all_optimizations.sub; p = &pass_all_optimizations.sub;
...@@ -326,12 +342,11 @@ init_tree_optimization_passes (void) ...@@ -326,12 +342,11 @@ init_tree_optimization_passes (void)
#undef DUP_PASS #undef DUP_PASS
/* Register the passes with the tree dump code. */ /* Register the passes with the tree dump code. */
register_dump_files (all_passes); register_dump_files (all_passes, 0);
} }
static void execute_pass_list (struct tree_opt_pass *); static void execute_pass_list (struct tree_opt_pass *);
static unsigned int current_properties;
static unsigned int last_verified; static unsigned int last_verified;
static void static void
...@@ -370,9 +385,9 @@ execute_one_pass (struct tree_opt_pass *pass) ...@@ -370,9 +385,9 @@ execute_one_pass (struct tree_opt_pass *pass)
if (pass->gate && !pass->gate ()) if (pass->gate && !pass->gate ())
return false; return false;
/* Verify that all required properties are present. */ /* Note that the folders should only create gimple expressions.
if (pass->properties_required & ~current_properties) This is a hack until the new folder is ready. */
abort (); in_gimple_form = (pass->properties_provided & PROP_trees) != 0;
/* Run pre-pass verification. */ /* Run pre-pass verification. */
todo = pass->todo_flags_start & ~last_verified; todo = pass->todo_flags_start & ~last_verified;
...@@ -411,10 +426,6 @@ execute_one_pass (struct tree_opt_pass *pass) ...@@ -411,10 +426,6 @@ execute_one_pass (struct tree_opt_pass *pass)
if (todo) if (todo)
execute_todo (todo); execute_todo (todo);
/* Update properties. */
current_properties &= ~pass->properties_destroyed;
current_properties |= pass->properties_provided;
/* Close down timevar and dump file. */ /* Close down timevar and dump file. */
if (pass->tv_id) if (pass->tv_id)
timevar_pop (pass->tv_id); timevar_pop (pass->tv_id);
...@@ -440,25 +451,6 @@ execute_pass_list (struct tree_opt_pass *pass) ...@@ -440,25 +451,6 @@ execute_pass_list (struct tree_opt_pass *pass)
} }
/* Called to move the SAVE_EXPRs for parameter declarations in a
nested function into the nested function. DATA is really the
nested FUNCTION_DECL. */
static tree
set_save_expr_context (tree *tp,
int *walk_subtrees,
void *data)
{
if (TREE_CODE (*tp) == SAVE_EXPR && !SAVE_EXPR_CONTEXT (*tp))
SAVE_EXPR_CONTEXT (*tp) = (tree) data;
/* Do not walk back into the SAVE_EXPR_CONTEXT; that will cause
circularity. */
else if (DECL_P (*tp))
*walk_subtrees = 0;
return NULL;
}
/* For functions-as-trees languages, this performs all optimization and /* For functions-as-trees languages, this performs all optimization and
compilation for FNDECL. */ compilation for FNDECL. */
...@@ -522,68 +514,13 @@ tree_rest_of_compilation (tree fndecl, bool nested_p) ...@@ -522,68 +514,13 @@ tree_rest_of_compilation (tree fndecl, bool nested_p)
} }
} }
/* Note that the folders should only create gimple expressions.
This is a hack until the new folder is ready. */
in_gimple_form = true;
/* Perform all tree transforms and optimizations. */
execute_pass_list (all_passes);
/* Note that the folders can create non-gimple expressions again. */
in_gimple_form = false;
/* If the function has a variably modified type, there may be
SAVE_EXPRs in the parameter types. Their context must be set to
refer to this function; they cannot be expanded in the containing
function. */
if (decl_function_context (fndecl) == current_function_decl
&& variably_modified_type_p (TREE_TYPE (fndecl)))
walk_tree (&TREE_TYPE (fndecl), set_save_expr_context, fndecl,
NULL);
/* Expand the variables recorded during gimple lowering. This must
occur before the call to expand_function_start to ensure that
all used variables are expanded before we expand anything on the
PENDING_SIZES list. */
expand_used_vars ();
/* Set up parameters and prepare for return, for the function. */
expand_function_start (fndecl, 0);
/* If this function is `main', emit a call to `__main'
to run global initializers, etc. */
if (DECL_NAME (fndecl)
&& MAIN_NAME_P (DECL_NAME (fndecl))
&& DECL_FILE_SCOPE_P (fndecl))
expand_main_function ();
/* Generate the RTL for this function. */
expand_expr_stmt_value (DECL_SAVED_TREE (fndecl), 0, 0);
/* We hard-wired immediate_size_expand to zero above.
expand_function_end will decrement this variable. So, we set the
variable to one here, so that after the decrement it will remain
zero. */
immediate_size_expand = 1;
/* Make sure the locus is set to the end of the function, so that
epilogue line numbers and warnings are set properly. */
if (cfun->function_end_locus.file)
input_location = cfun->function_end_locus;
/* The following insns belong to the top scope. */
record_block_change (DECL_INITIAL (current_function_decl));
/* Generate rtl for function exit. */
expand_function_end ();
/* If this is a nested function, protect the local variables in the stack /* If this is a nested function, protect the local variables in the stack
above us from being collected while we're compiling this function. */ above us from being collected while we're compiling this function. */
if (nested_p) if (nested_p)
ggc_push_context (); ggc_push_context ();
/* Run the optimizers and output the assembler code for this function. */ /* Perform all tree transforms and optimizations. */
rest_of_compilation (fndecl); execute_pass_list (all_passes);
/* Restore original body if still needed. */ /* Restore original body if still needed. */
if (cfun->saved_tree) if (cfun->saved_tree)
......
...@@ -75,6 +75,10 @@ struct tree_opt_pass ...@@ -75,6 +75,10 @@ struct tree_opt_pass
#define PROP_pta (1 << 5) #define PROP_pta (1 << 5)
#define PROP_ssa (1 << 6) #define PROP_ssa (1 << 6)
#define PROP_no_crit_edges (1 << 7) #define PROP_no_crit_edges (1 << 7)
#define PROP_rtl (1 << 8)
#define PROP_trees \
(PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh)
/* To-do flags. */ /* To-do flags. */
#define TODO_dump_func (1 << 0) /* pass doesn't dump itself */ #define TODO_dump_func (1 << 0) /* pass doesn't dump itself */
...@@ -125,6 +129,8 @@ extern struct tree_opt_pass pass_dse; ...@@ -125,6 +129,8 @@ extern struct tree_opt_pass pass_dse;
extern struct tree_opt_pass pass_nrv; extern struct tree_opt_pass pass_nrv;
extern struct tree_opt_pass pass_remove_useless_vars; extern struct tree_opt_pass pass_remove_useless_vars;
extern struct tree_opt_pass pass_rename_ssa_copies; extern struct tree_opt_pass pass_rename_ssa_copies;
extern struct tree_opt_pass pass_expand;
extern struct tree_opt_pass pass_rest_of_compilation;
#endif /* GCC_TREE_PASS_H */ #endif /* GCC_TREE_PASS_H */
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