tsan_test.cc revision 2d1fdb26e458c4ddc04155c1d421bced3ba90cd0
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
31e64c3b6f05a65560df5e60742168d9a7e68a94ebAlexey Samsonov// We use this function instead of main, as ISO C++ forbids taking the address
32e64c3b6f05a65560df5e60742168d9a7e68a94ebAlexey Samsonov// of main, which we need to pass inside __tsan_func_entry.
33e64c3b6f05a65560df5e60742168d9a7e68a94ebAlexey Samsonovint run_tests(int argc, char **argv) {
34da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  TestMutexBeforeInit();  // Mutexes must be usable before __tsan_init();
35da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  __tsan_init();
36da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  __tsan_func_entry(__builtin_return_address(0));
370f4ae5d0e3223627ec60c9159f32bfa73038bce7Alexey Samsonov  __tsan_func_entry((void*)((intptr_t)&run_tests + 1));
38da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
39c3d169863cd29a9a052bd9a21288f8cd4679f1d7Alexey Samsonov  testing::GTEST_FLAG(death_test_style) = "threadsafe";
40da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  testing::InitGoogleTest(&argc, argv);
41da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  int res = RUN_ALL_TESTS();
42da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany
43da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  __tsan_func_exit();
44da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  __tsan_func_exit();
45da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany  return res;
46da4edd850db1a333c15fc3b0abc01a2e8d2f08feKostya Serebryany}
47e64c3b6f05a65560df5e60742168d9a7e68a94ebAlexey Samsonov
482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesconst char *argv0;
492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
50e64c3b6f05a65560df5e60742168d9a7e68a94ebAlexey Samsonovint main(int argc, char **argv) {
512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  argv0 = argv[0];
52e64c3b6f05a65560df5e60742168d9a7e68a94ebAlexey Samsonov  return run_tests(argc, argv);
53e64c3b6f05a65560df5e60742168d9a7e68a94ebAlexey Samsonov}
54