alpha.c (alpha_function_name): Delete.
authorRichard Henderson <rth@cygnus.com>
Thu, 25 Jun 1998 01:09:06 +0000 (18:09 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Thu, 25 Jun 1998 01:09:06 +0000 (18:09 -0700)
        * alpha.c (alpha_function_name): Delete.
        (alpha_ra_ever_killed): Notice current_function_is_thunk.
        (alpha_sa_mask, alpha_sa_size, alpha_does_function_need_gp): Likewise.
        (alpha_start_function): Reorg from output_prologue.
        (alpha_end_function): Reorg from output_epilogue.
        * alpha.h (ASM_DECLARE_FUNCTION_NAME): Call alpha_start_function.
        (ASM_DECLARE_FUNCTION_SIZE): New.
        (FUNCTION_PROLOGUE, FUNCTION_EPILOGUE): Delete.
        (PROFILE_BEFORE_PROLOGUE): Set.
        (ASM_OUTPUT_MI_THUNK): Remove bits now output by start/end_function.
        * alpha/win-nt.h (ASM_OUTPUT_MI_THUNK): Likewise.

From-SVN: r20709

gcc/ChangeLog
gcc/config/alpha/alpha.c
gcc/config/alpha/alpha.h
gcc/config/alpha/win-nt.h

index 8c01484ece08e4c54fb1f8bb86884f35641a915b..6918eb95575f883b3db9ff2bd91aa58b3bf5fe49 100644 (file)
@@ -1,3 +1,17 @@
+Thu Jun 25 01:00:48 1998  Richard Henderson  <rth@cygnus.com>
+
+       * alpha.c (alpha_function_name): Delete.
+       (alpha_ra_ever_killed): Notice current_function_is_thunk.
+       (alpha_sa_mask, alpha_sa_size, alpha_does_function_need_gp): Likewise.
+       (alpha_start_function): Reorg from output_prologue.
+       (alpha_end_function): Reorg from output_epilogue.
+       * alpha.h (ASM_DECLARE_FUNCTION_NAME): Call alpha_start_function.
+       (ASM_DECLARE_FUNCTION_SIZE): New.
+       (FUNCTION_PROLOGUE, FUNCTION_EPILOGUE): Delete.
+       (PROFILE_BEFORE_PROLOGUE): Set.
+       (ASM_OUTPUT_MI_THUNK): Remove bits now output by start/end_function.
+       * alpha/win-nt.h (ASM_OUTPUT_MI_THUNK): Likewise.
+
 Thu Jun 25 01:18:47 1998  John Wehle  (john@feith.com)
 
        * i386/freebsd-elf.h (ASM_OUTPUT_MAX_SKIP_ALIGN): Define.
index 172bf69b15c2c516e160ccb212f8a6f974f1c4c3..f04e06509d329bdfbd7e8230aa4b854823a80ab3 100644 (file)
@@ -79,11 +79,6 @@ char *alpha_mlat_string;     /* -mmemory-latency= */
 rtx alpha_compare_op0, alpha_compare_op1;
 int alpha_compare_fp_p;
 
-/* Save the name of the current function as used by the assembler.  This
-   is used by the epilogue.  */
-
-char *alpha_function_name;
-
 /* Non-zero if inside of a function, because the Alpha asm can't
    handle .files inside of functions.  */
 
@@ -2459,6 +2454,10 @@ alpha_return_addr (count, frame)
 static int
 alpha_ra_ever_killed ()
 {
+#ifdef ASM_OUTPUT_MI_THUNK
+  if (current_function_is_thunk)
+    return 0;
+#endif
   if (!alpha_return_addr_rtx)
     return regs_ever_live[REG_RA];
 
@@ -2930,7 +2929,7 @@ static int vms_save_fp_regno;
 /* Register number used to reference objects off our PV.  */
 static int vms_base_regno;
 
-/*  Compute register masks for saved registers.  */
+/* Compute register masks for saved registers.  */
 
 static void
 alpha_sa_mask (imaskP, fmaskP)
@@ -2941,28 +2940,30 @@ alpha_sa_mask (imaskP, fmaskP)
   unsigned long fmask = 0;
   int i;
 
-  if (TARGET_OPEN_VMS && vms_is_stack_procedure)
-    imask |= (1L << HARD_FRAME_POINTER_REGNUM);
-
-  /* One for every register we have to save.  */
+#ifdef ASM_OUTPUT_MI_THUNK
+  if (!current_function_is_thunk)
+#endif
+    {
+      if (TARGET_OPEN_VMS && vms_is_stack_procedure)
+       imask |= (1L << HARD_FRAME_POINTER_REGNUM);
 
-  for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
-    if (! fixed_regs[i] && ! call_used_regs[i]
-       && regs_ever_live[i] && i != REG_RA)
-      {
-       if (i < 32)
-         imask |= (1L << i);
-       else
-         fmask |= (1L << (i - 32));
-      }
+      /* One for every register we have to save.  */
+      for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
+       if (! fixed_regs[i] && ! call_used_regs[i]
+           && regs_ever_live[i] && i != REG_RA)
+         {
+           if (i < 32)
+             imask |= (1L << i);
+           else
+             fmask |= (1L << (i - 32));
+         }
 
-  if (imask || fmask || alpha_ra_ever_killed ())
-    imask |= (1L << REG_RA);
+      if (imask || fmask || alpha_ra_ever_killed ())
+       imask |= (1L << REG_RA);
+    }
 
   *imaskP = imask;
   *fmaskP = fmask;
-
-  return;
 }
 
 int
@@ -2971,12 +2972,18 @@ alpha_sa_size ()
   int sa_size = 0;
   int i;
 
-  /* One for every register we have to save.  */
-
-  for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
-    if (! fixed_regs[i] && ! call_used_regs[i]
-       && regs_ever_live[i] && i != REG_RA)
-      sa_size++;
+#ifdef ASM_OUTPUT_MI_THUNK
+  if (current_function_is_thunk)
+    sa_size = 0;
+  else
+#endif
+    {
+      /* One for every register we have to save.  */
+      for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
+       if (! fixed_regs[i] && ! call_used_regs[i]
+           && regs_ever_live[i] && i != REG_RA)
+         sa_size++;
+    }
 
   if (TARGET_OPEN_VMS)
     {
@@ -3070,6 +3077,11 @@ alpha_does_function_need_gp ()
     return 1;
 #endif
 
+#ifdef ASM_OUTPUT_MI_THUNK
+  if (current_function_is_thunk)
+    return 1;
+#endif
+
   /* If we need a GP (we have a LDSYM insn or a CALL_INSN), load it first. 
      Even if we are a static function, we still need to do this in case
      our address is taken and passed to something like qsort.  */
@@ -3328,12 +3340,13 @@ alpha_expand_prologue ()
     emit_insn (gen_blockage ());
 }
 
-/* Output the rest of the textual info surrounding the prologue.  */
+/* Output the textual info surrounding the prologue.  */
 
 void
-output_prologue (file, size)
+alpha_start_function (file, fnname, decl)
      FILE *file;
-     HOST_WIDE_INT size;
+     char *fnname;
+     tree decl;
 {
   unsigned long imask = 0;
   unsigned long fmask = 0;
@@ -3343,7 +3356,7 @@ output_prologue (file, size)
   HOST_WIDE_INT frame_size;
   /* Offset from base reg to register save area.  */
   HOST_WIDE_INT reg_offset;
-  char *entry_label = (char *) alloca (strlen (alpha_function_name) + 6);
+  char *entry_label = (char *) alloca (strlen (fnname) + 6);
   int i;
 
   sa_size = alpha_sa_size ();
@@ -3388,11 +3401,11 @@ output_prologue (file, size)
   if (TARGET_OPEN_VMS || !flag_inhibit_size_directive)
     {
       fputs ("\t.ent ", file);
-      assemble_name (file, alpha_function_name);
+      assemble_name (file, fnname);
       putc ('\n', file);
     }
 
-  strcpy (entry_label, alpha_function_name);
+  strcpy (entry_label, fnname);
   if (TARGET_OPEN_VMS)
     strcat (entry_label, "..en");
   ASM_OUTPUT_LABEL (file, entry_label);
@@ -3482,7 +3495,7 @@ output_prologue (file, size)
        fputs ("\tldgp $29,0($27)\n", file);
 
       putc ('$', file);
-      assemble_name (file, alpha_function_name);
+      assemble_name (file, fnname);
       fputs ("..ng:\n", file);
     }
 
@@ -3491,21 +3504,21 @@ output_prologue (file, size)
      available then.  */
   readonly_section ();
   fprintf (file, "\t.align 3\n");
-  assemble_name (file, alpha_function_name); fputs ("..na:\n", file);
+  assemble_name (file, fnname); fputs ("..na:\n", file);
   fputs ("\t.ascii \"", file);
-  assemble_name (file, alpha_function_name);
+  assemble_name (file, fnname);
   fputs ("\\0\"\n", file);
       
   link_section ();
   fprintf (file, "\t.align 3\n");
   fputs ("\t.name ", file);
-  assemble_name (file, alpha_function_name);
+  assemble_name (file, fnname);
   fputs ("..na\n", file);
-  ASM_OUTPUT_LABEL (file, alpha_function_name);
+  ASM_OUTPUT_LABEL (file, fnname);
   fprintf (file, "\t.pdesc ");
-  assemble_name (file, alpha_function_name);
+  assemble_name (file, fnname);
   fprintf (file, "..en,%s\n", vms_is_stack_procedure ? "stack" : "reg");
-  alpha_need_linkage (alpha_function_name, 1);
+  alpha_need_linkage (fnname, 1);
   text_section ();
 #endif
 }
