OSDN Git Service

* calls.c (store_unaligned_arguments_into_pseudos): Use xmalloc to
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 7 Jan 1999 11:29:38 +0000 (11:29 +0000)
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 7 Jan 1999 11:29:38 +0000 (11:29 +0000)
        allocate memory that will live beyond this function.
        (expand_call): Free it here.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@24561 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/calls.c

index 5493f51..a71ab6e 100644 (file)
@@ -1,3 +1,9 @@
+Thu Jan  7 11:26:17 1999  Mark Mitchell  <mark@markmitchell.com>
+
+       * calls.c (store_unaligned_arguments_into_pseudos): Use xmalloc to
+       allocate memory that will live beyond this function.
+       (expand_call): Free it here.
+
 Thu Jan  7 03:08:17 1999  Richard Henderson  <rth@cygnus.com>
 
        * sparc.h (PREFERRED_RELOAD_CLASS): Select GENERAL_REGS for 
index b180758..b41158e 100644 (file)
@@ -753,7 +753,12 @@ restore_fixed_argument_area (save_area, argblock, high_to_save, low_to_save)
 /* If any elements in ARGS refer to parameters that are to be passed in
    registers, but not in memory, and whose alignment does not permit a
    direct copy into registers.  Copy the values into a group of pseudos
-   which we will later copy into the appropriate hard registers.  */
+   which we will later copy into the appropriate hard registers. 
+
+   Pseudos for each unaligned argument will be stored into the array
+   args[argnum].aligned_regs.  The caller is responsible for deallocating
+   the aligned_regs array if it is nonzero.  */
+
 static void
 store_unaligned_arguments_into_pseudos (args, num_actuals)
      struct arg_data *args;
@@ -774,8 +779,8 @@ store_unaligned_arguments_into_pseudos (args, num_actuals)
          = args[i].partial ? args[i].partial
            : (bytes + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD;
 
-       args[i].aligned_regs = (rtx *) alloca (sizeof (rtx)
-                                              * args[i].n_aligned_regs);
+       args[i].aligned_regs = (rtx *) xmalloc (sizeof (rtx)
+                                               * args[i].n_aligned_regs);
 
        /* Structures smaller than a word are aligned to the least
           significant byte (to the right).  On a BYTES_BIG_ENDIAN machine,
@@ -2298,6 +2303,11 @@ expand_call (exp, target, ignore)
 
   pop_temp_slots ();
 
+  /* Free up storage we no longer need.  */
+  for (i = 0; i < num_actuals; ++i)
+    if (args[i].aligned_regs)
+      free (args[i].aligned_regs);
+
   return target;
 }
 \f