1 //===-- tsan_shadow_test.cpp ----------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file is a part of ThreadSanitizer (TSan), a race detector.
10 //
11 //===----------------------------------------------------------------------===//
12 #include "tsan_platform.h"
13 #include "tsan_rtl.h"
14 #include "gtest/gtest.h"
15 
16 namespace __tsan {
17 
18 TEST(Shadow, FastState) {
19   Shadow s(FastState(11, 22));
20   EXPECT_EQ(s.tid(), (u64)11);
21   EXPECT_EQ(s.epoch(), (u64)22);
22   EXPECT_EQ(s.GetIgnoreBit(), false);
23   EXPECT_EQ(s.GetFreedAndReset(), false);
24   EXPECT_EQ(s.GetHistorySize(), 0);
25   EXPECT_EQ(s.addr0(), (u64)0);
26   EXPECT_EQ(s.size(), (u64)1);
27   EXPECT_EQ(s.IsWrite(), true);
28 
29   s.IncrementEpoch();
30   EXPECT_EQ(s.epoch(), (u64)23);
31   s.IncrementEpoch();
32   EXPECT_EQ(s.epoch(), (u64)24);
33 
34   s.SetIgnoreBit();
35   EXPECT_EQ(s.GetIgnoreBit(), true);
36   s.ClearIgnoreBit();
37   EXPECT_EQ(s.GetIgnoreBit(), false);
38 
39   for (int i = 0; i < 8; i++) {
40     s.SetHistorySize(i);
41     EXPECT_EQ(s.GetHistorySize(), i);
42   }
43   s.SetHistorySize(2);
44   s.ClearHistorySize();
45   EXPECT_EQ(s.GetHistorySize(), 0);
46 }
47 
48 TEST(Shadow, Mapping) {
49   static int global;
50   int stack;
51   void *heap = malloc(0);
52   free(heap);
53 
54   CHECK(IsAppMem((uptr)&global));
55   CHECK(IsAppMem((uptr)&stack));
56   CHECK(IsAppMem((uptr)heap));
57 
58   CHECK(IsShadowMem(MemToShadow((uptr)&global)));
59   CHECK(IsShadowMem(MemToShadow((uptr)&stack)));
60   CHECK(IsShadowMem(MemToShadow((uptr)heap)));
61 }
62 
63 TEST(Shadow, Celling) {
64   u64 aligned_data[4];
65   char *data = (char*)aligned_data;
66   CHECK_EQ((uptr)data % kShadowSize, 0);
67   uptr s0 = MemToShadow((uptr)&data[0]);
68   CHECK_EQ(s0 % kShadowSize, 0);
69   for (unsigned i = 1; i < kShadowCell; i++)
70     CHECK_EQ(s0, MemToShadow((uptr)&data[i]));
71   for (unsigned i = kShadowCell; i < 2*kShadowCell; i++)
72     CHECK_EQ(s0 + kShadowSize*kShadowCnt, MemToShadow((uptr)&data[i]));
73   for (unsigned i = 2*kShadowCell; i < 3*kShadowCell; i++)
74     CHECK_EQ(s0 + 2*kShadowSize*kShadowCnt, MemToShadow((uptr)&data[i]));
75 }
76 
77 }  // namespace __tsan
78