aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorBernd Edlinger <bernd.edlinger@hotmail.de>2015-01-16 17:49:56 +0000
committerBernd Edlinger <edlinger@gcc.gnu.org>2015-01-16 17:49:56 +0000
commitcbf9a56669cf7ca630b941dce4a7e118b7012f57 (patch)
tree9027a397ba33ba154f6736baa3e9a09c58342c16 /gcc
parent39dac19e286a8b23b0e3bdde6ba18b65f3f919f8 (diff)
downloadgcc-cbf9a56669cf7ca630b941dce4a7e118b7012f57.zip
gcc-cbf9a56669cf7ca630b941dce4a7e118b7012f57.tar.gz
gcc-cbf9a56669cf7ca630b941dce4a7e118b7012f57.tar.bz2
sanititer.def (BUILT_IN_TSAN_VPTR_UPDATE): Fixed parameters.
2015-01-16 Bernd Edlinger <bernd.edlinger@hotmail.de> * sanititer.def (BUILT_IN_TSAN_VPTR_UPDATE): Fixed parameters. * tsan.c (instrument_expr): Fixed parameters of __tsan_vptr_update. gcc/testsuite/ChangeLog 2015-01-16 Bernd Edlinger <bernd.edlinger@hotmail.de> * g++.dg/tsan/vptr_benign_race.C: New testcase. * g++.dg/tsan/vptr_harmful_race.C: New testcase. From-SVN: r219761
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/sanitizer.def2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/tsan/vptr_benign_race.C49
-rw-r--r--gcc/testsuite/g++.dg/tsan/vptr_harmful_race.C58
-rw-r--r--gcc/tsan.c2
6 files changed, 119 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 717bdbd..ae633bf 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2015-01-16 Bernd Edlinger <bernd.edlinger@hotmail.de>
+
+ * sanititer.def (BUILT_IN_TSAN_VPTR_UPDATE): Fixed parameters.
+ * tsan.c (instrument_expr): Fixed parameters of __tsan_vptr_update.
+
2015-01-16 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* config/arm/arm.md: Move comment about splitting Thumb1 patterns to...
diff --git a/gcc/sanitizer.def b/gcc/sanitizer.def
index 0f18928..7d14910 100644
--- a/gcc/sanitizer.def
+++ b/gcc/sanitizer.def
@@ -167,7 +167,7 @@ DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_FUNC_ENTRY, "__tsan_func_entry",
DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_FUNC_EXIT, "__tsan_func_exit",
BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_VPTR_UPDATE, "__tsan_vptr_update",
- BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
+ BT_FN_VOID_PTR_PTR, ATTR_NOTHROW_LEAF_LIST)
DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_READ1, "__tsan_read1",
BT_FN_VOID_PTR, ATTR_NOTHROW_LEAF_LIST)
DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_READ2, "__tsan_read2",
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index dc3b607..cc0ab53 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-01-16 Bernd Edlinger <bernd.edlinger@hotmail.de>
+
+ * g++.dg/tsan/vptr_benign_race.C: New testcase.
+ * g++.dg/tsan/vptr_harmful_race.C: New testcase.
+
2015-01-16 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/60056
diff --git a/gcc/testsuite/g++.dg/tsan/vptr_benign_race.C b/gcc/testsuite/g++.dg/tsan/vptr_benign_race.C
new file mode 100644
index 0000000..283684b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tsan/vptr_benign_race.C
@@ -0,0 +1,49 @@
+#include <pthread.h>
+#include <semaphore.h>
+#include <stdio.h>
+
+struct A {
+ A() {
+ sem_init(&sem_, 0, 0);
+ }
+ virtual void F() {
+ }
+ void Done() {
+ sem_post(&sem_);
+ }
+ virtual ~A() {
+ }
+ sem_t sem_;
+};
+
+struct B : A {
+ virtual void F() {
+ }
+ virtual ~B() {
+ sem_wait(&sem_);
+ sem_destroy(&sem_);
+ }
+};
+
+static A *obj = new B;
+
+void *Thread1(void *x) {
+ obj->F();
+ obj->Done();
+ return NULL;
+}
+
+void *Thread2(void *x) {
+ delete obj;
+ 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);
+ fprintf(stderr, "PASS\n");
+}
+/* { dg-output "PASS.*" } */
diff --git a/gcc/testsuite/g++.dg/tsan/vptr_harmful_race.C b/gcc/testsuite/g++.dg/tsan/vptr_harmful_race.C
new file mode 100644
index 0000000..1473f93
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tsan/vptr_harmful_race.C
@@ -0,0 +1,58 @@
+/* { dg-shouldfail "tsan" } */
+/* { dg-additional-options "-ldl" } */
+
+#include <pthread.h>
+#include <semaphore.h>
+#include <stdio.h>
+#include <unistd.h>
+#include "tsan_barrier.h"
+
+static pthread_barrier_t barrier;
+
+struct A {
+ A() {
+ sem_init(&sem_, 0, 0);
+ }
+ virtual void F() {
+ }
+ void Done() {
+ sem_post(&sem_);
+ }
+ virtual ~A() {
+ sem_wait(&sem_);
+ sem_destroy(&sem_);
+ }
+ sem_t sem_;
+};
+
+struct B : A {
+ virtual void F() {
+ }
+ virtual ~B() { }
+};
+
+static A *obj = new B;
+
+void *Thread1(void *x) {
+ obj->F();
+ obj->Done();
+ barrier_wait(&barrier);
+ return NULL;
+}
+
+void *Thread2(void *x) {
+ barrier_wait(&barrier);
+ delete obj;
+ return NULL;
+}
+
+int main() {
+ barrier_init(&barrier, 2);
+ 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 on vptr.*(\n|\r\n|\r)" } */
diff --git a/gcc/tsan.c b/gcc/tsan.c
index 7c17262..ae89d5f 100644
--- a/gcc/tsan.c
+++ b/gcc/tsan.c
@@ -249,7 +249,7 @@ instrument_expr (gimple_stmt_iterator gsi, tree expr, bool is_write)
else
{
builtin_decl = builtin_decl_implicit (BUILT_IN_TSAN_VPTR_UPDATE);
- g = gimple_build_call (builtin_decl, 1, expr_ptr);
+ g = gimple_build_call (builtin_decl, 2, expr_ptr, unshare_expr (rhs));
}
gimple_set_location (g, loc);
gimple_seq_add_stmt_without_update (&seq, g);