1 | // This test checks that the cycle detection algorithm in llvm-cov is able to |
2 | // handle complex block graphs by skipping zero count cycles. |
3 | // |
4 | // RUN: mkdir -p %t.dir && cd %t.dir |
5 | // RUN: %clang --coverage %s -o %t -dumpdir ./ |
6 | // RUN: rm -f gcov-complex-line.gcda && %run %t |
7 | // RUN: llvm-cov gcov -t gcov-complex-line.c | FileCheck %s |
8 | |
9 | #define M_0 \ |
10 | do { \ |
11 | if (x == 0) \ |
12 | x = 0; \ |
13 | else \ |
14 | x = 1; \ |
15 | } while (0) |
16 | #define M_1 \ |
17 | do { \ |
18 | M_0; \ |
19 | M_0; \ |
20 | M_0; \ |
21 | M_0; \ |
22 | } while (0) |
23 | #define M_2 \ |
24 | do { \ |
25 | M_1; \ |
26 | M_1; \ |
27 | M_1; \ |
28 | M_1; \ |
29 | } while (0) |
30 | #define M_3 \ |
31 | do { \ |
32 | M_2; \ |
33 | M_2; \ |
34 | M_2; \ |
35 | M_2; \ |
36 | } while (0) |
37 | #define M_4 \ |
38 | do { \ |
39 | M_3; \ |
40 | M_3; \ |
41 | M_3; \ |
42 | M_3; \ |
43 | } while (0) |
44 | #define COMPLEX_LINE \ |
45 | do { \ |
46 | for (int i = 0; i < 100; ++i) \ |
47 | M_4; \ |
48 | } while (0) |
49 | |
50 | int main() { |
51 | volatile int x = 0; |
52 | // In the following line, the number of cycles in the block graph is at least |
53 | // 2^256, where 256 is the number of expansions of M_0. |
54 | COMPLEX_LINE; // CHECK: 101: [[#@LINE]]: COMPLEX_LINE; |
55 | } |
56 | |