Commit 4cf12e7e by Richard Henderson Committed by Richard Henderson

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
parent ad3b5aff
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> 2001-01-15 Joseph S. Myers <jsm28@cam.ac.uk>
* Makefile.in (install-man): Remove explicit dependency on * Makefile.in (install-man): Remove explicit dependency on
......
...@@ -979,7 +979,7 @@ i370-*-linux*) ...@@ -979,7 +979,7 @@ i370-*-linux*)
;; ;;
i[34567]86-*-elf*) i[34567]86-*-elf*)
xm_file="${xm_file} xm-svr4.h i386/xm-sysv4.h" 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 tmake_file=i386/t-i386elf
xmake_file=x-svr4 xmake_file=x-svr4
;; ;;
...@@ -1095,7 +1095,7 @@ i[34567]86-*-freebsd[12] | i[34567]86-*-freebsd[12].* | i[34567]86-*-freebsd*aou ...@@ -1095,7 +1095,7 @@ i[34567]86-*-freebsd[12] | i[34567]86-*-freebsd[12].* | i[34567]86-*-freebsd*aou
tmake_file=t-freebsd tmake_file=t-freebsd
;; ;;
i[34567]86-*-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" extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
tmake_file=t-freebsd tmake_file=t-freebsd
gas=yes gas=yes
...@@ -1166,7 +1166,7 @@ i[34567]86-*-linux*libc1) # Intel 80386's running GNU/Linux ...@@ -1166,7 +1166,7 @@ i[34567]86-*-linux*libc1) # Intel 80386's running GNU/Linux
# with ELF format using the # with ELF format using the
# GNU/Linux C library 5 # GNU/Linux C library 5
xmake_file=x-linux 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" tmake_file="t-linux t-linux-gnulibc1 i386/t-crtstuff"
extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
gnu_ld=yes gnu_ld=yes
...@@ -1179,7 +1179,7 @@ i[34567]86-*-linux*) # Intel 80386's running GNU/Linux ...@@ -1179,7 +1179,7 @@ i[34567]86-*-linux*) # Intel 80386's running GNU/Linux
# with ELF format using glibc 2 # with ELF format using glibc 2
# aka GNU/Linux C library 6 # aka GNU/Linux C library 6
xmake_file=x-linux 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" tmake_file="t-linux i386/t-crtstuff"
extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
gnu_ld=yes gnu_ld=yes
...@@ -1210,7 +1210,7 @@ i[34567]86-pc-msdosdjgpp*) ...@@ -1210,7 +1210,7 @@ i[34567]86-pc-msdosdjgpp*)
esac esac
;; ;;
i[34567]86-moss-msdos* | i[34567]86-*-moss*) 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 tmake_file=t-libc-ok
gnu_ld=yes gnu_ld=yes
gas=yes gas=yes
......
...@@ -100,6 +100,7 @@ Boston, MA 02111-1307, USA. */ ...@@ -100,6 +100,7 @@ Boston, MA 02111-1307, USA. */
#define IDENT_ASM_OP "\t.ident\t" #define IDENT_ASM_OP "\t.ident\t"
#undef ASM_FILE_END
#define ASM_FILE_END(FILE) \ #define ASM_FILE_END(FILE) \
do \ do \
{ \ { \
......
...@@ -498,6 +498,7 @@ do { \ ...@@ -498,6 +498,7 @@ do { \
asm_output_aligned_bss ((FILE), (DECL), (NAME), (SIZE), (ALIGN)) asm_output_aligned_bss ((FILE), (DECL), (NAME), (SIZE), (ALIGN))
/* Output function declarations at the end of the file. */ /* Output function declarations at the end of the file. */
#undef ASM_FILE_END
#define ASM_FILE_END(FILE) \ #define ASM_FILE_END(FILE) \
i386_pe_asm_file_end (FILE) i386_pe_asm_file_end (FILE)
......
...@@ -26,7 +26,7 @@ extern void optimization_options PARAMS ((int, int)); ...@@ -26,7 +26,7 @@ extern void optimization_options PARAMS ((int, int));
extern int ix86_can_use_return_insn_p PARAMS ((void)); 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 void load_pic_register PARAMS ((void));
extern HOST_WIDE_INT ix86_initial_elimination_offset PARAMS((int, int)); extern HOST_WIDE_INT ix86_initial_elimination_offset PARAMS((int, int));
extern void ix86_expand_prologue PARAMS ((void)); extern void ix86_expand_prologue PARAMS ((void));
......
...@@ -1689,28 +1689,40 @@ ix86_can_use_return_insn_p () ...@@ -1689,28 +1689,40 @@ ix86_can_use_return_insn_p ()
return tsize == 0 && nregs == 0; return tsize == 0 && nregs == 0;
} }
static const char *pic_label_name; static char pic_label_name[32];
static int pic_label_output;
/* This function generates code for -fpic that loads %ebx with /* This function generates code for -fpic that loads %ebx with
the return address of the caller and then returns. */ the return address of the caller and then returns. */
void void
asm_output_function_prefix (file, name) ix86_asm_file_end (file)
FILE *file; FILE *file;
const char *name ATTRIBUTE_UNUSED;
{ {
rtx xops[2]; 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 (! TARGET_DEEP_BRANCH_PREDICTION || pic_label_name[0] == 0)
if (pic_reg_used && TARGET_DEEP_BRANCH_PREDICTION) return;
{
if (!pic_label_output) #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
/* This used to call ASM_DECLARE_FUNCTION_NAME() but since it's an /* 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 internal (non-global) label that's being emitted, it didn't make
sense to have .type information for local labels. This caused sense to have .type information for local labels. This caused
...@@ -1720,13 +1732,10 @@ asm_output_function_prefix (file, name) ...@@ -1720,13 +1732,10 @@ asm_output_function_prefix (file, name)
ASM_OUTPUT_LABEL (file, pic_label_name); ASM_OUTPUT_LABEL (file, pic_label_name);
xops[1] = gen_rtx_MEM (SImode, xops[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 ("mov{l}\t{%1, %0|%0, %1}", xops);
output_asm_insn ("ret", xops); output_asm_insn ("ret", xops);
pic_label_output = 1;
}
}
} }
void void
...@@ -1738,12 +1747,8 @@ load_pic_register () ...@@ -1738,12 +1747,8 @@ load_pic_register ()
if (TARGET_DEEP_BRANCH_PREDICTION) if (TARGET_DEEP_BRANCH_PREDICTION)
{ {
if (pic_label_name == NULL) if (! pic_label_name[0])
{ ASM_GENERATE_INTERNAL_LABEL (pic_label_name, "LPR", 0);
char buf[32];
ASM_GENERATE_INTERNAL_LABEL (buf, "LPR", 0);
pic_label_name = ggc_strdup (buf);
}
pclab = gen_rtx_MEM (QImode, gen_rtx_SYMBOL_REF (Pmode, pic_label_name)); pclab = gen_rtx_MEM (QImode, gen_rtx_SYMBOL_REF (Pmode, pic_label_name));
} }
else else
...@@ -1951,8 +1956,8 @@ ix86_emit_save_regs () ...@@ -1951,8 +1956,8 @@ ix86_emit_save_regs ()
void void
ix86_expand_prologue () ix86_expand_prologue ()
{ {
HOST_WIDE_INT tsize = ix86_compute_frame_size (get_frame_size (), (int *) 0, (int *) 0, HOST_WIDE_INT tsize = ix86_compute_frame_size (get_frame_size (), (int *) 0,
(int *) 0); (int *) 0, (int *) 0);
rtx insn; rtx insn;
int pic_reg_used = flag_pic && (current_function_uses_pic_offset_table int pic_reg_used = flag_pic && (current_function_uses_pic_offset_table
|| current_function_uses_const_pool); || current_function_uses_const_pool);
......
...@@ -1356,13 +1356,11 @@ typedef struct ix86_args { ...@@ -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 (DECL)))) \
|| FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (TREE_TYPE (cfun->decl)))))) || FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (TREE_TYPE (cfun->decl))))))
/* This macro is invoked just before the start of a function. /* This macro is invoked at the end of compilation. It is used here to
It is used here to output code for -fpic that will load the output code for -fpic that will load the return address into %ebx. */
return address into %ebx. */
#undef ASM_OUTPUT_FUNCTION_PREFIX #undef ASM_FILE_END
#define ASM_OUTPUT_FUNCTION_PREFIX(FILE, FNNAME) \ #define ASM_FILE_END(FILE) ix86_asm_file_end (FILE)
asm_output_function_prefix (FILE, FNNAME)
/* Output assembler code to FILE to increment profiler label # LABELNO /* Output assembler code to FILE to increment profiler label # LABELNO
for profiling a function entry. */ for profiling a function entry. */
......
/* 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)
...@@ -752,12 +752,13 @@ while (0) ...@@ -752,12 +752,13 @@ while (0)
#define SCCS_DIRECTIVE #define SCCS_DIRECTIVE
/* This says what to print at the end of the assembly file */ /* This says what to print at the end of the assembly file */
#undef ASM_FILE_END
#define ASM_FILE_END(STREAM) \ #define ASM_FILE_END(STREAM) \
do \ do \
{ \ { \
if (HALF_PIC_P ()) \ if (HALF_PIC_P ()) \
HALF_PIC_FINISH (STREAM); \ HALF_PIC_FINISH (STREAM); \
\ ix86_asm_file_end (STREAM); \
if (!flag_no_ident) \ if (!flag_no_ident) \
{ \ { \
char *fstart = main_input_filename; \ char *fstart = main_input_filename; \
......
...@@ -213,6 +213,7 @@ do { \ ...@@ -213,6 +213,7 @@ do { \
#undef ASM_FILE_END #undef ASM_FILE_END
#define ASM_FILE_END(FILE) \ #define ASM_FILE_END(FILE) \
do { \ do { \
ix86_asm_file_end (FILE); \
if (!flag_no_ident) \ if (!flag_no_ident) \
fprintf ((FILE), "%s\"GCC: (GNU) %s\"\n", \ fprintf ((FILE), "%s\"GCC: (GNU) %s\"\n", \
IDENT_ASM_OP, version_string); \ IDENT_ASM_OP, version_string); \
......
...@@ -592,6 +592,8 @@ i386_pe_asm_file_end (file) ...@@ -592,6 +592,8 @@ i386_pe_asm_file_end (file)
{ {
struct extern_list *p; struct extern_list *p;
ix86_asm_file_end (file);
for (p = extern_head; p != NULL; p = p->next) for (p = extern_head; p != NULL; p = p->next)
{ {
tree decl; tree decl;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment