regclass.c (renumber, [...]): New static variables, moved out of allocate_reg_info.
authorBernd Schmidt <crux@pool.informatik.rwth-aachen.de>
Wed, 28 Oct 1998 10:22:48 +0000 (10:22 +0000)
committerJeff Law <law@gcc.gnu.org>
Wed, 28 Oct 1998 10:22:48 +0000 (03:22 -0700)
        * regclass.c (renumber, regno_allocated): New static variables, moved
        out of allocate_reg_info.
        (allocate_reg_info): Move these two variables outside the function.
        Move code to free memory into new function free_reg_info.
        (free_reg_info): New function, broken out of allocate_reg_info.
        * toplev.c (compile_file): Call free_reg_info, not allocate_reg_info.
        * rtl.h (allocate_reg_info): Don't declare.
        (free_reg_info): Declare.

From-SVN: r23397

gcc/ChangeLog
gcc/regclass.c
gcc/rtl.h
gcc/toplev.c

index f4dbd64..a84f212 100644 (file)
@@ -1,5 +1,14 @@
 Wed Oct 28 03:59:29 1998  Bernd Schmidt <crux@pool.informatik.rwth-aachen.de>
 
+       * regclass.c (renumber, regno_allocated): New static variables, moved
+       out of allocate_reg_info.
+       (allocate_reg_info): Move these two variables outside the function.
+       Move code to free memory into new function free_reg_info.
+       (free_reg_info): New function, broken out of allocate_reg_info.
+       * toplev.c (compile_file): Call free_reg_info, not allocate_reg_info.
+       * rtl.h (allocate_reg_info): Don't declare.
+       (free_reg_info): Declare.
+
        * final.c (cleanup_subreg_operands):  ASM_INPUTs need no treatment.
 
 Wed Oct 28 02:38:12 1998  Jason Merrill  <jason@yorick.cygnus.com>
index 5c23453..d9b6db6 100644 (file)
@@ -1827,6 +1827,9 @@ auto_inc_dec_reg_p (reg, mode)
 
 #endif /* REGISTER_CONSTRAINTS */
 \f
+static short *renumber = (short *)0;
+static size_t regno_allocated = 0;
+
 /* Allocate enough space to hold NUM_REGS registers for the tables used for
    reg_scan and flow_analysis that are indexed by the register number.  If
    NEW_P is non zero, initialize all of the registers, otherwise only
@@ -1840,38 +1843,12 @@ allocate_reg_info (num_regs, new_p, renumber_p)
      int new_p;
      int renumber_p;
 {
-  static size_t regno_allocated = 0;
-  static short *renumber = (short *)0;
   size_t size_info;
   size_t size_renumber;
   size_t min = (new_p) ? 0 : reg_n_max;
   struct reg_info_data *reg_data;
   struct reg_info_data *reg_next;
 
-  /* Free up all storage allocated */
-  if (num_regs < 0)
-    {
-      if (reg_n_info)
-       {
-         VARRAY_FREE (reg_n_info);
-         for (reg_data = reg_info_head; reg_data; reg_data = reg_next)
-           {
-             reg_next = reg_data->next;
-             free ((char *)reg_data);
-           }
-
-         free (prefclass_buffer);
-         free (altclass_buffer);
-         prefclass_buffer = (char *)0;
-         altclass_buffer = (char *)0;
-         reg_info_head = (struct reg_info_data *)0;
-         renumber = (short *)0;
-       }
-      regno_allocated = 0;
-      reg_n_max = 0;
-      return;
-    }
-
   if (num_regs > regno_allocated)
     {
       size_t old_allocated = regno_allocated;
@@ -1973,6 +1950,32 @@ allocate_reg_info (num_regs, new_p, renumber_p)
   MAX_REGNO_REG_SET (num_regs, new_p, renumber_p);
 }
 
+/* Free up the space allocated by allocate_reg_info.  */
+void
+free_reg_info ()
+{
+  if (reg_n_info)
+    {
+      struct reg_info_data *reg_data;
+      struct reg_info_data *reg_next;
+
+      VARRAY_FREE (reg_n_info);
+      for (reg_data = reg_info_head; reg_data; reg_data = reg_next)
+       {
+         reg_next = reg_data->next;
+         free ((char *)reg_data);
+       }
+
+      free (prefclass_buffer);
+      free (altclass_buffer);
+      prefclass_buffer = (char *)0;
+      altclass_buffer = (char *)0;
+      reg_info_head = (struct reg_info_data *)0;
+      renumber = (short *)0;
+    }
+  regno_allocated = 0;
+  reg_n_max = 0;
+}
 \f
 /* This is the `regscan' pass of the compiler, run just before cse
    and again just before loop.
index 0d7ffb7..0ca999e 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -1010,7 +1010,7 @@ extern rtx find_use_as_address            PROTO((rtx, rtx, HOST_WIDE_INT));
 extern int max_parallel;
 
 /* Free up register info memory.  */
-extern void allocate_reg_info          PROTO((size_t, int, int));
+extern void free_reg_info              PROTO((void));
 
 /* recog.c */
 extern int asm_noperands               PROTO((rtx));
index 64ef43e..197d280 100644 (file)
@@ -3067,6 +3067,7 @@ compile_file (name)
   ASM_FILE_END (asm_out_file);
 #endif
 
+
   /* Language-specific end of compilation actions.  */
  finish_syntax:
   lang_finish ();
@@ -3097,6 +3098,9 @@ compile_file (name)
       && (ferror (asm_out_file) != 0 || fclose (asm_out_file) != 0))
     fatal_io_error (asm_file_name);
 
+  /* Free up memory for the benefit of leak detectors.  */
+  free_reg_info ();
+
   /* Print the times.  */
 
   if (! quiet_flag)