diff options
author | Bernd Schmidt <bernds@cygnus.co.uk> | 1999-09-05 01:06:48 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 1999-09-05 01:06:48 +0000 |
commit | e2ecd91c7bff7cc5180c3bbd6dd1ff62b801350b (patch) | |
tree | 18e6552fb690c4b3e5efbd8f45b8ffa8e5ea1546 /gcc/emit-rtl.c | |
parent | 6308c57495b0a537146807560d60b8618e45e038 (diff) | |
download | gcc-e2ecd91c7bff7cc5180c3bbd6dd1ff62b801350b.zip gcc-e2ecd91c7bff7cc5180c3bbd6dd1ff62b801350b.tar.gz gcc-e2ecd91c7bff7cc5180c3bbd6dd1ff62b801350b.tar.bz2 |
c-decl.c (struct language_function): Renamed from struct c_function.
* c-decl.c (struct language_function): Renamed from struct c_function.
Delete elt NEXT.
(c_function_chain): Delete.
(push_c_function_context): New arg F. Don't warn about nested
functions here. Fill LANGUAGE elt of F. Delete code to update
c_function_chain. Don't call push_function_context.
(pop_c_function_context): New arg F. Restore from there instead of
from c_function_chain. Don't call pop_function_context. Clear out
LANGUAGE field of F when done.
* c-lang.c: Include "function.h"
(lang_init): Initialize save_lang_status and restore_lang_status.
* c-parse.in (nested_function, nested_function_notype): Warn about
nested functions. Call push_function_context/pop_function_context
instead of the _c_ variants.
* c-tree.h (push_c_function_context, pop_c_function_context): Update
prototype.
* Makefile.in (c-lang.o): Update dependencies.
* emit-rtl.c (init_emit): Use xmalloc to allocate regno_reg_rtx,
regno_pointer_flag, regno_pointer_align.
(gen_reg_rtx): Use xrealloc to enlarge them.
(free_emit_status): New function.
* function.c (mark_machine_status, mark_lang_status): New variables.
(assign_stack_local_1): Renamed from assign_outer_stack_local. Merge
in some bits from assign_stack_local. All callers changed to use new
name.
(assign_stack_local): Just call assign_stack_local_1.
(free_after_compilation): New function.
(put_reg_into_stack): Simplify to always call assign_stack_local_1.
(trampoline_address): Likewise.
(assign_parms): Use xcalloc/xrealloc to allocate parm_reg_stack_loc.
(prepare_function_start): Explicitly clear some more variables.
* function.h (struct function): New elt can_garbage_collect.
(mark_machine_status, mark_lang_status): Declare variables.
(free_after_compilation, free_emit_status, free_varasm_status,
init_varasm_status): Declare functions.
* toplev.c (rest_of_compilation): Call free_after_compilation when
done with the current function.
* varasm.c (free_varasm_status): New function.
From-SVN: r29117
Diffstat (limited to 'gcc/emit-rtl.c')
-rw-r--r-- | gcc/emit-rtl.c | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index c16ffe4..fd04427 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -502,18 +502,17 @@ gen_reg_rtx (mode) { int old_size = f->emit->regno_pointer_flag_length; rtx *new1; - char *new = (char *) savealloc (old_size * 2); - memcpy (new, f->emit->regno_pointer_flag, old_size); + char *new; + new = xrealloc (f->emit->regno_pointer_flag, old_size * 2); memset (new + old_size, 0, old_size); f->emit->regno_pointer_flag = new; - new = (char *) savealloc (old_size * 2); - memcpy (new, f->emit->regno_pointer_align, old_size); + new = xrealloc (f->emit->regno_pointer_align, old_size * 2); memset (new + old_size, 0, old_size); f->emit->regno_pointer_align = new; - new1 = (rtx *) savealloc (old_size * 2 * sizeof (rtx)); - memcpy (new1, regno_reg_rtx, old_size * sizeof (rtx)); + new1 = (rtx *) xrealloc (f->emit->x_regno_reg_rtx, + old_size * 2 * sizeof (rtx)); memset (new1 + old_size, 0, old_size * sizeof (rtx)); regno_reg_rtx = new1; @@ -1597,6 +1596,19 @@ restore_emit_status (p) last_label_num = 0; clear_emit_caches (); } + +/* Clear out all parts of our state in F that can safely be discarded + after the function has been compiled, to let garbage collection + reclaim the memory. */ +void +free_emit_status (f) + struct function *f; +{ + free (f->emit->x_regno_reg_rtx); + free (f->emit->regno_pointer_flag); + free (f->emit->regno_pointer_align); + f->emit->x_regno_reg_rtx = 0; +} /* Go through all the RTL insn bodies and copy any invalid shared structure. It does not work to do this twice, because the mark bits set here @@ -3404,15 +3416,15 @@ init_emit () f->emit->regno_pointer_flag_length = LAST_VIRTUAL_REGISTER + 101; f->emit->regno_pointer_flag - = (char *) savealloc (f->emit->regno_pointer_flag_length); + = (char *) xmalloc (f->emit->regno_pointer_flag_length); bzero (f->emit->regno_pointer_flag, f->emit->regno_pointer_flag_length); f->emit->regno_pointer_align - = (char *) savealloc (f->emit->regno_pointer_flag_length); + = (char *) xmalloc (f->emit->regno_pointer_flag_length); bzero (f->emit->regno_pointer_align, f->emit->regno_pointer_flag_length); regno_reg_rtx - = (rtx *) savealloc (f->emit->regno_pointer_flag_length * sizeof (rtx)); + = (rtx *) xmalloc (f->emit->regno_pointer_flag_length * sizeof (rtx)); bzero ((char *) regno_reg_rtx, f->emit->regno_pointer_flag_length * sizeof (rtx)); |