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