aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite
diff options
context:
space:
mode:
authorBernd Edlinger <bernd.edlinger@hotmail.de>2015-01-02 22:16:59 +0000
committerBernd Edlinger <edlinger@gcc.gnu.org>2015-01-02 22:16:59 +0000
commitfe86867f07504f643ab9bf1147bac785222cadb0 (patch)
tree2e150e026804c390ac9333406e3d7552c6a62711 /gcc/testsuite
parente4dd5b691d56f11c225e1e1847be3800854634b6 (diff)
downloadgcc-fe86867f07504f643ab9bf1147bac785222cadb0.zip
gcc-fe86867f07504f643ab9bf1147bac785222cadb0.tar.gz
gcc-fe86867f07504f643ab9bf1147bac785222cadb0.tar.bz2
Instrument bit field and unaligned accesses for TSAN.
gcc/ChangeLog: 2015-01-02 Bernd Edlinger <bernd.edlinger@hotmail.de> Instrument bit field and unaligned accesses for TSAN. * sanitizer.def (BUILT_IN_TSAN_READ_RANGE): New built-in function. (BUILT_IN_TSAN_WRITE_RANGE): New built-in function. * tsan.c (instrument_expr): Handle COMPONENT_REF and BIT_FIELD_REF. Use BUILT_IN_TSAN_READ_RANGE and BUILT_IN_TSAN_WRITE_RANGE for unaligned memory regions. testsuite/ChangeLog: 2015-01-02 Bernd Edlinger <bernd.edlinger@hotmail.de> * c-c++-common/tsan/bitfield_race.c: New testcase. * g++.dg/tsan/aligned_vs_unaligned_race.C: Fixed. From-SVN: r219150
Diffstat (limited to 'gcc/testsuite')
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/c-c++-common/tsan/bitfield_race.c26
-rw-r--r--gcc/testsuite/g++.dg/tsan/aligned_vs_unaligned_race.C8
3 files changed, 36 insertions, 3 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a47a1a1..cb1ba68 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-01-02 Bernd Edlinger <bernd.edlinger@hotmail.de>
+
+ * c-c++-common/tsan/bitfield_race.c: New testcase.
+ * g++.dg/tsan/aligned_vs_unaligned_race.C: Fixed.
+
2015-01-02 Tobias Burnus <burnus@net-b.de>
* gfortran.dg/coarray/collectives_4.f90: New.
diff --git a/gcc/testsuite/c-c++-common/tsan/bitfield_race.c b/gcc/testsuite/c-c++-common/tsan/bitfield_race.c
new file mode 100644
index 0000000..e8de097
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/tsan/bitfield_race.c
@@ -0,0 +1,26 @@
+/* { dg-shouldfail "tsan" } */
+
+#include <pthread.h>
+#include <unistd.h>
+
+struct bitfield
+{
+ int a:10;
+ int b:10;
+} Global;
+
+void *Thread1(void *x) {
+ sleep(1);
+ Global.a = 42;
+ return x;
+}
+
+int main() {
+ pthread_t t;
+ pthread_create(&t, 0, Thread1, 0);
+ Global.b = 43;
+ pthread_join(t, 0);
+ return Global.a;
+}
+
+/* { dg-output "WARNING: ThreadSanitizer: data race.*(\n|\r\n|\r)" } */
diff --git a/gcc/testsuite/g++.dg/tsan/aligned_vs_unaligned_race.C b/gcc/testsuite/g++.dg/tsan/aligned_vs_unaligned_race.C
index 390be86..e547e0c 100644
--- a/gcc/testsuite/g++.dg/tsan/aligned_vs_unaligned_race.C
+++ b/gcc/testsuite/g++.dg/tsan/aligned_vs_unaligned_race.C
@@ -1,3 +1,4 @@
+/* { dg-shouldfail "tsan" } */
#include <pthread.h>
#include <stdio.h>
#include <stdint.h>
@@ -11,8 +12,9 @@ void *Thread1(void *x) {
void *Thread2(void *x) {
char *p1 = reinterpret_cast<char *>(&Global[0]);
- uint64_t *p4 = reinterpret_cast<uint64_t *>(p1 + 1);
- (*p4)++;
+ struct __attribute__((packed, aligned(1))) u_uint64_t { uint64_t val; };
+ u_uint64_t *p4 = reinterpret_cast<u_uint64_t *>(p1 + 1);
+ (*p4).val++;
return NULL;
}
@@ -23,7 +25,7 @@ int main() {
pthread_join(t[0], NULL);
pthread_join(t[1], NULL);
printf("Pass\n");
- /* { dg-prune-output "ThreadSanitizer: data race.*(\n|\r\n|\r)" } */
+ /* { dg-output "WARNING: ThreadSanitizer: data race.*(\n|\r\n|\r)" } */
/* { dg-output "Pass.*" } */
return 0;
}