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
This commit is contained in:
Richard Henderson 2001-01-15 15:43:10 -08:00 committed by Richard Henderson
parent ad3b5aff7c
commit 4cf12e7e21
11 changed files with 114 additions and 50 deletions

View 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

View 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

View 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 \
{ \

View 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)

View 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));

View File

@ -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);
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
/* 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. */
ASM_OUTPUT_LABEL (file, pic_label_name);
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. */
ASM_OUTPUT_LABEL (file, pic_label_name);
xops[1] = gen_rtx_MEM (SImode, xops[1]);
output_asm_insn ("mov{l}\t{%1, %0|%0, %1}", xops);
output_asm_insn ("ret", xops);
pic_label_output = 1;
}
}
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);

View 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. */

37
gcc/config/i386/i386afe.h Normal file
View File

@ -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)

View 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; \

View 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); \

View 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;