Author: Alan Phipps Date: 2021-01-07T11:18:31-06:00 New Revision: ebcc8dcb68aa37f34a87641b0c8b73086712a3cf
URL: https://github.com/llvm/llvm-project/commit/ebcc8dcb68aa37f34a87641b0c8b73086712a3cf DIFF: https://github.com/llvm/llvm-project/commit/ebcc8dcb68aa37f34a87641b0c8b73086712a3cf.diff LOG: [Coverage] Refactor three tests from commit rG9f2967bcfe2f Refactor three tests to not depend on other test files as input but to instead refer to "Inputs" subdirectory. Added: llvm/test/tools/llvm-cov/Inputs/branch-c-general.c llvm/test/tools/llvm-cov/branch-c-general.test Modified: llvm/test/tools/llvm-cov/branch-export-json.test llvm/test/tools/llvm-cov/branch-export-lcov.test llvm/test/tools/llvm-cov/branch-noShowBranch.test Removed: llvm/test/tools/llvm-cov/branch-c-general.c ################################################################################ diff --git a/llvm/test/tools/llvm-cov/Inputs/branch-c-general.c b/llvm/test/tools/llvm-cov/Inputs/branch-c-general.c new file mode 100644 index 000000000000..2e7e773e5c39 --- /dev/null +++ b/llvm/test/tools/llvm-cov/Inputs/branch-c-general.c @@ -0,0 +1,260 @@ +// Test visualization of general branch constructs in C. + + + + + +void simple_loops() { + int i; + for (i = 0; i < 100; ++i) { + } + while (i > 0) + i--; + do {} while (i++ < 75); + +} + +void conditionals() { + for (int i = 0; i < 100; ++i) { + if (i % 2) { + if (i) {} + } else if (i % 3) { + if (i) {} + } else { + if (i) {} + } + + if (1 && i) {} + if (0 || i) {} + } + +} + +void early_exits() { + int i = 0; + + if (i) {} + + while (i < 100) { + i++; + if (i > 50) + break; + if (i % 2) + continue; + } + + if (i) {} + + do { + if (i > 75) + return; + else + i++; + } while (i < 100); + + if (i) {} + +} + +void jumps() { + int i; + + for (i = 0; i < 2; ++i) { + goto outofloop; + // Never reached -> no weights + if (i) {} + } + +outofloop: + if (i) {} + + goto loop1; + + while (i) { + loop1: + if (i) {} + } + + goto loop2; +first: +second: +third: + i++; + if (i < 3) + goto loop2; + + while (i < 3) { + loop2: + switch (i) { + case 0: + goto first; + case 1: + goto second; + case 2: + goto third; + } + } + + for (i = 0; i < 10; ++i) { + goto withinloop; + // never reached -> no weights + if (i) {} + withinloop: + if (i) {} + } + +} + +void switches() { + static int weights[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5}; + + // No cases -> no weights + switch (weights[0]) { + default: + break; + } + + for (int i = 0, len = sizeof(weights) / sizeof(weights[0]); i < len; ++i) { + switch (i[weights]) { + case 1: + if (i) {} + // fallthrough + case 2: + if (i) {} + break; + case 3: + if (i) {} + continue; + case 4: + if (i) {} + switch (i) { + case 6 ... 9: + if (i) {} + continue; + } + + default: + if (i == len - 1) + return; + } + } + + // Never reached -> no weights + if (weights[0]) {} + +} + +void big_switch() { + for (int i = 0; i < 32; ++i) { + switch (1 << i) { + case (1 << 0): + if (i) {} + // fallthrough + case (1 << 1): + if (i) {} + break; + case (1 << 2) ... (1 << 12): + if (i) {} + break; + // The branch for the large case range above appears after the case body. + + case (1 << 13): + if (i) {} + break; + case (1 << 14) ... (1 << 28): + if (i) {} + break; + // The branch for the large case range above appears after the case body. + + case (1 << 29) ... ((1 << 29) + 1): + if (i) {} + break; + default: + if (i) {} + break; + } + } + +} + +void boolean_operators() { + int v; + for (int i = 0; i < 100; ++i) { + v = i % 3 || i; + + v = i % 3 && i; + + v = i % 3 || i % 2 || i; + + v = i % 2 && i % 3 && i; + } + +} + +void boolop_loops() { + int i = 100; + + while (i && i > 50) + i--; + + while ((i % 2) || (i > 0)) + i--; + + for (i = 100; i && i > 50; --i); + + for (; (i % 2) || (i > 0); --i); + +} + +void conditional_operator() { + int i = 100; + + int j = i < 50 ? i : 1; + + int k = i ?: 0; + +} + +void do_fallthrough() { + for (int i = 0; i < 10; ++i) { + int j = 0; + do { + // The number of exits out of this do-loop via the break statement + // exceeds the counter value for the loop (which does not include the + // fallthrough count). Make sure that does not violate any assertions. + if (i < 8) break; + j++; + } while (j < 2); + } +} + +static void static_func() { + for (int i = 0; i < 10; ++i) { + } +} + + + + + + + + + + +int main(int argc, const char *argv[]) { + simple_loops(); + conditionals(); + early_exits(); + jumps(); + switches(); + big_switch(); + boolean_operators(); + boolop_loops(); + conditional_operator(); + do_fallthrough(); + static_func(); + extern void __llvm_profile_write_file(); + __llvm_profile_write_file(); + return 0; +} diff --git a/llvm/test/tools/llvm-cov/branch-c-general.c b/llvm/test/tools/llvm-cov/branch-c-general.c deleted file mode 100644 index ffbbd12bf161..000000000000 --- a/llvm/test/tools/llvm-cov/branch-c-general.c +++ /dev/null @@ -1,311 +0,0 @@ -// Test visualization of general branch constructs in C. - -// RUN: llvm-profdata merge %S/Inputs/branch-c-general.proftext -o %t.profdata -// RUN: llvm-cov show --show-branches=count %S/Inputs/branch-c-general.o32l -instr-profile %t.profdata -path-equivalence=/tmp,%S %s | FileCheck %s -// RUN: llvm-cov report --show-branch-summary %S/Inputs/branch-c-general.o32l -instr-profile %t.profdata -show-functions -path-equivalence=/tmp,%S %s | FileCheck %s -check-prefix=REPORT - -void simple_loops() { - int i; - for (i = 0; i < 100; ++i) { // CHECK: Branch ([[@LINE]]:15): [True: 100, False: 1] - } - while (i > 0) // CHECK: Branch ([[@LINE]]:10): [True: 100, False: 1] - i--; - do {} while (i++ < 75); // CHECK: Branch ([[@LINE]]:16): [True: 75, False: 1] - -} - -void conditionals() { - for (int i = 0; i < 100; ++i) {// CHECK: Branch ([[@LINE]]:19): [True: 100, False: 1] - if (i % 2) { // CHECK: Branch ([[@LINE]]:9): [True: 50, False: 50] - if (i) {} // CHECK: Branch ([[@LINE]]:11): [True: 50, False: 0] - } else if (i % 3) { // CHECK: Branch ([[@LINE]]:16): [True: 33, False: 17] - if (i) {} // CHECK: Branch ([[@LINE]]:11): [True: 33, False: 0] - } else { - if (i) {} // CHECK: Branch ([[@LINE]]:11): [True: 16, False: 1] - } - // CHECK: Branch ([[@LINE+1]]:9): [Folded - Ignored] - if (1 && i) {} // CHECK: Branch ([[@LINE]]:14): [True: 99, False: 1] - if (0 || i) {} // CHECK: Branch ([[@LINE]]:9): [Folded - Ignored] - } // CHECK: Branch ([[@LINE-1]]:14): [True: 99, False: 1] - -} - -void early_exits() { - int i = 0; - - if (i) {} // CHECK: Branch ([[@LINE]]:7): [True: 0, False: 1] - - while (i < 100) { // CHECK: Branch ([[@LINE]]:10): [True: 51, False: 0] - i++; - if (i > 50) // CHECK: Branch ([[@LINE]]:9): [True: 1, False: 50] - break; - if (i % 2) // CHECK: Branch ([[@LINE]]:9): [True: 25, False: 25] - continue; - } - - if (i) {} // CHECK: Branch ([[@LINE]]:7): [True: 1, False: 0] - - do { - if (i > 75) // CHECK: Branch ([[@LINE]]:9): [True: 1, False: 25] - return; - else - i++; - } while (i < 100); // CHECK: Branch ([[@LINE]]:12): [True: 25, False: 0] - - if (i) {} // CHECK: Branch ([[@LINE]]:7): [True: 0, False: 0] - -} - -void jumps() { - int i; - - for (i = 0; i < 2; ++i) { // CHECK: Branch ([[@LINE]]:15): [True: 1, False: 0] - goto outofloop; - // Never reached -> no weights - if (i) {} // CHECK: Branch ([[@LINE]]:9): [True: 0, False: 0] - } - -outofloop: - if (i) {} // CHECK: Branch ([[@LINE]]:7): [True: 0, False: 1] - - goto loop1; - - while (i) { // CHECK: Branch ([[@LINE]]:10): [True: 0, False: 1] - loop1: - if (i) {} // CHECK: Branch ([[@LINE]]:9): [True: 0, False: 1] - } - - goto loop2; -first: -second: -third: - i++; - if (i < 3) // CHECK: Branch ([[@LINE]]:7): [True: 2, False: 1] - goto loop2; - - while (i < 3) { // CHECK: Branch ([[@LINE]]:10): [True: 0, False: 1] - loop2: - switch (i) { - case 0: // CHECK: Branch ([[@LINE]]:5): [True: 1, False: 2] - goto first; - case 1: // CHECK: Branch ([[@LINE]]:5): [True: 1, False: 2] - goto second; - case 2: // CHECK: Branch ([[@LINE]]:5): [True: 1, False: 2] - goto third; - } - } - - for (i = 0; i < 10; ++i) { // CHECK: Branch ([[@LINE]]:15): [True: 10, False: 1] - goto withinloop; - // never reached -> no weights - if (i) {} // CHECK: Branch ([[@LINE]]:9): [True: 0, False: 0] - withinloop: - if (i) {} // CHECK: Branch ([[@LINE]]:9): [True: 9, False: 1] - } - -} - -void switches() { - static int weights[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5}; - - // No cases -> no weights - switch (weights[0]) { - default: // CHECK: Branch ([[@LINE]]:3): [True: 1, False: 0] - break; - } - // CHECK: Branch ([[@LINE+1]]:63): [True: 15, False: 0] - for (int i = 0, len = sizeof(weights) / sizeof(weights[0]); i < len; ++i) { - switch (i[weights]) { - case 1: // CHECK: Branch ([[@LINE]]:5): [True: 1, False: 14] - if (i) {} // CHECK: Branch ([[@LINE]]:11): [True: 0, False: 1] - // fallthrough - case 2: // CHECK: Branch ([[@LINE]]:5): [True: 2, False: 13] - if (i) {} // CHECK: Branch ([[@LINE]]:11): [True: 2, False: 1] - break; - case 3: // CHECK: Branch ([[@LINE]]:5): [True: 3, False: 12] - if (i) {} // CHECK: Branch ([[@LINE]]:11): [True: 3, False: 0] - continue; - case 4: // CHECK: Branch ([[@LINE]]:5): [True: 4, False: 11] - if (i) {} // CHECK: Branch ([[@LINE]]:11): [True: 4, False: 0] - switch (i) { - case 6 ... 9: // CHECK: Branch ([[@LINE]]:7): [True: 4, False: 0] - if (i) {} // CHECK: Branch ([[@LINE]]:13): [True: 4, False: 0] - continue; - } - - default: // CHECK: Branch ([[@LINE]]:5): [True: 5, False: 10] - if (i == len - 1) // CHECK: Branch ([[@LINE]]:11): [True: 1, False: 4] - return; - } - } - - // Never reached -> no weights - if (weights[0]) {} // CHECK: Branch ([[@LINE]]:7): [True: 0, False: 0] - -} - -void big_switch() { - for (int i = 0; i < 32; ++i) {// CHECK: Branch ([[@LINE]]:19): [True: 32, False: 1] - switch (1 << i) { - case (1 << 0): // CHECK: Branch ([[@LINE]]:5): [True: 1, False: 31] - if (i) {} // CHECK: Branch ([[@LINE]]:11): [True: 0, False: 1] - // fallthrough - case (1 << 1): // CHECK: Branch ([[@LINE]]:5): [True: 1, False: 31] - if (i) {} // CHECK: Branch ([[@LINE]]:11): [True: 1, False: 1] - break; - case (1 << 2) ... (1 << 12):// CHECK: Branch ([[@LINE]]:5): [True: 11, False: 21] - if (i) {} // CHECK: Branch ([[@LINE]]:11): [True: 11, False: 0] - break; - // The branch for the large case range above appears after the case body. - - case (1 << 13): // CHECK: Branch ([[@LINE]]:5): [True: 1, False: 31] - if (i) {} // CHECK: Branch ([[@LINE]]:11): [True: 1, False: 0] - break; - case (1 << 14) ... (1 << 28):// CHECK: Branch ([[@LINE]]:5): [True: 15, False: 17] - if (i) {} // CHECK: Branch ([[@LINE]]:11): [True: 15, False: 0] - break; - // The branch for the large case range above appears after the case body. - // CHECK: Branch ([[@LINE+1]]:5): [True: 1, False: 31] - case (1 << 29) ... ((1 << 29) + 1): - if (i) {} // CHECK: Branch ([[@LINE]]:11): [True: 1, False: 0] - break; - default: // CHECK: Branch ([[@LINE]]:5): [True: 2, False: 30] - if (i) {} // CHECK: Branch ([[@LINE]]:11): [True: 2, False: 0] - break; - } - } - -} - -void boolean_operators() { - int v; // CHECK: Branch ([[@LINE+1]]:19): [True: 100, False: 1] - for (int i = 0; i < 100; ++i) { - v = i % 3 || i; // CHECK: Branch ([[@LINE]]:9): [True: 66, False: 34] - // CHECK: Branch ([[@LINE-1]]:18): [True: 33, False: 1] - v = i % 3 && i; // CHECK: Branch ([[@LINE]]:9): [True: 66, False: 34] - // CHECK: Branch ([[@LINE-1]]:18): [True: 66, False: 0] - v = i % 3 || i % 2 || i; // CHECK: Branch ([[@LINE]]:9): [True: 66, False: 34] - // CHECK: Branch ([[@LINE-1]]:18): [True: 17, False: 17] - v = i % 2 && i % 3 && i; // CHECK: Branch ([[@LINE-2]]:27): [True: 16, False: 1] - } // CHECK: Branch ([[@LINE-1]]:9): [True: 50, False: 50] - // CHECK: Branch ([[@LINE-2]]:18): [True: 33, False: 17] -} // CHECK: Branch ([[@LINE-3]]:27): [True: 33, False: 0] - -void boolop_loops() { - int i = 100; - - while (i && i > 50) // CHECK: Branch ([[@LINE]]:10): [True: 51, False: 0] - i--; // CHECK: Branch ([[@LINE-1]]:15): [True: 50, False: 1] - - while ((i % 2) || (i > 0)) // CHECK: Branch ([[@LINE]]:10): [True: 25, False: 26] - i--; // CHECK: Branch ([[@LINE-1]]:21): [True: 25, False: 1] - - for (i = 100; i && i > 50; --i); // CHECK: Branch ([[@LINE]]:17): [True: 51, False: 0] - // CHECK: Branch ([[@LINE-1]]:22): [True: 50, False: 1] - for (; (i % 2) || (i > 0); --i); // CHECK: Branch ([[@LINE]]:10): [True: 25, False: 26] - // CHECK: Branch ([[@LINE-1]]:21): [True: 25, False: 1] -} - -void conditional_operator() { - int i = 100; - - int j = i < 50 ? i : 1; // CHECK: Branch ([[@LINE]]:11): [True: 0, False: 1] - - int k = i ?: 0; // CHECK: Branch ([[@LINE]]:11): [True: 1, False: 0] - -} - -void do_fallthrough() { - for (int i = 0; i < 10; ++i) {// CHECK: Branch ([[@LINE]]:19): [True: 10, False: 1] - int j = 0; - do { - // The number of exits out of this do-loop via the break statement - // exceeds the counter value for the loop (which does not include the - // fallthrough count). Make sure that does not violate any assertions. - if (i < 8) break; // CHECK: Branch ([[@LINE]]:11): [True: 8, False: 4] - j++; - } while (j < 2); // CHECK: Branch ([[@LINE]]:14): [True: 2, False: 2] - } -} - -static void static_func() { - for (int i = 0; i < 10; ++i) {// CHECK: Branch ([[@LINE]]:19): [True: 10, False: 1] - } -} - - - - - - - - - - -int main(int argc, const char *argv[]) { - simple_loops(); - conditionals(); - early_exits(); - jumps(); - switches(); - big_switch(); - boolean_operators(); - boolop_loops(); - conditional_operator(); - do_fallthrough(); - static_func(); - extern void __llvm_profile_write_file(); - __llvm_profile_write_file(); - return 0; -} - -// REPORT: Name Regions Miss Cover Lines Miss Cover Branches Miss Cover -// REPORT-NEXT: --- -// REPORT-NEXT: simple_loops 8 0 100.00% 9 0 100.00% 6 0 100.00% -// REPORT-NEXT: conditionals 24 0 100.00% 15 0 100.00% 16 2 87.50% -// REPORT-NEXT: early_exits 20 4 80.00% 25 3 88.00% 16 6 62.50% -// REPORT-NEXT: jumps 39 12 69.23% 48 4 91.67% 26 9 65.38% -// REPORT-NEXT: switches 28 5 82.14% 38 5 86.84% 30 9 70.00% -// REPORT-NEXT: big_switch 25 1 96.00% 32 0 100.00% 30 6 80.00% -// REPORT-NEXT: boolean_operators 16 0 100.00% 13 0 100.00% 22 2 90.91% -// REPORT-NEXT: boolop_loops 19 0 100.00% 14 0 100.00% 16 2 87.50% -// REPORT-NEXT: conditional_operator 4 2 50.00% 8 1 87.50% 4 2 50.00% -// REPORT-NEXT: do_fallthrough 9 0 100.00% 12 0 100.00% 6 0 100.00% -// REPORT-NEXT: main 1 0 100.00% 16 0 100.00% 0 0 0.00% -// REPORT-NEXT: c-general.c:static_func 4 0 100.00% 4 0 100.00% 2 0 100.00% -// REPORT-NEXT: --- -// REPORT-NEXT: TOTAL 197 24 87.82% 234 13 94.44% 174 38 78.16% - -// Test file-level report. -// RUN: llvm-profdata merge %S/Inputs/branch-c-general.proftext -o %t.profdata -// RUN: llvm-cov report %S/Inputs/branch-c-general.o32l -instr-profile %t.profdata -path-equivalence=/tmp,%S %s | FileCheck %s -check-prefix=FILEREPORT -// FILEREPORT: TOTAL{{.*}}174 38 78.16% - -// Test color True/False output. -// RUN: llvm-cov show --use-color --show-branches=count %S/Inputs/branch-c-general.o32l -instr-profile %t.profdata -path-equivalence=/tmp,%S %s | FileCheck %s -check-prefix=USECOLOR -// USECOLOR: Branch ({{[0-9]+}}:7): {{.*}}: 0, {{.*}}0] - -// Test html output. -// RUN: llvm-cov show --show-branch-summary --show-branches=count %S/Inputs/branch-c-general.o32l -instr-profile %t.profdata -path-equivalence=/tmp,%S %s -format html -o %t.html.dir -// RUN: FileCheck -check-prefix=HTML -input-file=%t.html.dir/coverage/tmp/branch-c-general.c.html %s -// HTML-COUNT-89: Branch (<span class='line-number'><a name='L{{[0-9]+}}' href='#L{{[0-9]+}}'><span> -// HTML-NOT: Branch (<span class='line-number'><a name='L{{[0-9]+}}' href='#L{{[0-9]+}}'><span> - -// RUN: FileCheck -check-prefix HTML-INDEX -input-file %t.html.dir/index.html %s -// HTML-INDEX-LABEL: <table> -// HTML-INDEX: <td class='column-entry-bold'>Filename</td> -// HTML-INDEX: <td class='column-entry-bold'>Function Coverage</td> -// HTML-INDEX: <td class='column-entry-bold'>Line Coverage</td> -// HTML-INDEX: <td class='column-entry-bold'>Region Coverage</td> -// HTML-INDEX: <td class='column-entry-bold'>Branch Coverage</td> -// HTML-INDEX: <a href='coverage{{.*}}branch-c-general.c.html'{{.*}}branch-c-general.c</a> -// HTML-INDEX: <td class='column-entry-green'> -// HTML-INDEX: 100.00% (12/12) -// HTML-INDEX: <td class='column-entry-yellow'> -// HTML-INDEX: 94.44% (221/234) -// HTML-INDEX: <td class='column-entry-yellow'> -// HTML-INDEX: 87.82% (173/197) -// HTML-INDEX: <td class='column-entry-red'> -// HTML-INDEX: 78.16% (136/174) -// HTML-INDEX: <tr class='light-row-bold'> -// HTML-INDEX: Totals diff --git a/llvm/test/tools/llvm-cov/branch-c-general.test b/llvm/test/tools/llvm-cov/branch-c-general.test new file mode 100644 index 000000000000..bbebdd19fbae --- /dev/null +++ b/llvm/test/tools/llvm-cov/branch-c-general.test @@ -0,0 +1,166 @@ +// Test visualization of general branch constructs in C. + +// RUN: llvm-profdata merge %S/Inputs/branch-c-general.proftext -o %t.profdata +// RUN: llvm-cov show --show-branches=count %S/Inputs/branch-c-general.o32l -instr-profile %t.profdata -path-equivalence=/tmp,%S/Inputs %S/Inputs/branch-c-general.c | FileCheck %s +// RUN: llvm-cov report --show-branch-summary %S/Inputs/branch-c-general.o32l -instr-profile %t.profdata -show-functions -path-equivalence=/tmp,%S/Inputs %S/Inputs/branch-c-general.c | FileCheck %s -check-prefix=REPORT + +// CHECK: simple_loops() +// CHECK: Branch (9:15): [True: 100, False: 1] +// CHECK: Branch (11:10): [True: 100, False: 1] +// CHECK: Branch (13:16): [True: 75, False: 1] + +// CHECK: conditionals() +// CHECK: Branch (18:19): [True: 100, False: 1] +// CHECK: Branch (19:9): [True: 50, False: 50] +// CHECK: Branch (20:11): [True: 50, False: 0] +// CHECK: Branch (21:16): [True: 33, False: 17] +// CHECK: Branch (22:11): [True: 33, False: 0] +// CHECK: Branch (24:11): [True: 16, False: 1] +// CHECK: Branch (27:9): [Folded - Ignored] +// CHECK: Branch (27:14): [True: 99, False: 1] +// CHECK: Branch (28:9): [Folded - Ignored] +// CHECK: Branch (28:14): [True: 99, False: 1] + +// CHECK: early_exits() +// CHECK: Branch (36:7): [True: 0, False: 1] +// CHECK: Branch (38:10): [True: 51, False: 0] +// CHECK: Branch (40:9): [True: 1, False: 50] +// CHECK: Branch (42:9): [True: 25, False: 25] +// CHECK: Branch (46:7): [True: 1, False: 0] +// CHECK: Branch (49:9): [True: 1, False: 25] +// CHECK: Branch (53:12): [True: 25, False: 0] +// CHECK: Branch (55:7): [True: 0, False: 0] + +// CHECK: jumps() +// CHECK: Branch (62:15): [True: 1, False: 0] +// CHECK: Branch (65:9): [True: 0, False: 0] +// CHECK: Branch (69:7): [True: 0, False: 1] +// CHECK: Branch (73:10): [True: 0, False: 1] +// CHECK: Branch (75:9): [True: 0, False: 1] +// CHECK: Branch (83:7): [True: 2, False: 1] +// CHECK: Branch (86:10): [True: 0, False: 1] +// CHECK: Branch (89:5): [True: 1, False: 2] +// CHECK: Branch (91:5): [True: 1, False: 2] +// CHECK: Branch (93:5): [True: 1, False: 2] +// CHECK: Branch (98:15): [True: 10, False: 1] +// CHECK: Branch (101:9): [True: 0, False: 0] +// CHECK: Branch (103:9): [True: 9, False: 1] + +// CHECK: switches() +// CHECK: Branch (113:3): [True: 1, False: 0] +// CHECK: Branch (117:63): [True: 15, False: 0] +// CHECK: Branch (119:5): [True: 1, False: 14] +// CHECK: Branch (120:11): [True: 0, False: 1] +// CHECK: Branch (122:5): [True: 2, False: 13] +// CHECK: Branch (123:11): [True: 2, False: 1] +// CHECK: Branch (125:5): [True: 3, False: 12] +// CHECK: Branch (126:11): [True: 3, False: 0] +// CHECK: Branch (128:5): [True: 4, False: 11] +// CHECK: Branch (129:11): [True: 4, False: 0] +// CHECK: Branch (131:7): [True: 4, False: 0] +// CHECK: Branch (132:13): [True: 4, False: 0] +// CHECK: Branch (136:5): [True: 5, False: 10] +// CHECK: Branch (137:11): [True: 1, False: 4] +// CHECK: Branch (143:7): [True: 0, False: 0] + +// CHECK: big_switch() +// CHECK: Branch (148:19): [True: 32, False: 1] +// CHECK: Branch (150:5): [True: 1, False: 31] +// CHECK: Branch (151:11): [True: 0, False: 1] +// CHECK: Branch (153:5): [True: 1, False: 31] +// CHECK: Branch (154:11): [True: 1, False: 1] +// CHECK: Branch (156:5): [True: 11, False: 21] +// CHECK: Branch (157:11): [True: 11, False: 0] +// CHECK: Branch (161:5): [True: 1, False: 31] +// CHECK: Branch (162:11): [True: 1, False: 0] +// CHECK: Branch (164:5): [True: 15, False: 17] +// CHECK: Branch (165:11): [True: 15, False: 0] +// CHECK: Branch (170:11): [True: 1, False: 0] +// CHECK: Branch (172:5): [True: 2, False: 30] +// CHECK: Branch (173:11): [True: 2, False: 0] + +// CHECK: boolean_operators() +// CHECK: Branch (183:9): [True: 66, False: 34] +// CHECK: Branch (183:18): [True: 33, False: 1] +// CHECK: Branch (185:9): [True: 66, False: 34] +// CHECK: Branch (185:18): [True: 66, False: 0] +// CHECK: Branch (187:9): [True: 66, False: 34] +// CHECK: Branch (187:18): [True: 17, False: 17] +// CHECK: Branch (187:27): [True: 16, False: 1] +// CHECK: Branch (189:9): [True: 50, False: 50] +// CHECK: Branch (189:18): [True: 33, False: 17] +// CHECK: Branch (189:27): [True: 33, False: 0] + +// CHECK: boolop_loops() +// CHECK: Branch (197:10): [True: 51, False: 0] +// CHECK: Branch (197:15): [True: 50, False: 1] +// CHECK: Branch (200:10): [True: 25, False: 26] +// CHECK: Branch (200:21): [True: 25, False: 1] +// CHECK: Branch (203:17): [True: 51, False: 0] +// CHECK: Branch (203:22): [True: 50, False: 1] +// CHECK: Branch (205:10): [True: 25, False: 26] +// CHECK: Branch (205:21): [True: 25, False: 1] + +// CHECK: conditional_operator() +// CHECK: Branch (212:11): [True: 0, False: 1] +// CHECK: Branch (214:11): [True: 1, False: 0] + +// CHECK: do_fallthrough() +// CHECK: Branch (219:19): [True: 10, False: 1] +// CHECK: Branch (227:14): [True: 2, False: 2] + +// CHECK: static_func() +// CHECK: Branch (232:19): [True: 10, False: 1] + + + +// REPORT: Name Regions Miss Cover Lines Miss Cover Branches Miss Cover +// REPORT-NEXT: --- +// REPORT-NEXT: simple_loops 8 0 100.00% 9 0 100.00% 6 0 100.00% +// REPORT-NEXT: conditionals 24 0 100.00% 15 0 100.00% 16 2 87.50% +// REPORT-NEXT: early_exits 20 4 80.00% 25 3 88.00% 16 6 62.50% +// REPORT-NEXT: jumps 39 12 69.23% 48 4 91.67% 26 9 65.38% +// REPORT-NEXT: switches 28 5 82.14% 38 5 86.84% 30 9 70.00% +// REPORT-NEXT: big_switch 25 1 96.00% 32 0 100.00% 30 6 80.00% +// REPORT-NEXT: boolean_operators 16 0 100.00% 13 0 100.00% 22 2 90.91% +// REPORT-NEXT: boolop_loops 19 0 100.00% 14 0 100.00% 16 2 87.50% +// REPORT-NEXT: conditional_operator 4 2 50.00% 8 1 87.50% 4 2 50.00% +// REPORT-NEXT: do_fallthrough 9 0 100.00% 12 0 100.00% 6 0 100.00% +// REPORT-NEXT: main 1 0 100.00% 16 0 100.00% 0 0 0.00% +// REPORT-NEXT: c-general.c:static_func 4 0 100.00% 4 0 100.00% 2 0 100.00% +// REPORT-NEXT: --- +// REPORT-NEXT: TOTAL 197 24 87.82% 234 13 94.44% 174 38 78.16% + +// Test file-level report. +// RUN: llvm-profdata merge %S/Inputs/branch-c-general.proftext -o %t.profdata +// RUN: llvm-cov report %S/Inputs/branch-c-general.o32l -instr-profile %t.profdata -path-equivalence=/tmp,%S/Inputs %S/Inputs/branch-c-general.c | FileCheck %s -check-prefix=FILEREPORT +// FILEREPORT: TOTAL{{.*}}174 38 78.16% + +// Test color True/False output. +// RUN: llvm-cov show --use-color --show-branches=count %S/Inputs/branch-c-general.o32l -instr-profile %t.profdata -path-equivalence=/tmp,%S/Inputs %S/Inputs/branch-c-general.c | FileCheck %s -check-prefix=USECOLOR +// USECOLOR: Branch ({{[0-9]+}}:7): {{.*}}: 0, {{.*}}0] + +// Test html output. +// RUN: llvm-cov show --show-branch-summary --show-branches=count %S/Inputs/branch-c-general.o32l -instr-profile %t.profdata -path-equivalence=/tmp,%S/Inputs %S/Inputs/branch-c-general.c -format html -o %t.html.dir +// RUN: FileCheck -check-prefix=HTML -input-file=%t.html.dir/coverage/tmp/branch-c-general.c.html %s +// HTML-COUNT-89: Branch (<span class='line-number'><a name='L{{[0-9]+}}' href='#L{{[0-9]+}}'><span> +// HTML-NOT: Branch (<span class='line-number'><a name='L{{[0-9]+}}' href='#L{{[0-9]+}}'><span> + +// RUN: FileCheck -check-prefix HTML-INDEX -input-file %t.html.dir/index.html %s +// HTML-INDEX-LABEL: <table> +// HTML-INDEX: <td class='column-entry-bold'>Filename</td> +// HTML-INDEX: <td class='column-entry-bold'>Function Coverage</td> +// HTML-INDEX: <td class='column-entry-bold'>Line Coverage</td> +// HTML-INDEX: <td class='column-entry-bold'>Region Coverage</td> +// HTML-INDEX: <td class='column-entry-bold'>Branch Coverage</td> +// HTML-INDEX: <a href='coverage{{.*}}branch-c-general.c.html'{{.*}}branch-c-general.c</a> +// HTML-INDEX: <td class='column-entry-green'> +// HTML-INDEX: 100.00% (12/12) +// HTML-INDEX: <td class='column-entry-yellow'> +// HTML-INDEX: 94.44% (221/234) +// HTML-INDEX: <td class='column-entry-yellow'> +// HTML-INDEX: 87.82% (173/197) +// HTML-INDEX: <td class='column-entry-red'> +// HTML-INDEX: 78.16% (136/174) +// HTML-INDEX: <tr class='light-row-bold'> +// HTML-INDEX: Totals diff --git a/llvm/test/tools/llvm-cov/branch-export-json.test b/llvm/test/tools/llvm-cov/branch-export-json.test index 7f3e8e024d25..7cf428608798 100644 --- a/llvm/test/tools/llvm-cov/branch-export-json.test +++ b/llvm/test/tools/llvm-cov/branch-export-json.test @@ -1,6 +1,6 @@ // RUN: llvm-profdata merge %S/Inputs/branch-showBranchPercentage.proftext -o %t.profdata -// RUN: llvm-cov export --format=text %S/Inputs/branch-showBranchPercentage.o32l -instr-profile %t.profdata -path-equivalence=/tmp,%S %S/branch-showBranchPercentage.c | FileCheck %s +// RUN: llvm-cov export --format=text %S/Inputs/branch-showBranchPercentage.o32l -instr-profile %t.profdata | FileCheck %s // CHECK: "branches": // CHECK: 14,7,14,15,1,5,0,0,4 @@ -22,7 +22,7 @@ // Check recursive macro-expansions. // RUN: llvm-profdata merge %S/Inputs/branch-macros.proftext -o %t.profdata -// RUN: llvm-cov export --format=text %S/Inputs/branch-macros.o32l -instr-profile %t.profdata -path-equivalence=/tmp,%S %S/branch-macros.c | FileCheck %s -check-prefix=MACROS +// RUN: llvm-cov export --format=text %S/Inputs/branch-macros.o32l -instr-profile %t.profdata | FileCheck %s -check-prefix=MACROS // MACROS: "branches": // MACROS: 27,10,27,11,0,3,0,0,4 diff --git a/llvm/test/tools/llvm-cov/branch-export-lcov.test b/llvm/test/tools/llvm-cov/branch-export-lcov.test index c13c54e67e02..3e4a300d645d 100644 --- a/llvm/test/tools/llvm-cov/branch-export-lcov.test +++ b/llvm/test/tools/llvm-cov/branch-export-lcov.test @@ -1,6 +1,6 @@ // RUN: llvm-profdata merge %S/Inputs/branch-showBranchPercentage.proftext -o %t.profdata -// RUN: llvm-cov export --format=lcov %S/Inputs/branch-showBranchPercentage.o32l -instr-profile %t.profdata -path-equivalence=/tmp,%S %S/branch-showBranchPercentage.c | FileCheck %s +// RUN: llvm-cov export --format=lcov %S/Inputs/branch-showBranchPercentage.o32l -instr-profile %t.profdata | FileCheck %s // CHECK-DAG: BRDA:14,0,0,1 // CHECK-DAG: BRDA:14,0,1,5 @@ -38,7 +38,7 @@ // Check recursive macro-expansions. // RUN: llvm-profdata merge %S/Inputs/branch-macros.proftext -o %t.profdata -// RUN: llvm-cov export --format=lcov %S/Inputs/branch-macros.o32l -instr-profile %t.profdata -path-equivalence=/tmp,%S %S/branch-macros.cpp | FileCheck %s -check-prefix=MACROS +// RUN: llvm-cov export --format=lcov %S/Inputs/branch-macros.o32l -instr-profile %t.profdata | FileCheck %s -check-prefix=MACROS // MACROS-COUNT-4: BRDA:17 // MACROS-NOT: BRDA:17 diff --git a/llvm/test/tools/llvm-cov/branch-noShowBranch.test b/llvm/test/tools/llvm-cov/branch-noShowBranch.test index 63b9f5218004..a8f12d698933 100644 --- a/llvm/test/tools/llvm-cov/branch-noShowBranch.test +++ b/llvm/test/tools/llvm-cov/branch-noShowBranch.test @@ -1,7 +1,7 @@ // RUN: llvm-profdata merge %S/Inputs/branch-c-general.proftext -o %t.profdata -// RUN: llvm-cov show %S/Inputs/branch-c-general.o32l -instr-profile %t.profdata -path-equivalence=/tmp,%S %S/branch-c-general.c | FileCheck %s -// RUN: llvm-cov report %S/Inputs/branch-c-general.o32l --show-branch-summary=false -instr-profile %t.profdata -show-functions -path-equivalence=/tmp,%S %S/branch-c-general.c | FileCheck %s -check-prefix=REPORT +// RUN: llvm-cov show %S/Inputs/branch-c-general.o32l -instr-profile %t.profdata -path-equivalence=/tmp,%S/Inputs | FileCheck %s +// RUN: llvm-cov report %S/Inputs/branch-c-general.o32l --show-branch-summary=false -instr-profile %t.profdata -show-functions -path-equivalence=/tmp,%S/Inputs %S/Inputs/branch-c-general.c | FileCheck %s -check-prefix=REPORT // CHECK-NOT: | Branch _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits