<div dir="ltr">Yes, I normally build with CMake/ninja (and did a clean build just now). We also have a bunch of bots running CMake builds.<div class="gmail_extra"><br><div class="gmail_quote">On Wed, May 29, 2013 at 10:52 PM, David Blaikie <span dir="ltr"><<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote"><div class="im">On Wed, May 29, 2013 at 11:06 AM, Sergey Matveev <span dir="ltr"><<a href="mailto:earthdok@google.com" target="_blank">earthdok@google.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">It seems to me that you're linking with an outdated RTSanitizerCommon.</div></blockquote><div><br></div>

</div><div>I just did a clean (ninja -t clean && ninja check-all) build & still received these linker errors. Have you verified this builds for you with CMake?</div><div><div class="h5"><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div><div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, May 29, 2013 at 9:45 PM, David Blaikie <span dir="ltr"><<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</a>></span> wrote:<br>


<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote"><div>On Wed, May 29, 2013 at 6:07 AM, Sergey Matveev <span dir="ltr"><<a href="mailto:earthdok@google.com" target="_blank">earthdok@google.com</a>></span> wrote:<br>



<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Author: smatveev<br>
Date: Wed May 29 08:07:42 2013<br>
New Revision: 182853<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=182853&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=182853&view=rev</a><br>
Log:<br>
[sanitizer] Change the way GetThreadStackAndTls() obtains the thread descriptor address.<br>
<br>
Instead of using arch_prctl(ARCH_GET_FS), read the address from the<br>
tread descriptor itself. This lets us avoid sandboxing issues. Also,<br>
GetThreadStackAndTls() can now be implemented on i386.<br></blockquote><div><br></div></div><div>This seems like it might've broken the compiler_rt cmake (& Ninja, specifically) build:<br><br><div>FAILED: cd /usr/local/google/home/blaikie/dev/llvm/build/clang/debug/projects/compiler-rt/lib/sanitizer_common/tests && /usr/local/google/home/blaikie/dev/llvm/build/clang/debug/bin/clang sanitizer_allocator_test.cc.i386.o sanitizer_atomic_test.cc.i386.o sanitizer_common_test.cc.i386.o sanitizer_flags_test.cc.i386.o sanitizer_libc_test.cc.i386.o sanitizer_linux_test.cc.i386.o sanitizer_list_test.cc.i386.o sanitizer_mutex_test.cc.i386.o sanitizer_nolibc_test.cc.i386.o sanitizer_printf_test.cc.i386.o sanitizer_scanf_interceptor_test.cc.i386.o sanitizer_stackdepot_test.cc.i386.o sanitizer_stacktrace_test.cc.i386.o sanitizer_stoptheworld_test.cc.i386.o sanitizer_test_main.cc.i386.o sanitizer_thread_registry_test.cc.i386.o gtest-all.cc.i386.o libRTSanitizerCommon.test.i386.a -o /usr/local/google/home/blaikie/dev/llvm/build/clang/debug/projects/compiler-rt/lib/sanitizer_common/tests/Sanitizer-i386-Test -lstdc++ -ldl -lpthread -m32</div>



<div>sanitizer_linux_test.cc.i386.o: In function `__sanitizer::thread_self_offset_test_func(void*)':</div><div>/usr/local/google/home/blaikie/dev/llvm/src/projects/compiler-rt/lib/sanitizer_common/tests/sanitizer_linux_test.cc:201: undefined reference to `__sanitizer::ThreadSelf()'</div>



<div>/usr/local/google/home/blaikie/dev/llvm/src/projects/compiler-rt/lib/sanitizer_common/tests/sanitizer_linux_test.cc:201: undefined reference to `__sanitizer::ThreadSelfOffset()'</div><div>/usr/local/google/home/blaikie/dev/llvm/src/projects/compiler-rt/lib/sanitizer_common/tests/sanitizer_linux_test.cc:201: undefined reference to `__sanitizer::ThreadSelf()'</div>



<div>/usr/local/google/home/blaikie/dev/llvm/src/projects/compiler-rt/lib/sanitizer_common/tests/sanitizer_linux_test.cc:201: undefined reference to `__sanitizer::ThreadSelf()'</div><div>/usr/local/google/home/blaikie/dev/llvm/src/projects/compiler-rt/lib/sanitizer_common/tests/sanitizer_linux_test.cc:201: undefined reference to `__sanitizer::ThreadSelfOffset()'</div>



