diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5493f51623a602bacffeb42b5b90725dc6f2cc2a..a71ab6e5595bf98789209a609e012e0d4d74ebb0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/calls.c b/gcc/calls.c index b1807584d92c34396f3c874b8ce5ccbb7884580e..b41158e1356c1a53de9764e68e9867ca328958c6 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -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; }