Name
cflow - generate C flowgraph
Syntax
cflow [-r] [-ix] [-i_ ] [-dnum] files
Description
The cflow command analyzes a collection of C, yacc, lex,
assembler, and object files and attempts to build a graph
charting the external references. Files suffixed with .y,
.l, and .c are yacced, lexed, and C-preprocessed as
appropriate. The results of the preprocessed files, and
files suffixed with .i, are then run through the first pass
of lint(CP). Files suffixed with .s are assembled.
Assembled files, and files suffixed with .o, have
information extracted from their symbol tables. The results
are collected and turned into a graph of external references
which is displayed upon the standard output.
Each line of output begins with a reference number, followed
by a suitable number of tabs indicating the level, then the
name of the global symbol followed by a colon and its
definition. Normally only function names that do not begin
with an underscore are listed (see the -i options below).
For information extracted from C source, the definition
consists of an abstract type declaration (for example, char
*), and, delimited by angle brackets, the name of the source
file and the line number where the definition was found.
Definitions extracted from object files indicate the file
name and location counter under which the symbol appeared
(for example, text). Leading underscores in C-style
external names are deleted.
Once a definition of a name has been printed, subsequent
references to that name contain only the reference number of
the line where the definition may be found. For undefined
references, only <> is printed.
As an example, given the following in file.c:
int i;
main()
{
f();
g();
f();
}
f()
{
i = h();
}
the command
cflow -ix file.c
produces the output
1 main: int(), <file.c 4>
2 f: int(), <file.c 11>
3 h: <>
4 i: int, <file.c 1>
5 g: <>
When the nesting level becomes too deep, the output of cflow
can be piped to pr(C), using the -e option, to compress the
tab expansion to something less than every eight spaces.
In addition to the -D, -I, and -U options (which are
interpreted just as they are by cc(CP) and cpp(CP)), the
following options are interpreted by cflow:
-r Reverse the ``caller:callee'' relationship producing
an inverted listing showing the callers of each
function. The listing is also sorted in
lexicographical order by callee.
-ix Include external and static data symbols. The default
is to include only functions in the flowgraph.
-i_ Include names that begin with an underscore. The
default is to exclude these functions (and data if
-ix is used).
-dnum The num decimal integer indicates the depth at which
the flowgraph is cut off. By default this is a very
large number. Attempts to set the cutoff depth to a
nonpositive integer will be ignored.
See Also
as(CP), cc(CP), cpp(CP), lex(CP), lint(CP), nm(CP),
yacc(CP), pr(C)
Diagnostics
cflow complains about bad options. It also complains about
multiple definitions and only believes the first one. Other
messages may come from the various programs used (for
example, the C-preprocessor).
Notes
Files produced by lex(CP) and yacc(CP) cause the reordering
of line number declarations which can confuse cflow. To get
proper results, feed cflow the yacc or lex input.
Standards Conformance
cflow is conformant with:
AT&T SVID Issue 2, Select Code 307-127;
and The X/Open Portability Guide II of January 1987.
(printed 6/18/89)