tsan_test.cc revision da4edd850db1a333c15fc3b0abc01a2e8d2f08fe
1da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany//===-- tsan_test.cc --------------------------------------------*- C++ -*-===//
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
37da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  testing::InitGoogleTest(&argc, argv);
38da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  int res = RUN_ALL_TESTS();
39da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
40da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  __tsan_func_exit();
41da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  __tsan_func_exit();
42da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  return res;
43da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
44