Brief description of `gcov' data files
======================================
`gcov' uses three files for doing profiling. The names of these
files are derived from the original *source* file by substituting the
file suffix with either `.bb', `.bbg', or `.da'. All of these files
are placed in the same directory as the source file, and contain data
stored in a platform-independent method.
The `.bb' and `.bbg' files are generated when the source file is
compiled with the GNU CC `-ftest-coverage' option. The `.bb' file
contains a list of source files (including headers), functions within
those files, and line numbers corresponding to each basic block in the
source file.
The `.bb' file format consists of several lists of 4-byte integers
which correspond to the line numbers of each basic block in the file.
Each list is terminated by a line number of 0. A line number of -1 is
used to designate that the source file name (padded to a 4-byte
boundary and followed by another -1) follows. In addition, a line
number of -2 is used to designate that the name of a function (also
padded to a 4-byte boundary and followed by a -2) follows.
The `.bbg' file is used to reconstruct the program flow graph for
the source file. It contains a list of the program flow arcs (possible
branches taken from one basic block to another) for each function which,
in combination with the `.bb' file, enables gcov to reconstruct the
program flow.
In the `.bbg' file, the format is:
number of basic blocks for function #0 (4-byte number)
total number of arcs for function #0 (4-byte number)
count of arcs in basic block #0 (4-byte number)
destination basic block of arc #0 (4-byte number)
flag bits (4-byte number)
destination basic block of arc #1 (4-byte number)
flag bits (4-byte number)
...
destination basic block of arc #N (4-byte number)
flag bits (4-byte number)
count of arcs in basic block #1 (4-byte number)
destination basic block of arc #0 (4-byte number)
flag bits (4-byte number)
...
A -1 (stored as a 4-byte number) is used to separate each function's
list of basic blocks, and to verify that the file has been read
correctly.
The `.da' file is generated when a program containing object files
built with the GNU CC `-fprofile-arcs' option is executed. A separate
`.da' file is created for each source file compiled with this option,
and the name of the `.da' file is stored as an absolute pathname in the
resulting object file. This path name is derived from the source file
name by substituting a `.da' suffix.
The format of the `.da' file is fairly simple. The first 8-byte
number is the number of counts in the file, followed by the counts
(stored as 8-byte numbers). Each count corresponds to the number of
times each arc in the program is executed. The counts are cumulative;
each time the program is executed, it attemps to combine the existing
`.da' files with the new counts for this invocation of the program. It
ignores the contents of any `.da' files whose number of arcs doesn't
correspond to the current program, and merely overwrites them instead.
All three of these files use the functions in `gcov-io.h' to store
integers; the functions in this header provide a machine-independent
mechanism for storing and retrieving data from a stream.