diff mbox

Provide 64-bit default Solaris/x86 configuration (PR target/39150)

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

Commit Message

Rainer Orth July 6, 2011, 11:34 a.m. UTC
There has long been some clamoring for a amd64-*-solaris2 configuration
similar to sparcv9-sun-solaris2.  I've resisted this for quite some
time, primarily because it doubles the maintenance effort of testing
both the 32-bit default and 64-bit default configurations.

After the recent cleanup patches to the Solaris configuration, it proved
to be quite easy and straight forward to implement.  Only a few changes
are worth mentioning:

* TRY_EMPTY_VM_SPACE for amd64 had to be massively reduced in
  host-solaris2.c, otherwise mmap would fail with ENOMEM.  The old value
  had been in the middle of the 64-bit address space, which obviously
  doesn't work.

* The TARGET_LD_EMULATION macro needed a clause to properly deal with
  the default case: at first, I had used a 32-bit GNU ld for the 64-bit
  configuation, which only works if you explicitly specify the 64-bit
  emulation.  I'm leaving this in although a 32-bit gld doesn't work
  properly: the lto-plugin is built as 64-bit object, thus all -flto
  tests fail in such a configuration.

I think practically the whole patch falls under the Solaris
maintainership, with the possible exception of the change to the copy of
libtool.m4 in libgo/config.  This is not for the technical content, but
for the special commit rules to that directory.  Ian?
 
Anyway, this part of the patch will have to go to upstream libtool.
Ralf, could you take care of that?

Bootstrapped without regression on i386-pc-solaris2.10 (both 32-bit
default and 64-bit default configurations), i386-pc-solaris2.11 and
sparc-sun-solaris2.11 in progress.

There are two caveats, which will be addressed subsequently:

* libstdc++-abi/abi_check FAILs for the 64-bit ABI due to a mismatch
  between --print-multi-directory and --print-multi-os-directory.  I'll
  report and hopefully address this subsequently; the problem already
  exists in the the existing sparcv9-sun-solaris2 configurations.

* In the sparcv9-sun-solaris2.11 builds, the 32-bit libgo tests fail to
  link since they have unresolved references to
  __sync_bool_compare_and_swap_8 and __sync_add_and_fetch_8.  I could
  trace this to -mv8plus being missing in that configuration.  I'm
  uncertain where best to handle this.  Eric?

Once all the bootstraps have finished, I'll commit this patch (at least
the non-libgo parts) unless anything unexpected comes up.

	Rainer


2011-07-02  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>

	gcc:
	PR target/39150
	* configure.ac (gcc_cv_as_hidden): Also accept
	x86_64-*-solaris2.1[0-9]*.
	(gcc_cv_as_cfi_directive): Likewise.
	(gcc_cv_as_comdat_group_group): Likewise.
	(set_have_as_tls): Likewise.
	* configure: Regenerate.
	* config.gcc (i[34567]86-*-solaris2*): Also handle
	x86_64-*-solaris2.1[0-9]*.
	* config.host (i[34567]86-*-solaris2*): Likewise.
	* config/sparc/sol2.h (ASM_CPU_DEFAULT_SPEC): Remove.
	* config/sol2-bi.h (ASM_CPU_DEFAULT_SPEC): Redefine.
	[USE_GLD] (ARCH_DEFAULT_EMULATION): Define.
	(TARGET_LD_EMULATION): Use it.
	* config/i386/sol2.h (ASM_CPU_DEFAULT_SPEC): Define.
	(SUBTARGET_CPU_EXTRA_SPECS): Add asm_cpu_default.
	* config/i386/sol2-bi.h (ASM_CPU32_DEFAULT_SPEC): Define.
	(ASM_CPU64_DEFAULT_SPEC): Define.
	(ASM_CPU_SPEC): Use %(asm_cpu_default).
	(ASM_SPEC): Redefine.
	(DEFAULT_ARCH32_P): Define using TARGET_64BIT_DEFAULT.
	* config/host-solaris.c [__x86_64__] (TRY_EMPTY_VM_SPACE): Reduce.
	* doc/install.texi (Specific, amd64-*-solaris2.1[0-9]*):
	Document.
	(Specific, i?86-*-solaris2.10): Mention x86_64-*-solaris2.1[0-9]*
	configuration.
	(Specific, x86_64-*-solaris2.1[0-9]*): Document.

	gcc/ada:
	PR target/39150
	* gcc-interface/Makefile.in: Handle x86_64-solaris2.

	libgcc:
	PR target/39150
	* config.host (*-*-solaris2*): Handle x86_64-*-solaris2.1[0-9]*
	like i?86-*-solaris2.1[0-9]*.
	(i[34567]86-*-solaris2*): Also handle x86_64-*-solaris2.1[0-9]*.
	* configure.ac (i?86-*-solaris2*): Likewise.
	* configure: Regenerate.

	gcc/testsuite:
	PR target/39150
	* gcc.misc-tests/linkage.exp: Handle x86_64-*-solaris2.1[0-9]*.

	toplevel:
	PR target/39150
	* configure.ac (i[3456789]86-*-solaris2*): Also accept
	x86_64-*-solaris2.1[0-9]*.
	* configure: Regenerate.

	boehm-gc:
	PR target/39150
	* configure.ac (i?86-*-solaris2.[89]): Also accept
	x86_64-*-solaris2.1?.
	* configure: Regenerate.

	gnattools:
	PR target/39150
	* configure.ac (*86-*-solaris2*): Also accept
	x86_64-*-solaris2.1[0-9]*.
	* configure: Regenerate.

	libcpp:
	PR target/39150
	* configure.ac (host_wide_int): Handle x86_64-*-solaris2.1[0-9]
	like i[34567]86-*-solaris2.1[0-9]*.
	* configure: Regenerate.

	libgo:
	PR target/39150
	* config/libtool.m4: Handle x86_64-*-solaris2.1[0-9]* like
	i?86-*-solaris*.
	* configure: Regenerate.

	libjava:
	PR target/39150
	* configure.host (x86_64-*): Add -Usun to libgcj_flags.
	(x86_64-*-solaris2.1[0-9]*): New case.
	(i?86-*-solaris2*): Also accept x86_64-*-solaris2.1[0-9]*.

