/* PR sanitizer/65400 */ /* { dg-shouldfail "tsan" } */ /* { dg-additional-options "-fno-omit-frame-pointer -ldl" } */ /* { dg-additional-sources pr65400-2.c } */ #include #include "tsan_barrier.h" static pthread_barrier_t barrier; int v __attribute__((aligned(8))); int q __attribute__((aligned(8))); int o __attribute__((aligned(8))); extern void baz4 (int *); __attribute__((noinline, noclone)) int bar (int x) { q += x; return x; } void foo (int *x) { if (__builtin_expect (x == 0, 1)) return; bar (bar (bar (bar (*x)))); } __attribute__((noinline, noclone)) void baz1 (int *x) { foo (x); } __attribute__((noinline, noclone)) void baz2 (int **x) { foo (*x); } __attribute__((noinline, noclone)) void baz3 (void) { barrier_wait (&barrier); v++; } __attribute__((noinline, noclone)) void baz5 (void) { int i; o = 1; baz1 (&o); int *p = &o; baz2 (&p); for (i = 0; i < 128; i++) baz4 (&o); if (q != 130 * 4) __builtin_abort (); baz3 (); } __attribute__((noinline, noclone)) void * tf (void *arg) { (void) arg; baz5 (); return NULL; } int main () { pthread_t th; barrier_init (&barrier, 2); if (pthread_create (&th, NULL, tf, NULL)) return 0; v++; barrier_wait (&barrier); pthread_join (th, NULL); return 0; } /* { dg-output "WARNING: ThreadSanitizer: data race.*#2 _?tf" } */