aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorBernd Schmidt <bernds@cygnus.co.uk>1999-08-01 12:07:41 +0000
committerBernd Schmidt <crux@gcc.gnu.org>1999-08-01 12:07:41 +0000
commit3f1d071b7b4c15eb5f5eae95bcbab3e57e3a51c8 (patch)
treeaf637eac1ac4aabf616ef5567e5e369c9bde6124 /gcc
parent695f7f32ab903598ecb5de68f7f3564d65298ad4 (diff)
downloadgcc-3f1d071b7b4c15eb5f5eae95bcbab3e57e3a51c8.zip
gcc-3f1d071b7b4c15eb5f5eae95bcbab3e57e3a51c8.tar.gz
gcc-3f1d071b7b4c15eb5f5eae95bcbab3e57e3a51c8.tar.bz2
Backport of GC branch patches part 2: kill stmt status saving.
From-SVN: r28374
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog45
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/decl.c5
-rw-r--r--gcc/cp/typeck.c3
-rw-r--r--gcc/emit-rtl.c3
-rw-r--r--gcc/function.c2
-rw-r--r--gcc/function.h21
-rw-r--r--gcc/rtl.h1
-rw-r--r--gcc/stmt.c201
-rw-r--r--gcc/tree.h1
10 files changed, 158 insertions, 130 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a4d4349..66da0db 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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".
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index a6f75c5..b70b803 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 1dc070b..bbbf7be 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -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);
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index e62f7e3..cd0652f 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -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)
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index 43fa8d9..3c0e08c 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -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)
diff --git a/gcc/function.c b/gcc/function.c
index cf4ed86..3467de0 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -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)
diff --git a/gcc/function.h b/gcc/function.h
index 03ff02f..3d3943a 100644
--- a/gcc/function.h
+++ b/gcc/function.h
@@ -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 *));
diff --git a/gcc/rtl.h b/gcc/rtl.h
index 520fa82..9b86a84 100644
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -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));
diff --git a/gcc/stmt.c b/gcc/stmt.c
index ad76d88..62cfee0 100644
--- a/gcc/stmt.c
+++ b/gcc/stmt.c
@@ -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;
+
+/* Return nonzero if anything is pushed on the loop, condition, or case
+ stack. */
+int
+in_control_zone_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;
+ return cond_stack || loop_stack || case_stack;
}
+/* Record the current file and line. Called from emit_line_note. */
void
-restore_stmt_status (p)
- struct function *p;
+set_file_and_line_for_stmt (file, line)
+ char *file;
+ int line;
{
- 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;
+ 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);
diff --git a/gcc/tree.h b/gcc/tree.h
index b16d73e..7047f1d 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -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));