1603c4be006d8c53905d736bf1f19a49f5ce98276Alexey Samsonov//===-- tsan_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_interface.h"
14da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany#include "tsan_test_util.h"
15da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany#include "gtest/gtest.h"
16da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
17da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanystatic void foo() {}
18da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanystatic void bar() {}
19da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
20da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya SerebryanyTEST(ThreadSanitizer, FuncCall) {
21da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  ScopedThread t1, t2;
22da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  MemLoc l;
23da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  t1.Write1(l);
24da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  t2.Call(foo);
25da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  t2.Call(bar);
26da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  t2.Write1(l, true);
27da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  t2.Return();
28da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  t2.Return();
29da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
30da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
31da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryanyint main(int argc, char **argv) {
32da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  TestMutexBeforeInit();  // Mutexes must be usable before __tsan_init();
33da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  __tsan_init();
34da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  __tsan_func_entry(__builtin_return_address(0));
35da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  __tsan_func_entry((char*)&main + 1);
36da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
37c3d169863cd29a9a052bd9a21288f8cd4679f1d7Alexey Samsonov  testing::GTEST_FLAG(death_test_style) = "threadsafe";
38da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  testing::InitGoogleTest(&argc, argv);
39da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  int res = RUN_ALL_TESTS();
40da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
41da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  __tsan_func_exit();
42da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  __tsan_func_exit();
43da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  return res;
44da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
45