Comments

Eric Botcazou July 6, 2011, 3:19 p.m. UTC | #1
> * In the sparcv9-sun-solaris2.11 builds, the 32-bit libgo tests fail to
>   link since they have unresolved references to
>   __sync_bool_compare_and_swap_8 and __sync_add_and_fetch_8.  I could
>   trace this to -mv8plus being missing in that configuration.  I'm
>   uncertain where best to handle this.  Eric?

Probably add MASK_V8PLUS to the 64-bit TARGET_DEFAULT in sol2.h, it will be
disabled in 64-bit mode by sparc_override_options.
Rainer Orth July 6, 2011, 3:34 p.m. UTC | #2
Eric Botcazou <ebotcazou@adacore.com> writes:

>> * In the sparcv9-sun-solaris2.11 builds, the 32-bit libgo tests fail to
>>   link since they have unresolved references to
>>   __sync_bool_compare_and_swap_8 and __sync_add_and_fetch_8.  I could
>>   trace this to -mv8plus being missing in that configuration.  I'm
>>   uncertain where best to handle this.  Eric?
>
> Probably add MASK_V8PLUS to the 64-bit TARGET_DEFAULT in sol2.h, it will be
> disabled in 64-bit mode by sparc_override_options.

Thanks, I'll give it a try.  I just seemd weird to have MASK_V8PLUS and
MASK_V9 at the same time.

	Rainer
Eric Botcazou July 6, 2011, 4:07 p.m. UTC | #3
> Thanks, I'll give it a try.  I just seemd weird to have MASK_V8PLUS and
> MASK_V9 at the same time.

Yes, that's why the existing comment should also be enhanced.  I'll fix it.
Rainer Orth July 7, 2011, 10 a.m. UTC | #4
Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> writes:

> There has long been some clamoring for a amd64-*-solaris2 configuration
> similar to sparcv9-sun-solaris2.  I've resisted this for quite some
> time, primarily because it doubles the maintenance effort of testing
> both the 32-bit default and 64-bit default configurations.
[...]
> I think practically the whole patch falls under the Solaris
> maintainership, with the possible exception of the change to the copy of
> libtool.m4 in libgo/config.  This is not for the technical content, but
> for the special commit rules to that directory.  Ian?
>  
> Anyway, this part of the patch will have to go to upstream libtool.
> Ralf, could you take care of that?
>
> Bootstrapped without regression on i386-pc-solaris2.10 (both 32-bit
> default and 64-bit default configurations), i386-pc-solaris2.11 and
> sparc-sun-solaris2.11 in progress.
[...]
> Once all the bootstraps have finished, I'll commit this patch (at least
> the non-libgo parts) unless anything unexpected comes up.

