aboutsummaryrefslogtreecommitdiff
path: root/gcc/function.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/function.c')
-rw-r--r--gcc/function.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/gcc/function.c b/gcc/function.c
index 4ee042b..442b506 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -462,8 +462,8 @@ find_function_data (decl)
since this function knows only about language-independent variables. */
void
-push_function_context_to (toplevel)
- int toplevel;
+push_function_context_to (context)
+ tree context;
{
struct function *p = (struct function *) xmalloc (sizeof (struct function));
@@ -481,6 +481,7 @@ push_function_context_to (toplevel)
p->calls_alloca = current_function_calls_alloca;
p->has_nonlocal_label = current_function_has_nonlocal_label;
p->has_nonlocal_goto = current_function_has_nonlocal_goto;
+ p->contains_functions = current_function_contains_functions;
p->args_size = current_function_args_size;
p->pretend_args_size = current_function_pretend_args_size;
p->arg_offset_rtx = current_function_arg_offset_rtx;
@@ -514,7 +515,7 @@ push_function_context_to (toplevel)
p->fixup_var_refs_queue = 0;
p->epilogue_delay_list = current_function_epilogue_delay_list;
- save_tree_status (p, toplevel);
+ save_tree_status (p, context);
save_storage_status (p);
save_emit_status (p);
init_emit ();
@@ -529,15 +530,15 @@ push_function_context_to (toplevel)
void
push_function_context ()
{
- push_function_context_to (0);
+ push_function_context_to (current_function_decl);
}
/* Restore the last saved context, at the end of a nested function.
This function is called from language-specific code. */
void
-pop_function_context_from (toplevel)
- int toplevel;
+pop_function_context_from (context)
+ tree context;
{
struct function *p = outer_function_chain;
@@ -554,8 +555,9 @@ pop_function_context_from (toplevel)
current_function_calls_alloca = p->calls_alloca;
current_function_has_nonlocal_label = p->has_nonlocal_label;
current_function_has_nonlocal_goto = p->has_nonlocal_goto;
- if (! toplevel)
- current_function_contains_functions = 1;
+ current_function_contains_functions
+ = p->contains_functions || p->inline_obstacks
+ || context == current_function_decl;
current_function_args_size = p->args_size;
current_function_pretend_args_size = p->pretend_args_size;
current_function_arg_offset_rtx = p->arg_offset_rtx;
@@ -589,7 +591,7 @@ pop_function_context_from (toplevel)
current_function_epilogue_delay_list = p->epilogue_delay_list;
reg_renumber = 0;
- restore_tree_status (p, toplevel);
+ restore_tree_status (p);
restore_storage_status (p);
restore_expr_status (p);
restore_emit_status (p);
@@ -616,7 +618,7 @@ pop_function_context_from (toplevel)
void pop_function_context ()
{
- pop_function_context_from (0);
+ pop_function_context_from (current_function_decl);
}
/* Allocate fixed slots in the stack frame of the current function. */