blob: df6e835dd9dffb1b074bb300211dcbcefcbd3886 [file] [log] [blame]
Stephen Hines86277eb2015-03-23 12:06:32 -07001// Test various levels of coverage
2//
3// RUN: mkdir -p %T/coverage-levels
4// RUN: OPT=coverage=1:verbosity=1:coverage_dir=%T/coverage-levels
Pirama Arumuga Nainarcdce50b2015-07-01 12:26:56 -07005// RUN: %clangxx -fsanitize=shift -DGOOD_SHIFT=1 -O1 -fsanitize-coverage=func %s -o %t
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -07006// RUN: UBSAN_OPTIONS=$OPT %run %t 2>&1 | FileCheck %s --check-prefix=CHECK1 --check-prefix=CHECK_NOWARN
Pirama Arumuga Nainarcdce50b2015-07-01 12:26:56 -07007// RUN: %clangxx -fsanitize=undefined -DGOOD_SHIFT=1 -O1 -fsanitize-coverage=func %s -o %t
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -07008// RUN: UBSAN_OPTIONS=$OPT %run %t 2>&1 | FileCheck %s --check-prefix=CHECK1 --check-prefix=CHECK_NOWARN
Stephen Hines86277eb2015-03-23 12:06:32 -07009
Pirama Arumuga Nainarcdce50b2015-07-01 12:26:56 -070010// RUN: %clangxx -fsanitize=shift -O1 -fsanitize-coverage=func %s -o %t
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -070011// RUN: UBSAN_OPTIONS=$OPT %run %t 2>&1 | FileCheck %s --check-prefix=CHECK1 --check-prefix=CHECK_WARN
Pirama Arumuga Nainarcdce50b2015-07-01 12:26:56 -070012// RUN: %clangxx -fsanitize=shift -O1 -fsanitize-coverage=bb %s -o %t
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -070013// RUN: UBSAN_OPTIONS=$OPT %run %t 2>&1 | FileCheck %s --check-prefix=CHECK2 --check-prefix=CHECK_WARN
Pirama Arumuga Nainarcdce50b2015-07-01 12:26:56 -070014// RUN: %clangxx -fsanitize=shift -O1 -fsanitize-coverage=edge %s -o %t
Pirama Arumuga Nainar259f7062015-05-06 11:49:53 -070015// RUN: UBSAN_OPTIONS=$OPT %run %t 2>&1 | FileCheck %s --check-prefix=CHECK3 --check-prefix=CHECK_WARN
Stephen Hines86277eb2015-03-23 12:06:32 -070016
Pirama Arumuga Nainarcdce50b2015-07-01 12:26:56 -070017// Coverage is not yet implemented in TSan.
18// XFAIL: ubsan-tsan
19
Stephen Hines86277eb2015-03-23 12:06:32 -070020volatile int sink;
21int main(int argc, char **argv) {
22 int shift = argc * 32;
23#if GOOD_SHIFT
24 shift = 3;
25#endif
26 if ((argc << shift) == 16) // False.
27 return 1;
28 return 0;
29}
30
31// CHECK_WARN: shift exponent 32 is too large
32// CHECK_NOWARN-NOT: ERROR
33// FIXME: Currently, coverage instrumentation kicks in after ubsan, so we get
34// more than the minimal number of instrumented blocks.
35// FIXME: Currently, ubsan with -fno-sanitize-recover and w/o asan will fail
36// to dump coverage.
37// CHECK1: 1 PCs written
38// CHECK2: 3 PCs written
39// CHECK3: 4 PCs written