| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,117 @@ | ||
| #include <stdlib.h> | ||
|
|
||
| bool case0(bool a) { | ||
| return 0 && a; | ||
| } | ||
| bool case1(bool a) { | ||
| return a && 0; | ||
| } | ||
| bool case2(bool a) { | ||
| return 1 && a; | ||
| } | ||
| bool case3(bool a) { | ||
| return a && 1; | ||
| } | ||
| bool case4(bool a) { | ||
| return 1 || a; | ||
| } | ||
| bool case5(bool a) { | ||
| return a || 1; | ||
| } | ||
| bool case6(bool a) { | ||
| return 0 || a; | ||
| } | ||
| bool case7(bool a) { | ||
| return a || 0; | ||
| } | ||
|
|
||
| bool case8(bool a, bool b) { | ||
| return 0 && a && b; | ||
| } | ||
| bool case9(bool a, bool b) { | ||
| return a && 0 && b; | ||
| } | ||
| bool casea(bool a, bool b) { | ||
| return 1 && a && b; | ||
| } | ||
| bool caseb(bool a, bool b) { | ||
| return a && 1 && b; | ||
| } | ||
| bool casec(bool a, bool b) { | ||
| return 1 || a || b; | ||
| } | ||
| bool cased(bool a, bool b) { | ||
| return a || 1 || b; | ||
| } | ||
| bool casee(bool a, bool b) { | ||
| return 0 || a || b; | ||
| } | ||
| bool casef(bool a, bool b) { | ||
| return a || 0 || b; | ||
| } | ||
|
|
||
| bool caseg(bool a, bool b) { | ||
| return b && a && 0; | ||
| } | ||
| bool caseh(bool a, bool b) { | ||
| return b && 0 && a; | ||
| } | ||
| bool casei(bool a, bool b) { | ||
| return b && a && 1; | ||
| } | ||
| bool casej(bool a, bool b) { | ||
| return b && 1 && a; | ||
| } | ||
| bool casek(bool a, bool b) { | ||
| return b || a || 1; | ||
| } | ||
| bool casel(bool a, bool b) { | ||
| return b || 1 || a; | ||
| } | ||
| bool casem(bool a, bool b) { | ||
| return b || a || 0; | ||
| } | ||
| bool casen(bool a, bool b) { | ||
| return b || 0 || a; | ||
| } | ||
|
|
||
| extern "C" { | ||
| extern void __llvm_profile_write_file(void); | ||
| } | ||
|
|
||
| int main(int argc, char *argv[]) | ||
| { | ||
| bool a = atoi(argv[1]); | ||
| bool b = atoi(argv[2]); | ||
| volatile bool c; | ||
|
|
||
| c = case0(a); | ||
| c = case1(a); | ||
| c = case2(a); | ||
| c = case3(a); | ||
| c = case4(a); | ||
| c = case5(a); | ||
| c = case6(a); | ||
| c = case7(a); | ||
|
|
||
| c = case8(a, b); | ||
| c = case9(a, b); | ||
| c = casea(a, b); | ||
| c = caseb(a, b); | ||
| c = casec(a, b); | ||
| c = cased(a, b); | ||
| c = casee(a, b); | ||
| c = casef(a, b); | ||
|
|
||
| c = caseg(a, b); | ||
| c = caseh(a, b); | ||
| c = casei(a, b); | ||
| c = casej(a, b); | ||
| c = casek(a, b); | ||
| c = casel(a, b); | ||
| c = casem(a, b); | ||
| c = casen(a, b); | ||
|
|
||
| __llvm_profile_write_file(); | ||
| return 0; | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,398 @@ | ||
| _Z5case8bb | ||
| # Func Hash: | ||
| 99214 | ||
| # Num Counters: | ||
| 5 | ||
| # Counter Values: | ||
| 4 | ||
| 0 | ||
| 0 | ||
| 0 | ||
| 0 | ||
| # Num Bitmask Bytes: | ||
| $1 | ||
| # Bitmask Byte Values: | ||
| 0x1 | ||
|
|
||
|
|
||
| _Z5case5b | ||
| # Func Hash: | ||
| 1551 | ||
| # Num Counters: | ||
| 3 | ||
| # Counter Values: | ||
| 4 | ||
| 1 | ||
| 0 | ||
| # Num Bitmask Bytes: | ||
| $1 | ||
| # Bitmask Byte Values: | ||
| 0x6 | ||
|
|
||
|
|
||
| _Z5caseabb | ||
| # Func Hash: | ||
| 99214 | ||
| # Num Counters: | ||
| 5 | ||
| # Counter Values: | ||
| 4 | ||
| 3 | ||
| 2 | ||
| 4 | ||
| 3 | ||
| # Num Bitmask Bytes: | ||
| $1 | ||
| # Bitmask Byte Values: | ||
| 0xa2 | ||
|
|
||
|
|
||
| _Z5case6b | ||
| # Func Hash: | ||
| 1551 | ||
| # Num Counters: | ||
| 3 | ||
| # Counter Values: | ||
| 4 | ||
| 4 | ||
| 1 | ||
| # Num Bitmask Bytes: | ||
| $1 | ||
| # Bitmask Byte Values: | ||
| 0x5 | ||
|
|
||
|
|
||
| _Z5casegbb | ||
| # Func Hash: | ||
| 99214 | ||
| # Num Counters: | ||
| 5 | ||
| # Counter Values: | ||
| 4 | ||
| 2 | ||
| 0 | ||
| 3 | ||
| 2 | ||
| # Num Bitmask Bytes: | ||
| $1 | ||
| # Bitmask Byte Values: | ||
| 0x23 | ||
|
|
||
|
|
||
| _Z5case1b | ||
| # Func Hash: | ||
| 1550 | ||
| # Num Counters: | ||
| 3 | ||
| # Counter Values: | ||
| 4 | ||
| 3 | ||
| 0 | ||
| # Num Bitmask Bytes: | ||
| $1 | ||
| # Bitmask Byte Values: | ||
| 0x3 | ||
|
|
||
|
|
||
| _Z5case7b | ||
| # Func Hash: | ||
| 1551 | ||
| # Num Counters: | ||
| 3 | ||
| # Counter Values: | ||
| 4 | ||
| 1 | ||
| 1 | ||
| # Num Bitmask Bytes: | ||
| $1 | ||
| # Bitmask Byte Values: | ||
| 0x3 | ||
|
|
||
|
|
||
| _Z5casedbb | ||
| # Func Hash: | ||
| 99279 | ||
| # Num Counters: | ||
| 5 | ||
| # Counter Values: | ||
| 4 | ||
| 0 | ||
| 0 | ||
| 1 | ||
| 0 | ||
| # Num Bitmask Bytes: | ||
| $1 | ||
| # Bitmask Byte Values: | ||
| 0x12 | ||
|
|
||
|
|
||
| _Z5casekbb | ||
| # Func Hash: | ||
| 99279 | ||
| # Num Counters: | ||
| 5 | ||
| # Counter Values: | ||
| 4 | ||
| 0 | ||
| 0 | ||
| 1 | ||
| 0 | ||
| # Num Bitmask Bytes: | ||
| $1 | ||
| # Bitmask Byte Values: | ||
| 0x12 | ||
|
|
||
|
|
||
| _Z5casehbb | ||
| # Func Hash: | ||
| 99214 | ||
| # Num Counters: | ||
| 5 | ||
| # Counter Values: | ||
| 4 | ||
| 0 | ||
| 0 | ||
| 3 | ||
| 0 | ||
| # Num Bitmask Bytes: | ||
| $1 | ||
| # Bitmask Byte Values: | ||
| 0x3 | ||
|
|
||
|
|
||
| _Z5case4b | ||
| # Func Hash: | ||
| 1551 | ||
| # Num Counters: | ||
| 3 | ||
| # Counter Values: | ||
| 4 | ||
| 0 | ||
| 0 | ||
| # Num Bitmask Bytes: | ||
| $1 | ||
| # Bitmask Byte Values: | ||
| 0x2 | ||
|
|
||
|
|
||
| _Z5caseibb | ||
| # Func Hash: | ||
| 99214 | ||
| # Num Counters: | ||
| 5 | ||
| # Counter Values: | ||
| 4 | ||
| 2 | ||
| 2 | ||
| 3 | ||
| 2 | ||
| # Num Bitmask Bytes: | ||
| $1 | ||
| # Bitmask Byte Values: | ||
| 0x83 | ||
|
|
||
|
|
||
| _Z5case2b | ||
| # Func Hash: | ||
| 1550 | ||
| # Num Counters: | ||
| 3 | ||
| # Counter Values: | ||
| 4 | ||
| 4 | ||
| 3 | ||
| # Num Bitmask Bytes: | ||
| $1 | ||
| # Bitmask Byte Values: | ||
| 0xa | ||
|
|
||
|
|
||
| _Z5casefbb | ||
| # Func Hash: | ||
| 99279 | ||
| # Num Counters: | ||
| 5 | ||
| # Counter Values: | ||
| 4 | ||
| 1 | ||
| 0 | ||
| 1 | ||
| 1 | ||
| # Num Bitmask Bytes: | ||
| $1 | ||
| # Bitmask Byte Values: | ||
| 0x6 | ||
|
|
||
|
|
||
| _Z5caselbb | ||
| # Func Hash: | ||
| 99279 | ||
| # Num Counters: | ||
| 5 | ||
| # Counter Values: | ||
| 4 | ||
| 0 | ||
| 0 | ||
| 1 | ||
| 0 | ||
| # Num Bitmask Bytes: | ||
| $1 | ||
| # Bitmask Byte Values: | ||
| 0x12 | ||
|
|
||
|
|
||
| _Z5casenbb | ||
| # Func Hash: | ||
| 99279 | ||
| # Num Counters: | ||
| 5 | ||
| # Counter Values: | ||
| 4 | ||
| 1 | ||
| 0 | ||
| 1 | ||
| 1 | ||
| # Num Bitmask Bytes: | ||
| $1 | ||
| # Bitmask Byte Values: | ||
| 0x6 | ||
|
|
||
|
|
||
| _Z5case9bb | ||
| # Func Hash: | ||
| 99214 | ||
| # Num Counters: | ||
| 5 | ||
| # Counter Values: | ||
| 4 | ||
| 0 | ||
| 0 | ||
| 3 | ||
| 0 | ||
| # Num Bitmask Bytes: | ||
| $1 | ||
| # Bitmask Byte Values: | ||
| 0x3 | ||
|
|
||
|
|
||
| _Z5casecbb | ||
| # Func Hash: | ||
| 99279 | ||
| # Num Counters: | ||
| 5 | ||
| # Counter Values: | ||
| 4 | ||
| 0 | ||
| 0 | ||
| 0 | ||
| 0 | ||
| # Num Bitmask Bytes: | ||
| $1 | ||
| # Bitmask Byte Values: | ||
| 0x2 | ||
|
|
||
|
|
||
| _Z5casebbb | ||
| # Func Hash: | ||
| 99214 | ||
| # Num Counters: | ||
| 5 | ||
| # Counter Values: | ||
| 4 | ||
| 3 | ||
| 2 | ||
| 3 | ||
| 3 | ||
| # Num Bitmask Bytes: | ||
| $1 | ||
| # Bitmask Byte Values: | ||
| 0xa1 | ||
|
|
||
|
|
||
| _Z5case0b | ||
| # Func Hash: | ||
| 1550 | ||
| # Num Counters: | ||
| 3 | ||
| # Counter Values: | ||
| 4 | ||
| 0 | ||
| 0 | ||
| # Num Bitmask Bytes: | ||
| $1 | ||
| # Bitmask Byte Values: | ||
| 0x1 | ||
|
|
||
|
|
||
| _Z5casejbb | ||
| # Func Hash: | ||
| 99214 | ||
| # Num Counters: | ||
| 5 | ||
| # Counter Values: | ||
| 4 | ||
| 3 | ||
| 2 | ||
| 3 | ||
| 3 | ||
| # Num Bitmask Bytes: | ||
| $1 | ||
| # Bitmask Byte Values: | ||
| 0xa1 | ||
|
|
||
|
|
||
| _Z5caseebb | ||
| # Func Hash: | ||
| 99279 | ||
| # Num Counters: | ||
| 5 | ||
| # Counter Values: | ||
| 4 | ||
| 1 | ||
| 0 | ||
| 4 | ||
| 1 | ||
| # Num Bitmask Bytes: | ||
| $1 | ||
| # Bitmask Byte Values: | ||
| 0x14 | ||
|
|
||
|
|
||
| main | ||
| # Func Hash: | ||
| 24 | ||
| # Num Counters: | ||
| 1 | ||
| # Counter Values: | ||
| 4 | ||
|
|
||
| _Z5case3b | ||
| # Func Hash: | ||
| 1550 | ||
| # Num Counters: | ||
| 3 | ||
| # Counter Values: | ||
| 4 | ||
| 3 | ||
| 3 | ||
| # Num Bitmask Bytes: | ||
| $1 | ||
| # Bitmask Byte Values: | ||
| 0x9 | ||
|
|
||
|
|
||
| _Z5casembb | ||
| # Func Hash: | ||
| 99279 | ||
| # Num Counters: | ||
| 5 | ||
| # Counter Values: | ||
| 4 | ||
| 0 | ||
| 0 | ||
| 1 | ||
| 0 | ||
| # Num Bitmask Bytes: | ||
| $1 | ||
| # Bitmask Byte Values: | ||
| 0x12 |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,27 @@ | ||
|
|
||
| #include <stdio.h> | ||
|
|
||
| extern "C" { | ||
| extern void __llvm_profile_write_file(void); | ||
| } | ||
|
|
||
| extern int foo(); | ||
|
|
||
| void test(bool a, bool b, bool c, bool d) { | ||
|
|
||
| if ((a && 1) || (0 && d) || 0) | ||
| printf("test1 decision true\n"); | ||
| } | ||
|
|
||
| int main() | ||
| { | ||
| test(true,false,true,false); | ||
| test(true,false,true,true); | ||
| test(true,true,false,false); | ||
| test(false,true,true,false); | ||
|
|
||
| test(true,false,false,false); | ||
|
|
||
| __llvm_profile_write_file(); | ||
| return 0; | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,30 @@ | ||
| main | ||
| # Func Hash: | ||
| 24 | ||
| # Num Counters: | ||
| 1 | ||
| # Counter Values: | ||
| 1 | ||
|
|
||
| _Z4testbbbb | ||
| # Func Hash: | ||
| 703556281489 | ||
| # Num Counters: | ||
| 9 | ||
| # Counter Values: | ||
| 5 | ||
| 4 | ||
| 1 | ||
| 1 | ||
| 1 | ||
| 4 | ||
| 4 | ||
| 0 | ||
| 0 | ||
| # Num Bitmask Bytes: | ||
| $4 | ||
| # Bitmask Byte Values: | ||
| 1 | ||
| 2 | ||
| 0 | ||
| 0 |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,42 @@ | ||
| main | ||
| # Func Hash: | ||
| 24 | ||
| # Num Counters: | ||
| 1 | ||
| # Counter Values: | ||
| 1 | ||
|
|
||
| _Z4testbbbb | ||
| # Func Hash: | ||
| 9819241276358969079 | ||
| # Num Counters: | ||
| 19 | ||
| # Counter Values: | ||
| 7 | ||
| 3 | ||
| 5 | ||
| 5 | ||
| 2 | ||
| 3 | ||
| 1 | ||
| 2 | ||
| 3 | ||
| 2 | ||
| 1 | ||
| 1 | ||
| 1 | ||
| 1 | ||
| 2 | ||
| 4 | ||
| 2 | ||
| 2 | ||
| 1 | ||
| # Num Bitmask Bytes: | ||
| $6 | ||
| # Bitmask Byte Values: | ||
| 0 | ||
| 0 | ||
| 0 | ||
| 0 | ||
| 0 | ||
| 0 |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,36 @@ | ||
|
|
||
| #include <stdio.h> | ||
|
|
||
| extern "C" { | ||
| extern void __llvm_profile_write_file(void); | ||
| } | ||
|
|
||
| extern int foo(); | ||
|
|
||
| void test(bool a, bool b, bool c, bool d) { | ||
|
|
||
| if ((a && b) || (c && d)) | ||
| printf("test1 decision true\n"); | ||
|
|
||
| if (b && c) if (a && d) | ||
| printf("test2 decision true\n"); | ||
|
|
||
| if ((c && d) && | ||
| (a && b)) | ||
| printf("test3 decision true\n"); | ||
| } | ||
|
|
||
| int main() | ||
| { | ||
| test(false,false,false,false); | ||
| test(true,false,true,false); | ||
| test(true,false,true,true); | ||
| test(true,true,false,false); | ||
|
|
||
| test(true,false,false,false); | ||
| test(true,true,true,true); | ||
| test(false,true,true,false); | ||
|
|
||
| __llvm_profile_write_file(); | ||
| return 0; | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,42 @@ | ||
| main | ||
| # Func Hash: | ||
| 24 | ||
| # Num Counters: | ||
| 1 | ||
| # Counter Values: | ||
| 1 | ||
|
|
||
| _Z4testbbbb | ||
| # Func Hash: | ||
| 9819241276358969079 | ||
| # Num Counters: | ||
| 19 | ||
| # Counter Values: | ||
| 7 | ||
| 3 | ||
| 5 | ||
| 5 | ||
| 2 | ||
| 3 | ||
| 1 | ||
| 2 | ||
| 3 | ||
| 2 | ||
| 1 | ||
| 1 | ||
| 1 | ||
| 1 | ||
| 2 | ||
| 4 | ||
| 2 | ||
| 2 | ||
| 1 | ||
| # Num Bitmask Bytes: | ||
| $6 | ||
| # Bitmask Byte Values: | ||
| 0x2f | ||
| 0x8 | ||
| 0xb | ||
| 0x9 | ||
| 0x83 | ||
| 0x80 |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,218 @@ | ||
| // Test visualization of MC/DC constructs for constant-folded condition masking. | ||
|
|
||
| // RUN: llvm-profdata merge %S/Inputs/mcdc-const.proftext -o %t.profdata | ||
| // RUN: llvm-cov show --show-branches=count --show-mcdc %S/Inputs/mcdc-const.o -instr-profile %t.profdata -path-equivalence=/tmp,%S/Inputs %S/Inputs/mcdc-const.cpp | FileCheck %s -check-prefix=CHECKGENERALCASE | ||
|
|
||
| // CHECKGENERALCASE: ------------------ | ||
| // CHECKGENERALCASE-NEXT: | Branch (12:8): [True: 4, False: 1] | ||
| // CHECKGENERALCASE-NEXT: | Branch (12:13): [Folded - Ignored] | ||
| // CHECKGENERALCASE-NEXT: | Branch (12:20): [Folded - Ignored] | ||
| // CHECKGENERALCASE-NEXT: | Branch (12:25): [True: 0, False: 0] | ||
| // CHECKGENERALCASE-NEXT: | Branch (12:31): [Folded - Ignored] | ||
| // CHECKGENERALCASE-NEXT: ------------------ | ||
| // CHECKGENERALCASE-NEXT: |---> MC/DC Decision Region (12:7) to (12:32) | ||
| // CHECKGENERALCASE-NEXT: | | ||
| // CHECKGENERALCASE-NEXT: | Number of Conditions: 5 | ||
| // CHECKGENERALCASE-NEXT: | Condition C1 --> (12:8) | ||
| // CHECKGENERALCASE-NEXT: | Condition C2 --> (12:13) | ||
| // CHECKGENERALCASE-NEXT: | Condition C3 --> (12:20) | ||
| // CHECKGENERALCASE-NEXT: | Condition C4 --> (12:25) | ||
| // CHECKGENERALCASE-NEXT: | Condition C5 --> (12:31) | ||
| // CHECKGENERALCASE-NEXT: | | ||
| // CHECKGENERALCASE-NEXT: | Executed MC/DC Test Vectors: | ||
| // CHECKGENERALCASE-NEXT: | | ||
| // CHECKGENERALCASE-NEXT: | C1, C2, C3, C4, C5 Result | ||
| // CHECKGENERALCASE-NEXT: | 1 { F, C, C, -, C = F } | ||
| // CHECKGENERALCASE-NEXT: | 2 { T, C, C, -, C = T } | ||
| // CHECKGENERALCASE-NEXT: | | ||
| // CHECKGENERALCASE-NEXT: | C1-Pair: covered: (1,2) | ||
| // CHECKGENERALCASE-NEXT: | C2-Pair: constant folded | ||
| // CHECKGENERALCASE-NEXT: | C3-Pair: constant folded | ||
| // CHECKGENERALCASE-NEXT: | C4-Pair: not covered | ||
| // CHECKGENERALCASE-NEXT: | C5-Pair: constant folded | ||
| // CHECKGENERALCASE-NEXT: | MC/DC Coverage for Decision: 50.00% | ||
| // CHECKGENERALCASE-NEXT: | | ||
| // CHECKGENERALCASE-NEXT: ------------------ | ||
|
|
||
| // RUN: llvm-profdata merge %S/Inputs/mcdc-const-folding.proftext -o %t.profdata | ||
| // RUN: llvm-cov show --show-mcdc %S/Inputs/mcdc-const-folding.o -instr-profile %t.profdata -path-equivalence=/tmp,%S/Inputs %S/Inputs/mcdc-const-folding.cpp | FileCheck %s -check-prefix=CHECKFULLCASE | ||
| // RUN: llvm-cov report --show-mcdc-summary %S/Inputs/mcdc-const-folding.o -instr-profile %t.profdata -show-functions -path-equivalence=/tmp,%S/Inputs %S/Inputs/mcdc-const-folding.cpp | FileCheck %s -check-prefix=REPORT | ||
|
|
||
| // CHECKFULLCASE: | 1 { C, - = F } | ||
| // CHECKFULLCASE: | C1-Pair: constant folded | ||
| // CHECKFULLCASE: | C2-Pair: not covered | ||
| // CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00% | ||
| // CHECKFULLCASE: | 1 { F, C = F } | ||
| // CHECKFULLCASE: | 2 { T, C = F } | ||
| // CHECKFULLCASE: | C1-Pair: not covered | ||
| // CHECKFULLCASE: | C2-Pair: constant folded | ||
| // CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00% | ||
| // CHECKFULLCASE: | 1 { C, F = F } | ||
| // CHECKFULLCASE: | 2 { C, T = T } | ||
| // CHECKFULLCASE: | C1-Pair: constant folded | ||
| // CHECKFULLCASE: | C2-Pair: covered: (1,2) | ||
| // CHECKFULLCASE: | MC/DC Coverage for Decision: 100.00% | ||
| // CHECKFULLCASE: | 1 { F, C = F } | ||
| // CHECKFULLCASE: | 2 { T, C = T } | ||
| // CHECKFULLCASE: | C1-Pair: covered: (1,2) | ||
| // CHECKFULLCASE: | C2-Pair: constant folded | ||
| // CHECKFULLCASE: | MC/DC Coverage for Decision: 100.00% | ||
| // CHECKFULLCASE: | 1 { C, - = T } | ||
| // CHECKFULLCASE: | C1-Pair: constant folded | ||
| // CHECKFULLCASE: | C2-Pair: not covered | ||
| // CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00% | ||
| // CHECKFULLCASE: | 1 { T, C = T } | ||
| // CHECKFULLCASE: | 2 { F, C = T } | ||
| // CHECKFULLCASE: | C1-Pair: not covered | ||
| // CHECKFULLCASE: | C2-Pair: constant folded | ||
| // CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00% | ||
| // CHECKFULLCASE: | 1 { C, F = F } | ||
| // CHECKFULLCASE: | 2 { C, T = T } | ||
| // CHECKFULLCASE: | C1-Pair: constant folded | ||
| // CHECKFULLCASE: | C2-Pair: covered: (1,2) | ||
| // CHECKFULLCASE: | MC/DC Coverage for Decision: 100.00% | ||
| // CHECKFULLCASE: | 1 { F, C = F } | ||
| // CHECKFULLCASE: | 2 { T, C = T } | ||
| // CHECKFULLCASE: | C1-Pair: covered: (1,2) | ||
| // CHECKFULLCASE: | C2-Pair: constant folded | ||
| // CHECKFULLCASE: | MC/DC Coverage for Decision: 100.00% | ||
| // CHECKFULLCASE: | 1 { C, -, - = F } | ||
| // CHECKFULLCASE: | C1-Pair: constant folded | ||
| // CHECKFULLCASE: | C2-Pair: not covered | ||
| // CHECKFULLCASE: | C3-Pair: not covered | ||
| // CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00% | ||
| // CHECKFULLCASE: | 1 { F, C, - = F } | ||
| // CHECKFULLCASE: | 2 { T, C, - = F } | ||
| // CHECKFULLCASE: | C1-Pair: not covered | ||
| // CHECKFULLCASE: | C2-Pair: constant folded | ||
| // CHECKFULLCASE: | C3-Pair: not covered | ||
| // CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00% | ||
| // CHECKFULLCASE: | 1 { C, F, - = F } | ||
| // CHECKFULLCASE: | 2 { C, T, F = F } | ||
| // CHECKFULLCASE: | 3 { C, T, T = T } | ||
| // CHECKFULLCASE: | C1-Pair: constant folded | ||
| // CHECKFULLCASE: | C2-Pair: covered: (1,3) | ||
| // CHECKFULLCASE: | C3-Pair: covered: (2,3) | ||
| // CHECKFULLCASE: | MC/DC Coverage for Decision: 100.00% | ||
| // CHECKFULLCASE: | 1 { F, C, - = F } | ||
| // CHECKFULLCASE: | 2 { T, C, F = F } | ||
| // CHECKFULLCASE: | 3 { T, C, T = T } | ||
| // CHECKFULLCASE: | C1-Pair: covered: (1,3) | ||
| // CHECKFULLCASE: | C2-Pair: constant folded | ||
| // CHECKFULLCASE: | C3-Pair: covered: (2,3) | ||
| // CHECKFULLCASE: | MC/DC Coverage for Decision: 100.00% | ||
| // CHECKFULLCASE: | 1 { C, -, - = T } | ||
| // CHECKFULLCASE: | C1-Pair: constant folded | ||
| // CHECKFULLCASE: | C2-Pair: not covered | ||
| // CHECKFULLCASE: | C3-Pair: not covered | ||
| // CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00% | ||
| // CHECKFULLCASE: | 1 { T, C, - = T } | ||
| // CHECKFULLCASE: | 2 { F, C, - = T } | ||
| // CHECKFULLCASE: | C1-Pair: not covered | ||
| // CHECKFULLCASE: | C2-Pair: constant folded | ||
| // CHECKFULLCASE: | C3-Pair: not covered | ||
| // CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00% | ||
| // CHECKFULLCASE: | 1 { C, F, T = T } | ||
| // CHECKFULLCASE: | 2 { C, T, - = T } | ||
| // CHECKFULLCASE: | C1-Pair: constant folded | ||
| // CHECKFULLCASE: | C2-Pair: not covered | ||
| // CHECKFULLCASE: | C3-Pair: not covered | ||
| // CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00% | ||
| // CHECKFULLCASE: | 1 { T, C, - = T } | ||
| // CHECKFULLCASE: | 2 { F, C, T = T } | ||
| // CHECKFULLCASE: | C1-Pair: not covered | ||
| // CHECKFULLCASE: | C2-Pair: constant folded | ||
| // CHECKFULLCASE: | C3-Pair: not covered | ||
| // CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00% | ||
| // CHECKFULLCASE: | 1 { F, -, C = F } | ||
| // CHECKFULLCASE: | 2 { T, F, C = F } | ||
| // CHECKFULLCASE: | 3 { T, T, C = F } | ||
| // CHECKFULLCASE: | C1-Pair: not covered | ||
| // CHECKFULLCASE: | C2-Pair: not covered | ||
| // CHECKFULLCASE: | C3-Pair: constant folded | ||
| // CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00% | ||
| // CHECKFULLCASE: | 1 { F, C, - = F } | ||
| // CHECKFULLCASE: | 2 { T, C, - = F } | ||
| // CHECKFULLCASE: | C1-Pair: not covered | ||
| // CHECKFULLCASE: | C2-Pair: constant folded | ||
| // CHECKFULLCASE: | C3-Pair: not covered | ||
| // CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00% | ||
| // CHECKFULLCASE: | 1 { F, -, C = F } | ||
| // CHECKFULLCASE: | 2 { T, F, C = F } | ||
| // CHECKFULLCASE: | 3 { T, T, C = T } | ||
| // CHECKFULLCASE: | C1-Pair: covered: (1,3) | ||
| // CHECKFULLCASE: | C2-Pair: covered: (2,3) | ||
| // CHECKFULLCASE: | C3-Pair: constant folded | ||
| // CHECKFULLCASE: | MC/DC Coverage for Decision: 100.00% | ||
| // CHECKFULLCASE: | 1 { F, C, - = F } | ||
| // CHECKFULLCASE: | 2 { T, C, F = F } | ||
| // CHECKFULLCASE: | 3 { T, C, T = T } | ||
| // CHECKFULLCASE: | C1-Pair: covered: (1,3) | ||
| // CHECKFULLCASE: | C2-Pair: constant folded | ||
| // CHECKFULLCASE: | C3-Pair: covered: (2,3) | ||
| // CHECKFULLCASE: | MC/DC Coverage for Decision: 100.00% | ||
| // CHECKFULLCASE: | 1 { T, -, C = T } | ||
| // CHECKFULLCASE: | 2 { F, T, C = T } | ||
| // CHECKFULLCASE: | C1-Pair: not covered | ||
| // CHECKFULLCASE: | C2-Pair: not covered | ||
| // CHECKFULLCASE: | C3-Pair: constant folded | ||
| // CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00% | ||
| // CHECKFULLCASE: | 1 { T, C, - = T } | ||
| // CHECKFULLCASE: | 2 { F, C, - = T } | ||
| // CHECKFULLCASE: | C1-Pair: not covered | ||
| // CHECKFULLCASE: | C2-Pair: constant folded | ||
| // CHECKFULLCASE: | C3-Pair: not covered | ||
| // CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00% | ||
| // CHECKFULLCASE: | 1 { T, -, C = T } | ||
| // CHECKFULLCASE: | 2 { F, T, C = T } | ||
| // CHECKFULLCASE: | C1-Pair: not covered | ||
| // CHECKFULLCASE: | C2-Pair: not covered | ||
| // CHECKFULLCASE: | C3-Pair: constant folded | ||
| // CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00% | ||
| // CHECKFULLCASE: | 1 { T, C, - = T } | ||
| // CHECKFULLCASE: | 2 { F, C, T = T } | ||
| // CHECKFULLCASE: | C1-Pair: not covered | ||
| // CHECKFULLCASE: | C2-Pair: constant folded | ||
| // CHECKFULLCASE: | C3-Pair: not covered | ||
| // CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00% | ||
|
|
||
| // REPORT: _Z5case0b {{.*}} 1 1 0.00% | ||
| // REPORT: _Z5case1b {{.*}} 1 1 0.00% | ||
| // REPORT: _Z5case2b {{.*}} 1 0 100.00% | ||
| // REPORT: _Z5case3b {{.*}} 1 0 100.00% | ||
| // REPORT: _Z5case4b {{.*}} 1 1 0.00% | ||
| // REPORT: _Z5case5b {{.*}} 1 1 0.00% | ||
| // REPORT: _Z5case6b {{.*}} 1 0 100.00% | ||
| // REPORT: _Z5case7b {{.*}} 1 0 100.00% | ||
| // REPORT: _Z5case8bb {{.*}} 2 2 0.00% | ||
| // REPORT: _Z5case9bb {{.*}} 2 2 0.00% | ||
| // REPORT: _Z5caseabb {{.*}} 2 0 100.00% | ||
| // REPORT: _Z5casebbb {{.*}} 2 0 100.00% | ||
| // REPORT: _Z5casecbb {{.*}} 2 2 0.00% | ||
| // REPORT: _Z5casedbb {{.*}} 2 2 0.00% | ||
| // REPORT: _Z5caseebb {{.*}} 2 2 0.00% | ||
| // REPORT: _Z5casefbb {{.*}} 2 2 0.00% | ||
| // REPORT: _Z5casegbb {{.*}} 2 2 0.00% | ||
| // REPORT: _Z5casehbb {{.*}} 2 2 0.00% | ||
| // REPORT: _Z5caseibb {{.*}} 2 0 100.00% | ||
| // REPORT: _Z5casejbb {{.*}} 2 0 100.00% | ||
| // REPORT: _Z5casekbb {{.*}} 2 2 0.00% | ||
| // REPORT: _Z5caselbb {{.*}} 2 2 0.00% | ||
| // REPORT: _Z5casembb {{.*}} 2 2 0.00% | ||
| // REPORT: _Z5casenbb {{.*}} 2 2 0.00% | ||
| // REPORT: TOTAL {{.*}} 40 28 30.00% | ||
|
|
||
| Instructions for regenerating the test: | ||
|
|
||
| # cd %S/Inputs | ||
| cp mcdc-const.cpp /tmp | ||
| cp mcdc-const-folding.cpp /tmp | ||
|
|
||
| clang -fcoverage-mcdc -fprofile-instr-generate \ | ||
| -fcoverage-mapping /tmp/mcdc-const.cpp -o /tmp/mcdc-const.o | ||
|
|
||
| clang -fcoverage-mcdc -fprofile-instr-generate \ | ||
| -fcoverage-mapping /tmp/mcdc-const-folding.cpp -o /tmp/mcdc-const-folding.o | ||
|
|
||
| mv /tmp/mcdc-const.o %S/Inputs | ||
| mv /tmp/mcdc-const-folding.o %S/Inputs |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,18 @@ | ||
| // RUN: llvm-profdata merge %S/Inputs/mcdc-general.proftext -o %t.profdata | ||
| // RUN: llvm-cov export --format=text %S/Inputs/mcdc-general.o -instr-profile %t.profdata | FileCheck %s | ||
|
|
||
| // CHECK: 12,7,12,27,0,5,[true,true,true,true] | ||
| // CHECK: 15,7,15,13,0,5,[true,true] | ||
| // CHECK: 15,19,15,25,0,5,[true,false] | ||
| // CHECK: 18,7,19,15,0,5,[true,true,false,true] | ||
| // CHECK: "mcdc":{"count":12,"covered":10,"notcovered":2,"percent":83.333333333333343} | ||
|
|
||
| Instructions for regenerating the test: | ||
|
|
||
| # cd %S/Inputs | ||
| cp mcdc-general.cpp /tmp | ||
|
|
||
| clang -fcoverage-mcdc -fprofile-instr-generate \ | ||
| -fcoverage-mapping /tmp/mcdc-general.cpp -o /tmp/mcdc-const.o | ||
|
|
||
| mv /tmp/mcdc-general.o %S/Inputs |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,82 @@ | ||
| // Test visualization of general MC/DC constructs with 0 executed test vectors. | ||
|
|
||
| // RUN: llvm-profdata merge %S/Inputs/mcdc-general-none.proftext -o %t.profdata | ||
| // RUN: llvm-cov show --show-mcdc %S/Inputs/mcdc-general.o -instr-profile %t.profdata -path-equivalence=/tmp,%S/Inputs %S/Inputs/mcdc-general.cpp | FileCheck %s | ||
| // RUN: llvm-cov report --show-mcdc-summary %S/Inputs/mcdc-general.o -instr-profile %t.profdata -show-functions -path-equivalence=/tmp,%S/Inputs %S/Inputs/mcdc-general.cpp | FileCheck %s -check-prefix=REPORT | ||
|
|
||
| // CHECK: test(bool | ||
|
|
||
| // CHECK: ------------------ | ||
| // CHECK-NEXT: |---> MC/DC Decision Region (12:7) to (12:27) | ||
| // CHECK-NEXT: | | ||
| // CHECK-NEXT: | Number of Conditions: 4 | ||
| // CHECK-NEXT: | Condition C1 --> (12:8) | ||
| // CHECK-NEXT: | Condition C2 --> (12:13) | ||
| // CHECK-NEXT: | Condition C3 --> (12:20) | ||
| // CHECK-NEXT: | Condition C4 --> (12:25) | ||
| // CHECK-NEXT: | | ||
| // CHECK-NEXT: | Executed MC/DC Test Vectors: | ||
| // CHECK-NEXT: | | ||
| // CHECK-NEXT: | None. | ||
| // CHECK-NEXT: | | ||
| // CHECK-NEXT: | C1-Pair: not covered | ||
| // CHECK-NEXT: | C2-Pair: not covered | ||
| // CHECK-NEXT: | C3-Pair: not covered | ||
| // CHECK-NEXT: | C4-Pair: not covered | ||
| // CHECK-NEXT: | MC/DC Coverage for Decision: 0.00% | ||
| // CHECK-NEXT: | | ||
| // CHECK-NEXT: ------------------ | ||
|
|
||
|
|
||
| // Turn off MC/DC visualization. | ||
| // RUN: llvm-cov show %S/Inputs/mcdc-general.o -instr-profile %t.profdata -path-equivalence=/tmp,%S/Inputs %S/Inputs/mcdc-general.cpp | FileCheck %s -check-prefix=NOMCDC | ||
| // NOMCDC-NOT: MC/DC Decision Region | ||
|
|
||
| // REPORT: Name Regions Miss Cover Lines Miss Cover Branches Miss Cover MC/DC Conditions Miss Cover | ||
| // REPORT-NEXT: ------------------------------------------------------------------------------------------------------------------------------------------- | ||
| // REPORT-NEXT: _Z4testbbbb 25 0 100.00% 9 0 100.00% 24 2 91.67% 12 12 0.00% | ||
| // REPORT-NEXT: main 1 0 100.00% 11 0 100.00% 0 0 0.00% 0 0 0.00% | ||
| // REPORT-NEXT: --- | ||
| // REPORT-NEXT: TOTAL 26 0 100.00% 20 0 100.00% 24 2 91.67% 12 12 0.00% | ||
|
|
||
| // Turn off MC/DC summary. | ||
| // RUN: llvm-cov report %S/Inputs/mcdc-general.o -instr-profile %t.profdata -show-functions -path-equivalence=/tmp,%S/Inputs %S/Inputs/mcdc-general.cpp | FileCheck %s -check-prefix=REPORT_NOMCDC | ||
| // REPORT_NOMCDC-NOT: TOTAL{{.*}}12 12 0.00% | ||
|
|
||
|
|
||
| // Test file-level report. | ||
| // RUN: llvm-cov report --show-mcdc-summary %S/Inputs/mcdc-general.o -instr-profile %t.profdata -path-equivalence=/tmp,%S/Inputs %S/Inputs/mcdc-general.cpp | FileCheck %s -check-prefix=FILEREPORT | ||
| // FILEREPORT: TOTAL{{.*}}12 12 0.00% | ||
|
|
||
|
|
||
| // Test html output. | ||
| // RUN: llvm-cov show --show-mcdc-summary --show-mcdc %S/Inputs/mcdc-general.o -instr-profile %t.profdata -path-equivalence=/tmp,%S/Inputs %S/Inputs/mcdc-general.cpp -format html -o %t.html.dir | ||
| // RUN: FileCheck -check-prefix=HTML -input-file=%t.html.dir/coverage/tmp/mcdc-general.cpp.html %s | ||
| // HTML-COUNT-4: MC/DC Decision Region (<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: <td class='column-entry-bold'>MC/DC</td> | ||
| // HTML-INDEX: <a href='coverage{{.*}}mcdc-general.cpp.html'{{.*}}mcdc-general.cpp</a> | ||
| // HTML-INDEX: <td class='column-entry-green'> | ||
| // HTML-INDEX: 100.00% (2/2) | ||
| // HTML-INDEX: 100.00% (20/20) | ||
| // HTML-INDEX: 100.00% (26/26) | ||
| // HTML-INDEX: 91.67% (22/24) | ||
| // HTML-INDEX: 0.00% (0/12) | ||
| // HTML-INDEX: Totals | ||
|
|
||
| Instructions for regenerating the test: | ||
|
|
||
| # cd %S/Inputs | ||
| cp mcdc-general.cpp /tmp | ||
|
|
||
| clang -fcoverage-mcdc -fprofile-instr-generate \ | ||
| -fcoverage-mapping /tmp/mcdc-general.cpp -o /tmp/mcdc-const.o | ||
|
|
||
| mv /tmp/mcdc-general.o %S/Inputs |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,148 @@ | ||
| // Test visualization of general MC/DC constructs. | ||
|
|
||
| // RUN: llvm-profdata merge %S/Inputs/mcdc-general.proftext -o %t.profdata | ||
| // RUN: llvm-cov show --show-mcdc %S/Inputs/mcdc-general.o -instr-profile %t.profdata -path-equivalence=/tmp,%S/Inputs %S/Inputs/mcdc-general.cpp | FileCheck %s | ||
| // RUN: llvm-cov report --show-mcdc-summary %S/Inputs/mcdc-general.o -instr-profile %t.profdata -show-functions -path-equivalence=/tmp,%S/Inputs %S/Inputs/mcdc-general.cpp | FileCheck %s -check-prefix=REPORT | ||
|
|
||
| // CHECK: test(bool | ||
|
|
||
| // CHECK: ------------------ | ||
| // CHECK-NEXT: |---> MC/DC Decision Region (12:7) to (12:27) | ||
| // CHECK-NEXT: | | ||
| // CHECK-NEXT: | Number of Conditions: 4 | ||
| // CHECK-NEXT: | Condition C1 --> (12:8) | ||
| // CHECK-NEXT: | Condition C2 --> (12:13) | ||
| // CHECK-NEXT: | Condition C3 --> (12:20) | ||
| // CHECK-NEXT: | Condition C4 --> (12:25) | ||
| // CHECK-NEXT: | | ||
| // CHECK-NEXT: | Executed MC/DC Test Vectors: | ||
| // CHECK-NEXT: | | ||
| // CHECK-NEXT: | C1, C2, C3, C4 Result | ||
| // CHECK-NEXT: | 1 { F, -, F, - = F } | ||
| // CHECK-NEXT: | 2 { T, F, F, - = F } | ||
| // CHECK-NEXT: | 3 { F, -, T, F = F } | ||
| // CHECK-NEXT: | 4 { T, F, T, F = F } | ||
| // CHECK-NEXT: | 5 { T, T, -, - = T } | ||
| // CHECK-NEXT: | 6 { T, F, T, T = T } | ||
| // CHECK-NEXT: | | ||
| // CHECK-NEXT: | C1-Pair: covered: (1,5) | ||
| // CHECK-NEXT: | C2-Pair: covered: (2,5) | ||
| // CHECK-NEXT: | C3-Pair: covered: (2,6) | ||
| // CHECK-NEXT: | C4-Pair: covered: (4,6) | ||
| // CHECK-NEXT: | MC/DC Coverage for Decision: 100.00% | ||
| // CHECK-NEXT: | | ||
| // CHECK-NEXT: ------------------ | ||
|
|
||
| // CHECK: ------------------ | ||
| // CHECK-NEXT: |---> MC/DC Decision Region (15:7) to (15:13) | ||
| // CHECK-NEXT: | | ||
| // CHECK-NEXT: | Number of Conditions: 2 | ||
| // CHECK-NEXT: | Condition C1 --> (15:7) | ||
| // CHECK-NEXT: | Condition C2 --> (15:12) | ||
| // CHECK-NEXT: | | ||
| // CHECK-NEXT: | Executed MC/DC Test Vectors: | ||
| // CHECK-NEXT: | | ||
| // CHECK-NEXT: | C1, C2 Result | ||
| // CHECK-NEXT: | 1 { F, - = F } | ||
| // CHECK-NEXT: | 2 { T, F = F } | ||
| // CHECK-NEXT: | 3 { T, T = T } | ||
| // CHECK-NEXT: | | ||
| // CHECK-NEXT: | C1-Pair: covered: (1,3) | ||
| // CHECK-NEXT: | C2-Pair: covered: (2,3) | ||
| // CHECK-NEXT: | MC/DC Coverage for Decision: 100.00% | ||
| // CHECK-NEXT: | | ||
| // CHECK-NEXT: |---> MC/DC Decision Region (15:19) to (15:25) | ||
| // CHECK-NEXT: | | ||
| // CHECK-NEXT: | Number of Conditions: 2 | ||
| // CHECK-NEXT: | Condition C1 --> (15:19) | ||
| // CHECK-NEXT: | Condition C2 --> (15:24) | ||
| // CHECK-NEXT: | | ||
| // CHECK-NEXT: | Executed MC/DC Test Vectors: | ||
| // CHECK-NEXT: | | ||
| // CHECK-NEXT: | C1, C2 Result | ||
| // CHECK-NEXT: | 1 { F, - = F } | ||
| // CHECK-NEXT: | 2 { T, T = T } | ||
| // CHECK-NEXT: | | ||
| // CHECK-NEXT: | C1-Pair: covered: (1,2) | ||
| // CHECK-NEXT: | C2-Pair: not covered | ||
| // CHECK-NEXT: | MC/DC Coverage for Decision: 50.00% | ||
| // CHECK-NEXT: | | ||
| // CHECK-NEXT: ------------------ | ||
|
|
||
| // CHECK: ------------------ | ||
| // CHECK-NEXT: |---> MC/DC Decision Region (18:7) to (19:15) | ||
| // CHECK-NEXT: | | ||
| // CHECK-NEXT: | Number of Conditions: 4 | ||
| // CHECK-NEXT: | Condition C1 --> (18:8) | ||
| // CHECK-NEXT: | Condition C2 --> (18:13) | ||
| // CHECK-NEXT: | Condition C3 --> (19:8) | ||
| // CHECK-NEXT: | Condition C4 --> (19:13) | ||
| // CHECK-NEXT: | | ||
| // CHECK-NEXT: | Executed MC/DC Test Vectors: | ||
| // CHECK-NEXT: | | ||
| // CHECK-NEXT: | C1, C2, C3, C4 Result | ||
| // CHECK-NEXT: | 1 { F, -, -, - = F } | ||
| // CHECK-NEXT: | 2 { T, F, -, - = F } | ||
| // CHECK-NEXT: | 3 { T, T, T, F = F } | ||
| // CHECK-NEXT: | 4 { T, T, T, T = T } | ||
| // CHECK-NEXT: | | ||
| // CHECK-NEXT: | C1-Pair: covered: (1,4) | ||
| // CHECK-NEXT: | C2-Pair: covered: (2,4) | ||
| // CHECK-NEXT: | C3-Pair: not covered | ||
| // CHECK-NEXT: | C4-Pair: covered: (3,4) | ||
| // CHECK-NEXT: | MC/DC Coverage for Decision: 75.00% | ||
| // CHECK-NEXT: | | ||
| // CHECK-NEXT: ------------------ | ||
|
|
||
| // Turn off MC/DC visualization. | ||
| // RUN: llvm-cov show %S/Inputs/mcdc-general.o -instr-profile %t.profdata -path-equivalence=/tmp,%S/Inputs %S/Inputs/mcdc-general.cpp | FileCheck %s -check-prefix=NOMCDC | ||
| // NOMCDC-NOT: MC/DC Decision Region | ||
|
|
||
| // REPORT: Name Regions Miss Cover Lines Miss Cover Branches Miss Cover MC/DC Conditions Miss Cover | ||
| // REPORT-NEXT: ------------------------------------------------------------------------------------------------------------------------------------------- | ||
| // REPORT-NEXT: _Z4testbbbb 25 0 100.00% 9 0 100.00% 24 2 91.67% 12 2 83.33% | ||
| // REPORT-NEXT: main 1 0 100.00% 11 0 100.00% 0 0 0.00% 0 0 0.00% | ||
| // REPORT-NEXT: --- | ||
| // REPORT-NEXT: TOTAL 26 0 100.00% 20 0 100.00% 24 2 91.67% 12 2 83.33% | ||
|
|
||
| // Turn off MC/DC summary. | ||
| // RUN: llvm-cov report %S/Inputs/mcdc-general.o -instr-profile %t.profdata -show-functions -path-equivalence=/tmp,%S/Inputs %S/Inputs/mcdc-general.cpp | FileCheck %s -check-prefix=REPORT_NOMCDC | ||
| // REPORT_NOMCDC-NOT: TOTAL{{.*}}12 2 83.33% | ||
|
|
||
|
|
||
| // Test file-level report. | ||
| // RUN: llvm-cov report --show-mcdc-summary %S/Inputs/mcdc-general.o -instr-profile %t.profdata -path-equivalence=/tmp,%S/Inputs %S/Inputs/mcdc-general.cpp | FileCheck %s -check-prefix=FILEREPORT | ||
| // FILEREPORT: TOTAL{{.*}}12 2 83.33% | ||
|
|
||
|
|
||
| // Test html output. | ||
| // RUN: llvm-cov show --show-mcdc-summary --show-mcdc %S/Inputs/mcdc-general.o -instr-profile %t.profdata -path-equivalence=/tmp,%S/Inputs %S/Inputs/mcdc-general.cpp -format html -o %t.html.dir | ||
| // RUN: FileCheck -check-prefix=HTML -input-file=%t.html.dir/coverage/tmp/mcdc-general.cpp.html %s | ||
| // HTML-COUNT-4: MC/DC Decision Region (<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: <td class='column-entry-bold'>MC/DC</td> | ||
| // HTML-INDEX: <a href='coverage{{.*}}mcdc-general.cpp.html'{{.*}}mcdc-general.cpp</a> | ||
| // HTML-INDEX: <td class='column-entry-green'> | ||
| // HTML-INDEX: 100.00% (2/2) | ||
| // HTML-INDEX: 100.00% (20/20) | ||
| // HTML-INDEX: 100.00% (26/26) | ||
| // HTML-INDEX: 91.67% (22/24) | ||
| // HTML-INDEX: 83.33% (10/12) | ||
| // HTML-INDEX: Totals | ||
|
|
||
| Instructions for regenerating the test: | ||
|
|
||
| # cd %S/Inputs | ||
| cp mcdc-general.cpp /tmp | ||
|
|
||
| clang -fcoverage-mcdc -fprofile-instr-generate \ | ||
| -fcoverage-mapping /tmp/mcdc-general.cpp -o /tmp/mcdc-general.o | ||
|
|
||
| mv /tmp/mcdc-general.o %S/Inputs |