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>
* Makefile.in (install-man): Remove explicit dependency on
......
......@@ -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
......
......@@ -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 \
{ \
......
......@@ -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)
......
......@@ -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));
......
......@@ -1689,28 +1689,40 @@ 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)
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
......@@ -1720,13 +1732,10 @@ asm_output_function_prefix (file, 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 ("ret", xops);
pic_label_output = 1;
}
}
}
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);
......
......@@ -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. */
......
/* 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)
#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; \
......
......@@ -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); \
......
......@@ -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;
......
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