aboutsummaryrefslogtreecommitdiff
path: root/gcc/emit-rtl.c
diff options
context:
space:
mode:
authorBernd Schmidt <bernds@cygnus.co.uk>1999-09-05 01:06:48 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>1999-09-05 01:06:48 +0000
commite2ecd91c7bff7cc5180c3bbd6dd1ff62b801350b (patch)
tree18e6552fb690c4b3e5efbd8f45b8ffa8e5ea1546 /gcc/emit-rtl.c
parent6308c57495b0a537146807560d60b8618e45e038 (diff)
downloadgcc-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.c30
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));