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