Backport of GC branch patches part 2: kill stmt status saving.

From-SVN: r28374
This commit is contained in:
Bernd Schmidt 1999-08-01 12:07:41 +00:00 committed by Bernd Schmidt
parent 695f7f32ab
commit 3f1d071b7b
10 changed files with 163 additions and 135 deletions

View file

@ -1,3 +1,48 @@
Sun Aug 1 12:55:31 1999 Bernd Schmidt <bernds@cygnus.co.uk>
* stmt.c (emit_filename, emit_lineno, expr_stmts_for_value,
last_expr_type, last_expr_value, block_start_count, block_stack,
stack_block_stack, cond_stack, loop_stack, case_stack, nesting_stack,
nesting_depth, goto_fixup_chain): Delete global vars; now allocated
dynamically in stmt elt of struct function for each function.
(struct nesting): Rename function_call_count elt to n_function_calls,
target_temp_slot_level to block_target_temp_slot_level. All users
changed.
(struct stmt_status): New structure definition.
Add many accessor macros for stmt_status elements which previously
were global variables.
(init_stmt_for_function): Allocate stmt elt for current_function.
Reflect that block_start_count was renamed to
current_block_start_count.
(save_stmt_status, restore_stmt_status): Delete functions.
(preserve_subexpressions_p): Don't access loop_stack when outside
a function.
(expand_start_bindings): Reflect that block_start_count was renamed to
current_block_start_count.
(expand_fixup): Likewise.
(expand_decl): Don't access block_stack when outside a function.
(expand_decl_cleanup): Likewise.
(expand_dcc_cleanup): Likewise.
(expand_dhc_cleanup): Likewise.
(expand_anon_union_decl): Likewise.
(set_file_and_line_for_stmt): New function.
(in_control_zone_p): New function.
* function.h (struct function): Add new elt stmt.
Delete elts block_stack, stack_block_stack, cond_stack, loop_stack,
case_stack, nesting_stack, nesting_depth, block_start_count,
last_expr_type, last_expr_value, expr_stmts_for_value, emit_filename,
emit_lineno, goto_fixup_chain.
(save_eh_status, restore_eh_status, save_stmt_status,
restore_stmt_status): Delete declarations.
* function.c (push_function_context_to): Don't call save_stmt_status.
(pop_function_context_to): Don't call restore_stmt_status.
* tree.h (in_control_zone_p): Declare.
* rtl.h (set_file_and_line_for_stmt): Declare.
* emit-rtl.c (emit_line_note): Don't set emit_filename/emit_lineno;
call set_file_and_line_for_stmt.
Thu Jul 31 12:34:45 1999 Joe Buck <jbuck@synopsys.com>
* gcc.texi: Use terms "GNU Compiler Collection" and "GCC".

View file

@ -1,3 +1,9 @@
1999-08-01 Bernd Schmidt <bernds@cygnus.co.uk>
* decl.c (finish_stmt): Don't declare and test cond_stack, loop_stack,
case_stack; use in_control_zone_p.
* typeck.c (c_expand_return): Likewise.
1999-07-31 Bernd Schmidt <bernds@cygnus.co.uk>
* except.c (catch_clauses): Delete declaration.

View file

