libgo: use -Wc,-shared-libgcc on Solaris

Patch from Rainer Orth.

For https://gcc.gnu.org/PR64900

Change-Id: I1d8c059009b2956b6e6d4f675fde79e72842ae11
Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/731482
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
diff --git a/libgo/Makefile.am b/libgo/Makefile.am
index 3eccadb..d139d78 100644
--- a/libgo/Makefile.am
+++ b/libgo/Makefile.am
@@ -837,7 +837,8 @@
 	$(golangorg_x_sys_cpu_gccgo_x86_lo)
 
 libgo_ldflags = \
-	-version-info $(libtool_VERSION) $(PTHREAD_CFLAGS) $(AM_LDFLAGS)
+	-version-info $(libtool_VERSION) $(PTHREAD_CFLAGS) $(AM_LDFLAGS) \
+	$(OSLDFLAGS)
 
 libgo_libadd = \
 	$(libgo_go_objs) ../libbacktrace/libbacktrace.la \
diff --git a/libgo/Makefile.in b/libgo/Makefile.in
index 0a2b7ee..6e194d0 100644
--- a/libgo/Makefile.in
+++ b/libgo/Makefile.in
@@ -453,6 +453,7 @@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
 OSCFLAGS = @OSCFLAGS@
+OSLDFLAGS = @OSLDFLAGS@
 OTOOL = @OTOOL@
 OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@
@@ -972,7 +973,8 @@
 	$(golangorg_x_sys_cpu_gccgo_x86_lo)
 
 libgo_ldflags = \
-	-version-info $(libtool_VERSION) $(PTHREAD_CFLAGS) $(AM_LDFLAGS)
+	-version-info $(libtool_VERSION) $(PTHREAD_CFLAGS) $(AM_LDFLAGS) \
+	$(OSLDFLAGS)
 
 libgo_libadd = \
 	$(libgo_go_objs) ../libbacktrace/libbacktrace.la \
diff --git a/libgo/configure b/libgo/configure
index bba3c7a..fa290d4 100755
--- a/libgo/configure
+++ b/libgo/configure
@@ -658,6 +658,7 @@
 USING_SPLIT_STACK_FALSE
 USING_SPLIT_STACK_TRUE
 SPLIT_STACK
+OSLDFLAGS
 HWCAP_CFLAGS
 OSCFLAGS
 GO_SYSCALL_OS_ARCH_FILE
@@ -11547,7 +11548,7 @@
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 11550 "configure"
+#line 11551 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -11653,7 +11654,7 @@
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 11656 "configure"
+#line 11657 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -14457,6 +14458,15 @@
 
 
 
+case "$target" in
+    *86*-*-solaris2.*)
+	# Link with -shared-libgcc on Solaris 11+/x86 as a workaround for
+	# PR go/64900.
+	OSLDFLAGS="-Wc,-shared-libgcc"
+	;;
+esac
+
+
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -fsplit-stack is supported" >&5
 $as_echo_n "checking whether -fsplit-stack is supported... " >&6; }
 if ${libgo_cv_c_split_stack_supported+:} false; then :
diff --git a/libgo/configure.ac b/libgo/configure.ac
index f8fe5f2..0004819 100644
--- a/libgo/configure.ac
+++ b/libgo/configure.ac
@@ -442,6 +442,15 @@
 dnl Check if assembler supports disabling hardware capability support.
 GCC_CHECK_ASSEMBLER_HWCAP
 
+case "$target" in
+    *86*-*-solaris2.*)
+	# Link with -shared-libgcc on Solaris 11+/x86 as a workaround for
+	# PR go/64900.
+	OSLDFLAGS="-Wc,-shared-libgcc"
+	;;
+esac
+AC_SUBST(OSLDFLAGS)
+
 dnl Use -fsplit-stack when compiling C code if available.
 AC_CACHE_CHECK([whether -fsplit-stack is supported],
 [libgo_cv_c_split_stack_supported],
diff --git a/libgo/testsuite/Makefile.in b/libgo/testsuite/Makefile.in
index 7c2e2e6..0b5e726 100644
--- a/libgo/testsuite/Makefile.in
+++ b/libgo/testsuite/Makefile.in
@@ -202,6 +202,7 @@
 OBJDUMP = @OBJDUMP@
 OBJEXT = @OBJEXT@
 OSCFLAGS = @OSCFLAGS@
+OSLDFLAGS = @OSLDFLAGS@
 OTOOL = @OTOOL@
 OTOOL64 = @OTOOL64@
 PACKAGE = @PACKAGE@