229 lines · plain
1// Test visualization of MC/DC constructs for constant-folded condition masking.2 3// RUN: llvm-profdata merge %S/Inputs/mcdc-const.proftext -o %t.profdata4// RUN: llvm-cov show --show-branches=count --show-mcdc %S/Inputs/mcdc-const.o -instr-profile %t.profdata -path-equivalence=.,%S/Inputs | FileCheck %s -check-prefix=CHECKGENERALCASE5 6// CHECKGENERALCASE: ------------------7// CHECKGENERALCASE-NEXT: | Branch (12:8): [True: 4, False: 1]8// CHECKGENERALCASE-NEXT: | Branch (12:13): [Folded - Ignored]9// CHECKGENERALCASE-NEXT: | Branch (12:20): [Folded - Ignored]10// CHECKGENERALCASE-NEXT: | Branch (12:25): [True: 0, False: 0]11// CHECKGENERALCASE-NEXT: | Branch (12:31): [Folded - Ignored]12// CHECKGENERALCASE-NEXT: ------------------13// CHECKGENERALCASE-NEXT: |---> MC/DC Decision Region (12:7) to (12:32)14// CHECKGENERALCASE-NEXT: |15// CHECKGENERALCASE-NEXT: | Number of Conditions: 516// CHECKGENERALCASE-NEXT: | Condition C1 --> (12:8)17// CHECKGENERALCASE-NEXT: | Condition C2 --> (12:13)18// CHECKGENERALCASE-NEXT: | Condition C3 --> (12:20)19// CHECKGENERALCASE-NEXT: | Condition C4 --> (12:25)20// CHECKGENERALCASE-NEXT: | Condition C5 --> (12:31)21// CHECKGENERALCASE-NEXT: |22// CHECKGENERALCASE-NEXT: | Executed MC/DC Test Vectors:23// CHECKGENERALCASE-NEXT: |24// CHECKGENERALCASE-NEXT: | C1, C2, C3, C4, C5 Result25// CHECKGENERALCASE-NEXT: | 1 { F, C, C, -, C = F }26// CHECKGENERALCASE-NEXT: | 2 { T, C, C, -, C = T }27// CHECKGENERALCASE-NEXT: |28// CHECKGENERALCASE-NEXT: | C1-Pair: covered: (1,2)29// CHECKGENERALCASE-NEXT: | C2-Pair: constant folded30// CHECKGENERALCASE-NEXT: | C3-Pair: constant folded31// CHECKGENERALCASE-NEXT: | C4-Pair: not covered32// CHECKGENERALCASE-NEXT: | C5-Pair: constant folded33// CHECKGENERALCASE-NEXT: | MC/DC Coverage for Decision: 50.00%34// CHECKGENERALCASE-NEXT: |35// CHECKGENERALCASE-NEXT: ------------------36 37// RUN: llvm-profdata merge %S/Inputs/mcdc-const-folding.proftext -o %t.profdata38// RUN: llvm-cov show --show-mcdc %S/Inputs/mcdc-const-folding.o -instr-profile %t.profdata -path-equivalence=.,%S/Inputs | FileCheck %s -check-prefix=CHECKFULLCASE39// RUN: llvm-cov report --show-mcdc-summary %S/Inputs/mcdc-const-folding.o -instr-profile %t.profdata -show-functions -path-equivalence=.,%S/Inputs %S/Inputs/mcdc-const-folding.cpp | FileCheck %s -check-prefix=REPORT40 41// CHECKFULLCASE: | 1 { C, - = F }42// CHECKFULLCASE: | C1-Pair: constant folded43// CHECKFULLCASE-NEXT: | C2-Pair: not covered44// CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00%45// CHECKFULLCASE: | 1 { F, C = F }46// CHECKFULLCASE-NEXT: | 2 { T, C = F }47// CHECKFULLCASE: | C1-Pair: not covered48// CHECKFULLCASE-NEXT: | C2-Pair: constant folded49// CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00%50// CHECKFULLCASE: | 1 { C, F = F }51// CHECKFULLCASE-NEXT: | 2 { C, T = T }52// CHECKFULLCASE: | C1-Pair: constant folded53// CHECKFULLCASE-NEXT: | C2-Pair: covered: (1,2)54// CHECKFULLCASE: | MC/DC Coverage for Decision: 100.00%55// CHECKFULLCASE: | 1 { F, C = F }56// CHECKFULLCASE-NEXT: | 2 { T, C = T }57// CHECKFULLCASE: | C1-Pair: covered: (1,2)58// CHECKFULLCASE-NEXT: | C2-Pair: constant folded59// CHECKFULLCASE: | MC/DC Coverage for Decision: 100.00%60// CHECKFULLCASE: | 1 { C, - = T }61// CHECKFULLCASE: | C1-Pair: constant folded62// CHECKFULLCASE-NEXT: | C2-Pair: not covered63// CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00%64// CHECKFULLCASE: | 1 { F, C = T }65// CHECKFULLCASE-NEXT: | 2 { T, C = T }66// CHECKFULLCASE: | C1-Pair: not covered67// CHECKFULLCASE-NEXT: | C2-Pair: constant folded68// CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00%69// CHECKFULLCASE: | 1 { C, F = F }70// CHECKFULLCASE-NEXT: | 2 { C, T = T }71// CHECKFULLCASE: | C1-Pair: constant folded72// CHECKFULLCASE-NEXT: | C2-Pair: covered: (1,2)73// CHECKFULLCASE: | MC/DC Coverage for Decision: 100.00%74// CHECKFULLCASE: | 1 { F, C = F }75// CHECKFULLCASE-NEXT: | 2 { T, C = T }76// CHECKFULLCASE: | C1-Pair: covered: (1,2)77// CHECKFULLCASE-NEXT: | C2-Pair: constant folded78// CHECKFULLCASE: | MC/DC Coverage for Decision: 100.00%79// CHECKFULLCASE: | 1 { C, -, - = F }80// CHECKFULLCASE: | C1-Pair: constant folded81// CHECKFULLCASE-NEXT: | C2-Pair: not covered82// CHECKFULLCASE-NEXT: | C3-Pair: not covered83// CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00%84// CHECKFULLCASE: | 1 { F, C, - = F }85// CHECKFULLCASE-NEXT: | 2 { T, C, - = F }86// CHECKFULLCASE: | C1-Pair: not covered87// CHECKFULLCASE-NEXT: | C2-Pair: constant folded88// CHECKFULLCASE-NEXT: | C3-Pair: not covered89// CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00%90// CHECKFULLCASE: | 1 { C, F, - = F }91// CHECKFULLCASE-NEXT: | 2 { C, T, F = F }92// CHECKFULLCASE-NEXT: | 3 { C, T, T = T }93// CHECKFULLCASE: | C1-Pair: constant folded94// CHECKFULLCASE-NEXT: | C2-Pair: covered: (1,3)95// CHECKFULLCASE-NEXT: | C3-Pair: covered: (2,3)96// CHECKFULLCASE: | MC/DC Coverage for Decision: 100.00%97// CHECKFULLCASE: | 1 { F, C, - = F }98// CHECKFULLCASE-NEXT: | 2 { T, C, F = F }99// CHECKFULLCASE-NEXT: | 3 { T, C, T = T }100// CHECKFULLCASE: | C1-Pair: covered: (1,3)101// CHECKFULLCASE-NEXT: | C2-Pair: constant folded102// CHECKFULLCASE-NEXT: | C3-Pair: covered: (2,3)103// CHECKFULLCASE: | MC/DC Coverage for Decision: 100.00%104// CHECKFULLCASE: | 1 { C, -, - = T }105// CHECKFULLCASE: | C1-Pair: constant folded106// CHECKFULLCASE-NEXT: | C2-Pair: not covered107// CHECKFULLCASE-NEXT: | C3-Pair: not covered108// CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00%109// CHECKFULLCASE: | 1 { F, C, - = T }110// CHECKFULLCASE-NEXT: | 2 { T, C, - = T }111// CHECKFULLCASE: | C1-Pair: not covered112// CHECKFULLCASE-NEXT: | C2-Pair: constant folded113// CHECKFULLCASE-NEXT: | C3-Pair: not covered114// CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00%115// CHECKFULLCASE: | 1 { C, F, T = T }116// CHECKFULLCASE-NEXT: | 2 { C, T, - = T }117// CHECKFULLCASE: | C1-Pair: constant folded118// CHECKFULLCASE-NEXT: | C2-Pair: not covered119// CHECKFULLCASE-NEXT: | C3-Pair: not covered120// CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00%121// CHECKFULLCASE: | 1 { F, C, T = T }122// CHECKFULLCASE-NEXT: | 2 { T, C, - = T }123// CHECKFULLCASE: | C1-Pair: not covered124// CHECKFULLCASE-NEXT: | C2-Pair: constant folded125// CHECKFULLCASE-NEXT: | C3-Pair: not covered126// CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00%127// CHECKFULLCASE: | 1 { F, -, C = F }128// CHECKFULLCASE-NEXT: | 2 { T, F, C = F }129// CHECKFULLCASE-NEXT: | 3 { T, T, C = F }130// CHECKFULLCASE: | C1-Pair: not covered131// CHECKFULLCASE-NEXT: | C2-Pair: not covered132// CHECKFULLCASE-NEXT: | C3-Pair: constant folded133// CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00%134// CHECKFULLCASE: | 1 { F, C, - = F }135// CHECKFULLCASE-NEXT: | 2 { T, C, - = F }136// CHECKFULLCASE: | C1-Pair: not covered137// CHECKFULLCASE-NEXT: | C2-Pair: constant folded138// CHECKFULLCASE-NEXT: | C3-Pair: not covered139// CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00%140// CHECKFULLCASE: | 1 { F, -, C = F }141// CHECKFULLCASE-NEXT: | 2 { T, F, C = F }142// CHECKFULLCASE-NEXT: | 3 { T, T, C = T }143// CHECKFULLCASE: | C1-Pair: covered: (1,3)144// CHECKFULLCASE-NEXT: | C2-Pair: covered: (2,3)145// CHECKFULLCASE-NEXT: | C3-Pair: constant folded146// CHECKFULLCASE: | MC/DC Coverage for Decision: 100.00%147// CHECKFULLCASE: | 1 { F, C, - = F }148// CHECKFULLCASE-NEXT: | 2 { T, C, F = F }149// CHECKFULLCASE-NEXT: | 3 { T, C, T = T }150// CHECKFULLCASE: | C1-Pair: covered: (1,3)151// CHECKFULLCASE-NEXT: | C2-Pair: constant folded152// CHECKFULLCASE-NEXT: | C3-Pair: covered: (2,3)153// CHECKFULLCASE: | MC/DC Coverage for Decision: 100.00%154// CHECKFULLCASE: | 1 { F, T, C = T }155// CHECKFULLCASE-NEXT: | 2 { T, -, C = T }156// CHECKFULLCASE: | C1-Pair: not covered157// CHECKFULLCASE-NEXT: | C2-Pair: not covered158// CHECKFULLCASE-NEXT: | C3-Pair: constant folded159// CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00%160// CHECKFULLCASE: | 1 { F, C, - = T }161// CHECKFULLCASE-NEXT: | 2 { T, C, - = T }162// CHECKFULLCASE: | C1-Pair: not covered163// CHECKFULLCASE-NEXT: | C2-Pair: constant folded164// CHECKFULLCASE-NEXT: | C3-Pair: not covered165// CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00%166// CHECKFULLCASE: | 1 { F, T, C = T }167// CHECKFULLCASE-NEXT: | 2 { T, -, C = T }168// CHECKFULLCASE: | C1-Pair: not covered169// CHECKFULLCASE-NEXT: | C2-Pair: not covered170// CHECKFULLCASE-NEXT: | C3-Pair: constant folded171// CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00%172// CHECKFULLCASE: | 1 { F, C, T = T }173// CHECKFULLCASE-NEXT: | 2 { T, C, - = T }174// CHECKFULLCASE: | C1-Pair: not covered175// CHECKFULLCASE-NEXT: | C2-Pair: constant folded176// CHECKFULLCASE-NEXT: | C3-Pair: not covered177// CHECKFULLCASE: | MC/DC Coverage for Decision: 0.00%178 179// REPORT: _Z5case0b {{.*}} 1 1 0.00%180// REPORT-NEXT: _Z5case1b {{.*}} 1 1 0.00%181// REPORT-NEXT: _Z5case2b {{.*}} 1 0 100.00%182// REPORT-NEXT: _Z5case3b {{.*}} 1 0 100.00%183// REPORT-NEXT: _Z5case4b {{.*}} 1 1 0.00%184// REPORT-NEXT: _Z5case5b {{.*}} 1 1 0.00%185// REPORT-NEXT: _Z5case6b {{.*}} 1 0 100.00%186// REPORT-NEXT: _Z5case7b {{.*}} 1 0 100.00%187// REPORT-NEXT: _Z5case8bb {{.*}} 2 2 0.00%188// REPORT-NEXT: _Z5case9bb {{.*}} 2 2 0.00%189// REPORT-NEXT: _Z5caseabb {{.*}} 2 0 100.00%190// REPORT-NEXT: _Z5casebbb {{.*}} 2 0 100.00%191// REPORT-NEXT: _Z5casecbb {{.*}} 2 2 0.00%192// REPORT-NEXT: _Z5casedbb {{.*}} 2 2 0.00%193// REPORT-NEXT: _Z5caseebb {{.*}} 2 2 0.00%194// REPORT-NEXT: _Z5casefbb {{.*}} 2 2 0.00%195// REPORT-NEXT: _Z5casegbb {{.*}} 2 2 0.00%196// REPORT-NEXT: _Z5casehbb {{.*}} 2 2 0.00%197// REPORT-NEXT: _Z5caseibb {{.*}} 2 0 100.00%198// REPORT-NEXT: _Z5casejbb {{.*}} 2 0 100.00%199// REPORT-NEXT: _Z5casekbb {{.*}} 2 2 0.00%200// REPORT-NEXT: _Z5caselbb {{.*}} 2 2 0.00%201// REPORT-NEXT: _Z5casembb {{.*}} 2 2 0.00%202// REPORT-NEXT: _Z5casenbb {{.*}} 2 2 0.00%203// REPORT: TOTAL {{.*}} 40 28 30.00%204 205Instructions for regenerating the test:206 207cd %S/Inputs # Or copy files into the working directory208 209clang++ -c -Os \210 -fcoverage-compilation-dir=. -mllvm -enable-name-compression=false \211 -fcoverage-mcdc -fprofile-instr-generate -fcoverage-mapping \212 mcdc-const.cpp mcdc-const-folding.cpp213 214# Instructions for regenerating proftext215 216for x in mcdc-const mcdc-const-folding; do (217 clang++ -fprofile-instr-generate $x.o -o $x218 find -name '*.profraw' | xargs rm -f219 export LLVM_PROFILE_FILE=$x-%p.profraw220 ./$x 0 1221 if [ "$x" = "mcdc-const-folding" ]; then222 ./$x 1 0223 ./$x 1 1224 ./$x 1 1 # Redundant225 fi226 llvm-profdata merge --sparse -o $x.profdata $(find -name '*.profraw')227 llvm-profdata merge --text -o $x.proftext $x.profdata228); done229