llvm-capstone/clang/test/CodeGen/sanitize-thread-disable.c
Alexander Potapenko cdb391698b [tsan] Do not include <stdatomic.h> from sanitize-thread-disable.c
Looks like non-x86 bots are unhappy with inclusion of <stdatomic.h>
e.g.:

clang-armv7-vfpv3-2stage - https://lab.llvm.org/buildbot/#/builders/182/builds/626
clang-ppc64le-linux - https://lab.llvm.org/buildbot/#/builders/76/builds/3619
llvm-clang-win-x-armv7l - https://lab.llvm.org/buildbot/#/builders/60/builds/4514

It seems to be unnecessary, just remove it and replace atomic_load()
calls with dereferences of _Atomic*.

Differential Revision: https://reviews.llvm.org/D108555
2021-08-23 16:21:43 +02:00

56 lines
2.1 KiB
C

// RUN: %clang -target x86_64-linux-gnu -S -emit-llvm -o - %s | FileCheck -check-prefixes CHECK,WITHOUT %s
// RUN: %clang -target x86_64-linux-gnu -S -emit-llvm -o - %s -fsanitize=thread | FileCheck -check-prefixes CHECK,TSAN %s
// Instrumented function.
// TSan inserts calls to __tsan_func_entry() and __tsan_func_exit() to prologue/epilogue.
// Non-atomic loads are instrumented with __tsan_readXXX(), atomic loads - with
// __tsan_atomicXXX_load().
//
// CHECK-LABEL: @instrumented1
// TSAN: call void @__tsan_func_entry
// WITHOUT-NOT: call void @__tsan_func_entry
// TSAN: call void @__tsan_read4
// WITHOUT-NOT: call void @__tsan_read4
// TSAN: call i32 @__tsan_atomic32_load
// WITHOUT-NOT: call i32 @__tsan_atomic32_load
// TSAN: call void @__tsan_func_exit
// WITHOUT-NOT: call void @__tsan_func_exit
// CHECK: ret i32
int instrumented1(int *a, _Atomic int *b) {
return *a + *b;
}
// Function with no_sanitize("thread").
// TSan only inserts instrumentation necessary to prevent false positives: calls are inserted for
// function entry/exit and atomics, but not plain memory accesses.
//
// CHECK-LABEL: @no_false_positives1
// TSAN: call void @__tsan_func_entry
// WITHOUT-NOT: call void @__tsan_func_entry
// TSAN-NOT: call void @__tsan_read4
// WITHOUT-NOT: call void @__tsan_read4
// TSAN: call i32 @__tsan_atomic32_load
// WITHOUT-NOT: call i32 @__tsan_atomic32_load
// TSAN: call void @__tsan_func_exit
// WITHOUT-NOT: call void @__tsan_func_exit
// CHECK: ret i32
__attribute__((no_sanitize("thread"))) int no_false_positives1(int *a, _Atomic int *b) {
return *a + *b;
}
// Function with disable_sanitizer_instrumentation: no instrumentation at all.
//
// CHECK-LABEL: @no_instrumentation1
// TSAN-NOT: call void @__tsan_func_entry
// WITHOUT-NOT: call void @__tsan_func_entry
// TSAN-NOT: call void @__tsan_read4
// WITHOUT-NOT: call void @__tsan_read4
// TSAN-NOT: call i32 @__tsan_atomic32_load
// WITHOUT-NOT: call i32 @__tsan_atomic32_load
// TSAN-NOT: call void @__tsan_func_exit
// WITHOUT-NOT: call void @__tsan_func_exit
// CHECK: ret i32
__attribute__((disable_sanitizer_instrumentation)) int no_instrumentation1(int *a, _Atomic int *b) {
return *a + *b;
}