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
50799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#ifdef __APPLE__
51799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// On Darwin, turns off symbolication and crash logs to make tests faster.
52799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarextern "C" const char* __tsan_default_options() {
53799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  return "symbolize=false:abort_on_error=0";
54799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar}
55799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#endif
56799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
57c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainarnamespace __sanitizer {
58c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainarbool ReexecDisabled() {
59c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  return true;
60c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar}
61c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar}
62c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar
63e64c3b6f05a65560df5e60742168d9a7e68a94ebAlexey Samsonovint main(int argc, char **argv) {
642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  argv0 = argv[0];
65e64c3b6f05a65560df5e60742168d9a7e68a94ebAlexey Samsonov  return run_tests(argc, argv);
66e64c3b6f05a65560df5e60742168d9a7e68a94ebAlexey Samsonov}
67