All bootstraps have completed without regressions, so I've installed the
patch as is, after verifying that the libgo parts aren't present in the
upstream Go repo.

I've also synced the toplevel configure.ac/configure changes to src.

One other issue: it was suggested that the 64-bit compiler might
actually be faster than a 32-bit one.  At least bootstrap times speak
another language: on a Sun Fire X4450 running Solaris 10 with 4 x 2.93
GHz Quad-Core Xeon Xeon X7350, I find for make -j32 + make -j32 -k check
for both multilibs:

      		64-bit		32-bit

		as/ld

      real     	1:59:28.66	1:52:15.55
      user     	7:14:33.93	6:43:25.84
      sys      	5:26:30.66	4:41:02.78

      		gas/ld

		2:02:47.64	1:54:24.51
		7:10:41.93	6:39:39.39
		5:37:15.86	4:51:41.02

		gas/gld

		1:59:57.13	1:45:13.18
		7:57:37.13	7:11:41.83
		5:11:58.14	4:04:26.97

Same picture on a Sun Fire X4600 M2 running Solaris 11 with 8 x 2.6 GHz
Dual-Core Opteron 8218.

	Rainer
diff mbox

Patch

diff --git a/boehm-gc/configure.ac b/boehm-gc/configure.ac
--- a/boehm-gc/configure.ac
+++ b/boehm-gc/configure.ac
@@ -400,7 +400,7 @@  case "$host" in
  alpha*-*-linux*)
     machdep="alpha_mach_dep.lo"
     ;;
- i?86-*-solaris2.[[89]] | i?86-*-solaris2.1?)
+ i?86-*-solaris2.[[89]] | i?86-*-solaris2.1? | x86_64-*-solaris2.1?)
     AC_DEFINE(SOLARIS25_PROC_VDB_BUG_FIXED,1,[PROC_VDB in Solaris 2.5 gives wrong values for dirty bits])
     ;;
  mipstx39-*-elf*)
diff --git a/configure.ac b/configure.ac
--- a/configure.ac
+++ b/configure.ac
@@ -923,7 +923,7 @@  case "${target}" in
   i[[3456789]]86-*-sco*)
     noconfigdirs="$noconfigdirs gprof target-libgloss"
     ;;
-  i[[3456789]]86-*-solaris2*)
+  i[[3456789]]86-*-solaris2* | x86_64-*-solaris2.1[[0-9]]*)
     noconfigdirs="$noconfigdirs target-libgloss"
     ;;
   i[[3456789]]86-*-sysv4*)
