From: ian Date: Tue, 5 Jun 2012 06:19:19 +0000 (+0000) Subject: runtime: Fix call to _dl_get_tls_static_info for i386. X-Git-Tag: upstream/4.9.2~12306 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=92b5b19118d222912f01bde0edcc2a8ca0af2296;p=platform%2Fupstream%2Flinaro-gcc.git runtime: Fix call to _dl_get_tls_static_info for i386. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@188230 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/libgo/config.h.in b/libgo/config.h.in index 10aab60..eb81c9e 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 1f797d4..be9e510 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 5125200..03909d6 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 2d0044d..0adecb7 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)