xref: /llvm-project/llvm/test/tools/llvm-cov/gcov/basic.test (revision 5ccdce95b4842a472ee466e4ad1bdfa4e9eb31dc)
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