1*05df5c54SJulian Lettner // RUN: %clang_tsan -O1 %s -DBUILD_LIB=1 -fno-sanitize=thread -shared -fPIC -o %dynamiclib %ld_flags_rpath_so 2*05df5c54SJulian Lettner // RUN: %clang_tsan -O1 %s -o %t %ld_flags_rpath_exe 326e0fb88SJulian Lettner // RUN: %run %t | FileCheck %s 426e0fb88SJulian Lettner 526e0fb88SJulian Lettner // Test that initialization/finalization hooks are called, even when they are 626e0fb88SJulian Lettner // not defined in the main executable, but by another another library that 726e0fb88SJulian Lettner // doesn't directly link against the TSan runtime. 826e0fb88SJulian Lettner 926e0fb88SJulian Lettner #include <stdio.h> 1026e0fb88SJulian Lettner 1126e0fb88SJulian Lettner #if BUILD_LIB 1226e0fb88SJulian Lettner __tsan_on_initialize()1326e0fb88SJulian Lettnerextern "C" void __tsan_on_initialize() { 1426e0fb88SJulian Lettner printf("__tsan_on_initialize()\n"); 1526e0fb88SJulian Lettner } 1626e0fb88SJulian Lettner __tsan_on_finalize(int failed)1726e0fb88SJulian Lettnerextern "C" int __tsan_on_finalize(int failed) { 1826e0fb88SJulian Lettner printf("__tsan_on_finalize()\n"); 1926e0fb88SJulian Lettner return failed; 2026e0fb88SJulian Lettner } 2126e0fb88SJulian Lettner 2226e0fb88SJulian Lettner #else // BUILD_LIB 2326e0fb88SJulian Lettner main()2426e0fb88SJulian Lettnerint main() { 2526e0fb88SJulian Lettner printf("main()\n"); 2626e0fb88SJulian Lettner return 0; 2726e0fb88SJulian Lettner } 2826e0fb88SJulian Lettner 2926e0fb88SJulian Lettner #endif // BUILD_LIB 3026e0fb88SJulian Lettner 3126e0fb88SJulian Lettner // CHECK: __tsan_on_initialize() 3226e0fb88SJulian Lettner // CHECK: main() 3326e0fb88SJulian Lettner // CHECK: __tsan_on_finalize() 34