diff --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp --- a/clang/lib/Driver/SanitizerArgs.cpp +++ b/clang/lib/Driver/SanitizerArgs.cpp @@ -43,11 +43,12 @@ SanitizerKind::KernelAddress | SanitizerKind::KernelHWAddress | SanitizerKind::MemTag | SanitizerKind::Memory | SanitizerKind::KernelMemory | SanitizerKind::Leak | - SanitizerKind::Undefined | SanitizerKind::Integer | + SanitizerKind::Undefined | SanitizerKind::Integer | SanitizerKind::Bounds | SanitizerKind::ImplicitConversion | SanitizerKind::Nullability | SanitizerKind::DataFlow | SanitizerKind::Fuzzer | SanitizerKind::FuzzerNoLink | SanitizerKind::FloatDivideByZero | - SanitizerKind::SafeStack | SanitizerKind::ShadowCallStack; + SanitizerKind::SafeStack | SanitizerKind::ShadowCallStack | + SanitizerKind::Thread; static const SanitizerMask RecoverableByDefault = SanitizerKind::Undefined | SanitizerKind::Integer | SanitizerKind::ImplicitConversion | SanitizerKind::Nullability | diff --git a/clang/test/CodeGen/sanitize-coverage-bounds.c b/clang/test/CodeGen/sanitize-coverage-bounds.c new file mode 100644 --- /dev/null +++ b/clang/test/CodeGen/sanitize-coverage-bounds.c @@ -0,0 +1,29 @@ +// RUN: %clang %s -emit-llvm -S -fsanitize=bounds -fsanitize-coverage=trace-pc,trace-cmp -o - | FileCheck %s + +int x[10]; + +// CHECK-LABEL: define dso_local void @foo( +void foo(int n) { + // CHECK: call void @__sanitizer_cov_trace_pc + // CHECK: call void @__sanitizer_cov_trace_const_cmp + // CHECK: br + // CHECK: call void @__sanitizer_cov_trace_pc + // CHECK: br + // CHECK: call void @__sanitizer_cov_trace_const_cmp + // CHECK: br + // CHECK: call void @__sanitizer_cov_trace_pc + // CHECK: br + if (n) + // CHECK: call void @__sanitizer_cov_trace_pc + // CHECK: call void @__ubsan_handle_out_of_bounds + // CHECK: br + // CHECK: getelementptr inbounds [10 x i32], [10 x i32]* @x + // CHECK: call void @__sanitizer_cov_trace_const_cmp8 + // CHECK: br + // CHECK: call void @__sanitizer_cov_trace_pc + // CHECK: store i32 42 + // CHECK: br + x[n] = 42; + + // CHECK: ret void +} diff --git a/clang/test/CodeGen/sanitize-coverage-thread.c b/clang/test/CodeGen/sanitize-coverage-thread.c new file mode 100644 --- /dev/null +++ b/clang/test/CodeGen/sanitize-coverage-thread.c @@ -0,0 +1,25 @@ +// RUN: %clang %s -emit-llvm -S -fsanitize=thread -fsanitize-coverage=trace-pc,trace-cmp -o - | FileCheck %s + +int x = 0; + +// CHECK-LABEL: define dso_local void @foo( +void foo(void) { + // CHECK: call void @__sanitizer_cov_trace_pc + + // CHECK: call void @__tsan_read4(i8* bitcast (i32* @x to i8*)) + // CHECK-NEXT: load i32, i32* @x, align 4 + + // CHECK: call void @__sanitizer_cov_trace_const_cmp4 + // CHECK: br + + // CHECK: call void @__sanitizer_cov_trace_pc + // CHECK: br + if (x) + // CHECK: call void @__sanitizer_cov_trace_pc + // CHECK: call void @__tsan_write4(i8* bitcast (i32* @x to i8*)) + // CHECK-NEXT: store i32 42, i32* @x, align 4 + // CHECK: br + x = 42; + + // CHECK: ret void +} diff --git a/clang/test/Driver/fsanitize-coverage.c b/clang/test/Driver/fsanitize-coverage.c --- a/clang/test/Driver/fsanitize-coverage.c +++ b/clang/test/Driver/fsanitize-coverage.c @@ -12,8 +12,10 @@ // RUN: %clang -target x86_64-linux-gnu -fsanitize=kernel-memory -fsanitize-coverage=func,trace-pc %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANITIZE-COVERAGE-FUNC // RUN: %clang -target x86_64-linux-gnu -fsanitize=leak -fsanitize-coverage=func,trace-pc %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANITIZE-COVERAGE-FUNC // RUN: %clang -target x86_64-linux-gnu -fsanitize=undefined -fsanitize-coverage=func,trace-pc %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANITIZE-COVERAGE-FUNC +// RUN: %clang -target x86_64-linux-gnu -fsanitize=bounds -fsanitize-coverage=func,trace-pc %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANITIZE-COVERAGE-FUNC // RUN: %clang -target x86_64-linux-gnu -fsanitize=bool -fsanitize-coverage=func,trace-pc %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANITIZE-COVERAGE-FUNC // RUN: %clang -target x86_64-linux-gnu -fsanitize=dataflow -fsanitize-coverage=func,trace-pc %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANITIZE-COVERAGE-FUNC +// RUN: %clang -target x86_64-linux-gnu -fsanitize=thread -fsanitize-coverage=func,trace-pc %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANITIZE-COVERAGE-FUNC // RUN: %clang -target %itanium_abi_triple -fsanitize=float-divide-by-zero -fsanitize-coverage=func,trace-pc %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANITIZE-COVERAGE-FUNC // RUN: %clang -target x86_64-linux-gnu -fsanitize-coverage=func,trace-pc %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SANITIZE-COVERAGE-FUNC // CHECK-SANITIZE-COVERAGE-FUNC: fsanitize-coverage-type=1