OSDN Git Service

* alpha.h (alpha_eh_epilogue_sp_ofs): Remove.
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 8 Sep 1999 05:00:54 +0000 (05:00 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 8 Sep 1999 05:00:54 +0000 (05:00 +0000)
        (struct machine_function): Declare; add eh_epilogue_sp_ofs.
        (INIT_EXPANDERS): Remove.
        * alpha.c: Include ggc.h.
        (alpha_eh_epilogue_sp_ofs, alpha_return_addr_rtx): Remove.
        (alpha_init_machine_status, alpha_mark_machine_status): New.
        (override_options): Install them.
        (struct machine_function): Moved to alpha.h.
        (alpha_save_machine_status, alpha_restore_machine_status): Remove.
        (alpha_init_expanders): Remove.
        (alpha_return_addr): Adjust to use current_function->machine.
        (alpha_ra_ever_killed): Likewise.
        (alpha_expand_epilogue): Likewise.
        * alpha.md (eh_epilogue): Likewise.

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

gcc/ChangeLog
gcc/config/alpha/alpha.c
gcc/config/alpha/alpha.h
gcc/config/alpha/alpha.md

index 15b8fbb..c5a8b17 100644 (file)
@@ -1,3 +1,20 @@
+Tue Sep  7 21:55:02 1999  Richard Henderson  <rth@cygnus.com>
+
+       * alpha.h (alpha_eh_epilogue_sp_ofs): Remove.
+       (struct machine_function): Declare; add eh_epilogue_sp_ofs.
+       (INIT_EXPANDERS): Remove.
+       * alpha.c: Include ggc.h.
+       (alpha_eh_epilogue_sp_ofs, alpha_return_addr_rtx): Remove.
+       (alpha_init_machine_status, alpha_mark_machine_status): New.
+       (override_options): Install them.
+       (struct machine_function): Moved to alpha.h.
+       (alpha_save_machine_status, alpha_restore_machine_status): Remove.
+       (alpha_init_expanders): Remove.
+       (alpha_return_addr): Adjust to use current_function->machine.
+       (alpha_ra_ever_killed): Likewise.
+       (alpha_expand_epilogue): Likewise.
+       * alpha.md (eh_epilogue): Likewise.
+
 Wed Sep  8 14:34:42 1999  Ian Piumarta  <piumarta@prof.inria.fr>
                          Melissa O'Neill  <oneill@cs.sfu.ca>
                          Geoffrey Keating  <geoffk@cygnus.com>
index e9da5db..37699ca 100644 (file)
@@ -40,6 +40,7 @@ Boston, MA 02111-1307, USA.  */
 #include "except.h"
 #include "function.h"
 #include "toplev.h"
+#include "ggc.h"
 
 /* External data.  */
 extern char *version_string;
@@ -79,19 +80,11 @@ const char *alpha_mlat_string;      /* -mmemory-latency= */
 rtx alpha_compare_op0, alpha_compare_op1;
 int alpha_compare_fp_p;
 
-/* Define the information needed to modify the epilogue for EH.  */
-
-rtx alpha_eh_epilogue_sp_ofs;
-
 /* Non-zero if inside of a function, because the Alpha asm can't
    handle .files inside of functions.  */
 
 static int inside_function = FALSE;
 
-/* If non-null, this rtx holds the return address for the function.  */
-
-static rtx alpha_return_addr_rtx;
-
 /* The number of cycles of latency we should assume on memory reads.  */
 
 int alpha_memory_latency = 3;
@@ -117,6 +110,10 @@ static void alpha_sa_mask
   PROTO((unsigned long *imaskP, unsigned long *fmaskP));
 static int alpha_does_function_need_gp
   PROTO((void));
+static void alpha_init_machine_status
+  PROTO((struct function *p));
+static void alpha_mark_machine_status
+  PROTO((struct function *p));
 
 
 /* Get the number of args of a function in one of two ways.  */
@@ -319,6 +316,10 @@ override_options ()
 
   /* Acquire a unique set number for our register saves and restores.  */
   alpha_sr_alias_set = new_alias_set ();
+
+  /* Set up function hooks.  */
+  init_machine_status = alpha_init_machine_status;
+  mark_machine_status = alpha_mark_machine_status;
 }
 \f
 /* Returns 1 if VALUE is a mask that contains full bytes of zero or ones.  */
@@ -2561,45 +2562,22 @@ alpha_adjust_cost (insn, link, dep_insn, cost)
 \f
 /* Functions to save and restore alpha_return_addr_rtx.  */
 
-struct machine_function
-{
-  rtx ra_rtx;
-};
-
 static void
-alpha_save_machine_status (p)
+alpha_init_machine_status (p)
      struct function *p;
 {
-  struct machine_function *machine =
-    (struct machine_function *) xmalloc (sizeof (struct machine_function));
-
-  p->machine = machine;
-  machine->ra_rtx = alpha_return_addr_rtx;
+  p->machine =
+    (struct machine_function *) xcalloc (1, sizeof (struct machine_function));
 }
 
 static void
-alpha_restore_machine_status (p)
+alpha_mark_machine_status (p)
      struct function *p;
 {
   struct machine_function *machine = p->machine;
 
-  alpha_return_addr_rtx = machine->ra_rtx;
-
-  free (machine);
-  p->machine = (struct machine_function *)0;
-}
-
-/* Do anything needed before RTL is emitted for each function.  */
-
-void
-alpha_init_expanders ()
-{
-  alpha_return_addr_rtx = NULL_RTX;
-  alpha_eh_epilogue_sp_ofs = NULL_RTX;
-
-  /* Arrange to save and restore machine status around nested functions.  */
-  save_machine_status = alpha_save_machine_status;
-  restore_machine_status = alpha_restore_machine_status;
+  ggc_mark_rtx (machine->eh_epilogue_sp_ofs);
+  ggc_mark_rtx (machine->ra_rtx);
 }
 
 /* Start the ball rolling with RETURN_ADDR_RTX.  */
@@ -2609,25 +2587,27 @@ alpha_return_addr (count, frame)
      int count;
      rtx frame ATTRIBUTE_UNUSED;
 {
-  rtx init;
+  rtx init, reg;
 
   if (count != 0)
     return const0_rtx;
 
-  if (alpha_return_addr_rtx)
-    return alpha_return_addr_rtx;
-
-  /* No rtx yet.  Invent one, and initialize it from $26 in the prologue.  */
-  alpha_return_addr_rtx = gen_reg_rtx (Pmode);
-  init = gen_rtx_SET (VOIDmode, alpha_return_addr_rtx,
-                     gen_rtx_REG (Pmode, REG_RA));
-
-  /* Emit the insn to the prologue with the other argument copies.  */
-  push_topmost_sequence ();
-  emit_insn_after (init, get_insns ());
-  pop_topmost_sequence ();
+  reg = current_function->machine->ra_rtx;
+  if (reg == NULL)
+    {
+      /* No rtx yet.  Invent one, and initialize it from $26 in
+        the prologue.  */
+      reg = gen_reg_rtx (Pmode);
+      current_function->machine->ra_rtx = reg;
+      init = gen_rtx_SET (VOIDmode, reg, gen_rtx_REG (Pmode, REG_RA));
+
+      /* Emit the insn to the prologue with the other argument copies.  */
+      push_topmost_sequence ();
+      emit_insn_after (init, get_insns ());
+      pop_topmost_sequence ();
+    }
 
-  return alpha_return_addr_rtx;
+  return reg;
 }
 
 static int
@@ -2639,7 +2619,7 @@ alpha_ra_ever_killed ()
   if (current_function_is_thunk)
     return 0;
 #endif
-  if (!alpha_return_addr_rtx)
+  if (!current_function->machine->ra_rtx)
     return regs_ever_live[REG_RA];
 
   push_topmost_sequence ();
@@ -3932,6 +3912,7 @@ alpha_expand_epilogue ()
   int fp_is_frame_pointer, fp_offset;
   rtx sa_reg, sa_reg_exp = NULL;
   rtx sp_adj1, sp_adj2, mem;
+  rtx eh_ofs;
   int i;
 
   sa_size = alpha_sa_size ();
@@ -3958,6 +3939,7 @@ alpha_expand_epilogue ()
   fp_is_frame_pointer = ((TARGET_OPEN_VMS && vms_is_stack_procedure)
                         || (!TARGET_OPEN_VMS && frame_pointer_needed));
 
+  eh_ofs = current_function->machine->eh_epilogue_sp_ofs;
   if (sa_size)
     {
       /* If we have a frame pointer, restore SP from it.  */
@@ -3988,7 +3970,7 @@ alpha_expand_epilogue ()
          
       /* Restore registers in order, excepting a true frame pointer. */
 
-      if (! alpha_eh_epilogue_sp_ofs)
+      if (! eh_ofs)
        {
          mem = gen_rtx_MEM (DImode, plus_constant(sa_reg, reg_offset));
          MEM_ALIAS_SET (mem) = alpha_sr_alias_set;
@@ -4021,16 +4003,15 @@ alpha_expand_epilogue ()
          }
     }
 
-  if (frame_size || alpha_eh_epilogue_sp_ofs)
+  if (frame_size || eh_ofs)
     {
       sp_adj1 = stack_pointer_rtx;
 
-      if (alpha_eh_epilogue_sp_ofs)
+      if (eh_ofs)
        {
          sp_adj1 = gen_rtx_REG (DImode, 23);
          emit_move_insn (sp_adj1,
-                         gen_rtx_PLUS (Pmode, stack_pointer_rtx,
-                                       alpha_eh_epilogue_sp_ofs));
+                         gen_rtx_PLUS (Pmode, stack_pointer_rtx, eh_ofs));
        }
 
       /* If the stack size is large, begin computation into a temporary
index 233dae9..a18ad5f 100644 (file)
@@ -1200,9 +1200,16 @@ extern struct rtx_def *alpha_emit_conditional_move ();
 extern struct rtx_def *alpha_compare_op0, *alpha_compare_op1;
 extern int alpha_compare_fp_p;
 
-/* Define the information needed to modify the epilogue for EH.  */
+/* Machine specific function data.  */
 
-extern struct rtx_def *alpha_eh_epilogue_sp_ofs;
+struct machine_function
+{
+  /* An offset to apply to the stack pointer when unwinding from EH.  */
+  struct rtx_def *eh_epilogue_sp_ofs;
+
+  /* If non-null, this rtx holds the return address for the function.  */
+  struct rtx_def *ra_rtx;
+};
 
 /* Make (or fake) .linkage entry for function call.
    IS_LOCAL is 0 if name is used in call, 1 if name is used in definition.  */
@@ -1327,12 +1334,6 @@ extern struct rtx_def *alpha_return_addr ();
 
 /* Before the prologue, RA lives in $26. */
 #define INCOMING_RETURN_ADDR_RTX  gen_rtx_REG (Pmode, 26)
-
-/* Initialize data used by insn expanders.  This is called from insn_emit,
-   once for every function before code is generated.  */
-
-#define INIT_EXPANDERS  alpha_init_expanders ()
-extern void alpha_init_expanders ();
 \f
 /* Addressing modes, and classification of registers for them.  */
 
index 6407b6c..456642f 100644 (file)
   "! TARGET_OPEN_VMS"
   "
 {
-  alpha_eh_epilogue_sp_ofs = operands[1];
+  current_function->machine->eh_epilogue_sp_ofs = operands[1];
   if (GET_CODE (operands[2]) != REG || REGNO (operands[2]) != 26)
     {
       rtx ra = gen_rtx_REG (Pmode, 26);