Commit cafbaf85 by Jason Merrill

(save_tree_status): Add argument to indicate that the new function is not a nested function.

(save_tree_status): Add argument to indicate that the new
        function is not a nested function.
        (restore_tree_status): Ditto.

From-SVN: r8206
parent e4a4639e
...@@ -319,8 +319,9 @@ gcc_obstack_init (obstack) ...@@ -319,8 +319,9 @@ gcc_obstack_init (obstack)
This is used before starting a nested function. */ This is used before starting a nested function. */
void void
save_tree_status (p) save_tree_status (p, toplevel)
struct function *p; struct function *p;
int toplevel;
{ {
p->all_types_permanent = all_types_permanent; p->all_types_permanent = all_types_permanent;
p->momentary_stack = momentary_stack; p->momentary_stack = momentary_stack;
...@@ -334,10 +335,15 @@ save_tree_status (p) ...@@ -334,10 +335,15 @@ save_tree_status (p)
p->saveable_obstack = saveable_obstack; p->saveable_obstack = saveable_obstack;
p->rtl_obstack = rtl_obstack; p->rtl_obstack = rtl_obstack;
/* Objects that need to be saved in this function can be in the nonsaved if (! toplevel)
obstack of the enclosing function since they can't possibly be needed {
once it has returned. */ /* Objects that need to be saved in this function can be in the nonsaved
function_maybepermanent_obstack = function_obstack; obstack of the enclosing function since they can't possibly be needed
once it has returned. */
function_maybepermanent_obstack = function_obstack;
maybepermanent_firstobj
= (char *) obstack_finish (function_maybepermanent_obstack);
}
function_obstack = (struct obstack *) xmalloc (sizeof (struct obstack)); function_obstack = (struct obstack *) xmalloc (sizeof (struct obstack));
gcc_obstack_init (function_obstack); gcc_obstack_init (function_obstack);
...@@ -348,30 +354,32 @@ save_tree_status (p) ...@@ -348,30 +354,32 @@ save_tree_status (p)
momentary_firstobj = (char *) obstack_finish (&momentary_obstack); momentary_firstobj = (char *) obstack_finish (&momentary_obstack);
momentary_function_firstobj = momentary_firstobj; momentary_function_firstobj = momentary_firstobj;
maybepermanent_firstobj
= (char *) obstack_finish (function_maybepermanent_obstack);
} }
/* Restore all variables describing the current status from the structure *P. /* Restore all variables describing the current status from the structure *P.
This is used after a nested function. */ This is used after a nested function. */
void void
restore_tree_status (p) restore_tree_status (p, toplevel)
struct function *p; struct function *p;
int toplevel;
{ {
all_types_permanent = p->all_types_permanent; all_types_permanent = p->all_types_permanent;
momentary_stack = p->momentary_stack; momentary_stack = p->momentary_stack;
obstack_free (&momentary_obstack, momentary_function_firstobj); obstack_free (&momentary_obstack, momentary_function_firstobj);
/* Free saveable storage used by the function just compiled and not if (! toplevel)
saved. {
/* Free saveable storage used by the function just compiled and not
CAUTION: This is in function_obstack of the containing function. So saved.
we must be sure that we never allocate from that obstack during
the compilation of a nested function if we expect it to survive past the CAUTION: This is in function_obstack of the containing function.
nested function's end. */ So we must be sure that we never allocate from that obstack during
obstack_free (function_maybepermanent_obstack, maybepermanent_firstobj); the compilation of a nested function if we expect it to survive
past the nested function's end. */
obstack_free (function_maybepermanent_obstack, maybepermanent_firstobj);
}
obstack_free (function_obstack, 0); obstack_free (function_obstack, 0);
free (function_obstack); free (function_obstack);
......
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