blob: d441ff8371592eed3615d022ab04af57dd0fa075 [file] [log] [blame]
/* PR sanitizer/65400 */
/* { dg-shouldfail "tsan" } */
/* { dg-additional-options "-fno-omit-frame-pointer -ldl" } */
/* { dg-additional-sources pr65400-2.c } */
#include <pthread.h>
#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" } */