i386.c (asm_output_function_prefix): Remove.
authorRichard Henderson <rth@redhat.com>
Mon, 15 Jan 2001 23:43:10 +0000 (15:43 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Mon, 15 Jan 2001 23:43:10 +0000 (15:43 -0800)
        * config/i386/i386.c (asm_output_function_prefix): Remove.
        (ix86_asm_file_end): New.
        (load_pic_register): Generate pic_label_name into a
        staticly allocated buffer.
        * config/i386/i386-protos.h: Update.
        * config/i386/i386.h (ASM_OUTPUT_FUNCTION_PREFIX): Remove.
        (ASM_FILE_END): New.
        * config/i386/i386afe.h: New file.
        * config.gcc (i?86-*-elf) [tm_file]: Use it.
        (i?86-*-{freebsd,linux*,moss*}): Likewise.
        * config/elfos.h (ASM_FILE_END): Undef before redefinition.
        * config/i386/cygwin.h (ASM_FILE_END): Likewise.
        * config/i386/osfrose.h (ASM_FILE_END): Invoke ix86_asm_file_end.
        * config/i386/sco5.h (ASM_FILE_END): Likewise.
        * config/i386/winnt.c (i386_pe_asm_file_end): Likewise.

From-SVN: r39055

gcc/ChangeLog
gcc/config.gcc
gcc/config/elfos.h
gcc/config/i386/cygwin.h
gcc/config/i386/i386-protos.h
gcc/config/i386/i386.c
gcc/config/i386/i386.h
gcc/config/i386/i386afe.h [new file with mode: 0644]
gcc/config/i386/osfrose.h
gcc/config/i386/sco5.h
gcc/config/i386/winnt.c

index 78103dc7f0e7f8ded92afe1b6eab727781a412f9..53c06b713276cef7b2db2b1d8b169e6a61cd2468 100644 (file)
@@ -1,3 +1,21 @@
+2001-01-15  Richard Henderson  <rth@redhat.com>
+
+       * config/i386/i386.c (asm_output_function_prefix): Remove.
+       (ix86_asm_file_end): New.
+       (load_pic_register): Generate pic_label_name into a
+       staticly allocated buffer.
+       * config/i386/i386-protos.h: Update.
+       * config/i386/i386.h (ASM_OUTPUT_FUNCTION_PREFIX): Remove.
+       (ASM_FILE_END): New.
+       * config/i386/i386afe.h: New file.
+       * config.gcc (i?86-*-elf) [tm_file]: Use it.
+       (i?86-*-{freebsd,linux*,moss*}): Likewise.
+       * config/elfos.h (ASM_FILE_END): Undef before redefinition.
+       * config/i386/cygwin.h (ASM_FILE_END): Likewise.
+       * config/i386/osfrose.h (ASM_FILE_END): Invoke ix86_asm_file_end.
+       * config/i386/sco5.h (ASM_FILE_END): Likewise.
+       * config/i386/winnt.c (i386_pe_asm_file_end): Likewise.
+
 2001-01-15  Joseph S. Myers  <jsm28@cam.ac.uk>
 
        * Makefile.in (install-man): Remove explicit dependency on
index 1408777be0afc4d4999a9e446b2d6653f8f9e812..c28dd6a88da8e92554cf02a074ed5373216336cc 100644 (file)
@@ -979,7 +979,7 @@ i370-*-linux*)
        ;;
 i[34567]86-*-elf*)
        xm_file="${xm_file} xm-svr4.h i386/xm-sysv4.h"
-       tm_file="i386/i386.h i386/att.h elfos.h i386/i386elf.h"
+       tm_file="i386/i386.h i386/att.h elfos.h i386/i386afe.h i386/i386elf.h"
        tmake_file=i386/t-i386elf
        xmake_file=x-svr4
        ;;
@@ -1095,7 +1095,7 @@ i[34567]86-*-freebsd[12] | i[34567]86-*-freebsd[12].* | i[34567]86-*-freebsd*aou
        tmake_file=t-freebsd
        ;;
 i[34567]86-*-freebsd*)