diff --git a/gcc/ada/gcc-interface/Makefile.in b/gcc/ada/gcc-interface/Makefile.in
--- a/gcc/ada/gcc-interface/Makefile.in
+++ b/gcc/ada/gcc-interface/Makefile.in
@@ -1011,8 +1011,8 @@  ifeq ($(strip $(filter-out sparc% sun so
   endif
 endif
 
-ifeq ($(strip $(filter-out %86 solaris2%,$(arch) $(osys))),)
-  LIBGNAT_TARGET_PAIRS = \
+ifeq ($(strip $(filter-out %86 %x86_64 solaris2%,$(arch) $(osys))),)
+  LIBGNAT_TARGET_PAIRS_COMMON = \
   a-numaux.adb<a-numaux-x86.adb \
   a-numaux.ads<a-numaux-x86.ads \
   a-intnam.ads<a-intnam-solaris.ads \
@@ -1028,13 +1028,29 @@  ifeq ($(strip $(filter-out %86 solaris2%
   s-tpopsp.adb<s-tpopsp-solaris.adb \
   g-soliop.ads<g-soliop-solaris.ads
 
-  ifeq ($(strip $(MULTISUBDIR)),/amd64)
-    LIBGNAT_TARGET_PAIRS += \
-    system.ads<system-solaris-x86_64.ads
+  LIBGNAT_TARGET_PAIRS_32 = \
+  g-bytswa.adb<g-bytswa-x86.adb \
+  system.ads<system-solaris-x86.ads
+
+  LIBGNAT_TARGET_PAIRS_64 = \
+  system.ads<system-solaris-x86_64.ads
+
+  ifeq ($(strip $(filter-out %86 solaris2%,$(arch) $(osys))),)
+    ifeq ($(strip $(MULTISUBDIR)),/amd64)
+      LIBGNAT_TARGET_PAIRS = \
+      $(LIBGNAT_TARGET_PAIRS_COMMON) $(LIBGNAT_TARGET_PAIRS_64)
+    else
+      LIBGNAT_TARGET_PAIRS = \
+      $(LIBGNAT_TARGET_PAIRS_COMMON) $(LIBGNAT_TARGET_PAIRS_32)
+    endif
   else
-    LIBGNAT_TARGET_PAIRS += \
-    g-bytswa.adb<g-bytswa-x86.adb \
-    system.ads<system-solaris-x86.ads
+    ifeq ($(strip $(MULTISUBDIR)),/32)
+      LIBGNAT_TARGET_PAIRS = \
+      $(LIBGNAT_TARGET_PAIRS_COMMON) $(LIBGNAT_TARGET_PAIRS_32)
+    else
+      LIBGNAT_TARGET_PAIRS = \
+      $(LIBGNAT_TARGET_PAIRS_COMMON) $(LIBGNAT_TARGET_PAIRS_64)
+    endif
   endif
 
   TOOLS_TARGET_PAIRS=mlib-tgt-specific.adb<mlib-tgt-specific-solaris.adb
diff --git a/gcc/config.gcc b/gcc/config.gcc
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -1369,7 +1369,7 @@  i[34567]86-*-rtems*)
 	tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h i386/i386elf.h i386/rtemself.h rtems.h newlib-stdint.h"
 	tmake_file="${tmake_file} i386/t-rtems t-rtems"
 	;;
-i[34567]86-*-solaris2*)
+i[34567]86-*-solaris2* | x86_64-*-solaris2.1[0-9]*)
 	tm_file="${tm_file} i386/unix.h i386/att.h ${sol2_tm_file}"
 	# Set default arch_32 to pentium4, tune_32 to generic like the other
 	# i386 targets, although config.guess defaults to i386-pc-solaris2*.
@@ -3529,7 +3529,7 @@  case ${target} in
 	  i[34567]86-*-gnu*)
 		tmake_file="${tmake_file} i386/t-fprules-softfp soft-fp/t-softfp i386/t-linux"
 		;;
-	i[34567]86-*-solaris2*)
+	i[34567]86-*-solaris2* | x86_64-*-solaris2.1[0-9]*)
 		tmake_file="${tmake_file} i386/t-fprules-softfp soft-fp/t-softfp"
 		;;
 	i[34567]86-*-cygwin* | i[34567]86-*-mingw* | x86_64-*-mingw*)
diff --git a/gcc/config.host b/gcc/config.host
--- a/gcc/config.host
+++ b/gcc/config.host
@@ -197,7 +197,7 @@  case ${host} in
   i370-*-opened* | i370-*-mvs* ) # IBM 360/370/390 Architecture
     host_xm_defines='FATAL_EXIT_CODE=12'
     ;;
-  i[34567]86-*-solaris2*)
+  i[34567]86-*-solaris2* | x86_64-*-solaris2.1[0-9]*)
     out_host_hook_obj=host-solaris.o
     host_xmake_file="${host_xmake_file} x-solaris"
     ;;
