aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2001-01-15 15:43:10 -0800
committerRichard Henderson <rth@gcc.gnu.org>2001-01-15 15:43:10 -0800
commit4cf12e7e218267a97ce026848fcff54713e1483d (patch)
tree9bdff5066ecd23b877619975881ff8a84b94795a /gcc
parentad3b5aff7c758c9634febe64c8d7d29abf27f925 (diff)
downloadgcc-4cf12e7e218267a97ce026848fcff54713e1483d.zip
gcc-4cf12e7e218267a97ce026848fcff54713e1483d.tar.gz
gcc-4cf12e7e218267a97ce026848fcff54713e1483d.tar.bz2
i386.c (asm_output_function_prefix): Remove.
* 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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog18
-rw-r--r--gcc/config.gcc10
-rw-r--r--gcc/config/elfos.h1
-rw-r--r--gcc/config/i386/cygwin.h1
-rw-r--r--gcc/config/i386/i386-protos.h2
-rw-r--r--gcc/config/i386/i386.c73
-rw-r--r--gcc/config/i386/i386.h10
-rw-r--r--gcc/config/i386/i386afe.h37
-rw-r--r--gcc/config/i386/osfrose.h3
-rw-r--r--gcc/config/i386/sco5.h1
-rw-r--r--gcc/config/i386/winnt.c2
11 files changed, 111 insertions, 47 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 78103dc..53c06b7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/config.gcc b/gcc/config.gcc
index 1408777..c28dd6a 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -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
diff --git a/gcc/config/elfos.h b/gcc/config/elfos.h
index 9925ff5..27ee2f2 100644
--- a/gcc/config/elfos.h
+++ b/gcc/config/elfos.h
@@ -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 \
{ \
diff --git a/gcc/config/i386/cygwin.h b/gcc/config/i386/cygwin.h
index fc6cfe3..b29c66c 100644
--- a/gcc/config/i386/cygwin.h
+++ b/gcc/config/i386/cygwin.h
@@ -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)
diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h
index cd44c4b..e9cb3a8 100644
--- a/gcc/config/i386/i386-protos.h
+++ b/gcc/config/i386/i386-protos.h
@@ -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));
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index db32bda..d73c2c5 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -1689,44 +1689,53 @@ ix86_can_use_return_insn_p ()
return tsize == 0 && nregs == 0;
}
-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);
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
index 938de27..4845e39 100644
--- a/gcc/config/i386/i386.h
+++ b/gcc/config/i386/i386.h
@@ -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
index 0000000..b40be84
--- /dev/null
+++ b/gcc/config/i386/i386afe.h
@@ -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)
diff --git a/gcc/config/i386/osfrose.h b/gcc/config/i386/osfrose.h
index 1746788..1f86883 100644
--- a/gcc/config/i386/osfrose.h
+++ b/gcc/config/i386/osfrose.h
@@ -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; \
diff --git a/gcc/config/i386/sco5.h b/gcc/config/i386/sco5.h
index e9fae7a..b23990b 100644
--- a/gcc/config/i386/sco5.h
+++ b/gcc/config/i386/sco5.h
@@ -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); \
diff --git a/gcc/config/i386/winnt.c b/gcc/config/i386/winnt.c
index 32ab783..ae6b625 100644
--- a/gcc/config/i386/winnt.c
+++ b/gcc/config/i386/winnt.c
@@ -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;