diff --git a/config/ChangeLog b/config/ChangeLog index c57ec35e6a0bfd02dd80824f7a5bfa4765bfa52c..feb73b94a0f3dd5a69fe312f836f1d185afa7451 100644 --- a/config/ChangeLog +++ b/config/ChangeLog @@ -1,3 +1,7 @@ +2009-01-23 Jie Zhang <jie.zhang@analog.com> + + * tls.m4 (GCC_CHECK_EMUTLS): Define. + 2008-12-21 Andrew Pinski <pinskia@gmail.com> PR target/38300 diff --git a/config/tls.m4 b/config/tls.m4 index acb123f6986d499a37d24816065cb53c57e34436..e77742c76034a9b1cc39ee4144b574c5bc8190bb 100644 --- a/config/tls.m4 +++ b/config/tls.m4 @@ -86,3 +86,21 @@ AC_DEFUN([GCC_CHECK_CC_TLS], [ AC_DEFINE(HAVE_CC_TLS, 1, [Define to 1 if the target assembler supports thread-local storage.]) fi]) + +dnl Check whether TLS is emulated. +AC_DEFUN([GCC_CHECK_EMUTLS], [ + AC_CACHE_CHECK([whether the thread-local storage support is from emutls], + gcc_cv_use_emutls, [ + gcc_cv_use_emutls=no + echo '__thread int a; int b; int main() { return a = b; }' > conftest.c + if AC_TRY_COMMAND(${CC-cc} -Werror -S -o conftest.s conftest.c 1>&AS_MESSAGE_LOG_FD); then + if grep __emutls_get_address conftest.s > /dev/null; then + gcc_cv_use_emutls=yes + fi + fi + rm -f conftest.* + ]) + if test "$gcc_cv_use_emutls" = "yes" ; then + AC_DEFINE(USE_EMUTLS, 1, + [Define to 1 if the target use emutls for thread-local storage.]) + fi]) diff --git a/libmudflap/ChangeLog b/libmudflap/ChangeLog index 25dcdf9730e92bb2a47748fc16acc6db6b0a65d5..e42a15b5605f6dd9dfcbf16b1634e8a7e7ec5920 100644 --- a/libmudflap/ChangeLog +++ b/libmudflap/ChangeLog @@ -1,3 +1,13 @@ +2009-01-23 Jie Zhang <jie.zhang@analog.com> + + * mf-impl.h (__mf_get_state, __mf_set_state): Don't use + __thread when TLS support is emulated. + * mf-hooks3.c (__mf_get_state, __mf_set_state): Likewise. + * mf-runtime.c (__mf_state_1): Likewise. + * configure.ac: Use GCC_CHECK_EMUTLS. + * configure: Regenerate. + * config.h.in: Regenerate. + 2008-12-18 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> * configure: Regenerate. diff --git a/libmudflap/config.h.in b/libmudflap/config.h.in index 94b2b8a209843fbd70e9b4576bfe730738d7d52d..0c88f61553fa37cb412e6be9e220fa77063cf965 100644 --- a/libmudflap/config.h.in +++ b/libmudflap/config.h.in @@ -277,5 +277,8 @@ /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS +/* Define to 1 if the target use emutls for thread-local storage. */ +#undef USE_EMUTLS + /* Version number of package */ #undef VERSION diff --git a/libmudflap/configure b/libmudflap/configure index ad10a2c238d348c73efa93c8f824bc6d3f2fb932..758ac8f0a3029ecba057d6b0064c0701c6c6de28 100755 --- a/libmudflap/configure +++ b/libmudflap/configure @@ -13024,6 +13024,37 @@ echo "${ECHO_T}$gcc_cv_have_tls" >&6 cat >>confdefs.h <<\_ACEOF #define HAVE_TLS 1 +_ACEOF + + fi + + echo "$as_me:$LINENO: checking whether the thread-local storage support is from emutls" >&5 +echo $ECHO_N "checking whether the thread-local storage support is from emutls... $ECHO_C" >&6 +if test "${gcc_cv_use_emutls+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + gcc_cv_use_emutls=no + echo '__thread int a; int b; int main() { return a = b; }' > conftest.c + if { ac_try='${CC-cc} -Werror -S -o conftest.s conftest.c 1>&5' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + if grep __emutls_get_address conftest.s > /dev/null; then + gcc_cv_use_emutls=yes + fi + fi + rm -f conftest.* + +fi +echo "$as_me:$LINENO: result: $gcc_cv_use_emutls" >&5 +echo "${ECHO_T}$gcc_cv_use_emutls" >&6 + if test "$gcc_cv_use_emutls" = "yes" ; then + +cat >>confdefs.h <<\_ACEOF +#define USE_EMUTLS 1 _ACEOF fi diff --git a/libmudflap/configure.ac b/libmudflap/configure.ac index a22be278d32c8b1193bbf4067a45585191428158..8ce99a10270df1c01871ab941b5d04c0d74c8b1d 100644 --- a/libmudflap/configure.ac +++ b/libmudflap/configure.ac @@ -265,6 +265,7 @@ fi # See if we support thread-local storage. GCC_CHECK_TLS +GCC_CHECK_EMUTLS AC_CONFIG_FILES([Makefile testsuite/Makefile testsuite/mfconfig.exp]) AC_OUTPUT diff --git a/libmudflap/mf-hooks3.c b/libmudflap/mf-hooks3.c index dec4cd63b83da62f3c7d9f3df2970bfd9df5a907..5792a14f5dbe02b835594f2f9850f632e63b47d5 100644 --- a/libmudflap/mf-hooks3.c +++ b/libmudflap/mf-hooks3.c @@ -78,7 +78,7 @@ DECLARE(int, pthread_create, pthread_t *thr, const pthread_attr_t *attr, /* Multithreading support hooks. */ -#ifndef HAVE_TLS +#if !defined(HAVE_TLS) || defined(USE_EMUTLS) /* We don't have TLS. Ordinarily we could use pthread keys, but since we're commandeering malloc/free that presents a few problems. The first is that we'll recurse from __mf_get_state to pthread_setspecific to malloc back to @@ -217,7 +217,7 @@ __mf_pthread_cleanup (void *arg) if (__mf_opts.heur_std_data) __mf_unregister (&errno, sizeof (errno), __MF_TYPE_GUESS); -#ifndef HAVE_TLS +#if !defined(HAVE_TLS) || defined(USE_EMUTLS) struct mf_thread_data *data = __mf_find_threadinfo (0); if (data) data->used_p = 0; diff --git a/libmudflap/mf-impl.h b/libmudflap/mf-impl.h index 728a58bc05dd56ce1c4e02c1eec1b3b1c3fd29bc..15d0b9ae53ac5e3cc50d8f58623d8938745ac887 100644 --- a/libmudflap/mf-impl.h +++ b/libmudflap/mf-impl.h @@ -244,7 +244,7 @@ extern pthread_mutex_t __mf_biglock; #define UNLOCKTH() do {} while (0) #endif -#if defined(LIBMUDFLAPTH) && !defined(HAVE_TLS) +#if defined(LIBMUDFLAPTH) && (!defined(HAVE_TLS) || defined(USE_EMUTLS)) extern enum __mf_state_enum __mf_get_state (void); extern void __mf_set_state (enum __mf_state_enum); #else diff --git a/libmudflap/mf-runtime.c b/libmudflap/mf-runtime.c index 79fdb323dbed334eca9cd6e11f747ee9425e8b21..93b895a15734a43c7cdbe0013c00a37d4cea579a 100644 --- a/libmudflap/mf-runtime.c +++ b/libmudflap/mf-runtime.c @@ -178,7 +178,7 @@ struct __mf_options __mf_opts; int __mf_starting_p = 1; #ifdef LIBMUDFLAPTH -#ifdef HAVE_TLS +#if defined(HAVE_TLS) && !defined(USE_EMUTLS) __thread enum __mf_state_enum __mf_state_1 = reentrant; #endif #else