It has long been on my agenda to perform/complete the toplevel libgcc migration for my targets. Although Solaris is the most complicated of the three, it lays some infrastructure for the others, so I'm starting with this patch. The ones for IRIX 6 and Tru64 UNIX will follow once the dust on this one has settled (and they have been tested :-)
The patch allowed for a considerable simplification of libgcc configuration for Solaris and some generalizations that will be used by patches for the other two platforms. A couple of issues are worth noticing: * The major point is that it proved possible to generalize/merge the several t-slibgcc* fragments currently in gcc/config. By moving code around a bit and introducing a couple of variables, I could come up with a version that should work on Solaris, IRIX, Tru64 UNIX and Linux. This is far more readable than the heavily duplicated versions we currently have. The resulting libgcc/config/t-slibgcc is mostly identical to current gcc/config/t-slibgcc-elf-ver. * One wart that turned up as result of the incomplete toplevel libgcc conversion is that one needs to keep defining SHLIB_LINK on the gcc side so ENABLE_SHARED_LIBGCC is defined correctly. This is currently done in gcc/config/t-slibgcc-darwin and gcc/config/i386/t-nwld. Until this is fixed, I've introduced a new gcc/config/t-slibgcc-dummy, properly commented to explain what's going on. Since I cannot test the other targets, I've left them alone. Should I file a PR for this issue? * Another wart was that gcc/ada/gcc-interface/Makefile.in requires TARGET_LIBGCC2_CFLAGS, which is otherwise only used in libgcc. It often contains -fPIC, and if the variable is removed, libgnat.so won't link (text relocations remain). This is probably another ada PR? * On the libgcc side, several of the t-crtfm fragments are identical except for the cpu subdir name. Since there's already the cpu_type configure variable, I'm exporting that to make and make use of it in libgcc/config/t-crtfm. Currently, only sparc uses it, but mips will once I complete the IRIX migration, and ia64 could, too. * There were two copies of gmon-sol2.c, one for sparc, and a modified version thereof for i386. I've done an initial merge that at least allowed a successful regtest on Solaris 11/x86, but there is considerable further cleanup (and reformatting ;-) potential. I'll probably do so as a followup. * Instead of doing sed hacks to strip comments from the various sol2-*.asm files, it seems to work to simply rename them to .S instead. * Several libgcc t-* fragements can use of $< instead of duplicating the file names. * I noticed that I had to rename TARGET_LIBGCC2_CFLAGS to HOST_LIBGCC2_CFLAGS so it works in libgcc. * There are several one- or two-line makefile fragments in gcc and libgcc. What is our policy for adding copyright notices to them. In a couple of cases, the files are the only remainder/extract of a previously far longer file. Should they keep the copyright dates of the former ones? This hasn't been fully tested yet (only i386-pc-solaris2.11 so far), but I'm posting it early for comments. Thanks. Rainer 2011-05-02 Rainer Orth <r...@cebitec.uni-bielefeld.de> gcc: * config.gcc (i[34567]86-*-solaris2*): Remove t-svr4, t-slibgcc-elf-ver, t-slibgcc-sld from tmake_file, add t-slibgcc-dummy. (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-sol2-10 (LIBGCC, INSTALL_LIBGCC, EXTRA_MULTILIB_PARTS): Remove. * config/sparc/t-sol2-64: Likewise. * config/sparc/t-sol2: Move to libgcc/config/sparc. * 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: Move to libgcc/config/i386/sol2-gc1.S. * 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: Move to libgcc/config. * config/t-slibgcc-dummy: New file. libgcc: * Makefile.in (cpu_type): Define. * config.host (i[34567]86-*-solaris2*): Move body ... (*-*-solaris2*): ... here. New case, generalize. (sparc-*-linux*): Replace sparc/t-crtfm by t-crtfm. (sparc64-*-linux*): Likewise. (sparc64-*-solaris2*, sparcv9-*-solaris2*, sparc-*-solaris2*): Fold into ... (sparc*-*-solaris2*): ... this. New case. * 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. * config/i386/sol2-ci.S: Move from gcc/config/i386/sol2-ci.asm. * config/i386/sol2-cn.S: Move from gcc/config/i386/sol2-cn.asm. * config/i386/sol2-gc1.S: Move from gcc/config/i386/sol2-gc1.asm. * config/i386/t-crtfm (crtfastmath.o): Use $<. * 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/t-sol2: Move from gcc/config/sparc. ($(T)gmon.o, $(T)crt1.o, $(T)crti.o, $(T)crtn.o, $(T)gcrt1.o): Remove. (gcrt1.o): New rule. (TARGET_LIBGCC2_CFLAGS): Remove. * config/sparc/t-crtfm: Move to ... * config/t-crtfm: ... this. Use $(cpu_type), $<. * config/t-slibgcc: Move from gcc/config. (SHLIB_SOVERSION): Define. (SHLIB_SONAME): Use it. (SHLIB_LC, SHLIB_MAKE_SOLINK, SHLIB_INSTALL_SOLINK): Define. (SHLIB_LINK): Use $(CC), $(SHLIB_LDFLAGS), $(SHLIB_MAKE_SOLINK). Replace $$ by $. (SHLIB_INSTALL): Replace $$ by $. Use $(SHLIB_INSTALL_SOLINK). (SHLIB_MKMAP, SHLIB_MAPFILES): Remove. * 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. diff --git a/gcc/config.gcc b/gcc/config.gcc --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -1328,16 +1328,13 @@ i[34567]86-*-solaris2*) if test x$gas = xyes; then tm_file="${tm_file} i386/sol2-gas.h" fi - tmake_file="${tmake_file} t-sol2 t-svr4" + tmake_file="${tmake_file} t-sol2 t-slibgcc-dummy" c_target_objs="${c_target_objs} sol2-c.o" cxx_target_objs="${cxx_target_objs} sol2-c.o" extra_objs="sol2.o" tm_p_file="${tm_p_file} sol2-protos.h" if test x$gnu_ld = xyes; then - tmake_file="$tmake_file t-slibgcc-elf-ver" tm_defines="${tm_defines} TARGET_GNU_LD=1" - else - tmake_file="$tmake_file t-slibgcc-sld" fi if test x$gas = xyes; then tm_file="usegas.h ${tm_file}" @@ -1348,9 +1345,6 @@ i[34567]86-*-solaris2*) tm_file="${tm_file} i386/x86-64.h i386/sol2-10.h" tm_defines="${tm_defines} TARGET_BI_ARCH=1" tmake_file="$tmake_file i386/t-sol2-10" - # i386/t-crtstuff only affects libgcc. Its inclusion - # depends on a runtime test and is thus performed in - # libgcc/configure.ac instead. need_64bit_hwint=yes need_64bit_isa=yes use_gcc_stdint=wrap @@ -2476,12 +2470,7 @@ sparc*-*-solaris2*) tm_file="${tm_file} sol2-gld.h sparc/sol2-gld-bi.h" fi tm_file="${tm_file} tm-dwarf2.h" - tmake_file="t-sol2 sparc/t-sol2 sparc/t-sol2-64 sparc/t-crtfm" - if test x$gnu_ld = xyes; then - tmake_file="$tmake_file t-slibgcc-elf-ver" - else - tmake_file="$tmake_file t-slibgcc-sld" - fi + tmake_file="t-sol2 t-slibgcc-dummy sparc/t-sol2-64" if test x$gas = xyes; then tm_file="usegas.h ${tm_file}" fi @@ -2489,7 +2478,6 @@ sparc*-*-solaris2*) cxx_target_objs="sol2-c.o" extra_objs="sol2.o" tm_p_file="${tm_p_file} sol2-protos.h" - extra_parts="crt1.o crti.o crtn.o gcrt1.o gmon.o crtbegin.o crtend.o" case ${enable_threads}:${have_pthread_h}:${have_thread_h} in "":yes:* | yes:yes:* ) thread_file=posix diff --git a/gcc/config/i386/t-sol2-10 b/gcc/config/i386/t-sol2-10 --- a/gcc/config/i386/t-sol2-10 +++ b/gcc/config/i386/t-sol2-10 @@ -1,4 +1,4 @@ -# Copyright (C) 2004 Free Software Foundation, Inc. +# Copyright (C) 2004, 2011 Free Software Foundation, Inc. # # This file is part of GCC. # @@ -19,11 +19,3 @@ MULTILIB_OPTIONS = m32/m64 MULTILIB_DIRNAMES = 32 amd64 MULTILIB_OSDIRNAMES = . amd64 - -LIBGCC = stmp-multilib -INSTALL_LIBGCC = install-multilib - -# GCC contains i386 assembler sources for some of the startfiles -# which aren't appropriate for amd64. Just use the installed -# versions of: crt1.o crti.o crtn.o gcrt1.o -EXTRA_MULTILIB_PARTS=gmon.o crtbegin.o crtend.o diff --git a/gcc/config/sparc/t-sol2-64 b/gcc/config/sparc/t-sol2-64 --- a/gcc/config/sparc/t-sol2-64 +++ b/gcc/config/sparc/t-sol2-64 @@ -2,9 +2,3 @@ MULTILIB_OPTIONS = m32/m64 MULTILIB_DIRNAMES = sparcv8plus sparcv9 MULTILIB_MATCHES = MULTILIB_OSDIRNAMES = . sparcv9 - -LIBGCC = stmp-multilib -INSTALL_LIBGCC = install-multilib - -EXTRA_MULTILIB_PARTS=crtbegin.o crtend.o gmon.o crt1.o crti.o crtn.o gcrt1.o \ - crtfastmath.o diff --git a/gcc/config/t-slibgcc-dummy b/gcc/config/t-slibgcc-dummy new file mode 100644 --- /dev/null +++ b/gcc/config/t-slibgcc-dummy @@ -0,0 +1,3 @@ +# SHLIB_LINK must be non-empty so ENABLE_SHARED_LIBGCC is defined correctly +# in DRIVER_DEFINES if libgcc configuration has been moved to toplevel. +SHLIB_LINK = dummy diff --git a/gcc/config/t-sol2 b/gcc/config/t-sol2 --- a/gcc/config/t-sol2 +++ b/gcc/config/t-sol2 @@ -29,6 +29,9 @@ sol2.o: $(srcdir)/config/sol2.c $(CONFIG $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \ $(srcdir)/config/sol2.c +# This is required by gcc/ada/gcc-interface/Makefile.in. +TARGET_LIBGCC2_CFLAGS = -fPIC + # 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 \ diff --git a/libgcc/Makefile.in b/libgcc/Makefile.in --- 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 --- 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,26 @@ 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 + *-*-solaris2.1[0-9]*) + # Solaris 10+ provides crt1.o, crti.o, crtn.o, and gcrt1.o as + # part of the base system. + ;; + *) + extra_parts="$extra_parts crt1.o crti.o crtn.o gcrt1.o" + ;; + esac + ;; *-*-vxworks*) ;; *-*-elf) @@ -311,17 +331,6 @@ i[34567]86-*-nto-qnx*) i[34567]86-*-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) ;; @@ -522,13 +531,13 @@ sparc-*-elf*) ;; 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* ) ;; -sparc64-*-solaris2* | sparcv9-*-solaris2*) - ;; -sparc-*-solaris2*) +sparc*-*-solaris2*) + tmake_file="$tmake_file t-crtfm" + extra_parts="$extra_parts crtfastmath.o" ;; sparc64-*-elf*) ;; @@ -538,7 +547,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/gcc/config/sparc/gmon-sol2.c b/libgcc/config/gmon-sol2.c rename from gcc/config/sparc/gmon-sol2.c rename to libgcc/config/gmon-sol2.c --- a/gcc/config/sparc/gmon-sol2.c +++ b/libgcc/config/gmon-sol2.c @@ -28,32 +28,67 @@ * 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 <oo...@ankh.org>, + * 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 <fcntl.h> /* for creat() */ -#if 0 -#include "sparc/gmon.h" -#else +#ifdef DEBUG +#include <stdio.h> +#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; @@ -62,10 +97,14 @@ struct rawarc { #define ROUNDDOWN(x,y) (((x)/(y))*(y)) #define ROUNDUP(x,y) ((((x)+(y)-1)/(y))*(y)) -#endif - /* 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 @@ -76,7 +115,7 @@ static struct tostruct *tos = 0; static long tolimit = 0; static char *s_lowpc = 0; static char *s_highpc = 0; -static unsigned long s_textsize = 0; +static size_t s_textsize = 0; static int ssiz; static char *sbuf; @@ -92,23 +131,23 @@ extern void _mcleanup (void); void monstartup(char *lowpc, char *highpc) { - int monsize; + size_t monsize; char *buffer; - register int o; + 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((unsigned long)lowpc, HISTFRACTION*sizeof(HISTCOUNTER)); + ROUNDDOWN((size_t)lowpc, HISTFRACTION*sizeof(HISTCOUNTER)); s_lowpc = lowpc; highpc = (char *) - ROUNDUP((unsigned long)highpc, HISTFRACTION*sizeof(HISTCOUNTER)); + ROUNDUP((size_t)highpc, HISTFRACTION*sizeof(HISTCOUNTER)); s_highpc = highpc; s_textsize = highpc - lowpc; monsize = (s_textsize / HISTFRACTION) + sizeof(struct phdr); - buffer = sbrk( monsize ); + buffer = (char *) sbrk( monsize ); if ( buffer == (char *) -1 ) { write( 2 , MSG , sizeof(MSG) ); return; @@ -206,8 +245,9 @@ _mcleanup(void) return; } # ifdef DEBUG - fprintf( stderr , "[mcleanup] sbuf 0x%x ssiz %d\n" , sbuf , ssiz ); + 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++ ) { @@ -218,7 +258,7 @@ _mcleanup(void) for (toindex=froms[fromindex]; toindex!=0; toindex=tos[toindex].link) { # ifdef DEBUG fprintf( stderr , - "[mcleanup] frompc 0x%x selfpc 0x%x count %d\n" , + "[mcleanup] frompc %#x selfpc %#x count %d\n" , frompc , tos[toindex].selfpc , tos[toindex].count ); # endif /* DEBUG */ rawarc.raw_frompc = (unsigned long) frompc; @@ -230,6 +270,7 @@ _mcleanup(void) 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 @@ -273,25 +314,99 @@ static void internal_mcount (char *, uns 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 *); -static void internal_mcount(char *selfpc, unsigned short *frompcindex) +/* 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 @@ -410,7 +525,8 @@ static void moncontrol(int mode) /* start */ profil((unsigned short *)(sbuf + sizeof(struct phdr)), ssiz - sizeof(struct phdr), - (long)s_lowpc, s_scale); + (size_t)s_lowpc, s_scale); + profiling = 0; } else { /* stop */ diff --git a/gcc/config/i386/sol2-c1.asm b/libgcc/config/i386/sol2-c1.S rename from gcc/config/i386/sol2-c1.asm rename to libgcc/config/i386/sol2-c1.S diff --git a/gcc/config/i386/sol2-ci.asm b/libgcc/config/i386/sol2-ci.S rename from gcc/config/i386/sol2-ci.asm rename to libgcc/config/i386/sol2-ci.S diff --git a/gcc/config/i386/sol2-cn.asm b/libgcc/config/i386/sol2-cn.S rename from gcc/config/i386/sol2-cn.asm rename to libgcc/config/i386/sol2-cn.S diff --git a/gcc/config/i386/sol2-gc1.asm b/libgcc/config/i386/sol2-gc1.S rename from gcc/config/i386/sol2-gc1.asm rename to libgcc/config/i386/sol2-gc1.S diff --git a/libgcc/config/i386/t-crtfm b/libgcc/config/i386/t-crtfm --- 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-sol2 b/libgcc/config/i386/t-sol2 --- a/libgcc/config/i386/t-sol2 +++ b/libgcc/config/i386/t-sol2 @@ -1,24 +1,6 @@ -# 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 +gcrt1.o: $(srcdir)/config/$(cpu_type)/sol2-gc1.S + $(gcc_compile) -c $< # 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++ @@ -29,9 +11,7 @@ # 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/gcc/config/sparc/sol2-c1.asm b/libgcc/config/sparc/sol2-c1.S rename from gcc/config/sparc/sol2-c1.asm rename to libgcc/config/sparc/sol2-c1.S diff --git a/gcc/config/sparc/sol2-ci.asm b/libgcc/config/sparc/sol2-ci.S rename from gcc/config/sparc/sol2-ci.asm rename to libgcc/config/sparc/sol2-ci.S diff --git a/gcc/config/sparc/sol2-cn.asm b/libgcc/config/sparc/sol2-cn.S rename from gcc/config/sparc/sol2-cn.asm rename to libgcc/config/sparc/sol2-cn.S diff --git a/gcc/config/sparc/t-sol2 b/libgcc/config/sparc/t-sol2 rename from gcc/config/sparc/t-sol2 rename to libgcc/config/sparc/t-sol2 --- a/gcc/config/sparc/t-sol2 +++ b/libgcc/config/sparc/t-sol2 @@ -1,5 +1,5 @@ # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2001, -# 2002 Free Software Foundation, Inc. +# 2002, 2011 Free Software Foundation, Inc. # # This file is part of GCC. # @@ -17,27 +17,13 @@ # along with GCC; see the file COPYING3. If not see # <http://www.gnu.org/licenses/>. -# gmon build rule: -$(T)gmon.o: $(srcdir)/config/sparc/gmon-sol2.c $(GCC_PASSES) \ - $(TCONFIG_H) tsystem.h coretypes.h $(TM_H) stmp-int-hdrs - $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(MULTILIB_CFLAGS) \ - -c $(srcdir)/config/sparc/gmon-sol2.c -o $(T)gmon.o - # Assemble startup files. -$(T)crt1.o: $(srcdir)/config/sparc/sol2-c1.asm $(GCC_PASSES) - $(GCC_FOR_TARGET) $(MULTILIB_CFLAGS) -c -o $(T)crt1.o -x assembler-with-cpp $(srcdir)/config/sparc/sol2-c1.asm -$(T)crti.o: $(srcdir)/config/sparc/sol2-ci.asm $(GCC_PASSES) - $(GCC_FOR_TARGET) $(MULTILIB_CFLAGS) -c -o $(T)crti.o -x assembler-with-cpp $(srcdir)/config/sparc/sol2-ci.asm -$(T)crtn.o: $(srcdir)/config/sparc/sol2-cn.asm $(GCC_PASSES) - $(GCC_FOR_TARGET) $(MULTILIB_CFLAGS) -c -o $(T)crtn.o -x assembler-with-cpp $(srcdir)/config/sparc/sol2-cn.asm -$(T)gcrt1.o: $(srcdir)/config/sparc/sol2-c1.asm $(GCC_PASSES) - $(GCC_FOR_TARGET) $(MULTILIB_CFLAGS) -c -DGCRT1 -o $(T)gcrt1.o -x assembler-with-cpp $(srcdir)/config/sparc/sol2-c1.asm +gcrt1.o: $(srcdir)/config/$(cpu_type)/sol2-gc1.S + $(gcc_compile) -c -DGCRT1 $< # 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 -TARGET_LIBGCC2_CFLAGS = -fPIC diff --git a/libgcc/config/sparc/t-crtfm b/libgcc/config/t-crtfm rename from libgcc/config/sparc/t-crtfm rename to libgcc/config/t-crtfm --- a/libgcc/config/sparc/t-crtfm +++ b/libgcc/config/t-crtfm @@ -1,2 +1,2 @@ -crtfastmath.o: $(gcc_srcdir)/config/sparc/crtfastmath.c - $(gcc_compile) -c $(gcc_srcdir)/config/sparc/crtfastmath.c +crtfastmath.o: $(gcc_srcdir)/config/$(cpu_type)/crtfastmath.c + $(gcc_compile) -c $< diff --git a/gcc/config/t-slibgcc-sld b/libgcc/config/t-slibgcc rename from gcc/config/t-slibgcc-sld rename to libgcc/config/t-slibgcc --- a/gcc/config/t-slibgcc-sld +++ b/libgcc/config/t-slibgcc @@ -1,4 +1,5 @@ -# Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. +# Copyright (C) 2001, 2002, 2003, 2004, 2005, 2011 +# Free Software Foundation, Inc. # # This file is part of GCC. # @@ -16,35 +17,35 @@ # along with GCC; see the file COPYING3. If not see # <http://www.gnu.org/licenses/>. -# Build a shared libgcc library with the Solaris linker. +# Build a shared libgcc library for ELF. SHLIB_EXT = .so SHLIB_SOLINK = @shlib_base_name@.so -SHLIB_SONAME = @shlib_base_name@.so.1 +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 = $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) -shared -nodefaultlibs \ - -Wl,-h,$(SHLIB_SONAME) -Wl,-z,text -Wl,-z,defs \ - -Wl,-M,$(SHLIB_MAP) -o $(SHLIB_DIR)/$(SHLIB_SONAME).tmp \ - @multilib_flags@ $(SHLIB_OBJS) -lc && \ +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) && \ - $(LN_S) $(SHLIB_SONAME) $(SHLIB_DIR)/$(SHLIB_SOLINK) -# $(slibdir) double quoted to protect it from expansion while building -# libgcc.mk. We want this delayed until actual install time. + $(SHLIB_MAKE_SOLINK) SHLIB_INSTALL = \ - $$(mkinstalldirs) $$(DESTDIR)$$(slibdir)$(SHLIB_SLIBDIR_QUAL); \ + $(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); \ - $(LN_S) $(SHLIB_SONAME) \ - $$(DESTDIR)$$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK) -SHLIB_MKMAP = $(srcdir)/mkmap-symver.awk -SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver + $(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 --- /dev/null +++ b/libgcc/config/t-slibgcc-elf-ver @@ -0,0 +1,21 @@ +# Copyright (C) 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 +# <http://www.gnu.org/licenses/>. + +# Build a shared libgcc library for ELF. + +SHLIB_MAPFILES = $(gcc_srcdir)/libgcc-std.ver diff --git a/libgcc/config/t-slibgcc-gld b/libgcc/config/t-slibgcc-gld new file mode 100644 --- /dev/null +++ b/libgcc/config/t-slibgcc-gld @@ -0,0 +1,25 @@ +# Copyright (C) 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 +# <http://www.gnu.org/licenses/>. + +# 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) +SHLIB_MKMAP = $(gcc_srcdir)/mkmap-symver.awk diff --git a/libgcc/config/t-slibgcc-sld b/libgcc/config/t-slibgcc-sld new file mode 100644 --- /dev/null +++ b/libgcc/config/t-slibgcc-sld @@ -0,0 +1,24 @@ +# Copyright (C) 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 +# <http://www.gnu.org/licenses/>. + +# Build a shared libgcc library with the Solaris linker. + +SHLIB_LDFLAGS = -Wl,-h,$(SHLIB_SONAME) -Wl,-z,text -Wl,-z,defs \ + -Wl,-M,$(SHLIB_MAP) +SHLIB_MKMAP = $(gcc_srcdir)/mkmap-symver.awk diff --git a/gcc/config/t-sol2 b/libgcc/config/t-sol2 copy from gcc/config/t-sol2 copy to libgcc/config/t-sol2 --- a/gcc/config/t-sol2 +++ b/libgcc/config/t-sol2 @@ -1,4 +1,4 @@ -# Copyright (C) 2004, 2008, 2009, 2010 Free Software Foundation, Inc. +# Copyright (C) 2004, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. # # This file is part of GCC. # @@ -16,21 +16,23 @@ # along with GCC; see the file COPYING3. If not see # <http://www.gnu.org/licenses/>. -# Solaris-specific format checking and pragmas -sol2-c.o: $(srcdir)/config/sol2-c.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ - tree.h c-family/c-format.h $(C_PRAGMA_H) $(C_COMMON_H) $(CPPLIB_H) \ - intl.h $(TM_H) $(TM_P_H) - $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \ - $(srcdir)/config/sol2-c.c - -# Solaris-specific attributes -sol2.o: $(srcdir)/config/sol2.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ - tree.h output.h $(TM_H) $(TM_P_H) $(GGC_H) - $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \ - $(srcdir)/config/sol2.c - # 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)/gthr-gnat.c $(srcdir)/unwind-c.c +LIB2ADDEH = $(gcc_srcdir)/unwind-dw2.c $(gcc_srcdir)/unwind-dw2-fde-glibc.c \ + $(gcc_srcdir)/unwind-sjlj.c $(gcc_srcdir)/gthr-gnat.c $(gcc_srcdir)/unwind-c.c LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h unwind-dw2-fde.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 + $(gcc_compile) -c $< +crti.o: $(srcdir)/config/$(cpu_type)/sol2-ci.S + $(gcc_compile) -c $< +crtn.o: $(srcdir)/config/$(cpu_type)/sol2-cn.S + $(gcc_compile) -c $< + +HOST_LIBGCC2_CFLAGS = -fPIC +CRTSTUFF_T_CFLAGS_S = $(CRTSTUFF_T_CFLAGS) diff --git a/libgcc/configure.ac b/libgcc/configure.ac --- 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 s 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) -- ----------------------------------------------------------------------------- Rainer Orth, Center for Biotechnology, Bielefeld University