diff --git a/gcc/config/host-solaris.c b/gcc/config/host-solaris.c
--- a/gcc/config/host-solaris.c
+++ b/gcc/config/host-solaris.c
@@ -73,7 +73,7 @@  mmap_fixed (void *addr, size_t len, int 
 #elif defined(__sparc__)
 # define TRY_EMPTY_VM_SPACE	0x80000000
 #elif defined(__x86_64__)
-# define TRY_EMPTY_VM_SPACE	0x8000000000000000
+# define TRY_EMPTY_VM_SPACE	0x80000000000
 #elif defined(__i386__)
 # define TRY_EMPTY_VM_SPACE	0xB0000000
 #else
diff --git a/gcc/config/i386/sol2-bi.h b/gcc/config/i386/sol2-bi.h
--- a/gcc/config/i386/sol2-bi.h
+++ b/gcc/config/i386/sol2-bi.h
@@ -31,12 +31,16 @@  along with GCC; see the file COPYING3.  
 
 /* GNU as understands --32 and --64, but the native Solaris
    assembler requires -xarch=generic or -xarch=generic64 instead.  */
+#ifdef USE_GAS
+#define ASM_CPU32_DEFAULT_SPEC "--32"
+#define ASM_CPU64_DEFAULT_SPEC "--64"
+#else
+#define ASM_CPU32_DEFAULT_SPEC "-xarch=generic"
+#define ASM_CPU64_DEFAULT_SPEC "-xarch=generic64"
+#endif
+
 #undef ASM_CPU_SPEC
-#ifdef USE_GAS
-#define ASM_CPU_SPEC "%{m32:--32} %{m64:--64}"
-#else
-#define ASM_CPU_SPEC "%{m32:-xarch=generic} %{m64:-xarch=generic64}"
-#endif
+#define ASM_CPU_SPEC "%(asm_cpu_default)"
 
 /* Don't let i386/x86-64.h override i386/sol2.h version.  Still cannot use
    -K PIC with the Solaris 10+ assembler, it gives many warnings:
@@ -47,8 +51,7 @@  along with GCC; see the file COPYING3.  
 /* We do not need to search a special directory for startup files.  */
 #undef MD_STARTFILE_PREFIX
 
-/* No 64-bit default configurations.  */
-#define DEFAULT_ARCH32_P 1
+#define DEFAULT_ARCH32_P !TARGET_64BIT_DEFAULT
 
 #define ARCH64_SUBDIR "amd64"
 
diff --git a/gcc/config/i386/sol2.h b/gcc/config/i386/sol2.h
--- a/gcc/config/i386/sol2.h
+++ b/gcc/config/i386/sol2.h
@@ -59,6 +59,8 @@  along with GCC; see the file COPYING3.  
 #undef CPP_SPEC
 #define CPP_SPEC "%{,assembler-with-cpp:-P} %(cpp_subtarget)"
 
+#define ASM_CPU_DEFAULT_SPEC ""
+
 #define ASM_CPU_SPEC ""
  
 /* Don't include ASM_PIC_SPEC.  While the Solaris 8 and 9 assembler accepts
@@ -70,7 +72,8 @@  along with GCC; see the file COPYING3.  
 
 #define SUBTARGET_CPU_EXTRA_SPECS \
   { "cpp_subtarget",	 CPP_SUBTARGET_SPEC },		\
-  { "asm_cpu",		 ASM_CPU_SPEC }
+  { "asm_cpu",		 ASM_CPU_SPEC },		\
+  { "asm_cpu_default",	 ASM_CPU_DEFAULT_SPEC },	\
 
 #undef SUBTARGET_EXTRA_SPECS
 #define SUBTARGET_EXTRA_SPECS \
diff --git a/gcc/config/sol2-bi.h b/gcc/config/sol2-bi.h
--- a/gcc/config/sol2-bi.h
+++ b/gcc/config/sol2-bi.h
@@ -56,6 +56,16 @@ 
 #define DEF_ARCH64_SPEC(__str) "%{!m32:" __str "}"
 #endif
 
+#undef ASM_CPU_DEFAULT_SPEC
+#define ASM_CPU_DEFAULT_SPEC \
+(DEFAULT_ARCH32_P ? "\
+%{m64:" ASM_CPU64_DEFAULT_SPEC "} \
+%{!m64:" ASM_CPU32_DEFAULT_SPEC "} \
+" : "\
+%{m32:" ASM_CPU32_DEFAULT_SPEC "} \
+%{!m32:" ASM_CPU64_DEFAULT_SPEC "} \
+")
+
 /* This should be the same as LINK_ARCH32_SPEC_BASE, except with
    ARCH64_SUBDIR appended to the paths and /usr/ccs/lib is no longer
    necessary.  */
@@ -78,8 +88,14 @@ 
 #endif
 
 #ifdef USE_GLD
+#if DEFAULT_ARCH32_P
+#define ARCH_DEFAULT_EMULATION ARCH32_EMULATION
+#else
+#define ARCH_DEFAULT_EMULATION ARCH64_EMULATION
+#endif
 #define TARGET_LD_EMULATION "%{m32:-m " ARCH32_EMULATION "}" \
-			    "%{m64:-m " ARCH64_EMULATION "} "
+			    "%{m64:-m " ARCH64_EMULATION "}" \
+			    "%{!m32:%{!m64:-m " ARCH_DEFAULT_EMULATION "}} "
 #else
 #define TARGET_LD_EMULATION ""
 #endif
diff --git a/gcc/config/sparc/sol2.h b/gcc/config/sparc/sol2.h
--- a/gcc/config/sparc/sol2.h
+++ b/gcc/config/sparc/sol2.h
@@ -205,16 +205,6 @@  along with GCC; see the file COPYING3.  
 %{!mcpu*:%(asm_cpu_default)} \
 "
 
-#undef ASM_CPU_DEFAULT_SPEC
-#define ASM_CPU_DEFAULT_SPEC \
-(DEFAULT_ARCH32_P ? "\
-%{m64:" ASM_CPU64_DEFAULT_SPEC "} \
-%{!m64:" ASM_CPU32_DEFAULT_SPEC "} \
-" : "\
-%{m32:" ASM_CPU32_DEFAULT_SPEC "} \
-%{!m32:" ASM_CPU64_DEFAULT_SPEC "} \
-")
-
 #undef ASM_ARCH32_SPEC
 #define ASM_ARCH32_SPEC ""
 
diff --git a/gcc/configure.ac b/gcc/configure.ac
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -2168,7 +2168,7 @@  foobar:],[
 # Solaris 9/x86 as incorrectly emits an alias for a hidden symbol with
 # STV_HIDDEN, so disable .hidden support if so.
 case "${target}" in
-  i?86-*-solaris2*)
+  i?86-*-solaris2* | x86_64-*-solaris2.1[[0-9]]*)
     if test x$gcc_cv_as != x && test x$gcc_cv_objdump != x; then
       cat > conftest.s <<EOF
 .globl hidden
