diff mbox

[build] Move Solaris 2 startup files to toplevel libgcc, revised

Message ID yddwrhc6ny3.fsf@manam.CeBiTec.Uni-Bielefeld.DE
State New
Headers show

Commit Message

Rainer Orth May 27, 2011, 5:41 p.m. UTC
This is a revised version of

	http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00098.html

to move the Solaris startup files to toplevel libgcc.  While I can
commit most if it myself, I need approval/testing in a few areas:

* Non-Solaris build changes:

** libgcc/Makefile.in now has cpu_type, substituted by configure.

** All sparc targets in libgcc now use config/t-crtfm, which makes use
   of that make variable.

** libgcc/config/i386/t-crtfm now uses $< instead of listing the same
   filename twice, as I've done in some other files.

** The libgcc configure.ac uses AC_LIB_PROG_LD_GNU to determine whether
   or not GNU ld is in use.  Although this is currently only used by the
   Solaris config.host case, it changes generic code.

* Non-Solaris SPARC changes:

  After I had moved sparc/sol2-c[in].asm to libgcc, I noticed that
  despite the name a few non-Solaris targets uses those files, too:

  sparc-*-elf*, sparc-*-rtems*, sparc64-*-elf*, sparc64-*-rtems*

  To handle both Solaris/SPARC and x86 the same wrt. those files, I
  decided to move the libgcc config to toplevel, too.  Those changes
  need SPARC and/or RTEMS maintainer approval.

** Cases for those targets in libgcc/config.host have now been filled.
   Since there was massive duplication between t-leon, t-leon3, and
   t-elf, I've instead introduced t-softfp for [fd]p-bit.c use, and
   t-softmul for sparc/lb1spc.asm use.

** sparc/t-crtin could be moved to libgcc and massively simplified.

** The t-leon, t-leon3, and t-elf files have all been left behind in gcc
   since there are still targets using them.

** All the EXTRA_PARTS make variables have been converted to extra_parts
   in libgcc/config.host.

There's only one other notable change relative to the original patch
submission:

* For Solaris/x86, i386/sol2-{, g}c1.asm have been merged as on sparc to
  avoid massive code duplication.  All former .asm files have been
  converted to use C comments, both because the Solaris 8 and 9
  assemblers cannot handle ! comments and to allow for preprocessor
  use.

The patch has been bootstrapped without regressions on
i386-pc-solaris2.{[89], 1[01]} and sparc-sun-solaris2.{[89], 1[01]} with
Sun as and ld, GNU as and Sun ld, and GNU as and ld.  In addition, I've
compared the output of pvs -dsvo of libgcc_s.so.1 to ascertain that
libgcc_s versioning is unaffected.

Besides, I've built a i386-pc-solaris2.10 x sparc-elf cross and verified
that the same set of files occur in sparc-elf/libgcc with and without
the patch.

I'd really appreciate if one of the RTEMS maintainers could test the
patch there.

Once it has been confirmed to work, ok for mainline?

This patch (especially libgcc/config/t-slibgcc) forms the bases for two
other such moves for IRIX 6 and Tru64 UNIX.  Those are tested and ready
and only await the installation of this one.

Thanks.
	Rainer


2011-05-02  Rainer Orth  <ro@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-*-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-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.
	* 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-*-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-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/sparc/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.

Comments

Eric Botcazou May 27, 2011, 6:16 p.m. UTC | #1
> * Non-Solaris SPARC changes:
>
>   After I had moved sparc/sol2-c[in].asm to libgcc, I noticed that
>   despite the name a few non-Solaris targets uses those files, too:
>
>   sparc-*-elf*, sparc-*-rtems*, sparc64-*-elf*, sparc64-*-rtems*

Yes, I tried to untangle that, but the RTEMS folks complained so I had to 
backpedal.  Note that this is also the case on the i386 side.
diff mbox

Patch

diff --git a/gcc/config.gcc b/gcc/config.gcc
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -1350,16 +1350,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}"
@@ -1370,9 +1367,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
@@ -2441,13 +2435,10 @@  sparc-*-elf*)
 		tmake_file="sparc/t-elf"
 		;;
 	esac
-	tmake_file="${tmake_file} sparc/t-crtin sparc/t-crtfm"
-	extra_parts="crtbegin.o crtend.o"
 	;;
 sparc-*-rtems*)
 	tm_file="${tm_file} dbxelf.h elfos.h sparc/sysv4.h sparc/sp-elf.h sparc/rtemself.h rtems.h newlib-stdint.h"
