Home | History | Annotate | Download | only in unit
      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