@@ -2423,7 +2423,7 @@  gcc_GAS_CHECK_FEATURE([cfi directives], 
 	  gcc_cv_as_cfi_directive=no
 	else
 	  case "$target" in
-	    i?86-*-solaris2.1[[0-9]]*)
+	    i?86-*-solaris2.1[[0-9]]* | x86_64-*-solaris2.1[[0-9]]*)
 	      # On Solaris/x86, make sure that GCC and gas agree on using
 	      # read-only .eh_frame sections for 64-bit.
 	      if $gcc_cv_as --64 -o conftest.o conftest.s > /dev/null 2>&1 && \
@@ -2627,7 +2627,7 @@  else
              foo:
 	     '
            ;;
-         i?86-*-solaris2*)
+         i?86-*-solaris2* | x86_64-*-solaris2.1[[0-9]]*)
 	   conftest_s='
                .group foo,.text%foo,#comdat
                .section .text%foo, "ax", @progbits
@@ -2805,12 +2805,16 @@  foo:	.long	25
 	tls_first_major=2
 	tls_first_minor=17
 	;;
-  i[34567]86-*-*)
+  i[34567]86-*-* | x86_64-*-solaris2.1[0-9]*)
     case "$target" in
       i[34567]86-*-solaris2.*)
 	on_solaris=yes
 	tga_func=___tls_get_addr
 	;;
+      x86_64-*-solaris2.1[0-9]*)
+	on_solaris=yes
+	tga_func=__tls_get_addr
+        ;;
       *)
 	on_solaris=no
 	;;
