diff options
author | Bernd Edlinger <bernd.edlinger@hotmail.de> | 2015-01-02 22:16:59 +0000 |
---|---|---|
committer | Bernd Edlinger <edlinger@gcc.gnu.org> | 2015-01-02 22:16:59 +0000 |
commit | fe86867f07504f643ab9bf1147bac785222cadb0 (patch) | |
tree | 2e150e026804c390ac9333406e3d7552c6a62711 /gcc/testsuite | |
parent | e4dd5b691d56f11c225e1e1847be3800854634b6 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/tsan/bitfield_race.c | 26 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/tsan/aligned_vs_unaligned_race.C | 8 |
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; } |