On Mon, 13 Feb 2012 16:16:30 -0800 Jeremy Huddleston <jerem...@apple.com> wrote:
> From: Jeremy Huddleston <jerem...@apple.com> > Date: Sat, 11 Feb 2012 00:44:38 -0800 > Subject: [PATCH 2/2] Expand TLS support beyond __thread to > __declspec(thread) > > Also prefer initial-exec if available. This code was pretty much > coppied from a similar commit that I made to xorg-server in April. > > cf: xorg/xserver: bb4d145bd25e2aee988b100ecf1105ea3b6a40b8 > > Signed-off-by: Jeremy Huddleston <jerem...@apple.com> This commit seems to cause troubles for clang in linux. Running pixman configure with clang-3.1 prefers the use of __declspec(thread) for TLS: checking for gettimeofday... yes checking sys/time.h usability... yes checking sys/time.h presence... yes checking for sys/time.h... yes checking for thread local storage (TLS) support... __declspec(thread) And config.log contains: configure:13722: checking for thread local storage (TLS) support configure:13750: clang -c -g -O2 -Wall -fno-strict-aliasing -fvisibility=hidden conftest.c >&5 configure:13750: $? = 0 configure:13750: clang -c -g -O2 -Wall -fno-strict-aliasing -fvisibility=hidden conftest.c >&5 configure:13750: $? = 0 configure:13758: result: __declspec(thread) So clang seems to accept both __thread and __declspec(thread) but selects the latter because it is the last in the list. For the current clang svn (soon to be clang-3.2) we get a bit different result in config.log: configure:13722: checking for thread local storage (TLS) support configure:13750: clang -c -g -O2 -Wall -fno-strict-aliasing -fvisibility=hidden conftest.c >&5 configure:13750: $? = 0 configure:13750: clang -c -g -O2 -Wall -fno-strict-aliasing -fvisibility=hidden conftest.c >&5 conftest.c:45:16: warning: __declspec attribute 'thread' is not supported [-Wignored-attributes] int __declspec(thread) test; ^ 1 warning generated. configure:13750: $? = 0 configure:13758: result: __declspec(thread) Here clang-3.2 produces a warning about __declspec(thread), but does not fail compilation. Which results in __declspec(thread) also being selected for TLS. A simple test demonstrates that __declspec(thread) does not work correctly in clang: /************************************/ #include <pthread.h> #include <unistd.h> #include <assert.h> int __declspec(thread) a = 0; void *thread_func(void * arg) { a++; sleep(1); assert(a == 1); return NULL; } int main(void) { pthread_t thread1, thread2; pthread_create(&thread1, NULL, thread_func, NULL); pthread_create(&thread2, NULL, thread_func, NULL); pthread_join(thread1, NULL); pthread_join(thread2, NULL); return 0; } /************************************/ On a positive side, looks like clang-3.2 is going to be able to pass pixman test suite successfully. I would suggest to just change the order of checks for __declspec(thread) and __thread in configure.ac -- Best regards, Siarhei Siamashka _______________________________________________ Pixman mailing list Pixman@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/pixman