-	tmake_file="sparc/t-elf sparc/t-crtin sparc/t-crtfm t-rtems"
-	extra_parts="crtbegin.o crtend.o"
+	tmake_file="sparc/t-elf t-rtems"
 	;;
 sparc-*-linux*)
 	tm_file="${tm_file} dbxelf.h elfos.h sparc/sysv4.h gnu-user.h linux.h glibc-stdint.h"
@@ -2504,12 +2495,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-crtin 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
@@ -2517,7 +2503,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 gcrt1.o gmon.o crtbegin.o crtend.o"
 	case ${enable_threads}:${have_pthread_h}:${have_thread_h} in
 	  "":yes:* | yes:yes:* )
 		thread_file=posix
@@ -2531,14 +2516,11 @@  sparc-wrs-vxworks)
 sparc64-*-elf*)
 	tm_file="${tm_file} dbxelf.h elfos.h newlib-stdint.h sparc/sysv4.h sparc/sp64-elf.h"
 	extra_options="${extra_options} sparc/little-endian.opt"
-	tmake_file="${tmake_file} sparc/t-crtin sparc/t-crtfm"
-	extra_parts="crtbegin.o crtend.o"
 	;;
 sparc64-*-rtems*)
 	tm_file="${tm_file} dbxelf.h elfos.h newlib-stdint.h sparc/sysv4.h sparc/sp64-elf.h sparc/rtemself.h rtems.h"
 	extra_options="${extra_options} sparc/little-endian.opt"
-	tmake_file="${tmake_file} sparc/t-crtin sparc/t-crtfm t-rtems"
-	extra_parts="crtbegin.o crtend.o"
+	tmake_file="${tmake_file} t-rtems"
 	;;
 sparc64-*-linux*)
 	tm_file="sparc/biarch64.h ${tm_file} dbxelf.h elfos.h sparc/sysv4.h gnu-user.h linux.h glibc-stdint.h sparc/linux64.h"
diff --git a/gcc/config/i386/sol2-gc1.asm b/gcc/config/i386/sol2-gc1.asm
deleted file mode 100644
--- a/gcc/config/i386/sol2-gc1.asm
+++ /dev/null
@@ -1,155 +0,0 @@ 
-! gcrt1.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
-! <http://www.gnu.org/licenses/>.
-
-
-! 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.
-
-! This is a modified crt1.s by J.W.Hawtin <oolon@ankh.org> 15/8/96, 
-! to allow program profiling, by calling monstartup on entry and _mcleanup 
-! on exit
-
-	.ident	"GNU C gcrt1.s"
-	.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	$_mcleanup,%eax
-	testl	%eax,%eax
-	je	.L1
-	pushl	$_mcleanup
-	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
-
-! Start profiling
-
-        pushl %ebp
-        movl %esp,%ebp
-        pushl $_etext
-        pushl $_start
-        call monstartup
-        addl $8,%esp
-	popl %ebp
-
-! 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
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,6 +2,3 @@  MULTILIB_OPTIONS = m32/m64
 MULTILIB_DIRNAMES = sparcv8plus sparcv9
 MULTILIB_MATCHES =
 MULTILIB_OSDIRNAMES = . sparcv9
-
-LIBGCC = stmp-multilib
-INSTALL_LIBGCC = install-multilib
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,30 @@  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"
+      ;;
+    *)
+      extra_parts="$extra_parts crt1.o crti.o crtn.o gcrt1.o"
+      ;;
+  esac
+  ;;
 *-*-vxworks*)
   ;;
 *-*-elf)
@@ -311,17 +335,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)
 	;;
@@ -519,18 +532,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 sparc/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 sparc/t-crtin sparc/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} sparc/t-crtin sparc/t-crtfm"
+	extra_parts="crtbegin.o crtend.o crti.o crtn.o crtfastmath.o"
 	;;
 sparc-wrs-vxworks)
 	;;
@@ -538,7 +564,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 <oolon@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
--- a/gcc/config/i386/sol2-c1.asm
+++ b/libgcc/config/i386/sol2-c1.S
@@ -1,46 +1,56 @@ 
-! crt1.s for Solaris 2, x86
+/* crt1.s for Solaris 2, x86
 
-!   Copyright (C) 1993, 1998, 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
-! <http://www.gnu.org/licenses/>.
+   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 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.
+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
+<http://www.gnu.org/licenses/>.  */
+
+
+/* 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 <oolon@ankh.org> 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).
+/* 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:
@@ -48,29 +58,29 @@  _start:
 	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.
+/* 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().
+/* 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
+	movl	$CLEANUP,%eax
 	testl	%eax,%eax
 	je	.L1
-	pushl	$_cleanup
+	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().
+/* 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
@@ -78,74 +88,86 @@  _start:
 	call	atexit
 .L2:
 
-! Register _fini() with atexit().  We will take care of calling _init()
-! directly.
+/* Register _fini() with atexit().  We will take care of calling _init()
+   directly.  */
 
 	pushl	$_fini
 	call	atexit
 
