aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/c-c++-common/tsan
diff options
context:
space:
mode:
authorBen Cheng <bccheng@google.com>2014-03-25 22:37:19 -0700
committerBen Cheng <bccheng@google.com>2014-03-25 22:37:19 -0700
commit1bc5aee63eb72b341f506ad058502cd0361f0d10 (patch)
treec607e8252f3405424ff15bc2d00aa38dadbb2518 /gcc-4.9/gcc/testsuite/c-c++-common/tsan
parent283a0bf58fcf333c58a2a92c3ebbc41fb9eb1fdb (diff)
downloadtoolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.tar.gz
toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.tar.bz2
toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.zip
Initial checkin of GCC 4.9.0 from trunk (r208799).
Change-Id: I48a3c08bb98542aa215912a75f03c0890e497dba
Diffstat (limited to 'gcc-4.9/gcc/testsuite/c-c++-common/tsan')
-rw-r--r--gcc-4.9/gcc/testsuite/c-c++-common/tsan/atomic_stack.c31
-rw-r--r--gcc-4.9/gcc/testsuite/c-c++-common/tsan/fd_pipe_race.c36
-rw-r--r--gcc-4.9/gcc/testsuite/c-c++-common/tsan/free_race.c27
-rw-r--r--gcc-4.9/gcc/testsuite/c-c++-common/tsan/free_race2.c28
-rw-r--r--gcc-4.9/gcc/testsuite/c-c++-common/tsan/mutexset1.c40
-rw-r--r--gcc-4.9/gcc/testsuite/c-c++-common/tsan/race_on_barrier.c32
-rw-r--r--gcc-4.9/gcc/testsuite/c-c++-common/tsan/race_on_barrier2.c32
-rw-r--r--gcc-4.9/gcc/testsuite/c-c++-common/tsan/race_on_mutex.c43
-rw-r--r--gcc-4.9/gcc/testsuite/c-c++-common/tsan/race_on_mutex2.c25
-rw-r--r--gcc-4.9/gcc/testsuite/c-c++-common/tsan/simple_race.c50
-rw-r--r--gcc-4.9/gcc/testsuite/c-c++-common/tsan/simple_stack.c65
-rw-r--r--gcc-4.9/gcc/testsuite/c-c++-common/tsan/sleep_sync.c30
-rw-r--r--gcc-4.9/gcc/testsuite/c-c++-common/tsan/thread_leak.c16
-rw-r--r--gcc-4.9/gcc/testsuite/c-c++-common/tsan/thread_leak1.c18
-rw-r--r--gcc-4.9/gcc/testsuite/c-c++-common/tsan/thread_leak2.c21
-rw-r--r--gcc-4.9/gcc/testsuite/c-c++-common/tsan/tiny_race.c22
-rw-r--r--gcc-4.9/gcc/testsuite/c-c++-common/tsan/tls_race.c20
-rw-r--r--gcc-4.9/gcc/testsuite/c-c++-common/tsan/write_in_reader_lock.c36
18 files changed, 572 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/atomic_stack.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/atomic_stack.c
new file mode 100644
index 000000000..6a3795120
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/atomic_stack.c
@@ -0,0 +1,31 @@
+/* { dg-shouldfail "tsan" } */
+
+#include <pthread.h>
+#include <unistd.h>
+
+int Global;
+
+void *Thread1(void *x) {
+ sleep(1);
+ __atomic_fetch_add(&Global, 1, __ATOMIC_RELAXED);
+ return NULL;
+}
+
+void *Thread2(void *x) {
+ Global++;
+ return NULL;
+}
+
+int main() {
+ pthread_t t[2];
+ pthread_create(&t[0], NULL, Thread1, NULL);
+ pthread_create(&t[1], NULL, Thread2, NULL);
+ pthread_join(t[0], NULL);
+ pthread_join(t[1], NULL);
+ return 0;
+}
+
+/* { dg-output "WARNING: ThreadSanitizer: data race.*(\n|\r\n|\r)" } */
+/* { dg-output " Atomic write of size 4.*" } */
+/* { dg-output " #0 __tsan_atomic32_fetch_add.*" } */
+/* { dg-output " #1 Thread1.*" } */
diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/fd_pipe_race.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/fd_pipe_race.c
new file mode 100644
index 000000000..28cd630d2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/fd_pipe_race.c
@@ -0,0 +1,36 @@
+/* { dg-shouldfail "tsan" } */
+
+#include <pthread.h>
+#include <stdio.h>
+#include <unistd.h>
+
+int fds[2];
+
+void *Thread1(void *x) {
+ write(fds[1], "a", 1);
+ return NULL;
+}
+
+void *Thread2(void *x) {
+ sleep(1);
+ close(fds[0]);
+ close(fds[1]);
+ return NULL;
+}
+
+int main() {
+ pipe(fds);
+ pthread_t t[2];
+ pthread_create(&t[0], NULL, Thread1, NULL);
+ pthread_create(&t[1], NULL, Thread2, NULL);
+ pthread_join(t[0], NULL);
+ pthread_join(t[1], NULL);
+}
+
+/* { dg-output "WARNING: ThreadSanitizer: data race.*\n" } */
+/* { dg-output " Write of size 8.*\n" } */
+/* { dg-output " #0 close.*\n" } */
+/* { dg-output " #1 Thread2.*\n" } */
+/* { dg-output " Previous read of size 8.*\n" } */
+/* { dg-output " #0 write.*\n" } */
+/* { dg-output " #1 Thread1.*\n" } */
diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/free_race.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/free_race.c
new file mode 100644
index 000000000..258f7b742
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/free_race.c
@@ -0,0 +1,27 @@
+/* { dg-shouldfail "tsan" } */
+
+#include <stdlib.h>
+
+void __attribute__((noinline)) foo(int *mem) {
+ free(mem);
+}
+
+void __attribute__((noinline)) bar(int *mem) {
+ mem[0] = 42;
+}
+
+int main() {
+ int *mem =(int*)malloc (100);
+ foo(mem);
+ bar(mem);
+ return 0;
+}
+
+/* { dg-output "WARNING: ThreadSanitizer: heap-use-after-free.*(\n|\r\n|\r)" } */
+/* { dg-output " Write of size 4 at.* by main thread:(\n|\r\n|\r)" } */
+/* { dg-output " #0 bar.*(\n|\r\n|\r)" } */
+/* { dg-output " #1 main.*(\n|\r\n|\r)" } */
+/* { dg-output " Previous write of size 8 at.* by main thread:(\n|\r\n|\r)" } */
+/* { dg-output " #0 free.*(\n|\r\n|\r)" } */
+/* { dg-output " #\(1|2\) foo.*(\n|\r\n|\r)" } */
+/* { dg-output " #\(2|3\) main.*(\n|\r\n|\r)" } */
diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/free_race2.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/free_race2.c
new file mode 100644
index 000000000..3971180c2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/free_race2.c
@@ -0,0 +1,28 @@
+/* { dg-shouldfail "tsan" } */
+
+#include <stdlib.h>
+
+void __attribute__((noinline)) foo(int *mem) {
+ free(mem);
+}
+
+void __attribute__((noinline)) bar(int *mem) {
+ mem[0] = 42;
+}
+
+int main() {
+ int *mem = (int*)malloc(100);
+ foo(mem);
+ bar(mem);
+ return 0;
+}
+
+/* { dg-output "WARNING: ThreadSanitizer: heap-use-after-free.*(\n|\r\n|\r)" } */
+/* { dg-output " Write of size 4.* by main thread:(\n|\r\n|\r)" } */
+/* { dg-output " #0 bar.*" } */
+/* { dg-output " #1 main .*" } */
+/* { dg-output " Previous write of size 8 at .* by main thread:(\n|\r\n|\r)" } */
+/* { dg-output " #0 free .*" } */
+/* { dg-output " #\(1|2\) foo.*(\n|\r\n|\r)" } */
+/* { dg-output " #\(2|3\) main .*" } */
+
diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/mutexset1.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/mutexset1.c
new file mode 100644
index 000000000..7c32a8524
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/mutexset1.c
@@ -0,0 +1,40 @@
+/* { dg-shouldfail "tsan" } */
+
+#include <pthread.h>
+#include <stdio.h>
+#include <unistd.h>
+
+int Global;
+pthread_mutex_t mtx;
+
+void *Thread1(void *x) {
+ sleep(1);
+ pthread_mutex_lock(&mtx);
+ Global++;
+ pthread_mutex_unlock(&mtx);
+ return NULL;
+}
+
+void *Thread2(void *x) {
+ Global--;
+ return NULL;/* { dg-output ".*" } */
+
+}
+
+int main() {
+ pthread_mutex_init(&mtx, 0);
+ pthread_t t[2];
+ pthread_create(&t[0], NULL, Thread1, NULL);
+ pthread_create(&t[1], NULL, Thread2, NULL);
+ pthread_join(t[0], NULL);
+ pthread_join(t[1], NULL);
+ pthread_mutex_destroy(&mtx);
+ return 0;
+}
+
+/* { dg-output "WARNING: ThreadSanitizer: data race.*(\n|\r\n|\r)" } */
+/* { dg-output " Read of size 4 at 0x\[0-9a-f\]+ by thread T1 \\(mutexes: write M\[0-9\]\\):.*" } */
+/* { dg-output " Previous write of size 4 at 0x\[0-9a-f\]+ by thread T2:.*" } */
+/* { dg-output " Mutex M\[0-9\] created at:.*" } */
+/* { dg-output " #0 pthread_mutex_init.*" } */
+/* { dg-output " #1 main (.*mutexset1.c|\\?{2}):\[0-9]+.*" } */
diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/race_on_barrier.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/race_on_barrier.c
new file mode 100644
index 000000000..0a0e5faba
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/race_on_barrier.c
@@ -0,0 +1,32 @@
+/* { dg-shouldfail "tsan" } */
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stddef.h>
+#include <unistd.h>
+
+pthread_barrier_t B;
+int Global;
+
+void *Thread1(void *x) {
+ pthread_barrier_init(&B, 0, 2);
+ pthread_barrier_wait(&B);
+ return NULL;
+}
+
+void *Thread2(void *x) {
+ sleep(1);
+ pthread_barrier_wait(&B);
+ return NULL;
+}
+
+int main() {
+ pthread_t t;
+ pthread_create(&t, NULL, Thread1, NULL);
+ Thread2(0);
+ pthread_join(t, NULL);
+ pthread_barrier_destroy(&B);
+ return 0;
+}
+
+/* { dg-output "WARNING: ThreadSanitizer: data race.*(\n|\r\n|\r)" } */
diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/race_on_barrier2.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/race_on_barrier2.c
new file mode 100644
index 000000000..b01a5cc21
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/race_on_barrier2.c
@@ -0,0 +1,32 @@
+/* { dg-shouldfail "tsan" } */
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stddef.h>
+#include <unistd.h>
+
+pthread_barrier_t B;
+int Global;
+
+void *Thread1(void *x) {
+ if (pthread_barrier_wait(&B) == PTHREAD_BARRIER_SERIAL_THREAD)
+ pthread_barrier_destroy(&B);
+ return NULL;
+}
+
+void *Thread2(void *x) {
+ if (pthread_barrier_wait(&B) == PTHREAD_BARRIER_SERIAL_THREAD)
+ pthread_barrier_destroy(&B);
+ return NULL;
+}
+
+int main() {
+ pthread_barrier_init(&B, 0, 2);
+ pthread_t t;
+ pthread_create(&t, NULL, Thread1, NULL);
+ Thread2(0);
+ pthread_join(t, NULL);
+ return 0;
+}
+
+/* { dg-output "WARNING: ThreadSanitizer: data race.*(\n|\r\n|\r)" } */
diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/race_on_mutex.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/race_on_mutex.c
new file mode 100644
index 000000000..5dad345d8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/race_on_mutex.c
@@ -0,0 +1,43 @@
+/* { dg-shouldfail "tsan" } */
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stddef.h>
+#include <unistd.h>
+
+pthread_mutex_t Mtx;
+int Global;
+
+void *Thread1(void *x) {
+ pthread_mutex_init(&Mtx, 0);
+ pthread_mutex_lock(&Mtx);
+ Global = 42;
+ pthread_mutex_unlock(&Mtx);
+ return NULL;
+}
+
+void *Thread2(void *x) {
+ sleep(1);
+ pthread_mutex_lock(&Mtx);
+ Global = 43;
+ pthread_mutex_unlock(&Mtx);
+ return NULL;
+}
+
+int main() {
+ pthread_t t[2];
+ pthread_create(&t[0], NULL, Thread1, NULL);
+ pthread_create(&t[1], NULL, Thread2, NULL);
+ pthread_join(t[0], NULL);
+ pthread_join(t[1], NULL);
+ pthread_mutex_destroy(&Mtx);
+ return 0;
+}
+
+/* { dg-output "WARNING: ThreadSanitizer: data race.*(\n|\r\n|\r)" } */
+/* { dg-output " Atomic read of size 1 at .* by thread T2:(\n|\r\n|\r)" } */
+/* { dg-output " #0 pthread_mutex_lock.*" } */
+/* { dg-output " #1 Thread2.* .*(race_on_mutex.c:21|\\?{2}:0) (.*)" } */
+/* { dg-output " Previous write of size 1 at .* by thread T1:(\n|\r\n|\r)" } */
+/* { dg-output " #0 pthread_mutex_init .* (.)*" } */
+/* { dg-output " #1 Thread1.* .*(race_on_mutex.c:12|\\?{2}:0) .*" } */
diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/race_on_mutex2.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/race_on_mutex2.c
new file mode 100644
index 000000000..80a6fb6c0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/race_on_mutex2.c
@@ -0,0 +1,25 @@
+/* { dg-shouldfail "tsan" } */
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stddef.h>
+#include <unistd.h>
+
+void *Thread(void *x) {
+ pthread_mutex_lock((pthread_mutex_t*)x);
+ pthread_mutex_unlock((pthread_mutex_t*)x);
+ return 0;
+}
+
+int main() {
+ pthread_mutex_t Mtx;
+ pthread_mutex_init(&Mtx, 0);
+ pthread_t t;
+ pthread_create(&t, 0, Thread, &Mtx);
+ sleep(1);
+ pthread_mutex_destroy(&Mtx);
+ pthread_join(t, 0);
+ return 0;
+}
+
+/* { dg-output "WARNING: ThreadSanitizer: data race.*(\n|\r\n|\r)" } */
diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/simple_race.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/simple_race.c
new file mode 100644
index 000000000..a40accd40
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/simple_race.c
@@ -0,0 +1,50 @@
+/* { dg-set-target-env-var TSAN_OPTIONS "halt_on_error=1" } */
+/* { dg-shouldfail "tsan" } */
+
+#include <pthread.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#define MAX_ITERATIONS_NUMBER 100
+#define SLEEP_STEP 128000
+
+unsigned int delay_time = 1000;
+
+static inline void delay () {
+ usleep(delay_time);
+}
+
+extern int main_1();
+
+int main() {
+ int i;
+ for (i = 0; i < MAX_ITERATIONS_NUMBER; i++) {
+ main_1();
+ delay_time += delay_time < 256000 ? delay_time : SLEEP_STEP;
+ }
+ return 0;
+}
+
+int Global;
+
+void *Thread1(void *x) {
+ delay();
+ Global = 42;
+ return NULL;
+}
+
+void *Thread2(void *x) {
+ Global = 43;
+ return NULL;
+}
+
+int main_1() {
+ pthread_t t[2];
+ pthread_create(&t[0], NULL, Thread1, NULL);
+ pthread_create(&t[1], NULL, Thread2, NULL);
+ pthread_join(t[0], NULL);
+ pthread_join(t[1], NULL);
+ return 0;
+}
+
+/* { dg-output "WARNING: ThreadSanitizer: data race.*(\n|\r\n|\r)" } */
diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/simple_stack.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/simple_stack.c
new file mode 100644
index 000000000..b66a67085
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/simple_stack.c
@@ -0,0 +1,65 @@
+/* { dg-shouldfail "tsan" } */
+
+#include <pthread.h>
+#include <stdio.h>
+#include <unistd.h>
+
+int Global;
+
+void __attribute__((noinline)) foo1() {
+ Global = 42;
+}
+
+void __attribute__((noinline)) bar1() {
+ volatile int tmp = 42; (void)tmp;
+ foo1();
+}
+
+void __attribute__((noinline)) foo2() {
+ volatile int v = Global; (void)v;
+}
+
+void __attribute__((noinline)) bar2() {
+ volatile int tmp = 42; (void)tmp;
+ foo2();
+}
+
+void *Thread1(void *x) {
+ sleep(1);
+ bar1();
+ return NULL;
+}
+
+void *Thread2(void *x) {
+ bar2();
+ return NULL;
+}
+
+void StartThread(pthread_t *t, void *(*f)(void*)) {
+ pthread_create(t, NULL, f, NULL);
+}
+
+int main() {
+ pthread_t t[2];
+ StartThread(&t[0], Thread1);
+ StartThread(&t[1], Thread2);
+ pthread_join(t[0], NULL);
+ pthread_join(t[1], NULL);
+ return 0;
+}
+
+/* { dg-output "WARNING: ThreadSanitizer: data race.*" } */
+/* { dg-output " Write of size 4 at .* by thread T1:(\n|\r\n|\r)" } */
+/* { dg-output " #0 foo1.* .*(simple_stack.c:10|\\?{2}:0) (.*)" } */
+/* { dg-output " #1 bar1.* .*(simple_stack.c:15|\\?{2}:0) (.*)" } */
+/* { dg-output " #2 Thread1.* .*(simple_stack.c:29|\\?{2}:0) (.*)" } */
+/* { dg-output " Previous read of size 4 at .* by thread T2:(\n|\r\n|\r)" } */
+/* { dg-output " #0 foo2.* .*(simple_stack.c:19|\\?{2}:0) (.*)" } */
+/* { dg-output " #1 bar2.* .*(simple_stack.c:24|\\?{2}:0) (.*)" } */
+/* { dg-output " #2 Thread2.* .*(simple_stack.c:34|\\?{2}:0) (.*)" } */
+/* { dg-output " Thread T1 \\(tid=.*, running\\) created by main thread at:(\n|\r\n|\r)" } */
+/* { dg-output " #0 pthread_create .* (.*)" } */
+/* { dg-output " #1 StartThread.* .*(simple_stack.c:39|\\?{2}:0) (.*)" } */
+/* { dg-output " Thread T2 (.*) created by main thread at:(\n|\r\n|\r)" } */
+/* { dg-output " #0 pthread_create .* (.*)" } */
+/* { dg-output " #1 StartThread.* .*(simple_stack.c:39|\\?{2}:0) (.*)" } */
diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/sleep_sync.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/sleep_sync.c
new file mode 100644
index 000000000..44d44554c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/sleep_sync.c
@@ -0,0 +1,30 @@
+/* { dg-shouldfail "tsan" } */
+
+#include <pthread.h>
+#include <unistd.h>
+
+int X = 0;
+
+void MySleep() {
+ sleep(1);
+}
+
+void *Thread(void *p) {
+ MySleep(); // Assume the main thread has done the write.
+ X = 42;
+ return 0;
+}
+
+int main() {
+ pthread_t t;
+ pthread_create(&t, 0, Thread, 0);
+ X = 43;
+ pthread_join(t, 0);
+ return 0;
+}
+
+/* { dg-output "WARNING: ThreadSanitizer: data race.*(\n|\r\n|\r).*} */
+/* { dg-output " As if synchronized via sleep:(\n|\r\n|\r)} */
+/* { dg-output " #0 sleep.*"*} */
+/* { dg-output " #1 MySleep.*"*} */
+/* { dg-output " #2 Thread.*"*} */
diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/thread_leak.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/thread_leak.c
new file mode 100644
index 000000000..02deaba58
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/thread_leak.c
@@ -0,0 +1,16 @@
+#include <pthread.h>
+#include <stdio.h>
+
+void *Thread(void *x) {
+ return 0;
+}
+
+int main() {
+ pthread_t t;
+ pthread_create(&t, 0, Thread, 0);
+ pthread_join(t, 0);
+ printf("PASS\n");
+ return 0;
+}
+
+/* { dg-prune-output "WARNING: ThreadSanitizer: thread leak.*" } */
diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/thread_leak1.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/thread_leak1.c
new file mode 100644
index 000000000..ce28ee487
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/thread_leak1.c
@@ -0,0 +1,18 @@
+/* { dg-shouldfail "tsan" } */
+
+#include <pthread.h>
+#include <unistd.h>
+
+void *Thread(void *x) {
+ return 0;
+}
+
+int main() {
+ pthread_t t;
+ pthread_create(&t, 0, Thread, 0);
+ sleep(1);
+ return 0;
+}
+
+/* { dg-output "WARNING: ThreadSanitizer: thread leak.*(\n|\r\n|\r)" } */
+/* { dg-output "SUMMARY: ThreadSanitizer: thread leak.*main.*(\n|\r\n|\r)" } */
diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/thread_leak2.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/thread_leak2.c
new file mode 100644
index 000000000..c9b804665
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/thread_leak2.c
@@ -0,0 +1,21 @@
+/* { dg-shouldfail "tsan" } */
+
+#include <pthread.h>
+#include <unistd.h>
+
+void *Thread(void *x) {
+ return 0;
+}
+
+int main() {
+ int i;
+ for (i = 0; i < 5; i++) {
+ pthread_t t;
+ pthread_create(&t, 0, Thread, 0);
+ }
+ sleep(1);
+ return 0;
+}
+
+/* { dg-output "WARNING: ThreadSanitizer: thread leak.*(\n|\r\n|\r)" } */
+/* { dg-output " And 4 more similar thread leaks.*" } */
diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/tiny_race.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/tiny_race.c
new file mode 100644
index 000000000..962497b28
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/tiny_race.c
@@ -0,0 +1,22 @@
+/* { dg-shouldfail "tsan" } */
+
+#include <pthread.h>
+#include <unistd.h>
+
+int Global;
+
+void *Thread1(void *x) {
+ sleep(1);
+ Global = 42;
+ return x;
+}
+
+int main() {
+ pthread_t t;
+ pthread_create(&t, 0, Thread1, 0);
+ Global = 43;
+ pthread_join(t, 0);
+ return Global;
+}
+
+/* { dg-output "WARNING: ThreadSanitizer: data race.*(\n|\r\n|\r)" } */
diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/tls_race.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/tls_race.c
new file mode 100644
index 000000000..423867e38
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/tls_race.c
@@ -0,0 +1,20 @@
+/* { dg-shouldfail "tsan" } */
+
+#include <pthread.h>
+#include <stddef.h>
+
+void *Thread(void *a) {
+ *(int*)a = 43;
+ return 0;
+}
+
+int main() {
+ static __thread int Var = 42;
+ pthread_t t;
+ pthread_create(&t, 0, Thread, &Var);
+ Var = 43;
+ pthread_join(t, 0);
+}
+
+/* { dg-output "WARNING: ThreadSanitizer: data race.*(\n|\r\n|\r).*" } */
+/* { dg-output " Location is TLS of main thread.(\n|\r\n|\r).*" } */
diff --git a/gcc-4.9/gcc/testsuite/c-c++-common/tsan/write_in_reader_lock.c b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/write_in_reader_lock.c
new file mode 100644
index 000000000..898d23d50
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/c-c++-common/tsan/write_in_reader_lock.c
@@ -0,0 +1,36 @@
+/* { dg-shouldfail "tsan" } */
+
+#include <pthread.h>
+#include <unistd.h>
+
+pthread_rwlock_t rwlock;
+int GLOB;
+
+void *Thread1(void *p) {
+ (void)p;
+ pthread_rwlock_rdlock(&rwlock);
+ // Write under reader lock.
+ sleep(1);
+ GLOB++;
+ pthread_rwlock_unlock(&rwlock);
+ return 0;
+}
+
+int main(int argc, char *argv[]) {
+ pthread_rwlock_init(&rwlock, NULL);
+ pthread_rwlock_rdlock(&rwlock);
+ pthread_t t;
+ pthread_create(&t, 0, Thread1, 0);
+ volatile int x = GLOB;
+ (void)x;
+ pthread_rwlock_unlock(&rwlock);
+ pthread_join(t, 0);
+ pthread_rwlock_destroy(&rwlock);
+ return 0;
+}
+
+/* { dg-output "WARNING: ThreadSanitizer: data race.*(\n|\r\n|\r)" } */
+/* { dg-output " Write of size 4 at 0x\[0-9a-f\]+ by thread T1.*:(\n|\r\n|\r).*" } */
+/* { dg-output " #0 Thread1.*\(write_in_reader_lock.c|\\?{2}\):\[0-9\]+ .*" } */
+/* { dg-output " Previous read of size 4 at.* by main thread.*:(\n|\r\n|\r).*" } */
+/* { dg-output " #0 main.*\(write_in_reader_lock.c|\\?{2}\):\[0-9\]+.*" } */