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