@@ -3709,15 +3722,16 @@ alpha_expand_epilogue ()
 /* Output the rest of the textual info surrounding the epilogue.  */
 
 void
-output_epilogue (file, size)
+alpha_end_function (file, fnname, decl)
      FILE *file;
-     int size;
+     char *fnname;
+     tree decl;
 {
   /* End the function.  */
   if (!flag_inhibit_size_directive)
     {
       fputs ("\t.end ", file);
-      assemble_name (file, alpha_function_name);
+      assemble_name (file, fnname);
       putc ('\n', file);
     }
   inside_function = FALSE;
index f81efdfec7bb5f6cbc49d86b6b9be40f3da99529..da129637cff05fb95f5a51443c1162172d2cddfc 100644 (file)
@@ -1090,7 +1090,6 @@ extern struct rtx_def *alpha_compare_op0, *alpha_compare_op1;
 extern int alpha_compare_fp_p;
 
 /* 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.  */
 extern void alpha_need_linkage ();
 
@@ -1098,30 +1097,26 @@ extern void alpha_need_linkage ();
 
 #define ASM_COMMENT_START " #"
 
-/* This macro produces the initial definition of a function name.  On the
-   Alpha, we need to save the function name for the prologue and epilogue.  */
-
-extern char *alpha_function_name;
+/* This macro produces the initial definition of a function.  */
 
-#define ASM_DECLARE_FUNCTION_NAME(FILE,NAME,DECL)      \
-{                                                      \
-   alpha_function_name = NAME;                         \
-}
-   
-/* This macro generates the assembly code for function entry.
-   FILE is a stdio stream to output the code to.
-   SIZE is an int: how many units of temporary storage to allocate.
-   Refer to the array `regs_ever_live' to determine which registers
-   to save; `regs_ever_live[I]' is nonzero if register number I
-   is ever used in the function.  This macro is responsible for
-   knowing which registers should not be saved even if used.  */
+#define ASM_DECLARE_FUNCTION_NAME(FILE,NAME,DECL) \
+  alpha_start_function(FILE,NAME,DECL);
+extern void alpha_start_function ();
 
-#define FUNCTION_PROLOGUE(FILE, SIZE)  output_prologue (FILE, SIZE)
+/* This macro closes up a function definition for the assembler.  */
 
+#define ASM_DECLARE_FUNCTION_SIZE(FILE,NAME,DECL) \
+  alpha_end_function(FILE,NAME,DECL)
+extern void alpha_end_function ();
+   
 /* This macro notes the end of the prologue.  */
 
 #define FUNCTION_END_PROLOGUE(FILE)  output_end_prologue (FILE)
 
+/* Output any profiling code before the prologue.  */
+
+#define PROFILE_BEFORE_PROLOGUE 1
+
 /* Output assembler code to FILE to increment profiler label # LABELNO
    for profiling a function entry.  Under OSF/1, profiling is enabled
    by simply passing -pg to the assembler and linker.  */
@@ -1170,19 +1165,6 @@ extern char *alpha_function_name;
    No definition is equivalent to always zero.  */
 
 #define EXIT_IGNORE_STACK 1
-
-/* This macro generates the assembly code for function exit,
-   on machines that need it.  If FUNCTION_EPILOGUE is not defined
-   then individual return instructions are generated for each
-   return statement.  Args are same as for FUNCTION_PROLOGUE.
-
-   The function epilogue should not depend on the current stack pointer!
-   It should use the frame pointer only.  This is mandatory because
-   of alloca; we also take advantage of it to omit stack adjustments
-   before returning.  */
-
-#define FUNCTION_EPILOGUE(FILE, SIZE)  output_epilogue (FILE, SIZE)
-
 \f
 /* Output assembler code for a block containing the constant parts
    of a trampoline, leaving space for the variable parts.
@@ -2124,16 +2106,8 @@ literal_section ()                                               \
 do {                                                                   \
   char *fn_name = XSTR (XEXP (DECL_RTL (FUNCTION), 0), 0);             \
                                                                        \
-  fprintf (FILE, "\t.ent ");                                           \
-  assemble_name (FILE, alpha_function_name);                           \
-  fputc ('\n', FILE);                                                  \
-  ASM_OUTPUT_LABEL (FILE, alpha_function_name);                                \
-  fprintf (FILE, "\tldgp $29,0($27)\n");                               \
-  fputc ('$', FILE);                                                   \
-  assemble_name (FILE, alpha_function_name);                           \
-  fprintf (FILE, "..ng:\n");                                           \
-  fprintf (FILE, "\t.frame $30,0,$26,0\n");                            \
-  fprintf (FILE, "\t.prologue 1\n");                                   \
+  /* Mark end of prologue.  */                                         \
+  output_end_prologue (FILE);                                          \
                                                                        \
   /* Rely on the assembler to macro expand a large delta.  */          \
   fprintf (FILE, "\tlda $16,%ld($16)\n", (long)(DELTA));               \
@@ -2146,18 +2120,11 @@ do {                                                                    \
     }                                                                  \
   else                                                                 \
     {                                                                  \
-      fprintf (FILE, "\tlda $27,");                                    \
-      assemble_name (FILE, fn_name);                                   \
-      fprintf (FILE, "\n\tjmp $31,($27),");                            \
+      fprintf (FILE, "\tjmp $31,");                                    \
       assemble_name (FILE, fn_name);                                   \
       fputc ('\n', FILE);                                              \
     }                                                                  \
-                                                                       \
-  fprintf (FILE, "\t.end ");                                           \
-  assemble_name (FILE, alpha_function_name);                           \
-  fputc ('\n', FILE);                                                  \
 } while (0)
