1/* PR sanitizer/65400 */ 2/* { dg-shouldfail "tsan" } */ 3/* { dg-additional-options "-fno-omit-frame-pointer -ldl" } */ 4/* { dg-additional-sources pr65400-2.c } */ 5 6#include <pthread.h> 7#include "tsan_barrier.h" 8 9static pthread_barrier_t barrier; 10int v __attribute__((aligned(8))); 11int q __attribute__((aligned(8))); 12int o __attribute__((aligned(8))); 13extern void baz4 (int *); 14 15__attribute__((noinline, noclone)) int 16bar (int x) 17{ 18 q += x; 19 return x; 20} 21 22void 23foo (int *x) 24{ 25 if (__builtin_expect (x == 0, 1)) 26 return; 27 bar (bar (bar (bar (*x)))); 28} 29 30__attribute__((noinline, noclone)) void 31baz1 (int *x) 32{ 33 foo (x); 34} 35 36__attribute__((noinline, noclone)) void 37baz2 (int **x) 38{ 39 foo (*x); 40} 41 42__attribute__((noinline, noclone)) void 43baz3 (void) 44{ 45 barrier_wait (&barrier); 46 v++; 47} 48 49__attribute__((noinline, noclone)) void 50baz5 (void) 51{ 52 int i; 53 o = 1; 54 baz1 (&o); 55 int *p = &o; 56 baz2 (&p); 57 for (i = 0; i < 128; i++) 58 baz4 (&o); 59 if (q != 130 * 4) 60 __builtin_abort (); 61 baz3 (); 62} 63 64__attribute__((noinline, noclone)) void * 65tf (void *arg) 66{ 67 (void) arg; 68 baz5 (); 69 return NULL; 70} 71 72int 73main () 74{ 75 pthread_t th; 76 barrier_init (&barrier, 2); 77 if (pthread_create (&th, NULL, tf, NULL)) 78 return 0; 79 v++; 80 barrier_wait (&barrier); 81 pthread_join (th, NULL); 82 return 0; 83} 84 85/* { dg-output "WARNING: ThreadSanitizer: data race.*#2 _?tf" } */ 86