1e69092beSFangrui Song# Tests for compatibility between llvm-cov and gcov. These work by 2e69092beSFangrui Song# comparing llvm-cov against reference outputs generated by gcov 4.2. 3e69092beSFangrui Song 4e69092beSFangrui Song# Test fails on Windows where internal shell is used due to path separator 5e69092beSFangrui Song# mismatches. 6*5ccdce95SJay FoadUNSUPPORTED: system-windows 7e69092beSFangrui Song 8e69092beSFangrui SongRUN: rm -rf %t 9e69092beSFangrui SongRUN: mkdir %t 10e69092beSFangrui SongRUN: cd %t 11e69092beSFangrui SongRUN: cp %p/Inputs/test* . 12e69092beSFangrui Song 13e69092beSFangrui Song# Basic behaviour with no flags 14e69092beSFangrui SongRUN: llvm-cov gcov test.c 2> %t.err | FileCheck %s --check-prefixes=OUT,OUTFILE --match-full-lines --strict-whitespace 15e69092beSFangrui SongRUN: FileCheck %s --check-prefix=C --match-full-lines --strict-whitespace < test.cpp.gcov 16e69092beSFangrui SongRUN: diff -ub test_no_options.h.gcov test.h.gcov 17e69092beSFangrui SongRUN: count 0 < %t.err 18e69092beSFangrui Song 19e69092beSFangrui Song# Same, but specifying the object directory 20e69092beSFangrui SongRUN: mkdir -p %t/objdir 21e69092beSFangrui SongRUN: cp test.gcno test.gcda %t/objdir 22e69092beSFangrui SongRUN: llvm-cov gcov -o objdir test.c | FileCheck %s --check-prefixes=OUT,OUTFILE 23e69092beSFangrui SongRUN: FileCheck --input-file=test.cpp.gcov %s --check-prefix=OBJDIR 24e69092beSFangrui SongOBJDIR: 0:Graph:objdir/test.gcno 25e69092beSFangrui SongOBJDIR-NEXT: 0:Data:objdir/test.gcda 26e69092beSFangrui Song 27e69092beSFangrui Song# Specifying an object file 28e69092beSFangrui SongRUN: llvm-cov gcov -o objdir/test.o test.c 29e69092beSFangrui SongRUN: FileCheck --input-file=test.cpp.gcov %s --check-prefix=OBJDIR 30e69092beSFangrui Song 31e69092beSFangrui Song# Specifying an object file that could be ambiguous with a directory 32e69092beSFangrui SongRUN: llvm-cov gcov -o objdir/test test.c 33e69092beSFangrui SongRUN: FileCheck --input-file=test.cpp.gcov %s --check-prefix=OBJDIR 34e69092beSFangrui Song 35e69092beSFangrui Song# With gcov output disabled 36e69092beSFangrui SongRUN: llvm-cov gcov -n test.c | FileCheck %s --check-prefix=OUT 37e69092beSFangrui Song 38e69092beSFangrui Song# Print to stdout. 39e69092beSFangrui SongRUN: llvm-cov gcov -t test.c > stdout 40e69092beSFangrui SongRUN: llvm-cov gcov --stdout test.c | cmp stdout - 41e69092beSFangrui SongRUN: cat test_no_options.cpp.gcov test_no_options.h.gcov | diff -u - stdout 42e69092beSFangrui SongRUN: llvm-cov gcov -n -t test.c | count 0 43e69092beSFangrui Song 44e69092beSFangrui SongRUN: llvm-cov gcov test_paths.cpp 2>/dev/null | FileCheck %s --check-prefix=MISSING 45e69092beSFangrui SongRUN: ls a.c.gcov 4624563b8dSOleksii OdynochenkoMISSING: File 'src/a.c' 47e69092beSFangrui SongMISSING: Creating 'a.c.gcov' 48e69092beSFangrui Song 49e69092beSFangrui Song# Preserve paths. This mangles the output filenames. 50e69092beSFangrui SongRUN: llvm-cov gcov -p test_paths.cpp 2>/dev/null | FileCheck %s --check-prefix=PRESERVE 5124563b8dSOleksii OdynochenkoRUN: ls src#a.c.gcov 5224563b8dSOleksii OdynochenkoPRESERVE: File 'src/a.c' 5324563b8dSOleksii OdynochenkoPRESERVE: Creating 'src#a.c.gcov' 54e69092beSFangrui Song 55e69092beSFangrui Song# Long file names. 56e69092beSFangrui SongRUN: llvm-cov gcov -l test_paths.cpp 57e69092beSFangrui SongRUN: ls test_paths.cpp##a.c.gcov 58e69092beSFangrui Song 59e69092beSFangrui Song# Long file names and preserve paths. 60e69092beSFangrui SongRUN: mkdir -p src && llvm-cov gcov -lp -gcno test_paths.gcno -gcda test_paths.gcda src/../test_paths.cpp 6124563b8dSOleksii OdynochenkoRUN: ls src#^#test_paths.cpp##src#a.c.gcov 62e69092beSFangrui Song 63e69092beSFangrui Song# Hash pathnames. 64e69092beSFangrui SongRUN: llvm-cov gcov -x -gcno test_paths.gcno -gcda test_paths.gcda src/../test_paths.cpp 6524563b8dSOleksii OdynochenkoRUN: ls a.c##0c546a4dd99c1774b7b06e4fad16158c.gcov 66e69092beSFangrui Song 67e69092beSFangrui Song# Function summaries. This changes stdout, but not the gcov files. 68e69092beSFangrui SongRUN: llvm-cov gcov test.c -f | FileCheck %s --check-prefixes=OUT,OUTFILE,OUT-F 69e69092beSFangrui SongRUN: FileCheck --input-file=test.cpp.gcov %s --check-prefix=C 70e69092beSFangrui SongRUN: FileCheck --input-file=test.h.gcov %s --check-prefix=H 71e69092beSFangrui Song 72e69092beSFangrui Song# All blocks. This doesn't affect stdout, only the gcov files. 73e69092beSFangrui SongRUN: llvm-cov gcov test.c -a | FileCheck %s --check-prefixes=OUT,OUTFILE 74e69092beSFangrui SongRUN: FileCheck --input-file=test.cpp.gcov %s --check-prefixes=C,C-A 75e69092beSFangrui SongRUN: FileCheck --input-file=test.h.gcov %s --check-prefixes=H,H-A 76e69092beSFangrui Song 77e69092beSFangrui Song# Branch probabilities. 78e69092beSFangrui SongRUN: llvm-cov gcov test.c -a -b | FileCheck %s --check-prefixes=OUT,OUTFILE,OUT-B 79e69092beSFangrui SongRUN: FileCheck --input-file=test.cpp.gcov %s --check-prefixes=C,C-A,C-B 80e69092beSFangrui SongRUN: FileCheck --input-file=test.h.gcov %s --check-prefixes=H,H-A,H-B 81e69092beSFangrui Song 82e69092beSFangrui Song# Function summaries including branch probabilities. 83e69092beSFangrui SongRUN: llvm-cov gcov test.c -a -b -f | FileCheck %s --check-prefixes=OUT,OUTFILE,OUT-F,OUT-B,OUT-FB --match-full-lines --strict-whitespace 84e69092beSFangrui SongRUN: FileCheck %s --check-prefixes=C,C-A,C-B --match-full-lines --strict-whitespace < test.cpp.gcov 85e69092beSFangrui SongRUN: FileCheck %s --check-prefixes=H,H-A,H-B --match-full-lines --strict-whitespace < test.h.gcov 86e69092beSFangrui Song 87e69092beSFangrui Song OUT-F:Function '_ZN1A1BEv' 88e69092beSFangrui Song OUT-F-NEXT:Lines executed:100.00% of 1 89e69092beSFangrui Song OUT-FB-NEXT:No branches 90e69092beSFangrui Song OUT-FB-NEXT:No calls 91e69092beSFangrui Song OUT-F-EMPTY: 92e69092beSFangrui Song OUT-F-NEXT:Function '_Z7uselessv' 93e69092beSFangrui Song OUT-F-NEXT:Lines executed:0.00% of 1 94e69092beSFangrui Song OUT-FB-NEXT:No branches 95e69092beSFangrui Song OUT-FB-NEXT:No calls 96e69092beSFangrui Song OUT-F-EMPTY: 97e69092beSFangrui Song OUT-F-NEXT:Function '_Z12more_uselessv' 98e69092beSFangrui Song OUT-F-NEXT:Lines executed:0.00% of 2 99e69092beSFangrui Song OUT-FB-NEXT:No branches 100e69092beSFangrui Song OUT-FB-NEXT:No calls 101e69092beSFangrui Song OUT-F-EMPTY: 102e69092beSFangrui Song OUT-F-NEXT:Function '_Z3foov' 103e69092beSFangrui Song OUT-F-NEXT:Lines executed:100.00% of 3 104e69092beSFangrui Song OUT-FB-NEXT:No branches 105e69092beSFangrui Song OUT-FB-NEXT:No calls 106e69092beSFangrui Song OUT-F-EMPTY: 107e69092beSFangrui Song OUT-F-NEXT:Function '_Z3barv' 108e69092beSFangrui Song OUT-F-NEXT:Lines executed:0.00% of 3 109e69092beSFangrui Song OUT-FB-NEXT:No branches 110e69092beSFangrui Song OUT-FB-NEXT:No calls 111e69092beSFangrui Song OUT-F-EMPTY: 112e69092beSFangrui Song OUT-F-NEXT:Function '_Z6assignii' 113e69092beSFangrui Song OUT-F-NEXT:Lines executed:100.00% of 3 114e69092beSFangrui Song OUT-FB-NEXT:No branches 115e69092beSFangrui Song OUT-FB-NEXT:No calls 116e69092beSFangrui Song OUT-F-EMPTY: 117e69092beSFangrui Song OUT-F-NEXT:Function '_Z15initialize_gridv' 118e69092beSFangrui Song OUT-F-NEXT:Lines executed:100.00% of 5 119e69092beSFangrui Song OUT-FB-NEXT:No branches 120e69092beSFangrui Song OUT-FB-NEXT:No calls 121e69092beSFangrui Song OUT-F-EMPTY: 122e69092beSFangrui Song OUT-F-NEXT:Function 'main' 123e69092beSFangrui Song OUT-F-NEXT:Lines executed:92.00% of 25 124e69092beSFangrui Song OUT-FB-NEXT:No branches 125e69092beSFangrui Song OUT-FB-NEXT:No calls 126e69092beSFangrui Song OUT-F-EMPTY: 127e69092beSFangrui Song OUT-F-NEXT:Function '_ZN1AC2Ev' 128e69092beSFangrui Song OUT-F-NEXT:Lines executed:100.00% of 1 129e69092beSFangrui Song OUT-FB-NEXT:No branches 130e69092beSFangrui Song OUT-FB-NEXT:No calls 131e69092beSFangrui Song OUT-F-EMPTY: 132e69092beSFangrui Song OUT:File 'test.cpp' 133e69092beSFangrui Song OUT-NEXT:Lines executed:81.40% of 43 134e69092beSFangrui Song OUT-B-NEXT:Branches executed:100.00% of 15 135e69092beSFangrui Song OUT-B-NEXT:Taken at least once:86.67% of 15 136e69092beSFangrui Song OUT-B-NEXT:No calls 137e69092beSFangrui SongOUTFILE-NEXT:Creating 'test.cpp.gcov' 138e69092beSFangrui Song OUT-EMPTY: 13924563b8dSOleksii Odynochenko OUT-NEXT:File 'test.h' 140e69092beSFangrui Song OUT-NEXT:Lines executed:100.00% of 1 141e69092beSFangrui Song OUT-B-NEXT:No branches 142e69092beSFangrui Song OUT-B-NEXT:No calls 143e69092beSFangrui SongOUTFILE-NEXT:Creating 'test.h.gcov' 144e69092beSFangrui Song 145e69092beSFangrui Song# Summarize unconditional branches too. 146e69092beSFangrui SongRUN: llvm-cov gcov test.c -a -b -u | FileCheck %s --check-prefixes=OUT,OUTFILE,OUT-B 147e69092beSFangrui SongRUN: FileCheck --input-file=test.cpp.gcov %s --check-prefixes=C,C-A,C-B,C-U 148e69092beSFangrui SongRUN: FileCheck --input-file=test.h.gcov %s --check-prefixes=H,H-A,H-B,H-U 149e69092beSFangrui Song 150e69092beSFangrui Song# Absolute counts for branches. 151e69092beSFangrui SongRUN: llvm-cov gcov test.c -a -b -c -u 152e69092beSFangrui SongRUN: FileCheck --input-file=test.h.gcov %s --check-prefix=H-C 153e69092beSFangrui SongH-C: unconditional 0 taken 1 154e69092beSFangrui Song 155e69092beSFangrui Song# Missing gcda file just gives 0 counts. 156e69092beSFangrui SongRUN: llvm-cov gcov test.c -gcda=no_such_gcda_file | FileCheck %s --check-prefix=NO-GCDA 157e69092beSFangrui SongRUN: diff -ub test_no_gcda.cpp.gcov test.cpp.gcov 158e69092beSFangrui SongRUN: diff -ub test_no_gcda.h.gcov test.h.gcov 159e69092beSFangrui SongNO-GCDA: File 'test.cpp' 160e69092beSFangrui SongNO-GCDA-NEXT: Lines executed:0.00% of 43 161e69092beSFangrui SongNO-GCDA-NEXT: Creating 'test.cpp.gcov' 162e69092beSFangrui SongNO-GCDA-EMPTY: 16324563b8dSOleksii OdynochenkoNO-GCDA-NEXT: File 'test.h' 164e69092beSFangrui SongNO-GCDA-NEXT: Lines executed:0.00% of 1 165e69092beSFangrui SongNO-GCDA-NEXT: Creating 'test.h.gcov' 166e69092beSFangrui Song 167e69092beSFangrui Song# Invalid gcno file. 168e69092beSFangrui SongRUN: llvm-cov gcov test.c -gcno=test_read_fail.gcno 169e69092beSFangrui Song 170e69092beSFangrui Song# Not a .gcda file. Error but keep the .gcov output. 171e69092beSFangrui SongRUN: echo invalid > not.gcda 172e69092beSFangrui SongRUN: llvm-cov gcov test.c -gcda=not.gcda 2> %t.err | FileCheck %s --check-prefix=NO-GCDA 173e69092beSFangrui SongRUN: FileCheck %s --check-prefix=NOT-GCDA < %t.err 174e69092beSFangrui SongNOT-GCDA: not.gcda:not a gcov data file 175e69092beSFangrui Song 176e69092beSFangrui Song# Bad file checksum on gcda. 177e69092beSFangrui SongRUN: llvm-cov gcov test.c -gcda=test_file_checksum_fail.gcda 2> %t.err | FileCheck %s --check-prefix=NO-GCDA 178e69092beSFangrui Song 179e69092beSFangrui Song# Bad function checksum on gcda 180e69092beSFangrui SongRUN: llvm-cov gcov test.c -gcda=test_func_checksum_fail.gcda 2> %t.err | FileCheck %s --check-prefix=NO-GCDA 181e69092beSFangrui Song 182e69092beSFangrui Song# Has arcs from exit blocks 183e69092beSFangrui SongRUN-DISABLED: llvm-cov gcov test_exit_block_arcs.c 2>&1 | FileCheck %s -check-prefix=EXIT_BLOCK_ARCS 184e69092beSFangrui SongEXIT_BLOCK_ARCS: (main) has arcs from exit block. 185e69092beSFangrui Song 186e69092beSFangrui Song 187e69092beSFangrui Song C: -: 0:Source:test.cpp 188e69092beSFangrui SongC-NEXT: -: 0:Graph:test.gcno 189e69092beSFangrui SongC-NEXT: -: 0:Data:test.gcda 190e69092beSFangrui SongC-NEXT: -: 0:Runs:1 191e69092beSFangrui SongC-NEXT: -: 0:Programs:1 192e69092beSFangrui SongC-NEXT: -: 1:#include "test.h" 193e69092beSFangrui SongC-NEXT: -: 2:#include <cstdlib> 194e69092beSFangrui SongC-NEXT: -: 3: 195e69092beSFangrui SongC-NEXT: -: 4:bool on = false; 196e69092beSFangrui SongC-NEXT: -: 5:int len = 42; 197e69092beSFangrui SongC-NEXT: -: 6:double grid[10][10] = {0}; 198e69092beSFangrui SongC-NEXT: -: 7:const char * hello = "world"; 199e69092beSFangrui SongC-NEXT: -: 8:const char * world = "hello"; 200e69092beSFangrui SongC-NEXT: -: 9: 201e69092beSFangrui Song C-B:function _ZN1A1BEv called 4294967296 returned 100% blocks executed 100% 202e69092beSFangrui SongC-NEXT:4294967296: 10:void A::B() {} 203e69092beSFangrui Song C-A:4294967296: 10-block 0 204e69092beSFangrui Song C-U:unconditional 0 taken 100% 205e69092beSFangrui Song C-A:4294967296: 10-block 1 206e69092beSFangrui Song C-U:unconditional 1 taken 100% 207e69092beSFangrui SongC-NEXT: -: 11: 208e69092beSFangrui Song C-B:function _Z7uselessv called 0 returned 0% blocks executed 0% 209e69092beSFangrui SongC-NEXT: #####: 12:void useless() {} 210e69092beSFangrui Song C-A: $$$$$: 12-block 0 211e69092beSFangrui Song C-U:unconditional 0 never executed 212e69092beSFangrui Song C-A: $$$$$: 12-block 1 213e69092beSFangrui Song C-U:unconditional 1 never executed 214e69092beSFangrui SongC-NEXT: -: 13: 215e69092beSFangrui Song C-B:function _Z12more_uselessv called 0 returned 0% blocks executed 0% 216e69092beSFangrui SongC-NEXT: #####: 14:double more_useless() { 217e69092beSFangrui SongC-NEXT: #####: 15: return 0; 218e69092beSFangrui Song C-A: $$$$$: 15-block 0 219e69092beSFangrui Song C-U:unconditional 0 never executed 220e69092beSFangrui Song C-A: $$$$$: 15-block 1 221e69092beSFangrui Song C-U:unconditional 1 never executed 222e69092beSFangrui SongC-NEXT: -: 16:} 223e69092beSFangrui SongC-NEXT: -: 17: 224e69092beSFangrui Song C-B:function _Z3foov called 1 returned 100% blocks executed 100% 225e69092beSFangrui SongC-NEXT: 1: 18:int foo() { 226e69092beSFangrui SongC-NEXT: 1: 19: on = true; 227e69092beSFangrui Song C-A: 1: 19-block 0 228e69092beSFangrui Song C-U:unconditional 0 taken 100% 229e69092beSFangrui SongC-NEXT: 1: 20: return 3; 230e69092beSFangrui Song C-A: 1: 20-block 0 231e69092beSFangrui Song C-U:unconditional 0 taken 100% 232e69092beSFangrui SongC-NEXT: -: 21:} 233e69092beSFangrui SongC-NEXT: -: 22: 234e69092beSFangrui Song C-B:function _Z3barv called 0 returned 0% blocks executed 0% 235e69092beSFangrui SongC-NEXT: #####: 23:int bar() { 236e69092beSFangrui SongC-NEXT: #####: 24: len--; 237e69092beSFangrui Song C-A: $$$$$: 24-block 0 238e69092beSFangrui Song C-U:unconditional 0 never executed 239e69092beSFangrui SongC-NEXT: #####: 25: return foo() + 45; 240e69092beSFangrui Song C-A: $$$$$: 25-block 0 241e69092beSFangrui Song C-U:unconditional 0 never executed 242e69092beSFangrui SongC-NEXT: -: 26:} 243e69092beSFangrui SongC-NEXT: -: 27: 244e69092beSFangrui Song C-B:function _Z6assignii called 4 returned 100% blocks executed 100% 245e69092beSFangrui SongC-NEXT: 4: 28:void assign(int ii, int jj) { 246e69092beSFangrui Song C-A: 4: 28-block 0 247e69092beSFangrui Song C-U:unconditional 0 taken 100% 248e69092beSFangrui SongC-NEXT: 4: 29: grid[ii][jj] = (ii+1) * (jj+1); 249e69092beSFangrui SongC-NEXT: 4: 30:} 250e69092beSFangrui Song C-A: 4: 30-block 0 251e69092beSFangrui Song C-U:unconditional 0 taken 100% 252e69092beSFangrui SongC-NEXT: -: 31: 253e69092beSFangrui Song C-B:function _Z15initialize_gridv called 1 returned 100% blocks executed 100% 254e69092beSFangrui SongC-NEXT: 1: 32:void initialize_grid() { 255e69092beSFangrui SongC-NEXT: 3: 33: for (int ii = 0; ii < 2; ii++) 256e69092beSFangrui Song C-A: 1: 33-block 0 257e69092beSFangrui Song C-U:unconditional 0 taken 100% 258e69092beSFangrui Song C-A: 1: 33-block 1 259e69092beSFangrui Song C-U:unconditional 1 taken 100% 260e69092beSFangrui Song C-A: 3: 33-block 2 261e69092beSFangrui Song C-B:branch {{[02]}} taken 67% 262e69092beSFangrui Song C-B:branch {{[13]}} taken 33% 263e69092beSFangrui Song C-A: 2: 33-block 3 264e69092beSFangrui Song C-U:unconditional 4 taken 100% 265e69092beSFangrui SongC-NEXT: 6: 34: for (int jj = 0; jj < 2; jj++) 266e69092beSFangrui Song C-A: 2: 34-block 0 267e69092beSFangrui Song C-U:unconditional 0 taken 100% 268e69092beSFangrui Song C-A: 6: 34-block 1 269e69092beSFangrui Song C-B:branch {{[01]}} taken 67% 270e69092beSFangrui Song C-B:branch {{[12]}} taken 33% 271e69092beSFangrui Song C-A: 4: 34-block 2 272e69092beSFangrui Song C-U:unconditional 3 taken 100% 273e69092beSFangrui SongC-NEXT: 6: 35: assign(ii, jj); 274e69092beSFangrui Song C-A: 4: 35-block 0 275e69092beSFangrui Song C-U:unconditional 0 taken 100% 276e69092beSFangrui Song C-A: 2: 35-block 1 277e69092beSFangrui Song C-U:unconditional 1 taken 100% 278e69092beSFangrui SongC-NEXT: 1: 36:} 279e69092beSFangrui Song C-A: 1: 36-block 0 280e69092beSFangrui Song C-U:unconditional 0 taken 100% 281e69092beSFangrui SongC-NEXT: -: 37: 282e69092beSFangrui Song C-B:function main called 1 returned 100% blocks executed 94% 283e69092beSFangrui SongC-NEXT: 1: 38:int main() { 284e69092beSFangrui Song C-A: 1: 38-block 0 285e69092beSFangrui Song C-U:unconditional 0 taken 100% 286e69092beSFangrui SongC-NEXT: 1: 39: initialize_grid(); 287e69092beSFangrui SongC-NEXT: -: 40: 288e69092beSFangrui SongC-NEXT: 1: 41: int a = 2; 289e69092beSFangrui SongC-NEXT: 1: 42: on = rand() % 2; 290e69092beSFangrui SongC-NEXT: 1: 43: if (on) { 291e69092beSFangrui Song C-A: 1: 43-block 0 292e69092beSFangrui Song C-B:branch 0 taken 100% 293e69092beSFangrui Song C-B:branch 1 taken 0% 294e69092beSFangrui SongC-NEXT: 1: 44: foo(); 295e69092beSFangrui SongC-NEXT: 1: 45: ++a; 296e69092beSFangrui SongC-NEXT: 1: 46: } else { 297e69092beSFangrui Song C-A: 1: 46-block 0 298e69092beSFangrui Song C-U:unconditional 0 taken 100% 299e69092beSFangrui SongC-NEXT: #####: 47: bar(); 300e69092beSFangrui SongC-NEXT: #####: 48: a += rand(); 301e69092beSFangrui Song C-A: $$$$$: 48-block 0 302e69092beSFangrui Song C-U:unconditional 0 never executed 303e69092beSFangrui SongC-NEXT: -: 49: } 304e69092beSFangrui SongC-NEXT: -: 50: 305e69092beSFangrui SongC-NEXT: 11: 51: for (int ii = 0; ii < 10; ++ii) { 306e69092beSFangrui Song C-A: 1: 51-block 0 307e69092beSFangrui Song C-U:unconditional 0 taken 100% 308e69092beSFangrui Song C-A: 11: 51-block 1 309e69092beSFangrui Song C-B:branch {{[01]}} taken 91% 310e69092beSFangrui Song C-B:branch {{[12]}} taken 9% 311e69092beSFangrui Song C-A: 10: 51-block 2 312e69092beSFangrui Song C-U:unconditional 3 taken 100% 313e69092beSFangrui SongC-NEXT: 10: 52: switch (rand() % 5) { 314e69092beSFangrui Song C-A: 10: 52-block 0 315e69092beSFangrui Song C-B:branch 0 taken 10% 316e69092beSFangrui Song C-B:branch 1 taken 20% 317e69092beSFangrui Song C-B:branch 2 taken 0% 318e69092beSFangrui Song C-B:branch 3 taken 40% 319e69092beSFangrui Song C-B:branch 4 taken 30% 320e69092beSFangrui SongC-NEXT: -: 53: case 0: 321e69092beSFangrui SongC-NEXT: 2: 54: a += rand(); 322e69092beSFangrui SongC-NEXT: 2: 55: break; 323e69092beSFangrui Song C-A: 2: 55-block 0 324e69092beSFangrui Song C-U:unconditional 0 taken 100% 325e69092beSFangrui SongC-NEXT: -: 56: case 1: 326e69092beSFangrui SongC-NEXT: -: 57: case 2: 327e69092beSFangrui SongC-NEXT: 4: 58: a += rand() / rand(); 328e69092beSFangrui SongC-NEXT: 4: 59: break; 329e69092beSFangrui Song C-A: 4: 59-block 0 330e69092beSFangrui Song C-U:unconditional 0 taken 100% 331e69092beSFangrui SongC-NEXT: -: 60: case 3: 332e69092beSFangrui SongC-NEXT: 3: 61: a -= rand(); 333e69092beSFangrui SongC-NEXT: 3: 62: break; 334e69092beSFangrui Song C-A: 3: 62-block 0 335e69092beSFangrui Song C-U:unconditional 0 taken 100% 336e69092beSFangrui SongC-NEXT: -: 63: default: 337e69092beSFangrui SongC-NEXT: 1: 64: a = -1; 338e69092beSFangrui SongC-NEXT: 1: 65: } 339e69092beSFangrui Song C-A: 1: 65-block 0 340e69092beSFangrui Song C-U:unconditional 0 taken 100% 341e69092beSFangrui SongC-NEXT: 10: 66: } 342e69092beSFangrui Song C-A: 10: 66-block 0 343e69092beSFangrui Song C-U:unconditional 0 taken 100% 344e69092beSFangrui SongC-NEXT: -: 67: 345e69092beSFangrui SongC-NEXT: 1: 68: A thing; 346e69092beSFangrui SongC-NEXT:4294967297: 69: for (uint64_t ii = 0; ii < 4294967296; ++ii) 347e69092beSFangrui Song C-A: 1: 69-block 0 348e69092beSFangrui Song C-U:unconditional 0 taken 100% 349e69092beSFangrui Song C-A:4294967297: 69-block 1 350e69092beSFangrui Song C-B:branch {{[01]}} taken 99% 351e69092beSFangrui Song C-B:branch {{[12]}} taken 1% 352e69092beSFangrui Song C-A:4294967296: 69-block 2 353e69092beSFangrui Song C-U:unconditional 3 taken 100% 354e69092beSFangrui SongC-NEXT:4294967296: 70: thing.B(); 355e69092beSFangrui Song C-A:4294967296: 70-block 0 356e69092beSFangrui Song C-U:unconditional 0 taken 100% 357e69092beSFangrui SongC-NEXT: -: 71: 358e69092beSFangrui SongC-NEXT: 1: 72: return a + 8 + grid[2][3] + len; 359e69092beSFangrui Song C-A: 1: 72-block 0 360e69092beSFangrui Song C-U:unconditional 0 taken 100% 361e69092beSFangrui SongC-NEXT: -: 73: return more_useless(); 362e69092beSFangrui SongC-NEXT: -: 74:} 363e69092beSFangrui Song 36424563b8dSOleksii Odynochenko H: -: 0:Source:test.h 365e69092beSFangrui SongH-NEXT: -: 0:Graph:test.gcno 366e69092beSFangrui SongH-NEXT: -: 0:Data:test.gcda 367e69092beSFangrui SongH-NEXT: -: 0:Runs:1 368e69092beSFangrui SongH-NEXT: -: 0:Programs:1 369e69092beSFangrui SongH-NEXT: -: 1:#include <stdint.h> 370e69092beSFangrui Song H-B:function _ZN1AC2Ev called 1 returned 100% blocks executed 100% 371e69092beSFangrui SongH-NEXT: 1: 2:struct A { 372e69092beSFangrui Song H-A: 1: 2-block 0 373e69092beSFangrui Song H-U:unconditional 0 taken 100% 374e69092beSFangrui SongH-NEXT: -: 3: virtual void B(); 375e69092beSFangrui SongH-NEXT: -: 4:}; 376