1*bcaeed49SFangrui Song // RUN: rm -rf %t-dir 2*bcaeed49SFangrui Song // RUN: mkdir %t-dir 3*bcaeed49SFangrui Song 4*bcaeed49SFangrui Song // RUN: %clangxx_tsan -O1 %s -DLIB -fPIC -shared -o %t-dir/libignore_lib4.so 5*bcaeed49SFangrui Song // RUN: %clangxx_tsan -O1 %s %link_libcxx_tsan -o %t-dir/executable 6*bcaeed49SFangrui Song // RUN: echo "called_from_lib:libignore_lib4.so" > %t-dir/executable.supp 7*bcaeed49SFangrui Song // RUN: %env_tsan_opts=suppressions='%t-dir/executable.supp' %run %t-dir/executable 2>&1 | FileCheck %s 8*bcaeed49SFangrui Song 9*bcaeed49SFangrui Song // powerpc64 big endian bots failed with "FileCheck error: '-' is empty" due 10*bcaeed49SFangrui Song // to a segmentation fault. 11*bcaeed49SFangrui Song // UNSUPPORTED: powerpc64-unknown-linux-gnu 12*bcaeed49SFangrui Song // aarch64 bots failed with "called_from_lib suppression 'libignore_lib4.so' 13*bcaeed49SFangrui Song // is matched against 2 libraries". 14*bcaeed49SFangrui Song // UNSUPPORTED: aarch64 15*bcaeed49SFangrui Song 16*bcaeed49SFangrui Song // Test longjmp in ignored lib. 17*bcaeed49SFangrui Song // It used to crash since we jumped out of ScopedInterceptor scope. 18*bcaeed49SFangrui Song 19*bcaeed49SFangrui Song #include "test.h" 20*bcaeed49SFangrui Song #include <setjmp.h> 21*bcaeed49SFangrui Song #include <string.h> 22*bcaeed49SFangrui Song #include <errno.h> 23*bcaeed49SFangrui Song #include <libgen.h> 24*bcaeed49SFangrui Song #include <string> 25*bcaeed49SFangrui Song 26*bcaeed49SFangrui Song #ifdef LIB 27*bcaeed49SFangrui Song myfunc()28*bcaeed49SFangrui Songextern "C" void myfunc() { 29*bcaeed49SFangrui Song for (int i = 0; i < (1 << 20); i++) { 30*bcaeed49SFangrui Song jmp_buf env; 31*bcaeed49SFangrui Song if (!setjmp(env)) 32*bcaeed49SFangrui Song longjmp(env, 1); 33*bcaeed49SFangrui Song } 34*bcaeed49SFangrui Song } 35*bcaeed49SFangrui Song 36*bcaeed49SFangrui Song #else 37*bcaeed49SFangrui Song main(int argc,char ** argv)38*bcaeed49SFangrui Songint main(int argc, char **argv) { 39*bcaeed49SFangrui Song std::string lib = std::string(dirname(argv[0])) + "/libignore_lib4.so"; 40*bcaeed49SFangrui Song void *h = dlopen(lib.c_str(), RTLD_GLOBAL | RTLD_NOW); 41*bcaeed49SFangrui Song void (*func)() = (void(*)())dlsym(h, "myfunc"); 42*bcaeed49SFangrui Song func(); 43*bcaeed49SFangrui Song fprintf(stderr, "DONE\n"); 44*bcaeed49SFangrui Song return 0; 45*bcaeed49SFangrui Song } 46*bcaeed49SFangrui Song 47*bcaeed49SFangrui Song #endif 48*bcaeed49SFangrui Song 49*bcaeed49SFangrui Song // CHECK: DONE 50