summaryrefslogtreecommitdiff
path: root/libgo
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2012-06-05 06:19:19 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2012-06-05 06:19:19 +0000
commit44072af5b08af901bf25a728a6beecde0664e92c (patch)
tree41efff854752dd2e4f96649759a91c71ff28ccbf /libgo
parent70b9f51628c32d91a451ff6616f675d5a738413b (diff)
downloadgcc-44072af5b08af901bf25a728a6beecde0664e92c.tar.gz
runtime: Fix call to _dl_get_tls_static_info for i386.
From-SVN: r188230
Diffstat (limited to 'libgo')
-rw-r--r--libgo/config.h.in3
-rwxr-xr-xlibgo/configure2
-rw-r--r--libgo/configure.ac2
-rw-r--r--libgo/runtime/proc.c27
4 files changed, 31 insertions, 3 deletions
diff --git a/libgo/config.h.in b/libgo/config.h.in
index 10aab607481..eb81c9ee715 100644
--- a/libgo/config.h.in
+++ b/libgo/config.h.in
@@ -286,6 +286,9 @@
/* Define to 1 if you have the `wait4' function. */
#undef HAVE_WAIT4
+/* Define to 1 if you have the `_dl_get_tls_static_info' function. */
+#undef HAVE__DL_GET_TLS_STATIC_INFO
+
/* Define if the C++ compiler is configured for setjmp/longjmp exceptions. */
#undef LIBGO_SJLJ_EXCEPTIONS
diff --git a/libgo/configure b/libgo/configure
index 1f797d4deeb..be9e510ce25 100755
--- a/libgo/configure
+++ b/libgo/configure
@@ -14584,7 +14584,7 @@ else
fi
-for ac_func in strerror_r strsignal wait4 mincore setenv
+for ac_func in strerror_r strsignal wait4 mincore setenv _dl_get_tls_static_info
do :
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
diff --git a/libgo/configure.ac b/libgo/configure.ac
index 5125200e2a1..03909d6046c 100644
--- a/libgo/configure.ac
+++ b/libgo/configure.ac
@@ -481,7 +481,7 @@ fi
AM_CONDITIONAL(HAVE_SYS_MMAN_H, test "$ac_cv_header_sys_mman_h" = yes)
-AC_CHECK_FUNCS(strerror_r strsignal wait4 mincore setenv)
+AC_CHECK_FUNCS(strerror_r strsignal wait4 mincore setenv _dl_get_tls_static_info)
AM_CONDITIONAL(HAVE_STRERROR_R, test "$ac_cv_func_strerror_r" = yes)
AM_CONDITIONAL(HAVE_WAIT4, test "$ac_cv_func_wait4" = yes)
diff --git a/libgo/runtime/proc.c b/libgo/runtime/proc.c
index 2d0044dca6a..0adecb7b57e 100644
--- a/libgo/runtime/proc.c
+++ b/libgo/runtime/proc.c
@@ -1105,6 +1105,7 @@ runtime_newm(void)
M *m;
pthread_attr_t attr;
pthread_t tid;
+ size_t stacksize;
m = runtime_malloc(sizeof(M));
mcommoninit(m);
@@ -1118,7 +1119,31 @@ runtime_newm(void)
#ifndef PTHREAD_STACK_MIN
#define PTHREAD_STACK_MIN 8192
#endif
- if(pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN) != 0)
+
+ stacksize = PTHREAD_STACK_MIN;
+
+#ifdef HAVE__DL_GET_TLS_STATIC_INFO
+ {
+ /* On GNU/Linux the static TLS size is taken out of
+ the stack size, and we get an error or a crash if
+ there is not enough stack space left. Add it back
+ in if we can, in case the program uses a lot of TLS
+ space. */
+#ifndef internal_function
+#ifdef __i386__
+#define internal_function __attribute__ ((regparm (3), stdcall))
+#else
+#define internal_function
+#endif
+#endif
+ extern void _dl_get_tls_static_info(size_t*, size_t*) internal_function;
+ size_t tlssize, tlsalign;
+ _dl_get_tls_static_info(&tlssize, &tlsalign);
+ stacksize += tlssize;
+ }
+#endif
+
+ if(pthread_attr_setstacksize(&attr, stacksize) != 0)
runtime_throw("pthread_attr_setstacksize");
if(pthread_create(&tid, &attr, runtime_mstart, m) != 0)