<div>/usr/local/google/home/blaikie/dev/llvm/src/projects/compiler-rt/lib/sanitizer_common/tests/sanitizer_linux_test.cc:201: undefined reference to `__sanitizer::ThreadSelf()'</div><div>sanitizer_linux_test.cc.i386.o: In function `__sanitizer::thread_descriptor_size_test_func(void*)':</div>



<div>/usr/local/google/home/blaikie/dev/llvm/src/projects/compiler-rt/lib/sanitizer_common/tests/sanitizer_linux_test.cc:216: undefined reference to `__sanitizer::ThreadSelf()'</div><div>sanitizer_linux_test.cc.i386.o: In function `__sanitizer::SanitizerLinux_ThreadDescriptorSize_Test::TestBody()':</div>



<div>/usr/local/google/home/blaikie/dev/llvm/src/projects/compiler-rt/lib/sanitizer_common/tests/sanitizer_linux_test.cc:230: undefined reference to `__sanitizer::ThreadDescriptorSize()'</div><div>clang-3.3: error: linker command failed with exit code 1 (use -v to see invocation)</div>



<div><br></div></div><div><div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
Modified:<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h<br>
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux_libcdep.cc<br>
    compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_linux_test.cc<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h?rev=182853&r1=182852&r2=182853&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h?rev=182853&r1=182852&r2=182853&view=diff</a><br>




==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux.h Wed May 29 08:07:42 2013<br>
@@ -55,6 +55,8 @@ void AdjustStackSizeLinux(void *attr, in<br>
<br>
 // Exposed for testing.<br>
 uptr ThreadDescriptorSize();<br>
+uptr ThreadSelf();<br>
+uptr ThreadSelfOffset();<br>
<br>
 // Matches a library's file name against a base name (stripping path and version<br>
 // information).<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux_libcdep.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux_libcdep.cc?rev=182853&r1=182852&r2=182853&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux_libcdep.cc?rev=182853&r1=182852&r2=182853&view=diff</a><br>




==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux_libcdep.cc (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_linux_libcdep.cc Wed May 29 08:07:42 2013<br>
@@ -19,19 +19,12 @@<br>
 #include "sanitizer_procmaps.h"<br>
 #include "sanitizer_stacktrace.h"<br>
<br>
-#ifdef __x86_64__<br>
-#include <asm/prctl.h><br>
-#endif<br>
 #include <dlfcn.h><br>
 #include <pthread.h><br>
 #include <sys/prctl.h><br>
 #include <sys/resource.h><br>
 #include <unwind.h><br>
<br>
-#ifdef __x86_64__<br>
-extern "C" int arch_prctl(int code, __sanitizer::uptr *addr);<br>
-#endif<br>
-<br>
 namespace __sanitizer {<br>
<br>
 void GetThreadStackTopAndBottom(bool at_initialization, uptr *stack_top,<br>
@@ -200,20 +193,37 @@ uptr GetTlsSize() {<br>
   return g_tls_size;<br>
 }<br>
<br>
+#if defined(__x86_64__) || defined(i386)<br>
 // sizeof(struct thread) from glibc.<br>
-#ifdef __x86_64__<br>
-const uptr kThreadDescriptorSize = 2304;<br>
+const uptr kThreadDescriptorSize = FIRST_32_SECOND_64(1216, 2304);<br>
<br>
 uptr ThreadDescriptorSize() {<br>
   return kThreadDescriptorSize;<br>
 }<br>
+<br>
+// The offset at which pointer to self is located in the thread descriptor.<br>
+const uptr kThreadSelfOffset = FIRST_32_SECOND_64(8, 16);<br>
+<br>
+uptr ThreadSelfOffset() {<br>
+  return kThreadSelfOffset;<br>
+}<br>
+<br>
+uptr ThreadSelf() {<br>
+  uptr descr_addr;<br>
+#ifdef __i386__<br>
+  asm("mov %%gs:%c1,%0" : "=r"(descr_addr) : "i"(kThreadSelfOffset));<br>
+#else<br>
+  asm("mov %%fs:%c1,%0" : "=r"(descr_addr) : "i"(kThreadSelfOffset));<br>
 #endif<br>
+  return descr_addr;<br>
+}<br>
+#endif  // defined(__x86_64__) || defined(i386)<br>
<br>
 void GetThreadStackAndTls(bool main, uptr *stk_addr, uptr *stk_size,<br>
                           uptr *tls_addr, uptr *tls_size) {<br>
 #ifndef SANITIZER_GO<br>
-#ifdef __x86_64__<br>
-  arch_prctl(ARCH_GET_FS, tls_addr);<br>
+#if defined(__x86_64__) || defined(i386)<br>
+  *tls_addr = ThreadSelf();<br>
   *tls_size = GetTlsSize();<br>
   *tls_addr -= *tls_size;<br>
   *tls_addr += kThreadDescriptorSize;<br>
<br>
Modified: compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_linux_test.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_linux_test.cc?rev=182853&r1=182852&r2=182853&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_linux_test.cc?rev=182853&r1=182852&r2=182853&view=diff</a><br>




==============================================================================<br>
--- compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_linux_test.cc (original)<br>
+++ compiler-rt/trunk/lib/sanitizer_common/tests/sanitizer_linux_test.cc Wed May 29 08:07:42 2013<br>
@@ -19,9 +19,6 @@<br>
 #include "sanitizer_common/sanitizer_common.h"<br>
 #include "gtest/gtest.h"<br>
<br>
-#ifdef __x86_64__<br>
-#include <asm/prctl.h><br>
-#endif<br>
 #include <pthread.h><br>
 #include <sched.h><br>
 #include <stdlib.h><br>
@@ -29,10 +26,6 @@<br>
 #include <algorithm><br>
 #include <vector><br>
<br>
-#ifdef __x86_64__<br>
-extern "C" int arch_prctl(int code, __sanitizer::uptr *addr);<br>
-#endif<br>
-<br>
 namespace __sanitizer {<br>
<br>
 struct TidReporterArgument {<br>
@@ -202,23 +195,37 @@ TEST(SanitizerCommon, SetEnvTest) {<br>
   EXPECT_EQ(0, getenv(kEnvName));<br>
 }<br>
<br>
-#ifdef __x86_64__<br>
-// libpthread puts the thread descriptor (%fs:0x0) at the end of stack space.<br>
-void *thread_descriptor_test_func(void *arg) {<br>
-  uptr fs;<br>
-  arch_prctl(ARCH_GET_FS, &fs);<br>
+#if defined(__x86_64__) || defined(i386)<br>
+void *thread_self_offset_test_func(void *arg) {<br>
+  bool result =<br>
+      *(uptr *)((char *)ThreadSelf() + ThreadSelfOffset()) == ThreadSelf();<br>
+  return (void *)result;<br>
+}<br>
+<br>
+TEST(SanitizerLinux, ThreadSelfOffset) {<br>
+  EXPECT_TRUE((bool)thread_self_offset_test_func(0));<br>
+  pthread_t tid;<br>
+  void *result;<br>
+  ASSERT_EQ(0, pthread_create(&tid, 0, thread_self_offset_test_func, 0));<br>
+  ASSERT_EQ(0, pthread_join(tid, &result));<br>
+  EXPECT_TRUE((bool)result);<br>
+}<br>
+<br>
+// libpthread puts the thread descriptor at the end of stack space.<br>
+void *thread_descriptor_size_test_func(void *arg) {<br>
+  uptr descr_addr = ThreadSelf();<br>
   pthread_attr_t attr;<br>
   pthread_getattr_np(pthread_self(), &attr);<br>
   void *stackaddr;<br>
-  uptr stacksize;<br>
+  size_t stacksize;<br>
   pthread_attr_getstack(&attr, &stackaddr, &stacksize);<br>
-  return (void *)((uptr)stackaddr + stacksize - fs);<br>
+  return (void *)((uptr)stackaddr + stacksize - descr_addr);<br>
 }<br>
<br>
 TEST(SanitizerLinux, ThreadDescriptorSize) {<br>
   pthread_t tid;<br>
   void *result;<br>
-  pthread_create(&tid, 0, thread_descriptor_test_func, 0);<br>
+  ASSERT_EQ(0, pthread_create(&tid, 0, thread_descriptor_size_test_func, 0));<br>
   ASSERT_EQ(0, pthread_join(tid, &result));<br>
   EXPECT_EQ((uptr)result, ThreadDescriptorSize());<br>
 }<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div></div></div><br></div></div>
</blockquote></div><br></div>
</div></div></blockquote></div></div></div><br></div></div>
</blockquote></div><br></div></div>