[tsan] Include __tsan_external_* API from a header file instead of declaring them manually. NFC.
Differential Revision: https://reviews.llvm.org/D32384 llvm-svn: 301190
This commit is contained in:
parent
264b6de4b0
commit
dd13e4e0b0
|
@ -17,8 +17,6 @@ int __tsan_get_report_loc(void *report, unsigned long idx, const char **type,
|
||||||
unsigned long trace_size);
|
unsigned long trace_size);
|
||||||
int __tsan_get_report_loc_object_type(void *report, unsigned long idx,
|
int __tsan_get_report_loc_object_type(void *report, unsigned long idx,
|
||||||
const char **object_type);
|
const char **object_type);
|
||||||
void *__tsan_external_register_tag(const char *object_type);
|
|
||||||
void __tsan_external_assign_tag(void *addr, void *tag);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void *Thread(void *arg) {
|
void *Thread(void *arg) {
|
||||||
|
|
|
@ -5,14 +5,6 @@
|
||||||
|
|
||||||
#import "../test.h"
|
#import "../test.h"
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
void *__tsan_external_register_tag(const char *object_type);
|
|
||||||
void *__tsan_external_assign_tag(void *addr, void *tag);
|
|
||||||
void __tsan_external_read(void *addr, void *caller_pc, void *tag);
|
|
||||||
void __tsan_external_write(void *addr, void *caller_pc, void *tag);
|
|
||||||
void __tsan_write8(void *addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *tag;
|
void *tag;
|
||||||
|
|
||||||
__attribute__((no_sanitize("thread")))
|
__attribute__((no_sanitize("thread")))
|
||||||
|
|
|
@ -8,6 +8,8 @@
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include "sanitizer_common/print_address.h"
|
#include "sanitizer_common/print_address.h"
|
||||||
|
|
||||||
|
#include <sanitizer/tsan_interface.h>
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
#include <mach/mach_time.h>
|
#include <mach/mach_time.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -6,31 +6,22 @@
|
||||||
|
|
||||||
volatile uint64_t objs[8*2*(2 + 4 + 8)][2];
|
volatile uint64_t objs[8*2*(2 + 4 + 8)][2];
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
uint16_t __sanitizer_unaligned_load16(volatile void *addr);
|
|
||||||
uint32_t __sanitizer_unaligned_load32(volatile void *addr);
|
|
||||||
uint64_t __sanitizer_unaligned_load64(volatile void *addr);
|
|
||||||
void __sanitizer_unaligned_store16(volatile void *addr, uint16_t v);
|
|
||||||
void __sanitizer_unaligned_store32(volatile void *addr, uint32_t v);
|
|
||||||
void __sanitizer_unaligned_store64(volatile void *addr, uint64_t v);
|
|
||||||
}
|
|
||||||
|
|
||||||
// All this mess is to generate unique stack for each race,
|
// All this mess is to generate unique stack for each race,
|
||||||
// otherwise tsan will suppress similar stacks.
|
// otherwise tsan will suppress similar stacks.
|
||||||
|
|
||||||
static NOINLINE void access(volatile char *p, int sz, int rw) {
|
static NOINLINE void access(volatile void *p, int sz, int rw) {
|
||||||
if (rw) {
|
if (rw) {
|
||||||
switch (sz) {
|
switch (sz) {
|
||||||
case 0: __sanitizer_unaligned_store16(p, 0); break;
|
case 0: __sanitizer_unaligned_store16((void *)p, 0); break;
|
||||||
case 1: __sanitizer_unaligned_store32(p, 0); break;
|
case 1: __sanitizer_unaligned_store32((void *)p, 0); break;
|
||||||
case 2: __sanitizer_unaligned_store64(p, 0); break;
|
case 2: __sanitizer_unaligned_store64((void *)p, 0); break;
|
||||||
default: exit(1);
|
default: exit(1);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
switch (sz) {
|
switch (sz) {
|
||||||
case 0: __sanitizer_unaligned_load16(p); break;
|
case 0: __sanitizer_unaligned_load16((void *)p); break;
|
||||||
case 1: __sanitizer_unaligned_load32(p); break;
|
case 1: __sanitizer_unaligned_load32((void *)p); break;
|
||||||
case 2: __sanitizer_unaligned_load64(p); break;
|
case 2: __sanitizer_unaligned_load64((void *)p); break;
|
||||||
default: exit(1);
|
default: exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue