(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
This commit is contained in:
Jason Merrill 1994-10-02 23:17:08 +00:00
parent e4a4639ef0
commit cafbaf85f5

View File

@ -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)
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)
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
saved.
CAUTION: This is in function_obstack of the containing function. So CAUTION: This is in function_obstack of the containing function.
we must be sure that we never allocate from that obstack during So 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 the compilation of a nested function if we expect it to survive
nested function's end. */ past the nested function's end. */
obstack_free (function_maybepermanent_obstack, maybepermanent_firstobj); obstack_free (function_maybepermanent_obstack, maybepermanent_firstobj);
}
obstack_free (function_obstack, 0); obstack_free (function_obstack, 0);
free (function_obstack); free (function_obstack);