-! 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!).
+#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.
+/* 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.
-!
+/* 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(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().
+/* 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.
+/* 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!
+/* If all else fails, just try a halt!  */
 
 	hlt
 	.type	_start,@function
 	.size	_start,.-_start
 
-! A dummy profiling support routine for non-profiling executables,
-! in case we link in some objects that have been compiled for profiling.
+#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/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
--- a/gcc/config/i386/sol2-ci.asm
+++ b/libgcc/config/i386/sol2-ci.S
@@ -1,31 +1,31 @@ 
-! crti.s for Solaris 2, x86.
+/* 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
-! <http://www.gnu.org/licenses/>.
+   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.
 
-! 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.
+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
+<http://www.gnu.org/licenses/>.  */
+
+
+/* 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"
 
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
--- a/gcc/config/i386/sol2-cn.asm
+++ b/libgcc/config/i386/sol2-cn.S
@@ -1,30 +1,30 @@ 
-! crtn.s for Solaris 2, x86.
+/* 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
-! <http://www.gnu.org/licenses/>.
+   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.
 
-! This file just supplies returns for the .init and .fini sections.  It is
-! linked in after all other files.
+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
+<http://www.gnu.org/licenses/>.  */
+
+
+/* This file just supplies returns for the .init and .fini sections.  It is
+   linked in after all other files.  */
 
 	.ident	"GNU C crtn.o"
 
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,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 @@ 
 # 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-crtin b/libgcc/config/sparc/t-crtin
rename from gcc/config/sparc/t-crtin
rename to libgcc/config/sparc/t-crtin
--- a/gcc/config/sparc/t-crtin
+++ b/libgcc/config/sparc/t-crtin
@@ -1,6 +1,4 @@ 
-EXTRA_PARTS += crti.o crtn.o
-
-$(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
+crti.o: $(srcdir)/config/sparc/sol2-ci.S
+	$(crt_compile) -c $<
+crtn.o: $(srcdir)/config/sparc/sol2-cn.S
+	$(crt_compile) -c $<
diff --git a/libgcc/config/sparc/t-softfp b/libgcc/config/sparc/t-softfp
new file mode 100644
--- /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
+# <http://www.gnu.org/licenses/>.
+
+# 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
--- /dev/null
+++ b/libgcc/config/sparc/t-softmul
@@ -0,0 +1,2 @@ 
+LIB1ASMSRC = sparc/lb1spc.asm
+LIB1ASMFUNCS = _mulsi3 _divsi3 _modsi3
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,39 +1,6 @@ 
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2001,
-# 2002 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/>.
-
-# 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)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
-
 # 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-rtems b/libgcc/config/t-rtems
copy from gcc/config/t-rtems
copy to libgcc/config/t-rtems
--- a/gcc/config/t-rtems
+++ b/libgcc/config/t-rtems
@@ -1,7 +1,4 @@ 
-# RTEMS always has limits.h.
-LIMITS_H_TEST = true
-
 # 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.
-LIBGCC2_INCLUDES = -I$(srcdir)/../newlib/libc/sys/rtems/include
+HOST_LIBGCC2_CFLAGS = -I$(srcdir)/../newlib/libc/sys/rtems/include
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,36 @@ 
 # 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.
 
 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 = $$(libgcc_objdir)/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,4 @@ 
+# Build a shared libgcc library for ELF with symbol versioning.
+
+SHLIB_MKMAP = $(srcdir)/mkmap-symver.awk
+SHLIB_MAPFILES = $(libgcc_objdir)/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,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
--- /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/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
@@ -16,21 +16,25 @@ 
 # 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) $(TARGET_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)/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
+	$(crt_compile) -c $<
+crti.o: $(srcdir)/config/$(cpu_type)/sol2-ci.S
+	$(crt_compile) -c $<
+crtn.o: $(srcdir)/config/$(cpu_type)/sol2-cn.S
+	$(crt_compile) -c $<
+gcrt1.o: $(srcdir)/config/$(cpu_type)/sol2-c1.S
+	$(crt_compile) -c -DGCRT1 $<
+
+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)