runtime: Fix call to _dl_get_tls_static_info for i386.
authorIan Lance Taylor <ian@gcc.gnu.org>
Tue, 5 Jun 2012 06:19:19 +0000 (06:19 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Tue, 5 Jun 2012 06:19:19 +0000 (06:19 +0000)
From-SVN: r188230

libgo/config.h.in
libgo/configure
libgo/configure.ac
libgo/runtime/proc.c

index 10aab6074810e042d9b3e1d172372e156ce8a429..eb81c9ee7152f65c41374c941d5ff1e7c273656d 100644 (file)
 /* 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
 
index 1f797d4deeb661f31215e0abe8671ea9951dd180..be9e510ce252c6089207550794539b3b2bcef596 100755 (executable)
@@ -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"
index 5125200e2a1b9b61b9f28e736b6d685f17599d93..03909d6046cd3299214c651256cd4817c4a4860a 100644 (file)
@@ -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)
 
index 2d0044dca6a73b5d53ec9538d12a3f8a4229dfa1..0adecb7b57ea14026ed0710e9992bbb16522b40b 100644 (file)
@@ -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)