libgo: If compiler can split-stack and linker can not, use -fno-split-stack.

If the compiler supports split-stack but we are using a gold linker that
    does not, as happens on PPC with current GCC but old gold, then we need
    to compile the Go code with -fno-split-stack to avoid a linker error
    avoid the inability to call from split-stack code to non-split-stack
    code.
    
    Reviewed-on: https://go-review.googlesource.com/14598

From-SVN: r227811
This commit is contained in:
Ian Lance Taylor 2015-09-15 21:15:37 +00:00
parent c8338173d7
commit a2bf11d16a
6 changed files with 24 additions and 5 deletions

View File

@ -1,4 +1,4 @@
6f0ac34e139755c319368757fe2a093f1e5bde49 eac8b31fec761c8da0606a70ae0547ff0b12e8db
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.

View File

@ -2074,7 +2074,7 @@ libnetgo_a_LIBADD = netgo.o
LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/../libtool-ldflags $(LDFLAGS)) LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/../libtool-ldflags $(LDFLAGS))
GOCFLAGS = $(CFLAGS) GOCFLAGS = $(CFLAGS)
AM_GOCFLAGS = $(STRINGOPS_FLAG) AM_GOCFLAGS = $(STRINGOPS_FLAG) $(GO_SPLIT_STACK)
GOCOMPILE = $(GOC) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_GOCFLAGS) $(GOCFLAGS) GOCOMPILE = $(GOC) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_GOCFLAGS) $(GOCFLAGS)
LTGOCOMPILE = $(LIBTOOL) --tag GO --mode=compile $(GOC) $(INCLUDES) \ LTGOCOMPILE = $(LIBTOOL) --tag GO --mode=compile $(GOC) $(INCLUDES) \

View File

@ -366,6 +366,7 @@ GOCFLAGS = $(CFLAGS)
GOOS = @GOOS@ GOOS = @GOOS@
GO_LIBCALL_OS_ARCH_FILE = @GO_LIBCALL_OS_ARCH_FILE@ GO_LIBCALL_OS_ARCH_FILE = @GO_LIBCALL_OS_ARCH_FILE@
GO_LIBCALL_OS_FILE = @GO_LIBCALL_OS_FILE@ GO_LIBCALL_OS_FILE = @GO_LIBCALL_OS_FILE@
GO_SPLIT_STACK = @GO_SPLIT_STACK@
GO_SYSCALL_OS_ARCH_FILE = @GO_SYSCALL_OS_ARCH_FILE@ GO_SYSCALL_OS_ARCH_FILE = @GO_SYSCALL_OS_ARCH_FILE@
GO_SYSCALL_OS_FILE = @GO_SYSCALL_OS_FILE@ GO_SYSCALL_OS_FILE = @GO_SYSCALL_OS_FILE@
GREP = @GREP@ GREP = @GREP@
@ -2153,7 +2154,7 @@ libgolibbegin_a_CFLAGS = $(AM_CFLAGS) -fPIC
libnetgo_a_SOURCES = $(go_netgo_files) libnetgo_a_SOURCES = $(go_netgo_files)
libnetgo_a_LIBADD = netgo.o libnetgo_a_LIBADD = netgo.o
LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/../libtool-ldflags $(LDFLAGS)) LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/../libtool-ldflags $(LDFLAGS))
AM_GOCFLAGS = $(STRINGOPS_FLAG) AM_GOCFLAGS = $(STRINGOPS_FLAG) $(GO_SPLIT_STACK)
GOCOMPILE = $(GOC) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_GOCFLAGS) $(GOCFLAGS) GOCOMPILE = $(GOC) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_GOCFLAGS) $(GOCFLAGS)
LTGOCOMPILE = $(LIBTOOL) --tag GO --mode=compile $(GOC) $(INCLUDES) \ LTGOCOMPILE = $(LIBTOOL) --tag GO --mode=compile $(GOC) $(INCLUDES) \
$(AM_GOCFLAGS) $(GOCFLAGS) $(AM_GOCFLAGS) $(GOCFLAGS)

