| 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 | |