diff options
author | Jason Merrill <merrill@gnu.org> | 1994-10-02 23:17:08 +0000 |
---|---|---|
committer | Jason Merrill <merrill@gnu.org> | 1994-10-02 23:17:08 +0000 |
commit | cafbaf85f5da81f8c37b54c303601a75bd278001 (patch) | |
tree | dfc589efcea31f2454b0db210051ae4c18432951 /gcc/tree.c | |
parent | e4a4639ef018444349825504d79025ff56e68f32 (diff) | |
download | gcc-cafbaf85f5da81f8c37b54c303601a75bd278001.zip gcc-cafbaf85f5da81f8c37b54c303601a75bd278001.tar.gz gcc-cafbaf85f5da81f8c37b54c303601a75bd278001.tar.bz2 |
(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
Diffstat (limited to 'gcc/tree.c')
-rw-r--r-- | gcc/tree.c | 40 |
1 files changed, 24 insertions, 16 deletions
@@ -319,8 +319,9 @@ gcc_obstack_init (obstack) This is used before starting a nested function. */ void -save_tree_status (p) +save_tree_status (p, toplevel) struct function *p; + int toplevel; { p->all_types_permanent = all_types_permanent; p->momentary_stack = momentary_stack; @@ -334,10 +335,15 @@ save_tree_status (p) p->saveable_obstack = saveable_obstack; p->rtl_obstack = rtl_obstack; - /* Objects that need to be saved in this function can be in the nonsaved - obstack of the enclosing function since they can't possibly be needed - once it has returned. */ - function_maybepermanent_obstack = function_obstack; + if (! toplevel) + { + /* Objects that need to be saved in this function can be in the nonsaved + 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)); gcc_obstack_init (function_obstack); @@ -348,30 +354,32 @@ save_tree_status (p) momentary_firstobj = (char *) obstack_finish (&momentary_obstack); momentary_function_firstobj = momentary_firstobj; - maybepermanent_firstobj - = (char *) obstack_finish (function_maybepermanent_obstack); } /* Restore all variables describing the current status from the structure *P. This is used after a nested function. */ void -restore_tree_status (p) +restore_tree_status (p, toplevel) struct function *p; + int toplevel; { all_types_permanent = p->all_types_permanent; momentary_stack = p->momentary_stack; obstack_free (&momentary_obstack, momentary_function_firstobj); - /* Free saveable storage used by the function just compiled and not - saved. - - CAUTION: This is in function_obstack of the containing function. 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 - nested function's end. */ - obstack_free (function_maybepermanent_obstack, maybepermanent_firstobj); + if (! toplevel) + { + /* Free saveable storage used by the function just compiled and not + saved. + + CAUTION: This is in function_obstack of the containing function. + 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 nested function's end. */ + obstack_free (function_maybepermanent_obstack, maybepermanent_firstobj); + } obstack_free (function_obstack, 0); free (function_obstack); |