2002-01-26 Richard Henderson <rth@redhat.com>
+ * Makefile.in (CRTSTUFF_CFLAGS): New.
+ (crtbegin.o, crtend.o, crtbeginS.o, crtendS.o, crtbeginT.o): Use it.
+ * config.gcc (alpha-linux, alpha-freebsd, alpha-netbsd): Use plain
+ crtstuff.c instead of alpha assembly version.
+ * crtstuff.c (CRT_CALL_STATIC_FUNCTION): Rewrite to assume the
+ entire dummy function sequence. Use FORCE_CODE_SECTION_ALIGN
+ not FORCE_{INIT,FINI}_SECTION_ALIGN.
+ (__do_global_dtors_aux): Mark used.
+ (frame_dummy, __do_global_ctors_aux): Mark used.
+ (fini_dummy, init_dummy): Remove.
+
+ * config/alpha/crtbegin.asm: Remove file.
+ * config/alpha/crtend.asm: Remove file.
+ * config/alpha/t-crtbe: Remove file.
+ * config/alpha/elf.h (CRT_CALL_STATIC_FUNCTION): New.
+ (LINK_EH_SPEC): New.
+
+ * config/cris/cris.h (CRT_CALL_STATIC_FUNCTION): Rewrite old
+ FORCE_INIT_SECTION_ALIGN hack. Register __fini_start before
+ calling constructors.
+ * config/cris/linux.h (CRT_CALL_STATIC_FUNCTION): Undef.
+
+ * config/i386/i386.h (CRT_CALL_STATIC_FUNCTION): New.
+ * config/i386/linux.h (CRT_CALL_STATIC_FUNCTION): Replace old
+ CRT_END_INIT_DUMMY hack.
+ * config/i386/sol2.h (FORCE_CODE_SECTION_ALIGN): Replace
+ FORCE_{INIT,FINI}_SECTION_ALIGN.
+
+ * config/mcore/mcore-elf.h (FORCE_CODE_SECTION_ALIGN): Replace
+ FORCE_{INIT,FINI}_SECTION_ALIGN.
+
+ * config/s390/s390.h (CRT_CALL_STATIC_FUNCTION): Update for new
+ invocation sequence.
+ * config/sh/sh.h (CRT_CALL_STATIC_FUNCTION): Likewise.
+
+ * doc/tm.texi (CRT_CALL_STATIC_FUNCTION): Update.
+ (FORCE_CODE_SECTION_ALIGN): New.
+
+2002-01-26 Richard Henderson <rth@redhat.com>
+
* config/cris/cris.c (cris_print_operand): Handle 64-bit CONST_INT.
2002-01-26 Richard Henderson <rth@redhat.com>
# Additional target-dependent options for compiling libgcc2.a.
TARGET_LIBGCC2_CFLAGS =
+# Options to use when compiling crtbegin/end.
+CRTSTUFF_CFLAGS = -O2 $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -g0 \
+ -finhibit-size-directive -fno-inline-functions -fno-exceptions
+
# Additional sources to handle exceptions; overridden on ia64.
LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde.c \
$(srcdir)/unwind-sjlj.c
# constructors.
$(T)crtbegin.o: crtstuff.c $(GCC_PASSES) $(TCONFIG_H) auto-host.h \
gbl-ctors.h stmp-int-hdrs tsystem.h
- $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -g0 \
- -finhibit-size-directive -fno-inline-functions \
- -fno-exceptions $(CRTSTUFF_T_CFLAGS) @inhibit_libc@ \
- -c $(srcdir)/crtstuff.c -DCRT_BEGIN -o $(T)crtbegin$(objext)
+ $(GCC_FOR_TARGET) $(CRTSTUFF_CFLAGS) $(CRTSTUFF_T_CFLAGS) \
+ @inhibit_libc@ -c $(srcdir)/crtstuff.c -DCRT_BEGIN \
+ -o $(T)crtbegin$(objext)
$(T)crtend.o: crtstuff.c $(GCC_PASSES) $(TCONFIG_H) auto-host.h \
gbl-ctors.h stmp-int-hdrs tsystem.h
- $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -g0 \
- -finhibit-size-directive -fno-inline-functions \
- -fno-exceptions $(CRTSTUFF_T_CFLAGS) @inhibit_libc@ \
- -c $(srcdir)/crtstuff.c -DCRT_END -o $(T)crtend$(objext)
+ $(GCC_FOR_TARGET) $(CRTSTUFF_CFLAGS) $(CRTSTUFF_T_CFLAGS) \
+ @inhibit_libc@ -c $(srcdir)/crtstuff.c -DCRT_END \
+ -o $(T)crtend$(objext)
# These are versions of crtbegin and crtend for shared libraries.
$(T)crtbeginS.o: crtstuff.c $(GCC_PASSES) $(TCONFIG_H) auto-host.h \
gbl-ctors.h stmp-int-hdrs tsystem.h
- $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -g0 \
- -finhibit-size-directive -fno-inline-functions \
- -fno-exceptions $(CRTSTUFF_T_CFLAGS_S) @inhibit_libc@ \
- -c $(srcdir)/crtstuff.c -DCRT_BEGIN -DCRTSTUFFS_O \
+ $(GCC_FOR_TARGET) $(CRTSTUFF_CFLAGS) $(CRTSTUFF_T_CFLAGS_S) \
+ @inhibit_libc@ -c $(srcdir)/crtstuff.c -DCRT_BEGIN -DCRTSTUFFS_O \
-o $(T)crtbeginS$(objext)
$(T)crtendS.o: crtstuff.c $(GCC_PASSES) $(TCONFIG_H) auto-host.h \
gbl-ctors.h stmp-int-hdrs tsystem.h
- $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -g0 \
- -finhibit-size-directive -fno-inline-functions \
- -fno-exceptions $(CRTSTUFF_T_CFLAGS_S) @inhibit_libc@ \
- -c $(srcdir)/crtstuff.c -DCRT_END -DCRTSTUFFS_O \
+ $(GCC_FOR_TARGET) $(CRTSTUFF_CFLAGS) $(CRTSTUFF_T_CFLAGS_S) \
+ @inhibit_libc@ -c $(srcdir)/crtstuff.c -DCRT_END -DCRTSTUFFS_O \
-o $(T)crtendS$(objext)
# This is a version of crtbegin for -static links.
$(T)crtbeginT.o: crtstuff.c $(GCC_PASSES) $(TCONFIG_H) auto-host.h \
gbl-ctors.h stmp-int-hdrs tsystem.h
- $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) -g0 \
- -finhibit-size-directive -fno-inline-functions \
- -fno-exceptions $(CRTSTUFF_T_CFLAGS) @inhibit_libc@ \
- -c $(srcdir)/crtstuff.c -DCRT_BEGIN -DCRTSTUFFT_O \
+ $(GCC_FOR_TARGET) $(CRTSTUFF_CFLAGS) $(CRTSTUFF_T_CFLAGS) \
+ @inhibit_libc@ -c $(srcdir)/crtstuff.c -DCRT_BEGIN -DCRTSTUFFT_O \
-o $(T)crtbeginT$(objext)
# Compile the start modules crt0.o and mcrt0.o that are linked with
alpha*-*-linux*libc1*)
tm_file="${tm_file} alpha/elf.h alpha/linux.h alpha/linux-elf.h"
target_cpu_default="MASK_GAS"
- tmake_file="t-slibgcc-elf-ver t-linux t-linux-gnulibc1 alpha/t-alpha alpha/t-crtbe alpha/t-crtfm alpha/t-ieee"
+ tmake_file="t-slibgcc-elf-ver t-linux t-linux-gnulibc1 alpha/t-alpha alpha/t-crtfm alpha/t-ieee"
+ extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o"
gas=yes gnu_ld=yes
if test x$enable_threads = xyes; then
thread_file='posix'
alpha*-*-linux*)
tm_file="${tm_file} alpha/elf.h alpha/linux.h alpha/linux-elf.h"
target_cpu_default="MASK_GAS"
- tmake_file="t-slibgcc-elf-ver t-linux alpha/t-crtbe alpha/t-crtfm alpha/t-alpha alpha/t-ieee"
+ tmake_file="t-slibgcc-elf-ver t-linux alpha/t-crtfm alpha/t-alpha alpha/t-ieee"
+ extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o"
gas=yes gnu_ld=yes
if test x$enable_threads = xyes; then
thread_file='posix'
alpha*-*-freebsd*)
tm_file="${tm_file} ${fbsd_tm_file} alpha/elf.h alpha/freebsd.h"
target_cpu_default="MASK_GAS"
- tmake_file="${tmake_file} alpha/t-crtbe alpha/t-crtfm alpha/t-alpha alpha/t-ieee"
+ tmake_file="${tmake_file} alpha/t-crtfm alpha/t-alpha alpha/t-ieee"
+ extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o"
;;
alpha*-*-netbsd*)
tm_file="${tm_file} netbsd.h alpha/elf.h netbsd-elf.h alpha/netbsd.h"
target_cpu_default="MASK_GAS"
- tmake_file="${tmake_file} alpha/t-alpha alpha/t-crtbe alpha/t-ieee"
+ tmake_file="${tmake_file} alpha/t-alpha alpha/t-ieee"
+ extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o"
;;
alpha*-*-openbsd*)
+++ /dev/null
-/*
- * Copyright (C) 1996, 1998, 2000 Free Software Foundation, Inc.
- * Contributed by Richard Henderson (rth@tamu.edu)
- *
- * This file 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.
- *
- * In addition to the permissions in the GNU General Public License, the
- * Free Software Foundation gives you unlimited permission to link the
- * compiled version of this file with other programs, and to distribute
- * those programs without any restriction coming from the use of this
- * file. (The General Public License restrictions do apply in other
- * respects; for example, they cover modification of the file, and
- * distribution when not linked into another program.)
- *
- * This file 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 this program; see the file COPYING. If not, write to
- * the Free Software Foundation, 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * As a special exception, if you link this library with files
- * compiled with GCC to produce an executable, this does not cause
- * the resulting executable to be covered by the GNU General Public License.
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
- */
-
-#include "auto-host.h"
-
-
-/*
- * Heads of the constructor/destructor lists.
- */
-
-/* The __*TOR_LIST__ symbols are not global because when this file is used
- in a shared library, we do not want the symbol to fall over to the
- application's lists. */
-
-.section .ctors,"aw"
- .align 3
-__CTOR_LIST__:
- .quad -1
-
-.section .dtors,"aw"
- .align 3
-__DTOR_LIST__:
- .quad -1
-
-.section .jcr,"aw"
- .align 3
-__JCR_LIST__:
-
-.section .eh_frame,"aw"
-__EH_FRAME_BEGIN__:
-
-/*
- * Fragment of the ELF _fini routine that invokes our dtor cleanup.
- */
-
-.section .fini,"ax"
-
- /* Since the bits of the _fini function are spread across many
- object files, each potentially with its own GP, we must
- assume we need to load ours. Further, our .fini section
- can easily be more than 4MB away from our .text bits so we
- can't use bsr. */
-
- br $29,1f
-1: ldgp $29,0($29)
- jsr $26,__do_global_dtors_aux
-
- /* Must match the alignment we got from crti.o else we get
- zero-filled holes in our _fini function and then SIGILL. */
- .align 3
-
-/*
- * Fragment of the ELF _init routine that sets up the frame info.
- */
-
-.section .init,"ax"
- br $29,1f
-1: ldgp $29,0($29)
- jsr $26,__do_frame_setup
- .align 3
-
-/*
- * Invoke our destructors in order.
- */
-
-.section .sdata
-
-/* Support recursive calls to exit. */
- .type dtor_ptr,@object
- .size dtor_ptr,4
-dtor_ptr:
- .gprel32 __DTOR_LIST__ + 8
-
-/* A globally unique widget for c++ local destructors to hang off.
-
- This has a unique value in every dso; in the main program its
- value is zero. The object should be protected. This means the
- instance in any dso or the main program is not used in any other
- dso. The dynamic linker takes care of this. */
-
- .global __dso_handle
- .type __dso_handle,@object
- .size __dso_handle,8
-#ifdef SHARED
-.section .data
- .align 3
-__dso_handle:
- .quad __dso_handle
-#else
-.section .bss
- .align 3
-__dso_handle:
- .zero 8
-#endif
-#ifdef HAVE_GAS_HIDDEN
- .hidden __dso_handle
-#endif
-
-.text
-
- .align 3
- .ent __do_global_dtors_aux
-
-__do_global_dtors_aux:
- ldgp $29,0($27)
- lda $30,-16($30)
- .frame $30,16,$26,0
- stq $9,8($30)
- stq $26,0($30)
- .mask 0x4000200,-16
- .prologue 1
-
-#ifdef SHARED
- /* Do c++ local destructors. */
- lda $1,__cxa_finalize
- beq $1,0f
- lda $16,__dso_handle
- jsr $26,__cxa_finalize
- ldgp $29,0($26)
-#endif
-
-0: lda $9,dtor_ptr
- br 2f
-1: stl $1,0($9)
- jsr $26,($27)
- ldgp $29,0($26)
-2: ldl $1,0($9)
- addq $1,$29,$2
- ldq $27,0($2)
- addl $1,8,$1
- bne $27,1b
-
- /* Remove our frame info. */
- lda $1,__deregister_frame_info
- beq $1,3f
- lda $16,__EH_FRAME_BEGIN__
- jsr $26,__deregister_frame_info
- ldgp $29,0($26)
-
-3: ldq $26,0($30)
- ldq $9,8($30)
- lda $30,16($30)
- ret
-
- .end __do_global_dtors_aux
-
-/*
- * Install our frame info; register java classes, if any.
- */
-
-.section .bss
- .type frame_object,@object
- .size frame_object, 48
- .align 3
-frame_object:
- .zero 48
-
-.text
-
- .align 3
- .ent __do_frame_setup
-
-__do_frame_setup:
- ldgp $29,0($27)
- lda $30,-16($30)
- .frame $30,16,$26,0
- stq $26,0($30)
- .mask 0x4000000,-16
- .prologue 1
-
- lda $1,__register_frame_info
- beq $1,0f
- lda $16,__EH_FRAME_BEGIN__
- lda $17,frame_object
- jsr $26,__register_frame_info
- ldgp $29,0($26)
-
-0: lda $1,_Jv_RegisterClasses
- lda $16,__JCR_LIST__
- beq $1,0f
- ldq $2,8($16)
- beq $2,0f
- jsr $26,_Jv_RegisterClasses
- ldgp $29,0($26)
-
-0: ldq $26,0($30)
- lda $30,16($30)
- ret
-
- .end __do_frame_setup
-
-.weak __register_frame_info
-.weak __deregister_frame_info
-#ifdef SHARED
-.weak __cxa_finalize
-#endif
-.weak _Jv_RegisterClasses
+++ /dev/null
-/*
- * Copyright (C) 1996, 2000 Free Software Foundation, Inc.
- * Contributed by Richard Henderson (rth@tamu.edu)
- *
- * This file 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.
- *
- * In addition to the permissions in the GNU General Public License, the
- * Free Software Foundation gives you unlimited permission to link the
- * compiled version of this file with other programs, and to distribute
- * those programs without any restriction coming from the use of this
- * file. (The General Public License restrictions do apply in other
- * respects; for example, they cover modification of the file, and
- * distribution when not linked into another program.)
- *
- * This file 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 this program; see the file COPYING. If not, write to
- * the Free Software Foundation, 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- *
- * As a special exception, if you link this library with files
- * compiled with GCC to produce an executable, this does not cause
- * the resulting executable to be covered by the GNU General Public License.
- * This exception does not however invalidate any other reasons why
- * the executable file might be covered by the GNU General Public License.
- */
-
-/*
- * Tails of the constructor/destructor lists.
- */
-
-/* The __*TOR_END__ symbols are not global because when this file is used
- in a shared library, we do not want the symbol to fall over to the
- application's lists. */
-
-.section .ctors,"aw"
- .align 3
-__CTOR_END__:
- .quad 0
-
-.section .dtors,"aw"
- .align 3
-__DTOR_END__:
- .quad 0
-
-.section .jcr,"aw"
- .align 3
-__JCR_END__:
- .quad 0
-
-.section .eh_frame,"aw"
-__FRAME_END__:
- .quad 0
-
-/*
- * Fragment of the ELF _init routine that invokes our ctor startup
- */
-
-.section .init,"ax"
-
- /* Since the bits of the _init function are spread across many
- object files, each potentially with its own GP, we must
- assume we need to load ours. Further, our .init section
- can easily be more than 4MB away from our .text bits so we
- can't use bsr. */
-
- br $29,1f
-1: ldgp $29,0($29)
- jsr $26,__do_global_ctors_aux
-
- /* Must match the alignment we got from crti.o else we get
- zero-filled holes in our _init function and thense SIGILL. */
- .align 3
-
-/*
- * Invoke our constructors in order.
- */
-
-.text
-
- .align 3
- .ent __do_global_ctors_aux
-
-__do_global_ctors_aux:
- ldgp $29,0($27)
- lda $30,-16($30)
- .frame $30,16,$26,0
- stq $9,8($30)
- stq $26,0($30)
- .mask 0x4000200,-16
- .prologue 1
-
- lda $9,__CTOR_END__-8
- br 1f
-0: jsr $26,($27)
-1: ldq $27,0($9)
- subq $9,8,$9
- not $27,$0
- bne $0,0b
-
- ldq $26,0($30)
- ldq $9,8($30)
- lda $30,16($30)
- ret
-
- .end __do_global_ctors_aux
/* Definitions of target machine for GNU compiler, for DEC Alpha w/ELF.
- Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
+ Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002
Free Software Foundation, Inc.
Contributed by Richard Henderson (rth@tamu.edu).
alpha_this_gpdisp_sequence_number = 0)
extern int alpha_this_literal_sequence_number;
extern int alpha_this_gpdisp_sequence_number;
+
+/* Since the bits of the _init and _fini function is spread across
+ many object files, each potentially with its own GP, we must assume
+ we need to load our GP. Further, the .init/.fini section can
+ easily be more than 4MB away from the function to call so we can't
+ use bsr. */
+#define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \
+ asm (SECTION_OP "\n" \
+" br $29,1f\n" \
+"1: ldgp $29,0($29)\n" \
+" unop\n" \
+" jsr $26," USER_LABEL_PREFIX #FUNC "\n" \
+" .align 3\n" \
+" .previous");
+
+/* If we have the capability create headers for efficient EH lookup.
+ As of Jan 2002, only glibc 2.2.4 can actually make use of this, but
+ I imagine that other systems will catch up. In the meantime, it
+ doesn't harm to make sure that the data exists to be used later. */
+#if defined(HAVE_LD_EH_FRAME_HDR)
+#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} "
+#endif
+++ /dev/null
-# Effectively disable the crtbegin/end rules using crtstuff.c
-T = disable
-
-EXTRA_PARTS += crtbegin.o crtend.o crtbeginS.o crtendS.o
-
-# Assemble startup files.
-crtbegin.o: $(srcdir)/config/alpha/crtbegin.asm $(GCC_PASSES)
- $(GCC_FOR_TARGET) -c -o crtbegin.o -x assembler-with-cpp -I. $(srcdir)/config/alpha/crtbegin.asm
-crtend.o: $(srcdir)/config/alpha/crtend.asm $(GCC_PASSES)
- $(GCC_FOR_TARGET) -c -o crtend.o -x assembler-with-cpp -I. $(srcdir)/config/alpha/crtend.asm
-crtbeginS.o: $(srcdir)/config/alpha/crtbegin.asm $(GCC_PASSES)
- $(GCC_FOR_TARGET) -DSHARED -c -o crtbeginS.o -x assembler-with-cpp -I. $(srcdir)/config/alpha/crtbegin.asm
-crtendS.o: $(srcdir)/config/alpha/crtend.asm $(GCC_PASSES)
- $(GCC_FOR_TARGET) -DSHARED -c -o crtendS.o -x assembler-with-cpp -I. $(srcdir)/config/alpha/crtend.asm
/* We pull a little trick to register the _fini function with atexit,
after (presumably) registering the eh frame info, since we don't handle
_fini (a.k.a. ___fini_start) in crt0 or have a crti for "pure" ELF. */
-#ifdef CRT_BEGIN
-#define FORCE_INIT_SECTION_ALIGN \
- do \
- { \
- extern void __fini__start (void); \
- atexit (__fini__start); \
- } \
- while (0)
+#ifdef CRT_END
+# define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \
+static void __attribute__((__used__)) \
+call_ ## FUNC (void) \
+{ \
+ asm (SECTION_OP); \
+ if (__builtin_strcmp (#FUNC, "__do_global_ctors_aux") == 0) \
+ { \
+ extern void __fini__start (void); \
+ atexit (__fini__start); \
+ } \
+ FUNC (); \
+ asm (TEXT_SECTION_ASM_OP); \
+}
#endif
/* Node: PIC */
/* Node: Sections */
/* GNU/Linux has crti and crtn and does not need the
- FORCE_INIT_SECTION_ALIGN trick in cris.h. */
-#undef FORCE_INIT_SECTION_ALIGN
+ CRT_CALL_STATIC_FUNCTION trick in cris.h. */
+#undef CRT_CALL_STATIC_FUNCTION
/*
* Local variables:
#define ASM_SIMPLIFY_DWARF_ADDR(X) \
i386_simplify_dwarf_addr (X)
+
+/* Switch to init or fini section via SECTION_OP, emit a call to FUNC,
+ and switch back. For x86 we do this only to save a few bytes that
+ would otherwise be unused in the text section. */
+#define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \
+ asm (SECTION_OP "\n\t" \
+ "call " USER_LABEL_PREFIX #FUNC "\n" \
+ TEXT_SECTION_ASM_OP);
\f
/* Print operand X (an rtx) in assembler syntax to file FILE.
CODE is a letter or dot (`z' in `%z0') or 0 if no letter was specified.
/* Definitions for Intel 386 running Linux-based GNU systems with ELF format.
- Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002
+ Free Software Foundation, Inc.
Contributed by Eric Youngdale.
Modified for stabs-in-ELF by H.J. Lu.
#if defined(__PIC__) && defined (USE_GNULIBC_1)
/* This is a kludge. The i386 GNU/Linux dynamic linker needs ___brk_addr,
- __environ and atexit (). We have to make sure they are in the .dynsym
- section. We accomplish it by making a dummy call here. This
- code is never reached. */
-
-#define CRT_END_INIT_DUMMY \
- do \
- { \
- extern void *___brk_addr; \
- extern char **__environ; \
- \
- ___brk_addr = __environ; \
- atexit (0); \
- } \
- while (0)
+ __environ and atexit. We have to make sure they are in the .dynsym
+ section. We do this by forcing the assembler to create undefined
+ references to these symbols in the object file. */
+#undef CRT_CALL_STATIC_FUNCTION
+#define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \
+ asm (SECTION_OP "\n\t" \
+ "call " USER_LABEL_PREFIX #FUNC "\n" \
+ TEXT_SECTION_ASM_OP "\n\t" \
+ ".extern ___brk_addr\n\t" \
+ ".type ___brk_addr,@object\n\t" \
+ ".extern __environ\n\t" \
+ ".type __environ,@object\n\t" \
+ ".extern atexit\n\t" \
+ ".type atexit,@function");
#endif
/* Handle special EH pointer encodings. Absolute, pc-relative, and
/* Target definitions for GNU compiler for Intel 80386 running Solaris 2
- Copyright (C) 1993, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+ Copyright (C) 1993, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
Free Software Foundation, Inc.
Contributed by Fred Fish (fnf@cygnus.com).
two 0x00000090 ints, which generates a segmentation violation when
executed. This macro forces the assembler to do the padding, since
it knows what it is doing. */
-
-#define FORCE_INIT_SECTION_ALIGN asm (ALIGN_ASM_OP ## "16")
-#define FORCE_FINI_SECTION_ALIGN FORCE_INIT_SECTION_ALIGN
+#define FORCE_CODE_SECTION_ALIGN asm(ALIGN_ASM_OP "16");
/* Select a format to encode pointers in exception handling data. CODE
is 0 for data, 1 for code labels, 2 for function pointers. GLOBAL is
/* Definitions of MCore target.
- Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
Contributed by Cygnus Solutions.
This file is part of GNU CC.
#undef ENDFILE_SPEC
#define ENDFILE_SPEC "%{!mno-lsim:-lsim} crtend.o%s crtn.o%s"
-
/* The subroutine calls in the .init and .fini sections create literal
pools which must be jumped around... */
-#define FORCE_INIT_SECTION_ALIGN asm ("br 1f ; .literals ; 1:")
-#define FORCE_FINI_SECTION_ALIGN asm ("br 1f ; .literals ; 1:")
+#define FORCE_CODE_SECTION_ALIGN asm ("br 1f ; .literals ; 1:");
#undef CTORS_SECTION_ASM_OP
#define CTORS_SECTION_ASM_OP "\t.section\t.ctors,\"aw\""
/* S/390 constant pool breaks the devices in crtstuff.c to control section
in where code resides. We have to write it as asm code. */
#ifndef __s390x__
-#define CRT_CALL_STATIC_FUNCTION(func) \
- if (0) \
- func (); /* ... to avoid warnings. */ \
- else \
- asm \
- ("bras\t%%r2,1f\n\
-0: .long\t" #func " - 0b\n\
+#define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \
+ asm (SECTION_OP "\n\
+ bras\t%%r2,1f\n\
+0: .long\t" USER_LABEL_PREFIX #FUNC " - 0b\n\
1: l\t%%r3,0(%%r2)\n\
- bas\t%%r14,0(%%r3,%%r2)" : : : "2", "3", "cc", "memory");
+ bas\t%%r14,0(%%r3,%%r2)\n\
+ .previous");
#endif
/* Constant Pool for all symbols operands which are changed with
/* SH constant pool breaks the devices in crtstuff.c to control section
in where code resides. We have to write it as asm code. */
-#define CRT_CALL_STATIC_FUNCTION(func) \
- if (0) \
- /* This avoids warnings about the static function being unused. */ \
- func (); \
- else \
- /* We should be passing FUNC to the asm statement as an asm input \
- operand, but this breaks with -fPIC. FIXME. */ \
- asm \
- ("mov.l 1f,r1\n\
+#define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \
+ asm (SECTION_OP "\n\
+ mov.l 1f,r1\n\
mova 2f,r0\n\
braf r1\n\
lds r0,pr\n\
0: .p2align 2\n\
-1: .long " USER_LABEL_PREFIX #func " - 0b\n\
-2:")
+1: .long " USER_LABEL_PREFIX #FUNC " - 0b\n\
+2:\n" TEXT_SECTION_ASM_OP);
#define ALLOCATE_INITIAL_VALUE(hard_reg) \
(REGNO (hard_reg) == PR_REG \
/* Specialized bits of code needed to support construction and
destruction of file-scope objects in C++ code.
Copyright (C) 1991, 1994, 1995, 1996, 1997, 1998,
- 1999, 2000, 2001 Free Software Foundation, Inc.
+ 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
Contributed by Ron Guilmette (rfg@monkeys.com).
This file is part of GCC.
#include "tsystem.h"
#include "unwind-dw2-fde.h"
+#ifndef FORCE_CODE_SECTION_ALIGN
+# define FORCE_CODE_SECTION_ALIGN
+#endif
+
#ifndef CRT_CALL_STATIC_FUNCTION
-# define CRT_CALL_STATIC_FUNCTION(func) func ()
+# define CRT_CALL_STATIC_FUNCTION(SECTION_OP, FUNC) \
+static void __attribute__((__used__)) \
+call_ ## FUNC (void) \
+{ \
+ asm (SECTION_OP); \
+ FUNC (); \
+ FORCE_CODE_SECTION_ALIGN \
+ asm (TEXT_SECTION_ASM_OP); \
+}
#endif
#if defined(OBJECT_FORMAT_ELF) && defined(HAVE_LD_EH_FRAME_HDR) \
the list we left off processing, and we resume at that point,
should we be re-invoked. */
-static void
+static void __attribute__((used))
__do_global_dtors_aux (void)
{
static func_ptr *p = __DTOR_LIST__ + 1;
- static int completed;
+ static _Bool completed;
func_ptr f;
if (__builtin_expect (completed, 0))
completed = 1;
}
-
/* Stick a call to __do_global_dtors_aux into the .fini section. */
-
-static void __attribute__ ((__unused__))
-fini_dummy (void)
-{
- asm (FINI_SECTION_ASM_OP);
- CRT_CALL_STATIC_FUNCTION (__do_global_dtors_aux);
-#ifdef FORCE_FINI_SECTION_ALIGN
- FORCE_FINI_SECTION_ALIGN;
-#endif
- asm (TEXT_SECTION_ASM_OP);
-}
+CRT_CALL_STATIC_FUNCTION (FINI_SECTION_ASM_OP, __do_global_dtors_aux)
#if defined(USE_EH_FRAME_REGISTRY) || defined(JCR_SECTION_NAME)
/* Stick a call to __register_frame_info into the .init section. For some
reason calls with no arguments work more reliably in .init, so stick the
call in another function. */
-static void
+static void __attribute__((used))
frame_dummy (void)
{
#ifdef USE_EH_FRAME_REGISTRY
#endif /* JCR_SECTION_NAME */
}
-static void __attribute__ ((__unused__))
-init_dummy (void)
-{
- asm (INIT_SECTION_ASM_OP);
- CRT_CALL_STATIC_FUNCTION (frame_dummy);
-#ifdef FORCE_INIT_SECTION_ALIGN
- FORCE_INIT_SECTION_ALIGN;
-#endif
- asm (TEXT_SECTION_ASM_OP);
-}
+CRT_CALL_STATIC_FUNCTION (INIT_SECTION_ASM_OP, frame_dummy)
#endif /* EH_FRAME_SECTION_NAME || JCR_SECTION_NAME */
#else /* OBJECT_FORMAT_ELF */
such a thing) so that we can properly perform the construction of
file-scope static-storage C++ objects within shared libraries. */
-static void
+static void __attribute__((used))
__do_global_ctors_aux (void) /* prologue goes in .init section */
{
-#ifdef FORCE_INIT_SECTION_ALIGN
- FORCE_INIT_SECTION_ALIGN; /* Explicit align before switch to .text */
-#endif
+ FORCE_CODE_SECTION_ALIGN /* explicit align before switch to .text */
asm (TEXT_SECTION_ASM_OP); /* don't put epilogue and body in .init */
DO_GLOBAL_CTORS_BODY;
atexit (__do_global_dtors);
#ifdef INIT_SECTION_ASM_OP
#ifdef OBJECT_FORMAT_ELF
-
-static void
+static void __attribute__((used))
__do_global_ctors_aux (void)
{
func_ptr *p;
}
/* Stick a call to __do_global_ctors_aux into the .init section. */
-
-static void __attribute__ ((__unused__))
-init_dummy (void)
-{
- asm (INIT_SECTION_ASM_OP);
- CRT_CALL_STATIC_FUNCTION (__do_global_ctors_aux);
-#ifdef FORCE_INIT_SECTION_ALIGN
- FORCE_INIT_SECTION_ALIGN;
-#endif
- asm (TEXT_SECTION_ASM_OP);
-#ifdef CRT_END_INIT_DUMMY
- CRT_END_INIT_DUMMY;
-#endif
-}
-
+CRT_CALL_STATIC_FUNCTION (INIT_SECTION_ASM_OP, __do_global_ctors_aux)
#else /* OBJECT_FORMAT_ELF */
/* Stick the real initialization code, followed by a normal sort of
atexit (__do_global_dtors);
} /* epilogue and body go in .init section */
-#ifdef FORCE_INIT_SECTION_ALIGN
-FORCE_INIT_SECTION_ALIGN;
-#endif
-
+FORCE_CODE_SECTION_ALIGN
asm (TEXT_SECTION_ASM_OP);
#endif /* OBJECT_FORMAT_ELF */
not exist.
@findex CRT_CALL_STATIC_FUNCTION
-@item CRT_CALL_STATIC_FUNCTION
-If defined, a C statement that calls the function named as the sole
-argument of this macro. This is used in @file{crtstuff.c} if
-@code{INIT_SECTION_ASM_OP} or @code{FINI_SECTION_ASM_OP} to calls to
-initialization and finalization functions from the init and fini
-sections. By default, this macro is a simple function call. Some
+@item CRT_CALL_STATIC_FUNCTION (@var{section_op}, @var{function})
+If defined, an ASM statement that switches to a different section
+via @var{section_op}, calls @var{function}, and switches back to
+the text section. This is used in @file{crtstuff.c} if
+@code{INIT_SECTION_ASM_OP} or @code{FINI_SECTION_ASM_OP} to calls
+to initialization and finalization functions from the init and fini
+sections. By default, this macro uses a simple function call. Some
ports need hand-crafted assembly code to avoid dependencies on
registers initialized in the function prologue or to ensure that
constant pools don't end up too far way in the text section.
+@findex FORCE_CODE_SECTION_ALIGN
+@item FORCE_CODE_SECTION_ALIGN
+If defined, an ASM statement that aligns a code section to some
+arbitrary boundary. This is used to force all fragments of the
+@code{.init} and @code{.fini} sections to have to same alignment
+and thus prevent the linker from having to add any padding.
+
@findex EXTRA_SECTIONS
@findex in_text
@findex in_data