diff --git a/gcc/doc/install.texi b/gcc/doc/install.texi
--- a/gcc/doc/install.texi
+++ b/gcc/doc/install.texi
@@ -2957,6 +2957,8 @@  information are.
 @item
 @uref{#alpha-dec-osf51,,alpha*-dec-osf5.1}
 @item
+@uref{#amd64-x-solaris210,,amd64-*-solaris2.10}
+@item
 @uref{#arm-x-elf,,arm-*-elf}
 @item
 @uref{#avr,,avr}
@@ -3057,6 +3059,8 @@  information are.
 @item
 @uref{#x86-64-x-x,,x86_64-*-*, amd64-*-*}
 @item
+@uref{#x86-64-x-solaris210,,x86_64-*-solaris2.1[0-9]*}
+@item
 @uref{#xtensa-x-elf,,xtensa*-*-elf}
 @item
 @uref{#xtensa-x-linux,,xtensa*-*-linux*}
@@ -3157,6 +3161,13 @@  provide a fix shortly.
 @html
 <hr />
 @end html
+@heading @anchor{amd64-x-solaris210}amd64-*-solaris2.1[0-9]*
+
+This is a synonym for @samp{x86_64-*-solaris2.1[0-9]*}.
+
+@html
+<hr />
+@end html
 @heading @anchor{arm-x-elf}arm-*-elf
 ARM-family processors.  Subtargets that use the ELF object format
 require GNU binutils 2.13 or newer.  Such subtargets include:
@@ -3537,10 +3548,10 @@  you have the patch installed, you can co
 @end html
 @heading @anchor{ix86-x-solaris210}i?86-*-solaris2.10
 Use this for Solaris 10 or later on x86 and x86-64 systems.  This
-configuration is supported by GCC 4.0 and later versions only.  Unlike
-@samp{sparcv9-sun-solaris2*}, there is no corresponding 64-bit
-configuration like @samp{amd64-*-solaris2*} or @samp{x86_64-*-solaris2*}.
-@c FIXME: will there ever be?
+configuration is supported by GCC 4.0 and later versions only.  Starting
+with GCC 4.7, there is also a 64-bit @samp{amd64-*-solaris2.1[0-9]*} or
+@samp{x86_64-*-solaris2.1[0-9]*} configuration that corresponds to
+@samp{sparcv9-sun-solaris2*}.
 
 It is recommended that you configure GCC to use the GNU assembler, in
 @file{/usr/sfw/bin/gas}.  The versions included in Solaris 10, from GNU
@@ -4400,6 +4411,22 @@  both 64-bit x86-64 and 32-bit x86 code (
 @html
 <hr />
 @end html
+@heading @anchor{x86-64-x-solaris2.10}x86_64-*-solaris2.1[0-9]*
+
+GCC also supports the x86-64 architecture implemented by the AMD64
+processor (@samp{amd64-*-*} is an alias for @samp{x86_64-*-*}) on
+Solaris 10 or later.  Unlike other systems, without special options a
+bi-arch compiler is built which generates 32-bit code by default, but
+can generate 64-bit x86-64 code with the @option{-m64} switch.  Since
+GCC 4.7, there is also configuration that defaults to 64-bit code, but
+can generate 32-bit code with @option{-m32}.  To configure and build
+this way, you have to provide all support libraries like @file{libgmp}
+as 64-bit code, configure with @option{--target=x86_64-pc-solaris2.1x}
+and @samp{CC=gcc -m64}.
+
+@html
+<hr />
+@end html
 @heading @anchor{xtensa-x-elf}xtensa*-*-elf
 
 This target is intended for embedded Xtensa systems using the
diff --git a/gcc/testsuite/gcc.misc-tests/linkage.exp b/gcc/testsuite/gcc.misc-tests/linkage.exp
--- a/gcc/testsuite/gcc.misc-tests/linkage.exp
+++ b/gcc/testsuite/gcc.misc-tests/linkage.exp
@@ -46,7 +46,8 @@  if { [isnative] && ![is_remote host] } t
 		set native_cflags "-xarch=v9"
 	    }
 	}
-	if  [istarget "i?86*-*-solaris2*"] {
+	if  {[istarget "i?86*-*-solaris2*"]
+	     || [istarget "x86_64-*-solaris2.1\[0-9\]*"]} {
 	    set file_string [exec file "linkage-x.o"]
 	    if [ string match "*64*" $file_string ] {
 		set native_cflags "-xarch=amd64"
diff --git a/gnattools/configure.ac b/gnattools/configure.ac
--- a/gnattools/configure.ac
+++ b/gnattools/configure.ac
@@ -81,7 +81,7 @@  case "${target}" in
   sparc-sun-solaris*)
     TOOLS_TARGET_PAIRS="mlib-tgt-specific.adb<mlib-tgt-specific-solaris.adb"
     ;;
-  *86-*-solaris2*)
+  *86-*-solaris2* | x86_64-*-solaris2.1[[0-9]]*)
     TOOLS_TARGET_PAIRS="mlib-tgt-specific.adb<mlib-tgt-specific-solaris.adb"
     ;;
   *86-*-linux* \
diff --git a/libcpp/configure.ac b/libcpp/configure.ac
--- a/libcpp/configure.ac
+++ b/libcpp/configure.ac
@@ -145,7 +145,7 @@  case $target in
 	ia64-*-* | \
 	hppa*64*-*-* | \
 	i[34567]86-*-darwin* | \
-	i[34567]86-*-solaris2.1[0-9]* | \
+	i[34567]86-*-solaris2.1[0-9]* | x86_64-*-solaris2.1[0-9]* | \
 	i[34567]86-w64-mingw* | \
 	mips*-*-* | \
 	mmix-*-* | \
diff --git a/libgcc/config.host b/libgcc/config.host
--- a/libgcc/config.host
+++ b/libgcc/config.host
@@ -188,7 +188,7 @@  case ${host} in
   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]*)
+    i?86-*-solaris2.1[0-9]* | x86_64-*-solaris2.1[0-9]*)
       # Solaris 10+/x86 provides crt1.o, crti.o, crtn.o, and gcrt1.o as
       # part of the base system.
       ;;
@@ -378,7 +378,7 @@  i[34567]86-*-rtems*)
 	extra_parts="crtbegin.o crtend.o crti.o crtn.o"
 	tmake_file="${tmake_file} t-crtin i386/t-softfp i386/t-crtstuff t-rtems"
 	;;
-i[34567]86-*-solaris2*)
+i[34567]86-*-solaris2* | x86_64-*-solaris2.1[0-9]*)
 	tmake_file="$tmake_file i386/t-crtfm"
 	extra_parts="$extra_parts crtfastmath.o"
 	md_unwind_header=i386/sol2-unwind.h
@@ -692,7 +692,7 @@  i[34567]86-*-darwin* | x86_64-*-darwin* 
   i[34567]86-*-kfreebsd*-gnu | x86_64-*-kfreebsd*-gnu | \
   i[34567]86-*-linux* | x86_64-*-linux* | \
   i[34567]86-*-gnu* | \
-  i[34567]86-*-solaris2* | \
+  i[34567]86-*-solaris2* | x86_64-*-solaris2.1[0-9]* | \
   i[34567]86-*-cygwin* | i[34567]86-*-mingw* | x86_64-*-mingw* | \
   i[34567]86-*-freebsd* | x86_64-*-freebsd*)
 	if test "${host_address}" = 32; then
