From 63abf89e1f2516f9433e77d1e788ea3e0a52d115 Mon Sep 17 00:00:00 2001 From: ro Date: Wed, 1 Jun 2011 14:39:17 +0000 Subject: gcc: * config/t-slibgcc-darwin: Move to ... * config/t-slibgcc-dummy: .. this. Clarify comments. * config.gcc (i[34567]86-*-darwin*, x86_64-*-darwin*, powerpc-*-darwin*, powerpc64-*-darwin*): Reflect this. (i[3456x]86-*-netware*): Add t-slibgcc-dummy to tmake_file. (i[34567]86-*-rtems*): Remove extra_parts. Use i386/t-rtems. Remove i386/t-crtstuff from tmake_file. (i[34567]86-*-solaris2*): Remove t-svr4, t-slibgcc-elf-ver, t-slibgcc-sld from tmake_file, add t-slibgcc-dummy. (sparc-*-elf*, sparc64-*-elf*): Remove tmake_file, extra_parts. (sparc-*-rtems*, sparc64-*-rtems*): Remove sparc/t-crtin, sparc/t-crtfm from tmake_file. (sparc*-*-solaris2*): Remove sparc/t-sol2, sparc/t-crtfm, t-slibgcc-elf-ver, t-slibgcc-sld, add t-slibgcc-dummy. Remove extra_parts. * config/t-sol2 (TARGET_LIBGCC2_CFLAGS): Define. * config/i386/t-nwld (SHLIB_LINK): Remove. * config/i386/t-rtems-i386: Rename to ... * config/i386/t-rtems: ... this. ($(T)crti.o, $(T)crtn.o): Remove. (FPBIT, DPBIT, LIB2FUNCS_EXTRA): Remove. (dp-bit.c, fp-bit.c, xp-bit.c): Remove. (EXTRA_MULTILIB_PARTS, LIBGCC, INSTALL_LIBGCC): Remove. * config/i386/t-sol2-10 (LIBGCC, INSTALL_LIBGCC, EXTRA_MULTILIB_PARTS): Remove. * config/sparc/t-sol2-64: Likewise. * config/sparc/t-sol2: Remove. * config/sparc/t-crtin: Remove. * config/sparc/gmon-sol2.c: Move to ../libgcc/config. * config/i386/gmon-sol2.c: Remove. * config/i386/sol2-c1.asm: Move to ../libgcc/config/i386/sol2-c1.S. * config/i386/sol2-ci.asm: Move to ../libgcc/config/i386/sol2-ci.S. * config/i386/sol2-cn.asm: Move to ../libgcc/config/i386/sol2-cn.S. * config/i386/sol2-gc1.asm: Remove. * config/sparc/sol2-c1.asm: Move to ../libgcc/config/sparc/sol2-c1.S. * config/sparc/sol2-ci.asm: Move to ../libgcc/config/sparc/sol2-ci.S. * config/sparc/sol2-cn.asm: Move to ../libgcc/config/sparc/sol2-cn.S. * config/t-slibgcc-sld: Remove. libgcc: * Makefile.in (cpu_type): Define. * config.host (i[34567]86-*-rtems*): Handle it. (i[34567]86-*-solaris2*): Move body ... (*-*-solaris2*): ... here. New case, generalize. (sparc-*-elf*): Handle it. (sparc-*-linux*, sparc64-*-linux*): Replace sparc/t-crtfm by t-crtfm. (sparc-*-rtems*, sparc64-*-rtems*); Handle it. (sparc64-*-solaris2*, sparcv9-*-solaris2*, sparc-*-solaris2*): Fold into ... (sparc*-*-solaris2*): ... this. New case. (sparc64-*-elf*): Handle it. * config/gmon-sol2.c: Move from ../gcc/config/sparc. Merge ../gcc/config/i386/gmon-sol2.c. * config/i386/sol2-c1.S: Move from ../gcc/config/i386/sol2-c1.asm. Use C comments. Merge ../gcc/config/i386/sol2-gc1.asm. * config/i386/sol2-ci.S: Move from ../gcc/config/i386/sol2-ci.asm. Use C comments. * config/i386/sol2-cn.S: Move from ../gcc/config/i386/sol2-cn.asm. Use C comments. * config/i386/t-crtfm (crtfastmath.o): Use $<. * config/i386/t-crtstuff: New file. * config/i386/t-softfp: New file. * config/i386/t-sol2 ($(T)gmon.o, $(T)gcrt1.o, $(T)crt1.o), $(T)crti.o, $(T)crtn.o): Remove. (gcrt1.o): New rule. (TARGET_LIBGCC2_CFLAGS): Remove. * config/sparc/sol2-c1.S: Move from ../gcc/config/sparc/sol2-c1.asm. * config/sparc/sol2-ci.S: Move from ../gcc/config/sparc/sol2-ci.asm. * config/sparc/sol2-cn.S: Move from ../gcc/config/sparc/sol2-cn.asm. * config/sparc/t-sol2: New file. * config/sparc/t-crtfm: Move to ... * config/t-crtfm: ... this. Use $(cpu_type), $<. * config/t-crtin: New file. * config/sparc/t-softfp: New file. * config/sparc/t-softmul: New file. * config/t-rtems: New file. * config/t-slibgcc: New file. * config/t-slibgcc-elf-ver: New file. * config/t-slibgcc-gld: New file. * config/t-slibgcc-sld: New file. * config/t-sol2: New file. * configure.ac: Include ../config/lib-ld.m4. Call AC_LIB_PROG_LD_GNU. Substitute cpu_type. * configure: Regenerate. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@174529 138bc75d-0d04-0410-961f-82ee72b054a4 --- libgcc/ChangeLog | 52 ++++ libgcc/Makefile.in | 3 +- libgcc/config.host | 63 +++-- libgcc/config/gmon-sol2.c | 536 ++++++++++++++++++++++++++++++++++++++++ libgcc/config/i386/sol2-c1.S | 173 +++++++++++++ libgcc/config/i386/sol2-ci.S | 40 +++ libgcc/config/i386/sol2-cn.S | 35 +++ libgcc/config/i386/t-crtfm | 3 +- libgcc/config/i386/t-crtstuff | 7 + libgcc/config/i386/t-sol2 | 24 -- libgcc/config/sparc/sol2-c1.S | 103 ++++++++ libgcc/config/sparc/sol2-ci.S | 55 +++++ libgcc/config/sparc/sol2-cn.S | 41 +++ libgcc/config/sparc/t-crtfm | 2 - libgcc/config/sparc/t-softfp | 29 +++ libgcc/config/sparc/t-softmul | 2 + libgcc/config/sparc/t-sol2 | 6 + libgcc/config/t-crtfm | 2 + libgcc/config/t-crtin | 4 + libgcc/config/t-rtems | 4 + libgcc/config/t-slibgcc | 51 ++++ libgcc/config/t-slibgcc-elf-ver | 4 + libgcc/config/t-slibgcc-gld | 5 + libgcc/config/t-slibgcc-sld | 5 + libgcc/config/t-sol2 | 34 +++ libgcc/configure | 19 ++ libgcc/configure.ac | 4 + 27 files changed, 1260 insertions(+), 46 deletions(-) create mode 100644 libgcc/config/gmon-sol2.c create mode 100644 libgcc/config/i386/sol2-c1.S create mode 100644 libgcc/config/i386/sol2-ci.S create mode 100644 libgcc/config/i386/sol2-cn.S create mode 100644 libgcc/config/i386/t-crtstuff create mode 100644 libgcc/config/sparc/sol2-c1.S create mode 100644 libgcc/config/sparc/sol2-ci.S create mode 100644 libgcc/config/sparc/sol2-cn.S delete mode 100644 libgcc/config/sparc/t-crtfm create mode 100644 libgcc/config/sparc/t-softfp create mode 100644 libgcc/config/sparc/t-softmul create mode 100644 libgcc/config/sparc/t-sol2 create mode 100644 libgcc/config/t-crtfm create mode 100644 libgcc/config/t-crtin create mode 100644 libgcc/config/t-rtems create mode 100644 libgcc/config/t-slibgcc create mode 100644 libgcc/config/t-slibgcc-elf-ver create mode 100644 libgcc/config/t-slibgcc-gld create mode 100644 libgcc/config/t-slibgcc-sld create mode 100644 libgcc/config/t-sol2 (limited to 'libgcc') diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index d8c0729814d..1a44c76f23c 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,55 @@ +2011-06-01 Rainer Orth + + * Makefile.in (cpu_type): Define. + * config.host (i[34567]86-*-rtems*): Handle it. + (i[34567]86-*-solaris2*): Move body ... + (*-*-solaris2*): ... here. + New case, generalize. + (sparc-*-elf*): Handle it. + (sparc-*-linux*, sparc64-*-linux*): Replace sparc/t-crtfm by t-crtfm. + (sparc-*-rtems*, sparc64-*-rtems*); Handle it. + (sparc64-*-solaris2*, sparcv9-*-solaris2*, sparc-*-solaris2*): + Fold into ... + (sparc*-*-solaris2*): ... this. + New case. + (sparc64-*-elf*): Handle it. + * config/gmon-sol2.c: Move from ../gcc/config/sparc. + Merge ../gcc/config/i386/gmon-sol2.c. + * config/i386/sol2-c1.S: Move from ../gcc/config/i386/sol2-c1.asm. + Use C comments. + Merge ../gcc/config/i386/sol2-gc1.asm. + * config/i386/sol2-ci.S: Move from ../gcc/config/i386/sol2-ci.asm. + Use C comments. + * config/i386/sol2-cn.S: Move from ../gcc/config/i386/sol2-cn.asm. + Use C comments. + * config/i386/t-crtfm (crtfastmath.o): Use $<. + * config/i386/t-crtstuff: New file. + * config/i386/t-softfp: New file. + * config/i386/t-sol2 ($(T)gmon.o, $(T)gcrt1.o, $(T)crt1.o), + $(T)crti.o, $(T)crtn.o): Remove. + (gcrt1.o): New rule. + (TARGET_LIBGCC2_CFLAGS): Remove. + * config/sparc/sol2-c1.S: Move from ../gcc/config/sparc/sol2-c1.asm. + * config/sparc/sol2-ci.S: Move from ../gcc/config/sparc/sol2-ci.asm. + * config/sparc/sol2-cn.S: Move from ../gcc/config/sparc/sol2-cn.asm. + * config/sparc/t-sol2: New file. + * config/sparc/t-crtfm: Move to ... + * config/t-crtfm: ... this. + Use $(cpu_type), $<. + * config/t-crtin: New file. + * config/sparc/t-softfp: New file. + * config/sparc/t-softmul: New file. + * config/t-rtems: New file. + * config/t-slibgcc: New file. + * config/t-slibgcc-elf-ver: New file. + * config/t-slibgcc-gld: New file. + * config/t-slibgcc-sld: New file. + * config/t-sol2: New file. + * configure.ac: Include ../config/lib-ld.m4. + Call AC_LIB_PROG_LD_GNU. + Substitute cpu_type. + * configure: Regenerate. + 2011-05-27 Bernd Schmidt PR bootstrap/49173 diff --git a/libgcc/Makefile.in b/libgcc/Makefile.in index 557fab36e48..4a075ff8f29 100644 --- a/libgcc/Makefile.in +++ b/libgcc/Makefile.in @@ -1,6 +1,6 @@ # Makefile.in -# Copyright (C) 2005, 2006, 2009, 2010 Free Software Foundation +# Copyright (C) 2005, 2006, 2009, 2010, 2011 Free Software Foundation # # This file is part of GCC. # @@ -35,6 +35,7 @@ shlib_slibdir = @slibdir@ SHELL = @SHELL@ +cpu_type = @cpu_type@ enable_shared = @enable_shared@ decimal_float = @decimal_float@ enable_decimal_float = @enable_decimal_float@ diff --git a/libgcc/config.host b/libgcc/config.host index e3c48bb7f46..8b1113b9067 100644 --- a/libgcc/config.host +++ b/libgcc/config.host @@ -1,6 +1,6 @@ # libgcc host-specific configuration file. # Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, -# 2008, 2009, 2010 Free Software Foundation, Inc. +# 2008, 2009, 2010, 2011 Free Software Foundation, Inc. #This file is part of GCC. @@ -168,6 +168,31 @@ case ${host} in ;; *-*-rtems*) ;; +*-*-solaris2*) + tmake_file="$tmake_file t-sol2 t-slibgcc t-slibgcc-elf-ver" + if test $with_gnu_ld = yes; then + tmake_file="$tmake_file t-slibgcc-gld" + else + tmake_file="$tmake_file t-slibgcc-sld" + fi + # Add cpu-specific t-sol2 after t-slibgcc-* so it can augment SHLIB_MAPFILES. + tmake_file="$tmake_file $cpu_type/t-sol2" + extra_parts="gmon.o crtbegin.o crtend.o" + case ${host} in + i?86-*-solaris2.1[0-9]*) + # Solaris 10+/x86 provides crt1.o, crti.o, crtn.o, and gcrt1.o as + # part of the base system. + ;; + sparc*-*-solaris2.1[0-9]*) + # Solaris 10+/SPARC lacks crt1.o and gcrt1.o. + extra_parts="$extra_parts crt1.o gcrt1.o" + ;; + *) + tmake_file="$tmake_file t-crtin" + extra_parts="$extra_parts crt1.o crti.o crtn.o gcrt1.o" + ;; + esac + ;; *-*-vxworks*) ;; *-*-elf) @@ -309,19 +334,10 @@ i[3456x]86-*-netware*) i[34567]86-*-nto-qnx*) ;; i[34567]86-*-rtems*) + extra_parts="crtbegin.o crtend.o crti.o crtn.o" + tmake_file="${tmake_file} t-crtin i386/t-softfp i386/t-crtstuff t-rtems" ;; i[34567]86-*-solaris2*) - tmake_file="${tmake_file} i386/t-sol2" - case ${host} in - *-*-solaris2.1[0-9]*) - # Solaris 2.10 provides crt1.o, crti.o, crtn.o, and gcrt1.o as - # part of the base system. - extra_parts="gmon.o crtbegin.o crtend.o" - ;; - *) - extra_parts="crt1.o crti.o crtn.o gcrt1.o gmon.o crtbegin.o crtend.o" - ;; - esac ;; i[4567]86-wrs-vxworks|i[4567]86-wrs-vxworksae) ;; @@ -519,18 +535,31 @@ sparc-*-netbsdelf*) sparc64-*-openbsd*) ;; sparc-*-elf*) + case ${host} in + *-leon[3-9]*) + ;; + *) + tmake_file="sparc/t-softmul" + ;; + esac + tmake_file="${tmake_file} sparc/t-softfp t-crtin t-crtfm" + extra_parts="crtbegin.o crtend.o crti.o crtn.o crtfastmath.o" ;; sparc-*-linux*) # SPARC's running GNU/Linux, libc6 extra_parts="$extra_parts crtfastmath.o" - tmake_file="${tmake_file} sparc/t-crtfm" + tmake_file="${tmake_file} t-crtfm" ;; sparc-*-rtems* | sparc64-*-rtems* ) + tmake_file="sparc/t-elf t-crtin t-crtfm t-rtems" + extra_parts="crtbegin.o crtend.o crti.o crtn.o crtfastmath.o" ;; -sparc64-*-solaris2* | sparcv9-*-solaris2*) - ;; -sparc-*-solaris2*) +sparc*-*-solaris2*) + tmake_file="$tmake_file t-crtfm" + extra_parts="$extra_parts crtfastmath.o" ;; sparc64-*-elf*) + tmake_file="${tmake_file} t-crtin t-crtfm" + extra_parts="crtbegin.o crtend.o crti.o crtn.o crtfastmath.o" ;; sparc-wrs-vxworks) ;; @@ -538,7 +567,7 @@ sparc64-*-freebsd*|ultrasparc-*-freebsd*) ;; sparc64-*-linux*) # 64-bit SPARC's running GNU/Linux extra_parts="$extra_parts crtfastmath.o" - tmake_file="${tmake_file} sparc/t-crtfm" + tmake_file="${tmake_file} t-crtfm" ;; sparc64-*-netbsd*) ;; diff --git a/libgcc/config/gmon-sol2.c b/libgcc/config/gmon-sol2.c new file mode 100644 index 00000000000..614a1126b1e --- /dev/null +++ b/libgcc/config/gmon-sol2.c @@ -0,0 +1,536 @@ +/*- + * Copyright (c) 1991 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. [rescinded 22 July 1999] + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* FIXME: Check comment. */ +/* Mangled into a form that works on SPARC Solaris 2 by Mark Eichin + * for Cygnus Support, July 1992. + * + * This is a modified gmon.c by J.W.Hawtin , + * 14/8/96 based on the original gmon.c in GCC and the hacked version + * solaris 2 sparc version (config/sparc/gmon-sol.c) by Mark Eichin. To do + * process profiling on solaris 2.X X86 + * + * It must be used in conjunction with sol2-gc1.asm, which is used to start + * and stop process monitoring. + * + * Differences. + * + * On Solaris 2 _mcount is called by library functions not mcount, so support + * has been added for both. + * + * Also the prototype for profil() is different + * + * Solaris 2 does not seem to have char *minbrk whcih allows the setting of + * the minimum SBRK region so this code has been removed and lets pray malloc + * does not mess it up. + * + * Notes + * + * This code could easily be integrated with the original gmon.c and perhaps + * should be. + */ +#include "tconfig.h" +#include "tsystem.h" +#include /* for creat() */ + +#ifdef DEBUG +#include +#endif + +static void moncontrol (int); +extern void monstartup (char *, char *); +extern void _mcleanup (void); + +struct phdr { + char *lpc; + char *hpc; + int ncnt; +}; + + +#define HISTFRACTION 2 +#define HISTCOUNTER unsigned short +#define HASHFRACTION 1 +#define ARCDENSITY 2 +#define MINARCS 50 +#define BASEADDRESS 0x8000000 /* On Solaris 2 X86 all executables start here + and not at 0 */ + +struct tostruct { + char *selfpc; + long count; + unsigned short link; +}; + +struct rawarc { + unsigned long raw_frompc; + unsigned long raw_selfpc; + long raw_count; +}; +#define ROUNDDOWN(x,y) (((x)/(y))*(y)) +#define ROUNDUP(x,y) ((((x)+(y)-1)/(y))*(y)) + +/* extern mcount() asm ("mcount"); */ +/*extern*/ char *minbrk /* asm ("minbrk") */; +typedef __SIZE_TYPE__ size_t; +typedef __PTRDIFF_TYPE__ intptr_t; + +extern int errno; + +extern void *sbrk (intptr_t); + + /* + * froms is actually a bunch of unsigned shorts indexing tos + */ +static int profiling = 3; +static unsigned short *froms; +static struct tostruct *tos = 0; +static long tolimit = 0; +static char *s_lowpc = 0; +static char *s_highpc = 0; +static size_t s_textsize = 0; + +static int ssiz; +static char *sbuf; +static int s_scale; + /* see profil(2) where this is describe (incorrectly) */ +#define SCALE_1_TO_1 0x10000L + +#define MSG "No space for profiling buffer(s)\n" + +static void moncontrol (int); +extern void monstartup (char *, char *); +extern void _mcleanup (void); + +void monstartup(char *lowpc, char *highpc) +{ + size_t monsize; + char *buffer; + register size_t o; + + /* + * round lowpc and highpc to multiples of the density we're using + * so the rest of the scaling (here and in gprof) stays in ints. + */ + lowpc = (char *) + ROUNDDOWN((size_t)lowpc, HISTFRACTION*sizeof(HISTCOUNTER)); + s_lowpc = lowpc; + highpc = (char *) + ROUNDUP((size_t)highpc, HISTFRACTION*sizeof(HISTCOUNTER)); + s_highpc = highpc; + s_textsize = highpc - lowpc; + monsize = (s_textsize / HISTFRACTION) + sizeof(struct phdr); + buffer = (char *) sbrk( monsize ); + if ( buffer == (char *) -1 ) { + write( 2 , MSG , sizeof(MSG) ); + return; + } + froms = (unsigned short *) sbrk( s_textsize / HASHFRACTION ); + if ( froms == (unsigned short *) -1 ) { + write( 2 , MSG , sizeof(MSG) ); + froms = 0; + return; + } + tolimit = s_textsize * ARCDENSITY / 100; + if ( tolimit < MINARCS ) { + tolimit = MINARCS; + } else if ( tolimit > 65534 ) { + tolimit = 65534; + } + tos = (struct tostruct *) sbrk( tolimit * sizeof( struct tostruct ) ); + if ( tos == (struct tostruct *) -1 ) { + write( 2 , MSG , sizeof(MSG) ); + froms = 0; + tos = 0; + return; + } + minbrk = sbrk(0); + tos[0].link = 0; + sbuf = buffer; + ssiz = monsize; + ( (struct phdr *) buffer ) -> lpc = lowpc; + ( (struct phdr *) buffer ) -> hpc = highpc; + ( (struct phdr *) buffer ) -> ncnt = ssiz; + monsize -= sizeof(struct phdr); + if ( monsize <= 0 ) + return; + o = highpc - lowpc; + if( monsize < o ) +#ifndef hp300 + s_scale = ( (float) monsize / o ) * SCALE_1_TO_1; +#else /* avoid floating point */ + { + int quot = o / monsize; + + if (quot >= 0x10000) + s_scale = 1; + else if (quot >= 0x100) + s_scale = 0x10000 / quot; + else if (o >= 0x800000) + s_scale = 0x1000000 / (o / (monsize >> 8)); + else + s_scale = 0x1000000 / ((o << 8) / monsize); + } +#endif + else + s_scale = SCALE_1_TO_1; + moncontrol(1); +} + +void +_mcleanup(void) +{ + int fd; + int fromindex; + int endfrom; + char *frompc; + int toindex; + struct rawarc rawarc; + char *profdir; + const char *proffile; + char *progname; + char buf[PATH_MAX]; + extern char **___Argv; + + moncontrol(0); + + if ((profdir = getenv("PROFDIR")) != NULL) { + /* If PROFDIR contains a null value, no profiling output is produced */ + if (*profdir == '\0') { + return; + } + + progname=strrchr(___Argv[0], '/'); + if (progname == NULL) + progname=___Argv[0]; + else + progname++; + + sprintf(buf, "%s/%ld.%s", profdir, (long) getpid(), progname); + proffile = buf; + } else { + proffile = "gmon.out"; + } + + fd = creat( proffile, 0666 ); + if ( fd < 0 ) { + perror( proffile ); + return; + } +# ifdef DEBUG + fprintf( stderr , "[mcleanup] sbuf %#x ssiz %d\n" , sbuf , ssiz ); +# endif /* DEBUG */ + + write( fd , sbuf , ssiz ); + endfrom = s_textsize / (HASHFRACTION * sizeof(*froms)); + for ( fromindex = 0 ; fromindex < endfrom ; fromindex++ ) { + if ( froms[fromindex] == 0 ) { + continue; + } + frompc = s_lowpc + (fromindex * HASHFRACTION * sizeof(*froms)); + for (toindex=froms[fromindex]; toindex!=0; toindex=tos[toindex].link) { +# ifdef DEBUG + fprintf( stderr , + "[mcleanup] frompc %#x selfpc %#x count %d\n" , + frompc , tos[toindex].selfpc , tos[toindex].count ); +# endif /* DEBUG */ + rawarc.raw_frompc = (unsigned long) frompc; + rawarc.raw_selfpc = (unsigned long) tos[toindex].selfpc; + rawarc.raw_count = tos[toindex].count; + write( fd , &rawarc , sizeof rawarc ); + } + } + close( fd ); +} + +#ifdef __sparc__ +/* + * The SPARC stack frame is only held together by the frame pointers + * in the register windows. According to the SVR4 SPARC ABI + * Supplement, Low Level System Information/Operating System + * Interface/Software Trap Types, a type 3 trap will flush all of the + * register windows to the stack, which will make it possible to walk + * the frames and find the return addresses. + * However, it seems awfully expensive to incur a trap (system + * call) for every function call. It turns out that "call" simply puts + * the return address in %o7 expecting the "save" in the procedure to + * shift it into %i7; this means that before the "save" occurs, %o7 + * contains the address of the call to mcount, and %i7 still contains + * the caller above that. The asm mcount here simply saves those + * registers in argument registers and branches to internal_mcount, + * simulating a call with arguments. + * Kludges: + * 1) the branch to internal_mcount is hard coded; it should be + * possible to tell asm to use the assembler-name of a symbol. + * 2) in theory, the function calling mcount could have saved %i7 + * somewhere and reused the register; in practice, I *think* this will + * break longjmp (and maybe the debugger) but I'm not certain. (I take + * some comfort in the knowledge that it will break the native mcount + * as well.) + * 3) if builtin_return_address worked, this could be portable. + * However, it would really have to be optimized for arguments of 0 + * and 1 and do something like what we have here in order to avoid the + * trap per function call performance hit. + * 4) the atexit and monsetup calls prevent this from simply + * being a leaf routine that doesn't do a "save" (and would thus have + * access to %o7 and %i7 directly) but the call to write() at the end + * would have also prevented this. + * + * -- [eichin:19920702.1107EST] + */ + +static void internal_mcount (char *, unsigned short *) __attribute__ ((used)); + +/* i7 == last ret, -> frompcindex */ +/* o7 == current ret, -> selfpc */ +/* Solaris 2 libraries use _mcount. */ +asm(".global _mcount; _mcount: mov %i7,%o1; mov %o7,%o0;b,a internal_mcount"); +/* This is for compatibility with old versions of gcc which used mcount. */ +asm(".global mcount; mcount: mov %i7,%o1; mov %o7,%o0;b,a internal_mcount"); +#elif defined __x86_64__ +extern void internal_mcount (char *, unsigned short *); + +/* See GLIBC for additional information about this technique. */ +asm(".globl _mcount\n" + "\t.type\t_mcount, @function\n" + "_mcount:\n" + /* The compiler calls _mcount after the prologue, and does not + save any of the registers. Therefore we must preserve all + seven registers which may contain function arguments. */ + "\tsubq\t$0x38,%rsp\n" + "\tmovq\t%rax,(%rsp)\n" + "\tmovq\t%rcx,0x08(%rsp)\n" + "\tmovq\t%rdx,0x10(%rsp)\n" + "\tmovq\t%rsi,0x18(%rsp)\n" + "\tmovq\t%rdi,0x20(%rsp)\n" + "\tmovq\t%r8,0x28(%rsp)\n" + "\tmovq\t%r9,0x30(%rsp)\n" + /* Get SELFPC (pushed by the call to this function) and + FROMPCINDEX (via the frame pointer. */ + "\tmovq\t0x38(%rsp),%rdi\n" + "\tmovq\t0x8(%rbp),%rsi\n" + "\tcall\tinternal_mcount\n" + /* Restore the saved registers. */ + "\tmovq\t0x30(%rsp),%r9\n" + "\tmovq\t0x28(%rsp),%r8\n" + "\tmovq\t0x20(%rsp),%rdi\n" + "\tmovq\t0x18(%rsp),%rsi\n" + "\tmovq\t0x10(%rsp),%rdx\n" + "\tmovq\t0x08(%rsp),%rcx\n" + "\tmovq\t(%rsp),%rax\n" + "\taddq\t$0x38,%rsp\n" + "\tretq\n" + ); +#else +extern void internal_mcount (void); + + /* Solaris 2 libraries use _mcount. */ +asm(".globl _mcount; _mcount: jmp internal_mcount"); + /* This is for compatibility with old versions of gcc which used mcount. */ +asm(".globl mcount; mcount: jmp internal_mcount"); +#endif + +#ifdef __sparc__ +static +#endif +void +internal_mcount ( +#if defined __sparc__ || defined __x86_64__ + char *selfpc, + unsigned short *frompcindex +#else + void +#endif + ) +{ +#if !defined __sparc__ && !defined __x86_64__ + register char *selfpc; + register unsigned short *frompcindex; +#endif + register struct tostruct *top; + register struct tostruct *prevtop; + register long toindex; + static char already_setup; + +#if !defined __sparc__ && !defined __x86_64__ + /* + * find the return address for mcount, + * and the return address for mcount's caller. + */ + + /* selfpc = pc pushed by mcount call. + This identifies the function that was just entered. */ + selfpc = (void *) __builtin_return_address (0); + /* frompcindex = pc in preceding frame. + This identifies the caller of the function just entered. */ + frompcindex = (void *) __builtin_return_address (1); +#endif + + if(!already_setup) { + extern char etext[]; +#ifdef __sparc__ + extern char _start[]; + extern char _init[]; +#endif + already_setup = 1; +#if defined __sparc__ + monstartup(_start < _init ? _start : _init, etext); +#elif defined __x86_64__ + monstartup(0, etext); +#else + monstartup((char*)0x08040000, etext); +#endif +#ifdef USE_ONEXIT + on_exit(_mcleanup, 0); +#else + atexit(_mcleanup); +#endif + } + /* + * check that we are profiling + * and that we aren't recursively invoked. + */ + if (profiling) { + goto out; + } + profiling++; + /* + * check that frompcindex is a reasonable pc value. + * for example: signal catchers get called from the stack, + * not from text space. too bad. + */ + frompcindex = (unsigned short *)((long)frompcindex - (long)s_lowpc); + if ((unsigned long)frompcindex > s_textsize) { + goto done; + } + frompcindex = + &froms[((long)frompcindex) / (HASHFRACTION * sizeof(*froms))]; + toindex = *frompcindex; + if (toindex == 0) { + /* + * first time traversing this arc + */ + toindex = ++tos[0].link; + if (toindex >= tolimit) { + goto overflow; + } + *frompcindex = toindex; + top = &tos[toindex]; + top->selfpc = selfpc; + top->count = 1; + top->link = 0; + goto done; + } + top = &tos[toindex]; + if (top->selfpc == selfpc) { + /* + * arc at front of chain; usual case. + */ + top->count++; + goto done; + } + /* + * have to go looking down chain for it. + * top points to what we are looking at, + * prevtop points to previous top. + * we know it is not at the head of the chain. + */ + for (; /* goto done */; ) { + if (top->link == 0) { + /* + * top is end of the chain and none of the chain + * had top->selfpc == selfpc. + * so we allocate a new tostruct + * and link it to the head of the chain. + */ + toindex = ++tos[0].link; + if (toindex >= tolimit) { + goto overflow; + } + top = &tos[toindex]; + top->selfpc = selfpc; + top->count = 1; + top->link = *frompcindex; + *frompcindex = toindex; + goto done; + } + /* + * otherwise, check the next arc on the chain. + */ + prevtop = top; + top = &tos[top->link]; + if (top->selfpc == selfpc) { + /* + * there it is. + * increment its count + * move it to the head of the chain. + */ + top->count++; + toindex = prevtop->link; + prevtop->link = top->link; + top->link = *frompcindex; + *frompcindex = toindex; + goto done; + } + + } +done: + profiling--; + /* and fall through */ +out: + return; /* normal return restores saved registers */ + +overflow: + profiling++; /* halt further profiling */ +# define TOLIMIT "mcount: tos overflow\n" + write(2, TOLIMIT, sizeof(TOLIMIT)); + goto out; +} + +/* + * Control profiling + * profiling is what mcount checks to see if + * all the data structures are ready. + */ +static void moncontrol(int mode) +{ + if (mode) { + /* start */ + profil((unsigned short *)(sbuf + sizeof(struct phdr)), + ssiz - sizeof(struct phdr), + (size_t)s_lowpc, s_scale); + + profiling = 0; + } else { + /* stop */ + profil((unsigned short *)0, 0, 0, 0); + profiling = 3; + } +} diff --git a/libgcc/config/i386/sol2-c1.S b/libgcc/config/i386/sol2-c1.S new file mode 100644 index 00000000000..b2e473f5b9c --- /dev/null +++ b/libgcc/config/i386/sol2-c1.S @@ -0,0 +1,173 @@ +/* crt1.s for Solaris 2, x86 + + Copyright (C) 1993, 1998, 2008, 2009, 2011 Free Software Foundation, Inc. + Written By Fred Fish, Nov 1992 + +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 3, or (at your option) any +later version. + +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. + +Under Section 7 of GPL version 3, you are granted additional +permissions described in the GCC Runtime Library Exception, version +3.1, as published by the Free Software Foundation. + +You should have received a copy of the GNU General Public License and +a copy of the GCC Runtime Library Exception along with this program; +see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +. */ + + +/* This file takes control of the process from the kernel, as specified + in section 3 of the System V Application Binary Interface, Intel386 + Processor Supplement. It has been constructed from information obtained + from the ABI, information obtained from single stepping existing + Solaris executables through their startup code with gdb, and from + information obtained by single stepping executables on other i386 SVR4 + implementations. This file is the first thing linked into any + executable. */ + +#ifndef GCRT1 + .ident "GNU C crt1.s" +#define CLEANUP _cleanup +#else +/* This is a modified crt1.s by J.W.Hawtin 15/8/96, + to allow program profiling, by calling monstartup on entry and _mcleanup + on exit. */ + .ident "GNU C gcrt1.s" +#define CLEANUP _mcleanup +#endif + .weak _cleanup + .weak _DYNAMIC + .text + +/* Start creating the initial frame by pushing a NULL value for the return + address of the initial frame, and mark the end of the stack frame chain + (the innermost stack frame) with a NULL value, per page 3-32 of the ABI. + Initialize the first stack frame pointer in %ebp (the contents of which + are unspecified at process initialization). */ + + .globl _start +_start: + pushl $0x0 + pushl $0x0 + movl %esp,%ebp + +/* As specified per page 3-32 of the ABI, %edx contains a function + pointer that should be registered with atexit(), for proper + shared object termination. Just push it onto the stack for now + to preserve it. We want to register _cleanup() first. */ + + pushl %edx + +/* Check to see if there is an _cleanup() function linked in, and if + so, register it with atexit() as the last thing to be run by + atexit(). */ + + movl $CLEANUP,%eax + testl %eax,%eax + je .L1 + pushl $CLEANUP + call atexit + addl $0x4,%esp +.L1: + +/* Now check to see if we have an _DYNAMIC table, and if so then + we need to register the function pointer previously in %edx, but + now conveniently saved on the stack as the argument to pass to + atexit(). */ + + movl $_DYNAMIC,%eax + testl %eax,%eax + je .L2 + call atexit +.L2: + +/* Register _fini() with atexit(). We will take care of calling _init() + directly. */ + + pushl $_fini + call atexit + +#ifdef GCRT1 +/* Start profiling. */ + + pushl %ebp + movl %esp,%ebp + pushl $_etext + pushl $_start + call monstartup + addl $8,%esp + popl %ebp +#endif + +/* Compute the address of the environment vector on the stack and load + it into the global variable _environ. Currently argc is at 8 off + the frame pointer. Fetch the argument count into %eax, scale by the + size of each arg (4 bytes) and compute the address of the environment + vector which is 16 bytes (the two zero words we pushed, plus argc, + plus the null word terminating the arg vector) further up the stack, + off the frame pointer (whew!). */ + + movl 8(%ebp),%eax + leal 16(%ebp,%eax,4),%edx + movl %edx,_environ + +/* Push the environment vector pointer, the argument vector pointer, + and the argument count on to the stack to set up the arguments + for _init(), _fpstart(), and main(). Note that the environment + vector pointer and the arg count were previously loaded into + %edx and %eax respectively. The only new value we need to compute + is the argument vector pointer, which is at a fixed address off + the initial frame pointer. */ + +/* Make sure the stack is properly aligned. */ + andl $0xfffffff0,%esp + subl $4,%esp + + pushl %edx + leal 12(%ebp),%edx + pushl %edx + pushl %eax + +/* Call _init(argc, argv, environ), _fpstart(argc, argv, environ), and + main(argc, argv, environ). */ + + call _init + call __fpstart + call main + +/* Pop the argc, argv, and environ arguments off the stack, push the + value returned from main(), and call exit(). */ + + addl $12,%esp + pushl %eax + call exit + +/* An inline equivalent of _exit, as specified in Figure 3-26 of the ABI. */ + + pushl $0x0 + movl $0x1,%eax + lcall $7,$0 + +/* If all else fails, just try a halt! */ + + hlt + .type _start,@function + .size _start,.-_start + +#ifndef GCRT1 +/* A dummy profiling support routine for non-profiling executables, + in case we link in some objects that have been compiled for profiling. */ + + .weak _mcount +_mcount: + ret + .type _mcount,@function + .size _mcount,.-_mcount +#endif diff --git a/libgcc/config/i386/sol2-ci.S b/libgcc/config/i386/sol2-ci.S new file mode 100644 index 00000000000..61e1436f560 --- /dev/null +++ b/libgcc/config/i386/sol2-ci.S @@ -0,0 +1,40 @@ +/* crti.s for Solaris 2, x86. + + Copyright (C) 1993, 2008, 2009 Free Software Foundation, Inc. + Written By Fred Fish, Nov 1992 + +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 3, or (at your option) any +later version. + +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. + +Under Section 7 of GPL version 3, you are granted additional +permissions described in the GCC Runtime Library Exception, version +3.1, as published by the Free Software Foundation. + +You should have received a copy of the GNU General Public License and +a copy of the GCC Runtime Library Exception along with this program; +see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +. */ + + +/* This file just supplies labeled starting points for the .init and .fini + sections. It is linked in before the values-Xx.o files and also before + crtbegin.o. */ + + .ident "GNU C crti.s" + + .section .init + .globl _init + .type _init,@function +_init: + + .section .fini + .globl _fini + .type _fini,@function +_fini: diff --git a/libgcc/config/i386/sol2-cn.S b/libgcc/config/i386/sol2-cn.S new file mode 100644 index 00000000000..993675d2341 --- /dev/null +++ b/libgcc/config/i386/sol2-cn.S @@ -0,0 +1,35 @@ +/* crtn.s for Solaris 2, x86. + + Copyright (C) 1993, 2008, 2009 Free Software Foundation, Inc. + Written By Fred Fish, Nov 1992 + +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 3, or (at your option) any +later version. + +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. + +Under Section 7 of GPL version 3, you are granted additional +permissions described in the GCC Runtime Library Exception, version +3.1, as published by the Free Software Foundation. + +You should have received a copy of the GNU General Public License and +a copy of the GCC Runtime Library Exception along with this program; +see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +. */ + + +/* This file just supplies returns for the .init and .fini sections. It is + linked in after all other files. */ + + .ident "GNU C crtn.o" + + .section .init + ret $0x0 + + .section .fini + ret $0x0 diff --git a/libgcc/config/i386/t-crtfm b/libgcc/config/i386/t-crtfm index 6e89296b2b3..f71f99a7123 100644 --- a/libgcc/config/i386/t-crtfm +++ b/libgcc/config/i386/t-crtfm @@ -1,5 +1,4 @@ # This is an endfile, Use -minline-all-stringops to ensure # that __builtin_memset doesn't refer to the lib function memset(). crtfastmath.o: $(gcc_srcdir)/config/i386/crtfastmath.c - $(gcc_compile) -msse -minline-all-stringops -c \ - $(gcc_srcdir)/config/i386/crtfastmath.c + $(gcc_compile) -msse -minline-all-stringops -c $< diff --git a/libgcc/config/i386/t-crtstuff b/libgcc/config/i386/t-crtstuff new file mode 100644 index 00000000000..c14dd9411ae --- /dev/null +++ b/libgcc/config/i386/t-crtstuff @@ -0,0 +1,7 @@ +# The pushl in CTOR initialization interferes with frame pointer elimination. +# crtend*.o cannot be compiled without -fno-asynchronous-unwind-tables, +# because then __FRAME_END__ might not be the last thing in .eh_frame +# section. -fno-asynchronous-unwind-tables is off by default for i386 +# and is on by default for x86-64. We turn it off for both i386 and +# x86-64. +CRTSTUFF_T_CFLAGS += -fno-omit-frame-pointer -fno-asynchronous-unwind-tables diff --git a/libgcc/config/i386/t-sol2 b/libgcc/config/i386/t-sol2 index 883b1a92acc..1102146a589 100644 --- a/libgcc/config/i386/t-sol2 +++ b/libgcc/config/i386/t-sol2 @@ -1,25 +1,3 @@ -# gmon build rule: -$(T)gmon.o: $(gcc_srcdir)/config/i386/gmon-sol2.c $(GCC_PASSES) $(CONFIG_H) - $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(CFLAGS) \ - -c $(gcc_srcdir)/config/i386/gmon-sol2.c -o $(T)gmon.o - -# Assemble startup files. -# Apparently Sun believes that assembler files don't need comments, because no -# single ASCII character is valid (tried them all). So we manually strip out -# the comments with sed. This bug may only be in the Early Access releases. -$(T)gcrt1.o: $(gcc_srcdir)/config/i386/sol2-gc1.asm $(GCC_PASSES) - sed -e '/^!/d' <$(gcc_srcdir)/config/i386/sol2-gc1.asm >gcrt1.s - $(GCC_FOR_TARGET) $(CFLAGS) -c -o $(T)gcrt1.o gcrt1.s -$(T)crt1.o: $(gcc_srcdir)/config/i386/sol2-c1.asm $(GCC_PASSES) - sed -e '/^!/d' <$(gcc_srcdir)/config/i386/sol2-c1.asm >crt1.s - $(GCC_FOR_TARGET) $(CFLAGS) -c -o $(T)crt1.o crt1.s -$(T)crti.o: $(gcc_srcdir)/config/i386/sol2-ci.asm $(GCC_PASSES) - sed -e '/^!/d' <$(gcc_srcdir)/config/i386/sol2-ci.asm >crti.s - $(GCC_FOR_TARGET) $(CFLAGS) -c -o $(T)crti.o crti.s -$(T)crtn.o: $(gcc_srcdir)/config/i386/sol2-cn.asm $(GCC_PASSES) - sed -e '/^!/d' <$(gcc_srcdir)/config/i386/sol2-cn.asm >crtn.s - $(GCC_FOR_TARGET) $(CFLAGS) -c -o $(T)crtn.o crtn.s - # We need to use -fPIC when we are using gcc to compile the routines in # crtstuff.c. This is only really needed when we are going to use gcc/g++ # to produce a shared library, but since we don't know ahead of time when @@ -29,9 +7,7 @@ $(T)crtn.o: $(gcc_srcdir)/config/i386/sol2-cn.asm $(GCC_PASSES) # We must also enable optimization to avoid having any code appear after # the call & alignment statement, but before we switch back to the # .text section. - CRTSTUFF_T_CFLAGS = -fPIC -O2 -TARGET_LIBGCC2_CFLAGS = -fPIC # Add support for the introduction of 128-bit long double. SHLIB_MAPFILES += $(srcdir)/config/i386/libgcc-sol2.ver diff --git a/libgcc/config/sparc/sol2-c1.S b/libgcc/config/sparc/sol2-c1.S new file mode 100644 index 00000000000..63aa748e879 --- /dev/null +++ b/libgcc/config/sparc/sol2-c1.S @@ -0,0 +1,103 @@ +! crt1.s for sparc & sparcv9 (SunOS 5) + +! Copyright (C) 1992, 2009 Free Software Foundation, Inc. +! Written By David Vinayak Henkel-Wallace, June 1992 +! +! 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 3, or (at your option) any +! later version. +! +! 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. +! +! Under Section 7 of GPL version 3, you are granted additional +! permissions described in the GCC Runtime Library Exception, version +! 3.1, as published by the Free Software Foundation. +! +! You should have received a copy of the GNU General Public License and +! a copy of the GCC Runtime Library Exception along with this program; +! see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +! . + +! This file takes control of the process from the kernel, as specified +! in section 3 of the SVr4 ABI. +! This file is the first thing linked into any executable. + +#ifdef __sparcv9 +#define CPTRSIZE 8 +#define CPTRSHIFT 3 +#define STACK_BIAS 2047 +#define ldn ldx +#define stn stx +#define setn(s, scratch, dst) setx s, scratch, dst +#else +#define CPTRSIZE 4 +#define CPTRSHIFT 2 +#define STACK_BIAS 0 +#define ldn ld +#define stn st +#define setn(s, scratch, dst) set s, dst +#endif + + .section ".text" + .proc 022 + .global _start + +_start: + mov 0, %fp ! Mark bottom frame pointer + ldn [%sp + (16 * CPTRSIZE) + STACK_BIAS], %l0 ! argc + add %sp, (17 * CPTRSIZE) + STACK_BIAS, %l1 ! argv + + ! Leave some room for a call. Sun leaves 32 octets (to sit on + ! a cache line?) so we do too. +#ifdef __sparcv9 + sub %sp, 48, %sp +#else + sub %sp, 32, %sp +#endif + + ! %g1 may contain a function to be registered w/atexit + orcc %g0, %g1, %g0 +#ifdef __sparcv9 + be %xcc, .nope +#else + be .nope +#endif + mov %g1, %o0 + call atexit + nop +.nope: + ! Now make sure constructors and destructors are handled. + setn(_fini, %o1, %o0) + call atexit, 1 + nop + call _init, 0 + nop + + ! We ignore the auxiliary vector; there is no defined way to + ! access those data anyway. Instead, go straight to main: + mov %l0, %o0 ! argc + mov %l1, %o1 ! argv +#ifdef GCRT1 + setn(___Argv, %o4, %o3) + stn %o1, [%o3] ! *___Argv +#endif + ! Skip argc words past argv, to env: + sll %l0, CPTRSHIFT, %o2 + add %o2, CPTRSIZE, %o2 + add %l1, %o2, %o2 ! env + setn(_environ, %o4, %o3) + stn %o2, [%o3] ! *_environ + call main, 4 + nop + call exit, 0 + nop + call _exit, 0 + nop + ! We should never get here. + + .type _start,#function + .size _start,.-_start diff --git a/libgcc/config/sparc/sol2-ci.S b/libgcc/config/sparc/sol2-ci.S new file mode 100644 index 00000000000..8825f795834 --- /dev/null +++ b/libgcc/config/sparc/sol2-ci.S @@ -0,0 +1,55 @@ +! crti.s for solaris 2.0. + +! Copyright (C) 1992, 2008, 2009 Free Software Foundation, Inc. +! Written By David Vinayak Henkel-Wallace, June 1992 +! +! 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 3, or (at your option) any +! later version. +! +! 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. +! +! Under Section 7 of GPL version 3, you are granted additional +! permissions described in the GCC Runtime Library Exception, version +! 3.1, as published by the Free Software Foundation. +! +! You should have received a copy of the GNU General Public License and +! a copy of the GCC Runtime Library Exception along with this program; +! see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +! . + +! This file just make a stack frame for the contents of the .fini and +! .init sections. Users may put any desired instructions in those +! sections. + +! This file is linked in before the Values-Xx.o files and also before +! crtbegin, with which perhaps it should be merged. + + .section ".init" + .proc 022 + .global _init + .type _init,#function + .align 4 +_init: +#ifdef __sparcv9 + save %sp, -176, %sp +#else + save %sp, -96, %sp +#endif + + + .section ".fini" + .proc 022 + .global _fini + .type _fini,#function + .align 4 +_fini: +#ifdef __sparcv9 + save %sp, -176, %sp +#else + save %sp, -96, %sp +#endif diff --git a/libgcc/config/sparc/sol2-cn.S b/libgcc/config/sparc/sol2-cn.S new file mode 100644 index 00000000000..b92f3cf08d6 --- /dev/null +++ b/libgcc/config/sparc/sol2-cn.S @@ -0,0 +1,41 @@ +! crtn.s for solaris 2.0. + +! Copyright (C) 1992, 2008, 2009 Free Software Foundation, Inc. +! Written By David Vinayak Henkel-Wallace, June 1992 +! +! 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 3, or (at your option) any +! later version. +! +! 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. +! +! Under Section 7 of GPL version 3, you are granted additional +! permissions described in the GCC Runtime Library Exception, version +! 3.1, as published by the Free Software Foundation. +! +! You should have received a copy of the GNU General Public License and +! a copy of the GCC Runtime Library Exception along with this program; +! see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +! . + +! This file just makes sure that the .fini and .init sections do in +! fact return. Users may put any desired instructions in those sections. +! This file is the last thing linked into any executable. + + .section ".init" + .align 4 + + ret + restore + + .section ".fini" + .align 4 + + ret + restore + +! Th-th-th-that is all folks! diff --git a/libgcc/config/sparc/t-crtfm b/libgcc/config/sparc/t-crtfm deleted file mode 100644 index d6d616f1713..00000000000 --- a/libgcc/config/sparc/t-crtfm +++ /dev/null @@ -1,2 +0,0 @@ -crtfastmath.o: $(gcc_srcdir)/config/sparc/crtfastmath.c - $(gcc_compile) -c $(gcc_srcdir)/config/sparc/crtfastmath.c diff --git a/libgcc/config/sparc/t-softfp b/libgcc/config/sparc/t-softfp new file mode 100644 index 00000000000..94dfcfae0a1 --- /dev/null +++ b/libgcc/config/sparc/t-softfp @@ -0,0 +1,29 @@ +# Copyright (C) 2010, 2011 Free Software Foundation, Inc. +# +# This file is part of GCC. +# +# GCC 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 3, or (at your option) +# any later version. +# +# GCC 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 GCC; see the file COPYING3. If not see +# . + +# We want fine grained libraries, so use the new code to build the +# floating point emulation libraries. +FPBIT = fp-bit.c +DPBIT = dp-bit.c + +$(gcc_objdir)/dp-bit.c: $(gcc_srcdir)/config/fp-bit.c + cat $< > $@ + +$(gcc_objdir)/fp-bit.c: $(gcc_srcdir)/config/fp-bit.c + echo '#define FLOAT' > $@ + cat $< >> $@ diff --git a/libgcc/config/sparc/t-softmul b/libgcc/config/sparc/t-softmul new file mode 100644 index 00000000000..49faae47c53 --- /dev/null +++ b/libgcc/config/sparc/t-softmul @@ -0,0 +1,2 @@ +LIB1ASMSRC = sparc/lb1spc.asm +LIB1ASMFUNCS = _mulsi3 _divsi3 _modsi3 diff --git a/libgcc/config/sparc/t-sol2 b/libgcc/config/sparc/t-sol2 new file mode 100644 index 00000000000..372522bd0e4 --- /dev/null +++ b/libgcc/config/sparc/t-sol2 @@ -0,0 +1,6 @@ +# We need to use -fPIC when we are using gcc to compile the routines in +# crtstuff.c. This is only really needed when we are going to use gcc/g++ +# to produce a shared library, but since we don't know ahead of time when +# we will be doing that, we just always use -fPIC when compiling the +# routines in crtstuff.c. +CRTSTUFF_T_CFLAGS = -fPIC diff --git a/libgcc/config/t-crtfm b/libgcc/config/t-crtfm new file mode 100644 index 00000000000..6b9d84cf768 --- /dev/null +++ b/libgcc/config/t-crtfm @@ -0,0 +1,2 @@ +crtfastmath.o: $(gcc_srcdir)/config/$(cpu_type)/crtfastmath.c + $(gcc_compile) -c $< diff --git a/libgcc/config/t-crtin b/libgcc/config/t-crtin new file mode 100644 index 00000000000..b30e0d52e2f --- /dev/null +++ b/libgcc/config/t-crtin @@ -0,0 +1,4 @@ +crti.o: $(srcdir)/config/$(cpu_type)/sol2-ci.S + $(crt_compile) -c $< +crtn.o: $(srcdir)/config/$(cpu_type)/sol2-cn.S + $(crt_compile) -c $< diff --git a/libgcc/config/t-rtems b/libgcc/config/t-rtems new file mode 100644 index 00000000000..85e931e60f6 --- /dev/null +++ b/libgcc/config/t-rtems @@ -0,0 +1,4 @@ +# If we are building next to newlib, this will let us find the RTEMS +# limits.h when building libgcc2. Otherwise, newlib must be installed +# first. +HOST_LIBGCC2_CFLAGS = -I$(srcdir)/../newlib/libc/sys/rtems/include diff --git a/libgcc/config/t-slibgcc b/libgcc/config/t-slibgcc new file mode 100644 index 00000000000..0b5cc4bfc50 --- /dev/null +++ b/libgcc/config/t-slibgcc @@ -0,0 +1,51 @@ +# Copyright (C) 2001, 2002, 2003, 2004, 2005, 2011 +# Free Software Foundation, Inc. +# +# This file is part of GCC. +# +# GCC 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 3, or (at your option) +# any later version. +# +# GCC 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 GCC; see the file COPYING3. If not see +# . + +# Build a shared libgcc library. + +SHLIB_EXT = .so +SHLIB_SOLINK = @shlib_base_name@.so +SHLIB_SOVERSION = 1 +SHLIB_SONAME = @shlib_base_name@.so.$(SHLIB_SOVERSION) +SHLIB_MAP = @shlib_map_file@ +SHLIB_OBJS = @shlib_objs@ +SHLIB_DIR = @multilib_dir@ +SHLIB_SLIBDIR_QUAL = @shlib_slibdir_qual@ +SHLIB_LC = -lc +SHLIB_MAKE_SOLINK = $(LN_S) $(SHLIB_SONAME) $(SHLIB_DIR)/$(SHLIB_SOLINK) +SHLIB_INSTALL_SOLINK = $(LN_S) $(SHLIB_SONAME) \ + $(DESTDIR)$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK) + +SHLIB_LINK = $(CC) $(LIBGCC2_CFLAGS) -shared -nodefaultlibs \ + $(SHLIB_LDFLAGS) \ + -o $(SHLIB_DIR)/$(SHLIB_SONAME).tmp @multilib_flags@ \ + $(SHLIB_OBJS) $(SHLIB_LC) && \ + rm -f $(SHLIB_DIR)/$(SHLIB_SOLINK) && \ + if [ -f $(SHLIB_DIR)/$(SHLIB_SONAME) ]; then \ + mv -f $(SHLIB_DIR)/$(SHLIB_SONAME) \ + $(SHLIB_DIR)/$(SHLIB_SONAME).backup; \ + else true; fi && \ + mv $(SHLIB_DIR)/$(SHLIB_SONAME).tmp $(SHLIB_DIR)/$(SHLIB_SONAME) && \ + $(SHLIB_MAKE_SOLINK) +SHLIB_INSTALL = \ + $(mkinstalldirs) $(DESTDIR)$(slibdir)$(SHLIB_SLIBDIR_QUAL); \ + $(INSTALL_DATA) $(SHLIB_DIR)/$(SHLIB_SONAME) \ + $(DESTDIR)$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SONAME); \ + rm -f $(DESTDIR)$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK); \ + $(SHLIB_INSTALL_SOLINK) diff --git a/libgcc/config/t-slibgcc-elf-ver b/libgcc/config/t-slibgcc-elf-ver new file mode 100644 index 00000000000..2616d31cae5 --- /dev/null +++ b/libgcc/config/t-slibgcc-elf-ver @@ -0,0 +1,4 @@ +# Build a shared libgcc library for ELF with symbol versioning. + +SHLIB_MKMAP = $(gcc_srcdir)/mkmap-symver.awk +SHLIB_MAPFILES = libgcc-std.ver diff --git a/libgcc/config/t-slibgcc-gld b/libgcc/config/t-slibgcc-gld new file mode 100644 index 00000000000..7e77e0a0b27 --- /dev/null +++ b/libgcc/config/t-slibgcc-gld @@ -0,0 +1,5 @@ +# Build a shared libgcc library for ELF with symbol versioning +# with the GNU linker. + +SHLIB_LDFLAGS = -Wl,--soname=$(SHLIB_SONAME) \ + -Wl,--version-script=$(SHLIB_MAP) diff --git a/libgcc/config/t-slibgcc-sld b/libgcc/config/t-slibgcc-sld new file mode 100644 index 00000000000..178700047cc --- /dev/null +++ b/libgcc/config/t-slibgcc-sld @@ -0,0 +1,5 @@ +# Build a shared libgcc library for ELF with symbol versioning +# with the Solaris linker. + +SHLIB_LDFLAGS = -Wl,-h,$(SHLIB_SONAME) -Wl,-z,text -Wl,-z,defs \ + -Wl,-M,$(SHLIB_MAP) diff --git a/libgcc/config/t-sol2 b/libgcc/config/t-sol2 new file mode 100644 index 00000000000..2adcb13a820 --- /dev/null +++ b/libgcc/config/t-sol2 @@ -0,0 +1,34 @@ +# Copyright (C) 2004, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. +# +# This file is part of GCC. +# +# GCC 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 3, or (at your option) +# any later version. +# +# GCC 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 GCC; see the file COPYING3. If not see +# . + +# Use unwind-dw2-fde-glibc.c. Unless linker support and dl_iterate_phdr +# are present, automatically falls back to unwind-dw2-fde.c. +LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde-glibc.c \ + $(srcdir)/unwind-sjlj.c $(srcdir)/unwind-c.c + +# gmon build rule: +gmon.o: $(srcdir)/config/gmon-sol2.c + $(gcc_compile) -c $< + +# Assemble startup files. +crt1.o: $(srcdir)/config/$(cpu_type)/sol2-c1.S + $(crt_compile) -c $< +gcrt1.o: $(srcdir)/config/$(cpu_type)/sol2-c1.S + $(crt_compile) -c -DGCRT1 $< + +HOST_LIBGCC2_CFLAGS = -fPIC diff --git a/libgcc/configure b/libgcc/configure index 8a27aab1886..5acee3a63b1 100644 --- a/libgcc/configure +++ b/libgcc/configure @@ -555,6 +555,7 @@ ac_subst_vars='LTLIBOBJS LIBOBJS asm_hidden_op extra_parts +cpu_type tmake_file set_use_emutls set_have_cc_tls @@ -3742,6 +3743,23 @@ $as_echo "$libgcc_cv_fixed_point" >&6; } fixed_point=$libgcc_cv_fixed_point +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if test "${acl_cv_prog_gnu_ld+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU ld's only accept -v. +if $LD -v 2>&1 &5; then + acl_cv_prog_gnu_ld=yes +else + acl_cv_prog_gnu_ld=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_prog_gnu_ld" >&5 +$as_echo "$acl_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$acl_cv_prog_gnu_ld + + # Check for assembler CFI support. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether assembler supports CFI directives" >&5 $as_echo_n "checking whether assembler supports CFI directives... " >&6; } @@ -3938,6 +3956,7 @@ tmake_file="${tmake_file_}" + # We need multilib support. ac_config_files="$ac_config_files Makefile" diff --git a/libgcc/configure.ac b/libgcc/configure.ac index 7dbe114e394..a81e20943bf 100644 --- a/libgcc/configure.ac +++ b/libgcc/configure.ac @@ -4,6 +4,7 @@ sinclude(../config/enable.m4) sinclude(../config/tls.m4) sinclude(../config/acx.m4) sinclude(../config/no-executables.m4) +sinclude(../config/lib-ld.m4) sinclude(../config/override.m4) sinclude(../config/dfp.m4) @@ -166,6 +167,8 @@ AC_CACHE_CHECK([whether fixed-point is supported], [libgcc_cv_fixed_point], fixed_point=$libgcc_cv_fixed_point AC_SUBST(fixed_point) +AC_LIB_PROG_LD_GNU + # Check for assembler CFI support. AC_CACHE_CHECK([whether assembler supports CFI directives], [libgcc_cv_cfi], [AC_COMPILE_IFELSE( @@ -268,6 +271,7 @@ tmake_file="${tmake_file_}" AC_SUBST(tmake_file) # Substitute configuration variables +AC_SUBST(cpu_type) AC_SUBST(extra_parts) AC_SUBST(asm_hidden_op) -- cgit v1.2.1