1 //===-- tsan_platform_test.cc ---------------------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file is a part of ThreadSanitizer (TSan), a race detector. 11 // 12 //===----------------------------------------------------------------------===// 13 #include "sanitizer_common/sanitizer_libc.h" 14 #include "tsan_platform.h" 15 #include "tsan_rtl.h" 16 #include "gtest/gtest.h" 17 18 namespace __tsan { 19 20 static void TestThreadInfo(bool main) { 21 ScopedInRtl in_rtl; 22 uptr stk_addr = 0; 23 uptr stk_size = 0; 24 uptr tls_addr = 0; 25 uptr tls_size = 0; 26 GetThreadStackAndTls(main, &stk_addr, &stk_size, &tls_addr, &tls_size); 27 // Printf("stk=%zx-%zx(%zu)\n", stk_addr, stk_addr + stk_size, stk_size); 28 // Printf("tls=%zx-%zx(%zu)\n", tls_addr, tls_addr + tls_size, tls_size); 29 30 int stack_var; 31 EXPECT_NE(stk_addr, (uptr)0); 32 EXPECT_NE(stk_size, (uptr)0); 33 EXPECT_GT((uptr)&stack_var, stk_addr); 34 EXPECT_LT((uptr)&stack_var, stk_addr + stk_size); 35 36 static __thread int thread_var; 37 EXPECT_NE(tls_addr, (uptr)0); 38 EXPECT_NE(tls_size, (uptr)0); 39 EXPECT_GT((uptr)&thread_var, tls_addr); 40 EXPECT_LT((uptr)&thread_var, tls_addr + tls_size); 41 42 // Ensure that tls and stack do not intersect. 43 uptr tls_end = tls_addr + tls_size; 44 EXPECT_TRUE(tls_addr < stk_addr || tls_addr >= stk_addr + stk_size); 45 EXPECT_TRUE(tls_end < stk_addr || tls_end >= stk_addr + stk_size); 46 EXPECT_TRUE((tls_addr < stk_addr) == (tls_end < stk_addr)); 47 } 48 49 static void *WorkerThread(void *arg) { 50 TestThreadInfo(false); 51 return 0; 52 } 53 54 TEST(Platform, ThreadInfoMain) { 55 TestThreadInfo(true); 56 } 57 58 TEST(Platform, ThreadInfoWorker) { 59 pthread_t t; 60 pthread_create(&t, 0, WorkerThread, 0); 61 pthread_join(t, 0); 62 } 63 64 } // namespace __tsan 65