From 4cf12e7e218267a97ce026848fcff54713e1483d Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Mon, 15 Jan 2001 15:43:10 -0800 Subject: [PATCH] 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 --- gcc/ChangeLog | 18 ++++++++ gcc/config.gcc | 10 ++--- gcc/config/elfos.h | 1 + gcc/config/i386/cygwin.h | 1 + gcc/config/i386/i386-protos.h | 2 +- gcc/config/i386/i386.c | 79 +++++++++++++++++++---------------- gcc/config/i386/i386.h | 10 ++--- gcc/config/i386/i386afe.h | 37 ++++++++++++++++ gcc/config/i386/osfrose.h | 3 +- gcc/config/i386/sco5.h | 1 + gcc/config/i386/winnt.c | 2 + 11 files changed, 114 insertions(+), 50 deletions(-) create mode 100644 gcc/config/i386/i386afe.h diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 78103dc7f0e..53c06b71327 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,21 @@ +2001-01-15 Richard Henderson + + * 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 * Makefile.in (install-man): Remove explicit dependency on diff --git a/gcc/config.gcc b/gcc/config.gcc index 1408777be0a..c28dd6a88da 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 9925ff5cf33..27ee2f24df6 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 fc6cfe3ed83..b29c66c2e79 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 cd44c4b3cbd..e9cb3a88f97 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 db32bda6807..d73c2c58448 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); + + 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); diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h index 938de27a375..4845e392e0c 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 00000000000..b40be840af6 --- /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 17467889c8f..1f86883599b 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 e9fae7a72b8..b23990bb799 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 32ab783ef39..ae6b6253a8b 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;