File: sanitize-thread-disable.c

package info (click to toggle)
llvm-toolchain-20 1%3A20.1.6-1~exp1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 2,111,304 kB
  • sloc: cpp: 7,438,677; ansic: 1,393,822; asm: 1,012,926; python: 241,650; f90: 86,635; objc: 75,479; lisp: 42,144; pascal: 17,286; sh: 10,027; ml: 5,082; perl: 4,730; awk: 3,523; makefile: 3,349; javascript: 2,251; xml: 892; fortran: 672
file content (55 lines) | stat: -rw-r--r-- 2,194 bytes parent folder | download | duplicates (18)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// 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;
}