-       tm_file="i386/i386.h i386/att.h svr4.h freebsd.h i386/freebsd.h i386/perform.h"
+       tm_file="i386/i386.h i386/att.h svr4.h freebsd.h i386/i386afe.h i386/freebsd.h i386/perform.h"
        extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
        tmake_file=t-freebsd
        gas=yes
@@ -1166,7 +1166,7 @@ i[34567]86-*-linux*libc1) # Intel 80386's running GNU/Linux
                                # with ELF format using the
                                # GNU/Linux C library 5
        xmake_file=x-linux      
-       tm_file="i386/i386.h i386/att.h linux.h i386/linux.h"
+       tm_file="i386/i386.h i386/att.h linux.h i386/i386afe.h i386/linux.h"
        tmake_file="t-linux t-linux-gnulibc1 i386/t-crtstuff"
        extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
        gnu_ld=yes
@@ -1179,7 +1179,7 @@ i[34567]86-*-linux*)      # Intel 80386's running GNU/Linux
                        # with ELF format using glibc 2
                        # aka GNU/Linux C library 6
        xmake_file=x-linux
-       tm_file="i386/i386.h i386/att.h linux.h i386/linux.h"
+       tm_file="i386/i386.h i386/att.h linux.h i386/i386afe.h i386/linux.h"
        tmake_file="t-linux i386/t-crtstuff"
        extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
        gnu_ld=yes
@@ -1210,7 +1210,7 @@ i[34567]86-pc-msdosdjgpp*)
        esac
        ;;
 i[34567]86-moss-msdos* | i[34567]86-*-moss*)
-       tm_file="i386/i386.h i386/att.h linux.h i386/linux.h i386/moss.h"
+       tm_file="i386/i386.h i386/att.h linux.h i386/i386afe.h i386/linux.h i386/moss.h"
        tmake_file=t-libc-ok
        gnu_ld=yes
        gas=yes
index 9925ff5cf330a50a57865194f89bfce31609b671..27ee2f24df6a341a385af555698b6e7a50312530 100644 (file)
@@ -100,6 +100,7 @@ Boston, MA 02111-1307, USA.  */
 
 #define IDENT_ASM_OP "\t.ident\t"
 
