xref: /llvm-project/compiler-rt/test/tsan/on_initialize_finalize_hooks.cpp (revision 05df5c54e8e15a444f59c535b2935fc19a90579b)
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 Lettner extern "C" void __tsan_on_initialize() {
1426e0fb88SJulian Lettner   printf("__tsan_on_initialize()\n");
1526e0fb88SJulian Lettner }
1626e0fb88SJulian Lettner 
__tsan_on_finalize(int failed)1726e0fb88SJulian Lettner extern "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 Lettner int 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