-
 \f
 /* Define results of standard character escape sequences.  */
 #define TARGET_BELL 007
index ca35925c0585a377e0f2c5fc884183840e00d07f..0f57cf327a2ab86473000eb4fc1c061113945c24 100644 (file)
@@ -136,36 +136,20 @@ Boston, MA 02111-1307, USA.  */
 /* Output code to add DELTA to the first argument, and then jump to FUNCTION.
    Used for C++ multiple inheritance.  */
 
-#undef ASM_OUTPUT_MI_THUNK
 #define ASM_OUTPUT_MI_THUNK(FILE, THUNK_FNDECL, DELTA, FUNCTION)       \
 do {                                                                   \
-  char *fn_name = XSTR (XEXP (DECL_RTL (FUNCTION), 0), 0);             \
+  char *op, *fn_name = XSTR (XEXP (DECL_RTL (FUNCTION), 0), 0);                \
                                                                        \
-  fprintf (FILE, "\t.ent ");                                           \
-  assemble_name (FILE, alpha_function_name);                           \
-  fputc ('\n', FILE);                                                  \
-  ASM_OUTPUT_LABEL (FILE, alpha_function_name);                                \
-  fprintf (FILE, "\t.frame $30,0,$26,0\n");                            \
-  fprintf (FILE, "\t.prologue 1\n");                                   \
+  /* Mark end of prologue.  */                                         \
+  output_end_prologue (FILE);                                          \
                                                                        \
   /* Rely on the assembler to macro expand a large delta.  */          \
   fprintf (FILE, "\tlda $16,%ld($16)\n", (long)(DELTA));               \
                                                                        \
+  op = "jsr";                                                          \
   if (current_file_function_operand (XEXP (DECL_RTL (FUNCTION), 0)))   \
-    {                                                                  \
-      fprintf (FILE, "\tbr $31,");                                     \
-      assemble_name (FILE, fn_name);                                   \
-      fputc ('\n', FILE);                                              \
-    }                                                                  \
-  else                                                                 \
-    {                                                                  \
-      fprintf (FILE, "\tjmp $31,");                                    \
-      assemble_name (FILE, fn_name);                                   \
-      fputc ('\n', FILE);                                              \
-    }                                                                  \
-                                                                       \
-  fprintf (FILE, "\t.end ");                                           \
-  assemble_name (FILE, alpha_function_name);                           \
+    op = "br";                                                         \
+  fprintf (FILE, "\t%s $31,", op);                                     \
+  assemble_name (FILE, fn_name);                                       \
   fputc ('\n', FILE);                                                  \
 } while (0)
-