1603c4be006d8c53905d736bf1f19a49f5ce98276Alexey Samsonov//===-- tsan_shadow_test.cc -----------------------------------------------===// 2da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// 3da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// The LLVM Compiler Infrastructure 4da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// 5da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// This file is distributed under the University of Illinois Open Source 6da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// License. See LICENSE.TXT for details. 7da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// 8da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany//===----------------------------------------------------------------------===// 9da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// 10da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// This file is a part of ThreadSanitizer (TSan), a race detector. 11da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany// 12da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany//===----------------------------------------------------------------------===// 13da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany#include "tsan_platform.h" 140d35d9d9b1ff686b53918f9fd36797f0911db663Dmitry Vyukov#include "tsan_rtl.h" 15da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany#include "gtest/gtest.h" 16da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 17da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanynamespace __tsan { 18da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 190d35d9d9b1ff686b53918f9fd36797f0911db663Dmitry VyukovTEST(Shadow, FastState) { 200d35d9d9b1ff686b53918f9fd36797f0911db663Dmitry Vyukov Shadow s(FastState(11, 22)); 210d35d9d9b1ff686b53918f9fd36797f0911db663Dmitry Vyukov EXPECT_EQ(s.tid(), (u64)11); 220d35d9d9b1ff686b53918f9fd36797f0911db663Dmitry Vyukov EXPECT_EQ(s.epoch(), (u64)22); 230d35d9d9b1ff686b53918f9fd36797f0911db663Dmitry Vyukov EXPECT_EQ(s.GetIgnoreBit(), false); 240d35d9d9b1ff686b53918f9fd36797f0911db663Dmitry Vyukov EXPECT_EQ(s.GetFreedAndReset(), false); 25d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov EXPECT_EQ(s.GetHistorySize(), 0); 260d35d9d9b1ff686b53918f9fd36797f0911db663Dmitry Vyukov EXPECT_EQ(s.addr0(), (u64)0); 270d35d9d9b1ff686b53918f9fd36797f0911db663Dmitry Vyukov EXPECT_EQ(s.size(), (u64)1); 2833a040af0f32bcf2e5ab25fa2c9b6a81d3a59092Dmitry Vyukov EXPECT_EQ(s.IsWrite(), true); 290d35d9d9b1ff686b53918f9fd36797f0911db663Dmitry Vyukov 300d35d9d9b1ff686b53918f9fd36797f0911db663Dmitry Vyukov s.IncrementEpoch(); 310d35d9d9b1ff686b53918f9fd36797f0911db663Dmitry Vyukov EXPECT_EQ(s.epoch(), (u64)23); 320d35d9d9b1ff686b53918f9fd36797f0911db663Dmitry Vyukov s.IncrementEpoch(); 330d35d9d9b1ff686b53918f9fd36797f0911db663Dmitry Vyukov EXPECT_EQ(s.epoch(), (u64)24); 340d35d9d9b1ff686b53918f9fd36797f0911db663Dmitry Vyukov 350d35d9d9b1ff686b53918f9fd36797f0911db663Dmitry Vyukov s.SetIgnoreBit(); 360d35d9d9b1ff686b53918f9fd36797f0911db663Dmitry Vyukov EXPECT_EQ(s.GetIgnoreBit(), true); 370d35d9d9b1ff686b53918f9fd36797f0911db663Dmitry Vyukov s.ClearIgnoreBit(); 380d35d9d9b1ff686b53918f9fd36797f0911db663Dmitry Vyukov EXPECT_EQ(s.GetIgnoreBit(), false); 39d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov 40d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov for (int i = 0; i < 8; i++) { 41d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov s.SetHistorySize(i); 42d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov EXPECT_EQ(s.GetHistorySize(), i); 43d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov } 44d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov s.SetHistorySize(2); 45d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov s.ClearHistorySize(); 46d698edc4f74a17048eef3342a9fa42b3ebba802aDmitry Vyukov EXPECT_EQ(s.GetHistorySize(), 0); 470d35d9d9b1ff686b53918f9fd36797f0911db663Dmitry Vyukov} 480d35d9d9b1ff686b53918f9fd36797f0911db663Dmitry Vyukov 49da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(Shadow, Mapping) { 50da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany static int global; 51da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany int stack; 52da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany void *heap = malloc(0); 53da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany free(heap); 54da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 55da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK(IsAppMem((uptr)&global)); 56da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK(IsAppMem((uptr)&stack)); 57da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK(IsAppMem((uptr)heap)); 58da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 59da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK(IsShadowMem(MemToShadow((uptr)&global))); 60da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK(IsShadowMem(MemToShadow((uptr)&stack))); 61da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK(IsShadowMem(MemToShadow((uptr)heap))); 62da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 63da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 64da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(Shadow, Celling) { 65da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany u64 aligned_data[4]; 66da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany char *data = (char*)aligned_data; 67da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ((uptr)data % kShadowSize, 0); 68da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany uptr s0 = MemToShadow((uptr)&data[0]); 69da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(s0 % kShadowSize, 0); 70da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany for (unsigned i = 1; i < kShadowCell; i++) 71da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(s0, MemToShadow((uptr)&data[i])); 72da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany for (unsigned i = kShadowCell; i < 2*kShadowCell; i++) 73da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(s0 + kShadowSize*kShadowCnt, MemToShadow((uptr)&data[i])); 74da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany for (unsigned i = 2*kShadowCell; i < 3*kShadowCell; i++) 75da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany CHECK_EQ(s0 + 2*kShadowSize*kShadowCnt, MemToShadow((uptr)&data[i])); 76da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} 77da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany 78da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany} // namespace __tsan 79