@ -14509,9 +14509,6 @@ cplus_expand_expr_stmt (exp)
void
finish_stmt ()
{
extern struct nesting *cond_stack, *loop_stack, *case_stack;
if (current_function_assigns_this
|| ! current_function_just_assigned_this)
return;
@ -14519,7 +14516,7 @@ finish_stmt ()
{
/* Constructors must wait until we are out of control
zones before calling base constructors. */
if (cond_stack || loop_stack || case_stack)
if (in_control_zone_p ())
return;
expand_expr_stmt (base_init_expr);
check_base_init (current_class_type);

View file

@ -6735,7 +6735,6 @@ void
c_expand_return (retval)
tree retval;
{
extern struct nesting *cond_stack, *loop_stack, *case_stack;
extern tree dtor_label, ctor_label;
tree result = DECL_RESULT (current_function_decl);
tree valtype = TREE_TYPE (result);
@ -6925,7 +6924,7 @@ c_expand_return (retval)
if (retval != NULL_TREE
&& TREE_CODE_CLASS (TREE_CODE (retval)) == 'd'
&& cond_stack == 0 && loop_stack == 0 && case_stack == 0)
&& ! in_control_zone_p ())
current_function_return_value = retval;
if (ctor_label && TREE_CODE (ctor_label) != ERROR_MARK)

View file

@ -3167,8 +3167,7 @@ emit_line_note (file, line)
char *file;
int line;
{
emit_filename = file;
emit_lineno = line;
set_file_and_line_for_stmt (file, line);
#if 0
if (no_line_numbers)

View file

@ -626,7 +626,6 @@ push_function_context_to (context)
save_storage_status (p);
save_emit_status (p);
save_expr_status (p);
save_stmt_status (p);
save_varasm_status (p, context);
if (save_machine_status)
(*save_machine_status) (p);
@ -715,7 +714,6 @@ pop_function_context_from (context)
restore_storage_status (p);
restore_expr_status (p);
restore_emit_status (p);
restore_stmt_status (p);
restore_varasm_status (p);
if (restore_machine_status)

View file

@ -68,6 +68,7 @@ struct function
struct function *next;
struct eh_status *eh;
struct stmt_status *stmt;
/* For function.c. */
char *name;
@ -124,22 +125,6 @@ struct function
struct var_refs_queue *fixup_var_refs_queue;
CUMULATIVE_ARGS args_info;
/* For stmt.c */
struct nesting *block_stack;
struct nesting *stack_block_stack;
struct nesting *cond_stack;
struct nesting *loop_stack;
struct nesting *case_stack;
struct nesting *nesting_stack;
int nesting_depth;
int block_start_count;
tree last_expr_type;
rtx last_expr_value;
int expr_stmts_for_value;
char *emit_filename;
int emit_lineno;
struct goto_fixup *goto_fixup_chain;
/* For expr.c. */
rtx pending_chain;
int pending_stack_adjust;
@ -278,10 +263,6 @@ extern void save_tree_status PROTO((struct function *, tree));
extern void restore_tree_status PROTO((struct function *, tree));
extern void save_varasm_status PROTO((struct function *, tree));
extern void restore_varasm_status PROTO((struct function *));
extern void save_eh_status PROTO((struct function *));
extern void restore_eh_status PROTO((struct function *));
extern void save_stmt_status PROTO((struct function *));
extern void restore_stmt_status PROTO((struct function *));
extern void save_expr_status PROTO((struct function *));
extern void restore_expr_status PROTO((struct function *));
extern void save_emit_status PROTO((struct function *));

View file

@ -1464,6 +1464,7 @@ extern int operands_match_p PROTO ((rtx, rtx));
extern int safe_from_earlyclobber PROTO ((rtx, rtx));
/* In stmt.c */
extern void set_file_and_line_for_stmt PROTO ((char *, int));
extern void expand_null_return PROTO((void));
extern void emit_jump PROTO ((rtx));
extern int preserve_subexpressions_p PROTO ((void));

View file

@ -62,32 +62,12 @@ struct obstack stmt_obstack;
#define CASE_VECTOR_PC_RELATIVE 0
#endif
/* Filename and line number of last line-number note,
whether we actually emitted it or not. */
char *emit_filename;
int emit_lineno;
/* Nonzero if within a ({...}) grouping, in which case we must
always compute a value for each expr-stmt in case it is the last one. */
int expr_stmts_for_value;
/* Each time we expand an expression-statement,
record the expr's type and its RTL value here. */
static tree last_expr_type;
static rtx last_expr_value;
/* Each time we expand the end of a binding contour (in `expand_end_bindings')
and we emit a new NOTE_INSN_BLOCK_END note, we save a pointer to it here.
This is used by the `remember_end_note' function to record the endpoint
of each generated block in its associated BLOCK node. */
static rtx last_block_end_note;
/* Number of binding contours started so far in this function. */
int block_start_count;
/* Functions and data structures for expanding case statements. */
@ -223,7 +203,7 @@ struct nesting
For contours that have stack levels or cleanups. */
struct label_chain *label_chain;
/* Number of function calls seen, as of start of this block. */
int function_call_count;
int n_function_calls;
/* Nonzero if this is associated with a EH region. */
int exception_region;
/* The saved target_temp_slot_level from our outer block.
@ -231,7 +211,7 @@ struct nesting
this block, if that is done, target_temp_slot_level
reverts to the saved target_temp_slot_level at the very
end of the block. */
int target_temp_slot_level;
int block_target_temp_slot_level;
/* True if we are currently emitting insns in an area of
output code that is controlled by a conditional
expression. This is used by the cleanup handling code to
@ -276,31 +256,6 @@ struct nesting
} data;
};
/* Chain of all pending binding contours. */
struct nesting *block_stack;
/* If any new stacks are added here, add them to POPSTACKS too. */
/* Chain of all pending binding contours that restore stack levels
or have cleanups. */
struct nesting *stack_block_stack;
/* Chain of all pending conditional statements. */
struct nesting *cond_stack;
/* Chain of all pending loops. */
struct nesting *loop_stack;
/* Chain of all pending case or switch statements. */
struct nesting *case_stack;
/* Separate chain including all of the above,
chained through the `all' field. */
struct nesting *nesting_stack;
/* Number of entries on nesting_stack now. */
int nesting_depth;
/* Allocate and return a new `struct nesting'. */
#define ALLOC_NESTING() \
@ -369,8 +324,6 @@ struct goto_fixup
tree cleanup_list_list;
};
static struct goto_fixup *goto_fixup_chain;
/* Within any binding contour that must restore a stack level,
all labels are recorded with a chain of these structures. */
@ -381,6 +334,67 @@ struct label_chain
tree label;
};
struct stmt_status
{
/* Chain of all pending binding contours. */
struct nesting *x_block_stack;
/* If any new stacks are added here, add them to POPSTACKS too. */
/* Chain of all pending binding contours that restore stack levels
or have cleanups. */
struct nesting *x_stack_block_stack;
/* Chain of all pending conditional statements. */
struct nesting *x_cond_stack;
/* Chain of all pending loops. */
struct nesting *x_loop_stack;
/* Chain of all pending case or switch statements. */
struct nesting *x_case_stack;
/* Separate chain including all of the above,
chained through the `all' field. */
struct nesting *x_nesting_stack;
/* Number of entries on nesting_stack now. */
int x_nesting_depth;
/* Number of binding contours started so far in this function. */
int x_block_start_count;
/* Each time we expand an expression-statement,
record the expr's type and its RTL value here. */
tree x_last_expr_type;
rtx x_last_expr_value;
/* Nonzero if within a ({...}) grouping, in which case we must
always compute a value for each expr-stmt in case it is the last one. */
int x_expr_stmts_for_value;
/* Filename and line number of last line-number note,
whether we actually emitted it or not. */
char *x_emit_filename;
int x_emit_lineno;
struct goto_fixup *x_goto_fixup_chain;
};
#define block_stack (current_function->stmt->x_block_stack)
#define stack_block_stack (current_function->stmt->x_stack_block_stack)
#define cond_stack (current_function->stmt->x_cond_stack)
#define loop_stack (current_function->stmt->x_loop_stack)
#define case_stack (current_function->stmt->x_case_stack)
#define nesting_stack (current_function->stmt->x_nesting_stack)
#define nesting_depth (current_function->stmt->x_nesting_depth)
#define current_block_start_count (current_function->stmt->x_block_start_count)
#define last_expr_type (current_function->stmt->x_last_expr_type)
#define last_expr_value (current_function->stmt->x_last_expr_value)
#define expr_stmts_for_value (current_function->stmt->x_expr_stmts_for_value)
#define emit_filename (current_function->stmt->x_emit_filename)
#define emit_lineno (current_function->stmt->x_emit_lineno)
#define goto_fixup_chain (current_function->stmt->x_goto_fixup_chain)
/* Non-zero if we are using EH to handle cleanus. */
static int using_eh_for_cleanups_p = 0;
@ -428,6 +442,9 @@ init_stmt ()
void
init_stmt_for_function ()
{
current_function->stmt
= (struct stmt_status *) xmalloc (sizeof (struct stmt_status));
/* We are not currently within any block, conditional, loop or case. */
block_stack = 0;
stack_block_stack = 0;
@ -437,7 +454,7 @@ init_stmt_for_function ()
nesting_stack = 0;
nesting_depth = 0;
block_start_count = 0;
current_block_start_count = 0;
/* No gotos have been expanded yet. */
goto_fixup_chain = 0;
@ -448,47 +465,25 @@ init_stmt_for_function ()
init_eh_for_function ();
}
void
save_stmt_status (p)
struct function *p;
{
p->block_stack = block_stack;
p->stack_block_stack = stack_block_stack;
p->cond_stack = cond_stack;
p->loop_stack = loop_stack;
p->case_stack = case_stack;
p->nesting_stack = nesting_stack;
p->nesting_depth = nesting_depth;
p->block_start_count = block_start_count;
p->last_expr_type = last_expr_type;
p->last_expr_value = last_expr_value;
p->expr_stmts_for_value = expr_stmts_for_value;
p->emit_filename = emit_filename;
p->emit_lineno = emit_lineno;
p->goto_fixup_chain = goto_fixup_chain;
}
void
restore_stmt_status (p)
struct function *p;
{
block_stack = p->block_stack;
stack_block_stack = p->stack_block_stack;
cond_stack = p->cond_stack;
loop_stack = p->loop_stack;
case_stack = p->case_stack;
nesting_stack = p->nesting_stack;
nesting_depth = p->nesting_depth;
block_start_count = p->block_start_count;
last_expr_type = p->last_expr_type;
last_expr_value = p->last_expr_value;
expr_stmts_for_value = p->expr_stmts_for_value;
emit_filename = p->emit_filename;
emit_lineno = p->emit_lineno;
goto_fixup_chain = p->goto_fixup_chain;
}
/* Return nonzero if anything is pushed on the loop, condition, or case
stack. */
int
in_control_zone_p ()
{
return cond_stack || loop_stack || case_stack;
}
/* Record the current file and line. Called from emit_line_note. */
void
set_file_and_line_for_stmt (file, line)
char *file;
int line;
{
emit_filename = file;
emit_lineno = line;
}
/* Emit a no-op instruction. */
void
@ -878,7 +873,7 @@ expand_fixup (tree_label, rtl_label, last_insn)
emit_insns_after (start, original_before_jump);
}
fixup->block_start_count = block_start_count;
fixup->block_start_count = current_block_start_count;
fixup->stack_level = 0;
fixup->cleanup_list_list
= ((block->data.block.outer_cleanups
@ -2437,7 +2432,7 @@ preserve_subexpressions_p ()
if (flag_expensive_optimizations)
return 1;
if (optimize == 0 || loop_stack == 0)
if (optimize == 0 || current_function == 0 || loop_stack == 0)
return 0;
insn = get_last_insn_anywhere ();
@ -3019,9 +3014,9 @@ expand_start_bindings (exit_flag)
thisblock->depth = ++nesting_depth;
thisblock->data.block.stack_level = 0;
thisblock->data.block.cleanups = 0;
thisblock->data.block.function_call_count = 0;
thisblock->data.block.n_function_calls = 0;
thisblock->data.block.exception_region = 0;
thisblock->data.block.target_temp_slot_level = target_temp_slot_level;
thisblock->data.block.block_target_temp_slot_level = target_temp_slot_level;
thisblock->data.block.conditional_code = 0;
thisblock->data.block.last_unconditional_cleanup = note;
@ -3038,7 +3033,7 @@ expand_start_bindings (exit_flag)
thisblock->data.block.label_chain = 0;
thisblock->data.block.innermost_stack_block = stack_block_stack;
thisblock->data.block.first_insn = note;
thisblock->data.block.block_start_count = ++block_start_count;
thisblock->data.block.block_start_count = ++current_block_start_count;
thisblock->exit_label = exit_flag ? gen_label_rtx () : 0;
block_stack = thisblock;
nesting_stack = thisblock;
@ -3365,7 +3360,7 @@ expand_end_bindings (vars, mark_ends, dont_jump_in)
/* If necessary, make handlers for nonlocal gotos taking
place in the function calls in this block. */
if (function_call_count != thisblock->data.block.function_call_count
if (function_call_count != thisblock->data.block.n_function_calls
&& nonlocal_labels
/* Make handler for outermost block
if there were any nonlocal gotos to this function. */
@ -3462,7 +3457,7 @@ expand_end_bindings (vars, mark_ends, dont_jump_in)
use_variable (DECL_RTL (decl));
/* Restore the temporary level of TARGET_EXPRs. */
target_temp_slot_level = thisblock->data.block.target_temp_slot_level;
target_temp_slot_level = thisblock->data.block.block_target_temp_slot_level;
/* Restore block_stack level for containing block. */
@ -3480,7 +3475,7 @@ void
expand_decl (decl)
register tree decl;
{
struct nesting *thisblock = block_stack;
struct nesting *thisblock;
tree type;
type = TREE_TYPE (decl);
@ -3496,6 +3491,8 @@ expand_decl (decl)
if (TREE_STATIC (decl) || DECL_EXTERNAL (decl))
return;
thisblock = block_stack;
/* Create the RTL representation for the variable. */
if (type == error_mark_node)
@ -3722,12 +3719,14 @@ int
expand_decl_cleanup (decl, cleanup)
tree decl, cleanup;
{
struct nesting *thisblock = block_stack;
struct nesting *thisblock;
/* Error if we are not in any block. */
if (thisblock == 0)
if (current_function == 0 || block_stack == 0)
return 0;
thisblock = block_stack;
/* Record the cleanup if there is one. */
if (cleanup != 0)
@ -3851,12 +3850,13 @@ int
expand_dcc_cleanup (decl)
tree decl;
{
struct nesting *thisblock = block_stack;
struct nesting *thisblock;
tree cleanup;
/* Error if we are not in any block. */
if (thisblock == 0)
if (current_function == 0 || block_stack == 0)
return 0;
thisblock = block_stack;
/* Record the cleanup for the dynamic handler chain. */
@ -3892,12 +3892,13 @@ int
expand_dhc_cleanup (decl)
tree decl;
{
struct nesting *thisblock = block_stack;
struct nesting *thisblock;
tree cleanup;
/* Error if we are not in any block. */
if (thisblock == 0)
if (current_function == 0 || block_stack == 0)
return 0;
thisblock = block_stack;
/* Record the cleanup for the dynamic handler chain. */
@ -3924,7 +3925,7 @@ void
expand_anon_union_decl (decl, cleanup, decl_elts)
tree decl, cleanup, decl_elts;
{
struct nesting *thisblock = block_stack;
struct nesting *thisblock = current_function == 0 ? 0 : block_stack;
rtx x;
expand_decl (decl);

View file

@ -1929,6 +1929,7 @@ extern int (*lang_get_alias_set) PROTO((tree));
/* In stmt.c */
extern int in_control_zone_p PROTO((void));
extern void expand_fixups PROTO((struct rtx_def *));
extern tree expand_start_stmt_expr PROTO((void));
extern tree expand_end_stmt_expr PROTO((tree));