+#undef ASM_FILE_END
 #define ASM_FILE_END(FILE)                             \
   do                                                   \
     {                                                  \
index fc6cfe3ed83629ae9f366aa6c8509e2b64ecf6c1..b29c66c2e7974f8738814e14ee9eec73bd940815 100644 (file)
@@ -498,6 +498,7 @@ do {                                                                        \
   asm_output_aligned_bss ((FILE), (DECL), (NAME), (SIZE), (ALIGN))
 
 /* Output function declarations at the end of the file.  */
+#undef ASM_FILE_END
 #define ASM_FILE_END(FILE) \
   i386_pe_asm_file_end (FILE)
 
index cd44c4b3cbda93cb0108886a9f260819e85d0ef8..e9cb3a88f9757cafff788ca679d275bfeb61372e 100644 (file)
@@ -26,7 +26,7 @@ extern void optimization_options PARAMS ((int, int));
 
 extern int ix86_can_use_return_insn_p PARAMS ((void));
 
-extern void asm_output_function_prefix PARAMS ((FILE *, const char *));
+extern void ix86_asm_file_end PARAMS ((FILE *));
 extern void load_pic_register PARAMS ((void));
 extern HOST_WIDE_INT ix86_initial_elimination_offset PARAMS((int, int));
 extern void ix86_expand_prologue PARAMS ((void));
index db32bda680767cb723634b4dfb1d9acd6682d599..d73c2c584484a2d161a41f3fb411c593c5926538 100644 (file)
@@ -1689,44 +1689,53 @@ ix86_can_use_return_insn_p ()
   return tsize == 0 && nregs == 0;
 }
 \f
-static const char *pic_label_name;
-static int pic_label_output;
+static char pic_label_name[32];
 
 /* This function generates code for -fpic that loads %ebx with
    the return address of the caller and then returns.  */
 
 void
-asm_output_function_prefix (file, name)
+ix86_asm_file_end (file)
      FILE *file;
-     const char *name ATTRIBUTE_UNUSED;
 {
   rtx xops[2];
-  int pic_reg_used = flag_pic && (current_function_uses_pic_offset_table
-                                 || current_function_uses_const_pool);
-  xops[0] = pic_offset_table_rtx;
-  xops[1] = stack_pointer_rtx;
 
-  /* Deep branch prediction favors having a return for every call.  */
-  if (pic_reg_used && TARGET_DEEP_BRANCH_PREDICTION)
-    {
-      if (!pic_label_output)
-       {
-         /* This used to call ASM_DECLARE_FUNCTION_NAME() but since it's an
-            internal (non-global) label that's being emitted, it didn't make
-            sense to have .type information for local labels.   This caused
-            the SCO OpenServer 5.0.4 ELF assembler grief (why are you giving
-            me debug info for a label that you're declaring non-global?) this
-            was changed to call ASM_OUTPUT_LABEL() instead.  */
+  if (! TARGET_DEEP_BRANCH_PREDICTION || pic_label_name[0] == 0)
+    return;
+
+#ifdef ASM_OUTPUT_SECTION_NAME
+  /* The trick here is to create a linkonce section containing the
+     pic label thunk, but to refer to it with an internal label.
+     Because the label is internal, we don't have inter-dso name
+     binding issues on hosts that don't support ".hidden".
+
+     In order to use these macros, however, we must create a fake
+     function decl.  */
+  {
+    tree decl = build_decl (FUNCTION_DECL,
+                           get_identifier ("i686.get_pc_thunk"),
+                           error_mark_node);
+    DECL_ONE_ONLY (decl) = 1;
+    UNIQUE_SECTION (decl, 0);
+    named_section (decl, NULL, 0);
+  }
+#else
+  text_section ();
+#endif
 
-         ASM_OUTPUT_LABEL (file, pic_label_name);
+  /* This used to call ASM_DECLARE_FUNCTION_NAME() but since it's an
+     internal (non-global) label that's being emitted, it didn't make
+     sense to have .type information for local labels.   This caused
+     the SCO OpenServer 5.0.4 ELF assembler grief (why are you giving
+     me debug info for a label that you're declaring non-global?) this
+     was changed to call ASM_OUTPUT_LABEL() instead.  */
 
-         xops[1] = gen_rtx_MEM (SImode, xops[1]);
-         output_asm_insn ("mov{l}\t{%1, %0|%0, %1}", xops);
-         output_asm_insn ("ret", xops);
+  ASM_OUTPUT_LABEL (file, pic_label_name);
 
-         pic_label_output = 1;
-       }
-    }
+  xops[0] = pic_offset_table_rtx;
+  xops[1] = gen_rtx_MEM (SImode, stack_pointer_rtx);
+  output_asm_insn ("mov{l}\t{%1, %0|%0, %1}", xops);
+  output_asm_insn ("ret", xops);
 }
 
 void
@@ -1738,12 +1747,8 @@ load_pic_register ()
 
   if (TARGET_DEEP_BRANCH_PREDICTION)
     {
-      if (pic_label_name == NULL)
-       {
-         char buf[32];
-         ASM_GENERATE_INTERNAL_LABEL (buf, "LPR", 0);
-         pic_label_name = ggc_strdup (buf);
-       }
+      if (! pic_label_name[0])
+       ASM_GENERATE_INTERNAL_LABEL (pic_label_name, "LPR", 0);
       pclab = gen_rtx_MEM (QImode, gen_rtx_SYMBOL_REF (Pmode, pic_label_name));
     }
   else
@@ -1951,8 +1956,8 @@ ix86_emit_save_regs ()
 void
 ix86_expand_prologue ()
 {
-  HOST_WIDE_INT tsize = ix86_compute_frame_size (get_frame_size (), (int *) 0, (int *) 0,
-                                                (int *) 0);
+  HOST_WIDE_INT tsize = ix86_compute_frame_size (get_frame_size (), (int *) 0,
+                                                (int *) 0, (int *) 0);
   rtx insn;
   int pic_reg_used = flag_pic && (current_function_uses_pic_offset_table
                                  || current_function_uses_const_pool);
index 938de27a375bea859fcd96a00cacbc437c3000d8..4845e392e0cb9a1f12939b8a6bbb321d9c895acd 100644 (file)
@@ -1356,13 +1356,11 @@ typedef struct ix86_args {
        || ! FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (TREE_TYPE (DECL)))) \
        || FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (TREE_TYPE (cfun->decl))))))
 