12
libgo/configure vendored
View File

@ -620,6 +620,7 @@ NET_LIBS
MATH_LIBS MATH_LIBS
GOC_IS_LLGO_FALSE GOC_IS_LLGO_FALSE
GOC_IS_LLGO_TRUE GOC_IS_LLGO_TRUE
GO_SPLIT_STACK
USING_SPLIT_STACK_FALSE USING_SPLIT_STACK_FALSE
USING_SPLIT_STACK_TRUE USING_SPLIT_STACK_TRUE
SPLIT_STACK SPLIT_STACK
@ -11123,7 +11124,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF cat > conftest.$ac_ext <<_LT_EOF
#line 11126 "configure" #line 11127 "configure"
#include "confdefs.h" #include "confdefs.h"
#if HAVE_DLFCN_H #if HAVE_DLFCN_H
@ -11229,7 +11230,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF cat > conftest.$ac_ext <<_LT_EOF
#line 11232 "configure" #line 11233 "configure"
#include "confdefs.h" #include "confdefs.h"
#if HAVE_DLFCN_H #if HAVE_DLFCN_H
@ -14050,6 +14051,13 @@ else
fi fi
if test "$libgo_cv_c_split_stack_supported" = yes -a "$libgo_cv_c_linker_split_non_split" = no; then
GO_SPLIT_STACK=-fno-split-stack
else
GO_SPLIT_STACK=
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether linker supports split stack" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether linker supports split stack" >&5
$as_echo_n "checking whether linker supports split stack... " >&6; } $as_echo_n "checking whether linker supports split stack... " >&6; }
if test "${libgo_cv_c_linker_supports_split_stack+set}" = set; then : if test "${libgo_cv_c_linker_supports_split_stack+set}" = set; then :

View File

@ -407,6 +407,15 @@ AC_SUBST(SPLIT_STACK)
AM_CONDITIONAL(USING_SPLIT_STACK, AM_CONDITIONAL(USING_SPLIT_STACK,
test "$libgo_cv_c_split_stack_supported" = yes -a "$libgo_cv_c_linker_split_non_split" = yes) test "$libgo_cv_c_split_stack_supported" = yes -a "$libgo_cv_c_linker_split_non_split" = yes)
dnl If the compiler supports split-stack but the linker does not, then
dnl we need to explicitly disable split-stack for Go.
if test "$libgo_cv_c_split_stack_supported" = yes -a "$libgo_cv_c_linker_split_non_split" = no; then
GO_SPLIT_STACK=-fno-split-stack
else
GO_SPLIT_STACK=
fi
AC_SUBST(GO_SPLIT_STACK)
dnl Check whether the linker does stack munging when calling from dnl Check whether the linker does stack munging when calling from
dnl split-stack into non-split-stack code. We check this by looking dnl split-stack into non-split-stack code. We check this by looking
dnl at the --help output. FIXME: This is only half right: it's dnl at the --help output. FIXME: This is only half right: it's

View File

@ -108,6 +108,7 @@ GOCFLAGS = @GOCFLAGS@
GOOS = @GOOS@ GOOS = @GOOS@
GO_LIBCALL_OS_ARCH_FILE = @GO_LIBCALL_OS_ARCH_FILE@ GO_LIBCALL_OS_ARCH_FILE = @GO_LIBCALL_OS_ARCH_FILE@
GO_LIBCALL_OS_FILE = @GO_LIBCALL_OS_FILE@ GO_LIBCALL_OS_FILE = @GO_LIBCALL_OS_FILE@
GO_SPLIT_STACK = @GO_SPLIT_STACK@
GO_SYSCALL_OS_ARCH_FILE = @GO_SYSCALL_OS_ARCH_FILE@ GO_SYSCALL_OS_ARCH_FILE = @GO_SYSCALL_OS_ARCH_FILE@
GO_SYSCALL_OS_FILE = @GO_SYSCALL_OS_FILE@ GO_SYSCALL_OS_FILE = @GO_SYSCALL_OS_FILE@
GREP = @GREP@ GREP = @GREP@