diff --git a/libgcc/configure.ac b/libgcc/configure.ac
--- a/libgcc/configure.ac
+++ b/libgcc/configure.ac
@@ -207,7 +207,7 @@  esac
 # Link with -nostartfiles -nodefaultlibs since neither are present while
 # building libgcc.
 case ${host} in
-i?86-*-solaris2*)
+i?86-*-solaris2* | x86_64-*-solaris2.1[[0-9]]*)
   cat > conftest.s <<EOF
 	.section	.eh_frame,"a",@unwind
 	.zero	4
diff --git a/libgo/config/libtool.m4 b/libgo/config/libtool.m4
--- a/libgo/config/libtool.m4
+++ b/libgo/config/libtool.m4
@@ -1296,7 +1296,7 @@  s390*-*linux*|s390*-*tpf*|sparc*-*linux*
       case $lt_cv_prog_gnu_ld in
       yes*)
         case $host in
-        i?86-*-solaris*)
+        i?86-*-solaris* | x86_64-*-solaris2.1[[0-9]]*)
           LD="${LD-ld} -m elf_x86_64"
           ;;
         sparc*-*-solaris*)
diff --git a/libjava/configure.host b/libjava/configure.host
--- a/libjava/configure.host
+++ b/libjava/configure.host
@@ -141,6 +141,9 @@  case "${host}" in
 		libgcj_flags="${libgcj_flags} -ffloat-store" ;;
 	esac
 	libgcj_flags="${libgcj_flags} -fomit-frame-pointer"
+	# On Solaris we have defined 'sun' which later conflicts with 
+	# namespace usage. So to work this away we use the below undefine.
+	libgcj_flags="${libgcj_flags} -Usun"
 	libgcj_cxxflags=
 	libgcj_cflags=
 	DIVIDESPEC=-fno-use-divide-subroutine
@@ -285,6 +288,10 @@  EOF
 	sysdeps_dir=i386
 	DIVIDESPEC=-f%{m32:no-}%{!m32:%{!m64:no-}}%{m64:}use-divide-subroutine
 	;;
+  x86_64-*-solaris2.1[0-9]* )
+	sysdeps_dir=i386
+	DIVIDESPEC=-f%{m32:no-}use-divide-subroutine
+	;;
   mips-sgi-irix6* )
 	can_unwind_signal=yes
 	sysdeps_dir=mips
@@ -322,7 +329,7 @@  EOF
 	DIVIDESPEC=-fuse-divide-subroutine
 	CHECKREFSPEC=-fcheck-references
 	;;
-  i?86-*-solaris2*)
+  i?86-*-solaris2* | x86_64-*-solaris2.1[0-9]*)
 	can_unwind_signal=yes
 	;;
   *-*-freebsd*)