-/* This macro is invoked just before the start of a function.
-   It is used here to output code for -fpic that will load the
-   return address into %ebx.  */
+/* This macro is invoked at the end of compilation.  It is used here to
+   output code for -fpic that will load the return address into %ebx.  */
 
-#undef ASM_OUTPUT_FUNCTION_PREFIX
-#define ASM_OUTPUT_FUNCTION_PREFIX(FILE, FNNAME) \
-  asm_output_function_prefix (FILE, FNNAME)
+#undef ASM_FILE_END
+#define ASM_FILE_END(FILE)  ix86_asm_file_end (FILE)
 
 /* Output assembler code to FILE to increment profiler label # LABELNO
    for profiling a function entry.  */
diff --git a/gcc/config/i386/i386afe.h b/gcc/config/i386/i386afe.h
new file mode 100644 (file)
index 0000000..b40be84
--- /dev/null
@@ -0,0 +1,37 @@
+/* Copyright (C) 2001 Free Software Foundation, Inc.
+
+This file is part of GNU CC.
+
+GNU CC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU CC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU CC; see the file COPYING.  If not, write to
+the Free Software Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+/* Irritatingly, config/elfos.h defines its own version of ASM_FILE_END,
+   conflicting with a definition which we wish to have in i386/i386.h.
+   We _really_ need to clean up the hodge-podge of random macro placement
+   in the configury...  */
+
+/* This macro is invoked at the end of compilation.  It is used here to
+   output code for -fpic that will load the return address into %ebx.  */
+
+#undef ASM_FILE_END
+#define ASM_FILE_END(FILE)                             \
+  do                                                   \
+    {                                                  \
+      ix86_asm_file_end (FILE);                                \
+      if (!flag_no_ident)                              \
+       fprintf ((FILE), "%s\"GCC: (GNU) %s\"\n",       \
+                IDENT_ASM_OP, version_string);         \
+    }                                                  \
+  while (0)
index 17467889c8f73014aa0179448516a70bcba0f19e..1f86883599bedbc0f396b56fb9a081a6f02947b8 100644 (file)
@@ -752,12 +752,13 @@ while (0)
 #define SCCS_DIRECTIVE
 
 /* This says what to print at the end of the assembly file */
+#undef ASM_FILE_END
 #define ASM_FILE_END(STREAM)                                           \
 do                                                                     \
   {                                                                    \
     if (HALF_PIC_P ())                                                 \
       HALF_PIC_FINISH (STREAM);                                                \
-                                                                       \
+    ix86_asm_file_end (STREAM);                                                \
     if (!flag_no_ident)                                                        \
       {                                                                        \
        char *fstart = main_input_filename;                             \
index e9fae7a72b879c5fe96178356967b9c49d9fe41e..b23990bb7997bf8379d404dbb07b22ad7831b481 100644 (file)
@@ -213,6 +213,7 @@ do {                                                                        \
 #undef ASM_FILE_END
 #define ASM_FILE_END(FILE)                                             \
 do {                                                                   \
+     ix86_asm_file_end (FILE);                                         \
      if (!flag_no_ident)                                               \
        fprintf ((FILE), "%s\"GCC: (GNU) %s\"\n",                       \
                 IDENT_ASM_OP, version_string);                         \
index 32ab783ef39c545e71f4af69fc003c427eac8190..ae6b6253a8ba184fe04b88e6b264c08fb1daffd8 100644 (file)
@@ -592,6 +592,8 @@ i386_pe_asm_file_end (file)
 {
   struct extern_list *p;
 
+  ix86_asm_file_end (file);
+
   for (p = extern_head; p != NULL; p = p->next)
     {
       tree decl;