Home | History | Annotate | Download | only in unit
      1 //===-- tsan_shadow_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 "tsan_platform.h"
     14 #include "tsan_rtl.h"
     15 #include "gtest/gtest.h"
     16 
     17 namespace __tsan {
     18 
     19 TEST(Shadow, FastState) {
     20   Shadow s(FastState(11, 22));
     21   EXPECT_EQ(s.tid(), (u64)11);
     22   EXPECT_EQ(s.epoch(), (u64)22);
     23   EXPECT_EQ(s.GetIgnoreBit(), false);
     24   EXPECT_EQ(s.GetFreedAndReset(), false);
     25   EXPECT_EQ(s.GetHistorySize(), 0);
     26   EXPECT_EQ(s.addr0(), (u64)0);
     27   EXPECT_EQ(s.size(), (u64)1);
     28   EXPECT_EQ(s.IsWrite(), true);
     29 
     30   s.IncrementEpoch();
     31   EXPECT_EQ(s.epoch(), (u64)23);
     32   s.IncrementEpoch();
     33   EXPECT_EQ(s.epoch(), (u64)24);
     34 
     35   s.SetIgnoreBit();
     36   EXPECT_EQ(s.GetIgnoreBit(), true);
     37   s.ClearIgnoreBit();
     38   EXPECT_EQ(s.GetIgnoreBit(), false);
     39 
     40   for (int i = 0; i < 8; i++) {
     41     s.SetHistorySize(i);
     42     EXPECT_EQ(s.GetHistorySize(), i);
     43   }
     44   s.SetHistorySize(2);
     45   s.ClearHistorySize();
     46   EXPECT_EQ(s.GetHistorySize(), 0);
     47 }
     48 
     49 TEST(Shadow, Mapping) {
     50   static int global;
     51   int stack;
     52   void *heap = malloc(0);
     53   free(heap);
     54 
     55   CHECK(IsAppMem((uptr)&global));
     56   CHECK(IsAppMem((uptr)&stack));
     57   CHECK(IsAppMem((uptr)heap));
     58 
     59   CHECK(IsShadowMem(MemToShadow((uptr)&global)));
     60   CHECK(IsShadowMem(MemToShadow((uptr)&stack)));
     61   CHECK(IsShadowMem(MemToShadow((uptr)heap)));
     62 }
     63 
     64 TEST(Shadow, Celling) {
     65   u64 aligned_data[4];
     66   char *data = (char*)aligned_data;
     67   CHECK_EQ((uptr)data % kShadowSize, 0);
     68   uptr s0 = MemToShadow((uptr)&data[0]);
     69   CHECK_EQ(s0 % kShadowSize, 0);
     70   for (unsigned i = 1; i < kShadowCell; i++)
     71     CHECK_EQ(s0, MemToShadow((uptr)&data[i]));
     72   for (unsigned i = kShadowCell; i < 2*kShadowCell; i++)
     73     CHECK_EQ(s0 + kShadowSize*kShadowCnt, MemToShadow((uptr)&data[i]));
     74   for (unsigned i = 2*kShadowCell; i < 3*kShadowCell; i++)
     75     CHECK_EQ(s0 + 2*kShadowSize*kShadowCnt, MemToShadow((uptr)&data[i]));
     76 }
     77 
     78 }  // namespace __tsan
     79