xref: /openbsd-src/gnu/llvm/compiler-rt/lib/tsan/tests/rtl/tsan_test.cpp (revision 810390e339a5425391477d5d41c78d7cab2424ac)
13cab2bb3Spatrick //===-- tsan_test.cpp -----------------------------------------------------===//
23cab2bb3Spatrick //
33cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
43cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information.
53cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63cab2bb3Spatrick //
73cab2bb3Spatrick //===----------------------------------------------------------------------===//
83cab2bb3Spatrick //
93cab2bb3Spatrick // This file is a part of ThreadSanitizer (TSan), a race detector.
103cab2bb3Spatrick //
113cab2bb3Spatrick //===----------------------------------------------------------------------===//
123cab2bb3Spatrick #include "tsan_interface.h"
133cab2bb3Spatrick #include "tsan_test_util.h"
143cab2bb3Spatrick #include "gtest/gtest.h"
153cab2bb3Spatrick 
foo()163cab2bb3Spatrick static void foo() {}
bar()173cab2bb3Spatrick static void bar() {}
183cab2bb3Spatrick 
TEST_F(ThreadSanitizer,FuncCall)19*810390e3Srobert TEST_F(ThreadSanitizer, FuncCall) {
203cab2bb3Spatrick   ScopedThread t1, t2;
213cab2bb3Spatrick   MemLoc l;
223cab2bb3Spatrick   t1.Write1(l);
233cab2bb3Spatrick   t2.Call(foo);
243cab2bb3Spatrick   t2.Call(bar);
253cab2bb3Spatrick   t2.Write1(l, true);
263cab2bb3Spatrick   t2.Return();
273cab2bb3Spatrick   t2.Return();
283cab2bb3Spatrick }
293cab2bb3Spatrick 
303cab2bb3Spatrick // We use this function instead of main, as ISO C++ forbids taking the address
313cab2bb3Spatrick // of main, which we need to pass inside __tsan_func_entry.
run_tests(int argc,char ** argv)323cab2bb3Spatrick int run_tests(int argc, char **argv) {
333cab2bb3Spatrick   TestMutexBeforeInit();  // Mutexes must be usable before __tsan_init();
343cab2bb3Spatrick   __tsan_init();
353cab2bb3Spatrick   __tsan_func_entry(__builtin_return_address(0));
363cab2bb3Spatrick   __tsan_func_entry((void*)((intptr_t)&run_tests + 1));
373cab2bb3Spatrick 
383cab2bb3Spatrick   testing::GTEST_FLAG(death_test_style) = "threadsafe";
393cab2bb3Spatrick   testing::InitGoogleTest(&argc, argv);
403cab2bb3Spatrick   int res = RUN_ALL_TESTS();
413cab2bb3Spatrick 
423cab2bb3Spatrick   __tsan_func_exit();
433cab2bb3Spatrick   __tsan_func_exit();
443cab2bb3Spatrick   return res;
453cab2bb3Spatrick }
463cab2bb3Spatrick 
473cab2bb3Spatrick const char *argv0;
483cab2bb3Spatrick 
493cab2bb3Spatrick #ifdef __APPLE__
503cab2bb3Spatrick // On Darwin, turns off symbolication and crash logs to make tests faster.
__tsan_default_options()513cab2bb3Spatrick extern "C" const char* __tsan_default_options() {
523cab2bb3Spatrick   return "symbolize=false:abort_on_error=0";
533cab2bb3Spatrick }
543cab2bb3Spatrick #endif
553cab2bb3Spatrick 
main(int argc,char ** argv)563cab2bb3Spatrick int main(int argc, char **argv) {
573cab2bb3Spatrick   argv0 = argv[0];
583cab2bb3Spatrick   return run_tests(argc, argv);
593cab2bb3Spatrick }
60