tsan: declare annotations in test.h

We already declare subset of annotations in test.h.
But some are duplicated and declared in tests.
Move all annotation declarations to test.h.

Reviewed By: vitalybuka

Differential Revision: https://reviews.llvm.org/D102152
This commit is contained in:
Dmitry Vyukov 2021-05-10 09:04:20 +02:00
parent 6d2df18163
commit 8214764f35
14 changed files with 36 additions and 66 deletions

View File

@ -7,24 +7,8 @@ Annotations usage example.
Tsan does not see synchronization in barrier_wait.
ANNOTATE_HAPPENS_BEFORE/AFTER communicate the synchronization to tsan
and prevent the race report.
If the compiler does not support __has_feature macro, then you can build with
CFLAGS="-fsanitize=thread -DTHREAD_SANITIZER" and then use
#ifdef THREAD_SANITIZER to enabled annotations.
*/
#if defined(__has_feature) && __has_feature(thread_sanitizer)
# define ANNOTATE_HAPPENS_BEFORE(addr) \
AnnotateHappensBefore(__FILE__, __LINE__, (void*)(addr))
# define ANNOTATE_HAPPENS_AFTER(addr) \
AnnotateHappensAfter(__FILE__, __LINE__, (void*)(addr))
extern "C" void AnnotateHappensBefore(const char *f, int l, void *addr);
extern "C" void AnnotateHappensAfter(const char *f, int l, void *addr);
#else
# define ANNOTATE_HAPPENS_BEFORE(addr)
# define ANNOTATE_HAPPENS_AFTER(addr)
#endif
int Global;
void *Thread1(void *x) {

View File

@ -4,15 +4,6 @@
int Global;
int WTFGlobal;
extern "C" {
void AnnotateBenignRaceSized(const char *f, int l,
void *mem, unsigned int size, const char *desc);
void WTFAnnotateBenignRaceSized(const char *f, int l,
void *mem, unsigned int size,
const char *desc);
}
void *Thread(void *x) {
Global = 42;
WTFGlobal = 142;
@ -22,11 +13,8 @@ void *Thread(void *x) {
int main() {
barrier_init(&barrier, 2);
AnnotateBenignRaceSized(__FILE__, __LINE__,
&Global, sizeof(Global), "Race on Global");
WTFAnnotateBenignRaceSized(__FILE__, __LINE__,
&WTFGlobal, sizeof(WTFGlobal),
"Race on WTFGlobal");
ANNOTATE_BENIGN_RACE(Global);
WTF_ANNOTATE_BENIGN_RACE(WTFGlobal);
pthread_t t;
pthread_create(&t, 0, Thread, 0);
barrier_wait(&barrier);

View File

@ -1,9 +1,5 @@
// RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s
#include <pthread.h>
#include <stdio.h>
extern "C" void AnnotateIgnoreSyncBegin(const char*, int);
extern "C" void AnnotateIgnoreSyncEnd(const char*, int);
#include "test.h"
int Global;
pthread_mutex_t Mutex = PTHREAD_MUTEX_INITIALIZER;

View File

@ -1,5 +1,5 @@
// RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s
extern "C" void AnnotateRWLockAcquired(const char *f, int l, void *m, long rw);
#include "test.h"
int main() {
int m = 0;

View File

@ -1,6 +1,5 @@
// RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s
extern "C" void AnnotateRWLockAcquired(const char *f, int l, void *m, long rw);
extern "C" void AnnotateRWLockReleased(const char *f, int l, void *m, long rw);
#include "test.h"
int main() {
int m = 0;

View File

@ -1,5 +1,5 @@
// RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s
extern "C" void AnnotateRWLockReleased(const char *f, int l, void *m, long rw);
#include "test.h"
int main() {
int m = 0;

View File

@ -1,8 +1,5 @@
// RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s
#include <pthread.h>
#include <unistd.h>
extern "C" void AnnotateRWLockAcquired(const char *f, int l, void *m, long rw);
#include "test.h"
void *ThreadFunc(void *m) {
AnnotateRWLockAcquired(__FILE__, __LINE__, m, 1);

View File

@ -33,7 +33,7 @@ int main() {
// CHECK: #1 main {{.*}}mutexset5.cpp:[[@LINE+4]]
// CHECK: Mutex [[M2]] (0x{{.*}}) created at:
// CHECK: #0 pthread_mutex_init
// CHECK: #1 main {{.*}}mutexset5.cpp:[[@LINE+5]]
// CHECK: #1 main {{.*}}mutexset5.cpp:[[@LINE+2]]
pthread_mutex_init(&mtx1, 0);
pthread_mutex_init(&mtx2, 0);
pthread_t t[2];

View File

@ -1,19 +1,13 @@
// RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s
// UNSUPPORTED: darwin
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/time.h>
#include <unistd.h>
#include "test.h"
#include <errno.h>
#include <signal.h>
#include <sys/time.h>
#include <sys/types.h>
// Test synchronization in signal handled within IgnoreSync region.
extern "C" void AnnotateIgnoreSyncBegin(const char *f, int l);
extern "C" void AnnotateIgnoreSyncEnd(const char *f, int l);
const int kSignalCount = 500;
__thread int process_signals;

View File

@ -69,6 +69,8 @@ const int kPCInc = 1;
extern "C" {
#endif
void AnnotateThreadName(const char *f, int l, const char *name);
void AnnotateRWLockCreate(const char *f, int l, void *m);
void AnnotateRWLockCreateStatic(const char *f, int l, void *m);
void AnnotateRWLockDestroy(const char *f, int l, void *m);
@ -80,6 +82,15 @@ void AnnotateIgnoreReadsEnd(const char *f, int l);
void AnnotateIgnoreWritesBegin(const char *f, int l);
void AnnotateIgnoreWritesEnd(const char *f, int l);
void AnnotateIgnoreSyncBegin(const char *f, int l);
void AnnotateIgnoreSyncEnd(const char *f, int l);
void AnnotateHappensBefore(const char *f, int l, void *addr);
void AnnotateHappensAfter(const char *f, int l, void *addr);
void AnnotateBenignRaceSized(const char *f, int l, void *mem, unsigned int size, const char *desc);
void WTFAnnotateBenignRaceSized(const char *f, int l, void *mem, unsigned int size, const char *desc);
#ifdef __cplusplus
}
#endif
@ -94,6 +105,14 @@ void AnnotateIgnoreWritesEnd(const char *f, int l);
AnnotateRWLockAcquired(__FILE__, __LINE__, m, is_w)
#define ANNOTATE_RWLOCK_RELEASED(m, is_w) \
AnnotateRWLockReleased(__FILE__, __LINE__, m, is_w)
#define ANNOTATE_HAPPENS_BEFORE(addr) \
AnnotateHappensBefore(__FILE__, __LINE__, (void *)(addr))
#define ANNOTATE_HAPPENS_AFTER(addr) \
AnnotateHappensAfter(__FILE__, __LINE__, (void *)(addr))
#define ANNOTATE_BENIGN_RACE(var) \
AnnotateBenignRaceSized(__FILE__, __LINE__, &(var), sizeof(var), #var)
#define WTF_ANNOTATE_BENIGN_RACE(var) \
WTFAnnotateBenignRaceSized(__FILE__, __LINE__, &(var), sizeof(var), #var)
#ifdef __APPLE__
#define ASM_SYMBOL(symbol) "_" #symbol

View File

@ -1,8 +1,5 @@
// RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s
#include <pthread.h>
#include <stdio.h>
extern "C" void AnnotateIgnoreReadsBegin(const char *f, int l);
#include "test.h"
void *Thread(void *x) {
AnnotateIgnoreReadsBegin("", 0);

View File

@ -1,5 +1,5 @@
// RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s
extern "C" void AnnotateIgnoreWritesBegin(const char *f, int l);
#include "test.h"
int main() {
AnnotateIgnoreWritesBegin("", 0);

View File

@ -1,6 +1,5 @@
// RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s
extern "C" void AnnotateIgnoreReadsBegin(const char *f, int l);
extern "C" void AnnotateIgnoreReadsEnd(const char *f, int l);
#include "test.h"
int main() {
AnnotateIgnoreReadsBegin("", 0);
@ -15,8 +14,7 @@ int main() {
// CHECK: ThreadSanitizer: main thread finished with ignores enabled
// CHECK: Ignore was enabled at:
// CHECK: #0 AnnotateIgnoreReadsBegin
// CHECK: #1 main {{.*}}thread_end_with_ignore3.cpp:10
// CHECK: #1 main {{.*}}thread_end_with_ignore3.cpp:9
// CHECK: Ignore was enabled at:
// CHECK: #0 AnnotateIgnoreReadsBegin
// CHECK: #1 main {{.*}}thread_end_with_ignore3.cpp:11
// CHECK: #1 main {{.*}}thread_end_with_ignore3.cpp:10

View File

@ -15,8 +15,6 @@
#define USE_PTHREAD_SETNAME_NP 0
#endif
extern "C" void AnnotateThreadName(const char *f, int l, const char *name);
int Global;
void *Thread1(void *x) {