		README for GPROF

This is the GNU profiler.  It is distributed with other "binary
utilities" which should be in ../binutils.  See ../binutils/README for
more general notes, including where to send bug reports.

This file documents the changes and new features available with this
version of GNU gprof.

* New Features

 o Long options

 o Supports generalized file format, without breaking backward compatibility:
   new file format supports basic-block execution counts and non-realtime
   histograms (see below)

 o Supports profiling at the line level: flat profiles, call-graph profiles,
   and execution-counts can all be displayed at a level that identifies
   individual lines rather than just functions

 o Test-coverage support (similar to Sun tcov program): source files
   can be annotated with the number of times a function was invoked
   or with the number of times each basic-block in a function was
   executed

 o Generalized histograms: not just execution-time, but arbitrary
   histograms are support (for example, performance counter based
   profiles)

 o Powerful mechanism to select data to be included/excluded from
   analysis and/or output

 o Support for DEC OSF/1 v3.0

 o Full cross-platform profiling support: gprof uses BFD to support
   arbitrary, non-native object file formats and non-native byte-orders
   (this feature has not been tested yet)

 o In the call-graph function index, static function names are now
   printed together with the filename in which the function was defined
   (required bfd_find_nearest_line() support and symbolic debugging
    information to be present in the executable file)

 o Major overhaul of source code (compiles cleanly with -Wall, etc.)

* Supported Platforms

The current version is known to work on:

 o DEC OSF/1 v3.0
	All features supported.

 o SunOS 4.1.x
	All features supported.

 o Solaris 2.3
	Line-level profiling unsupported because bfd_find_nearest_line()
	is not fully implemented for Elf binaries.

 o HP-UX 9.01
	Line-level profiling unsupported because bfd_find_nearest_line()
	is not fully implemented for SOM binaries.

* Detailed Description

** User Interface Changes

The command-line interface is backwards compatible with earlier
versions of GNU gprof and Berkeley gprof.  The only exception is
the option to delete arcs from the call graph.  The old syntax
was:

	-k fromname toname

while the new syntax is:

	-k fromname/toname

This change was necessary to be compatible with long-option parsing.
Also, "fromname" and "toname" can now be arbitrary symspecs rather
than just function names (see below for an explanation of symspecs).
For example, option "-k gprof.c/" suppresses all arcs due to calls out
of file "gprof.c".

*** Sym Specs

It is often necessary to apply gprof only to specific parts of a
program.  GNU gprof has a simple but powerful mechanism to achieve
this.  So called {\em symspecs\/} provide the foundation for this
mechanism.  A symspec selects the parts of a profiled program to which
an operation should be applied to.  The syntax of a symspec is
simple:

	  filename_containing_a_dot
	| funcname_not_containing_a_dot
	| linenumber
	| ( [ any_filename ] `:' ( any_funcname | linenumber ) )

Here are some examples:

	main.c			Selects everything in file "main.c"---the
				dot in the string tells gprof to interpret
				the string as a filename, rather than as
				a function name.  To select a file whose
				name does contain a dot, a trailing colon
				should be specified.  For example, "odd:" is
				interpreted as the file named "odd".

	main			Selects all functions named "main".  Notice
				that there may be multiple instances of the
				same function name because some of the
				definitions may be local (i.e., static).
				Unless a function name is unique in a program,
				you must use the colon notation explained
				below to specify a function from a specific
				source file.  Sometimes, functionnames contain
				dots.  In such cases, it is necessary to
				add a leading colon to the name.  For example,
				":.mul" selects function ".mul".

	main.c:main		Selects function "main" in file "main.c".

	main.c:134		Selects line 134 in file "main.c".

IMPLEMENTATION NOTE: The source code uses the type sym_id for symspecs.
At some point, this probably ought to be changed to "sym_spec" to make
reading the code easier.

*** Long options

GNU gprof now supports long options.  The following is a list of all
supported options.  Options that are listed without description
operate in the same manner as the corresponding option in older
versions of gprof.

Short Form:	Long Form:
-----------	----------
-l		--line
			Request profiling at the line-level rather
			than just at the function level.  Source
			lines are identified by symbols of the form:

				func (file:line)

			where "func" is the function name, "file" is the
			file name and "line" is the line-number that
			corresponds to the line.

			To work properly, the binary must contain symbolic
			debugging information.  This means that the source
			have to be translated with option "-g" specified.
			Functions for which there is no symbolic debugging
			information available are treated as if "--line"
			had not been specified.  However, the line number
			printed with such symbols is usually incorrect
			and should be ignored.

-a		--no-static
-A[symspec]	--annotated-source[=symspec]
			Request output in the form of annotated source
			files.  If "symspec" is specified, print output only
			for symbols selected by "symspec".  If the option
			is specified multiple times, annotated output is
			generated for the union of all symspecs.

			Examples:

			  -A		Prints annotated source for all
					source files.
			  -Agprof.c	Prints annotated source for file
					gprof.c.
			  -Afoobar	Prints annotated source for files
					containing a function named "foobar".
					The entire file will be printed, but
					only the function itself will be
					annotated with profile data.

-J[symspec]	--no-annotated-source[=symspec]
			Suppress annotated source output.  If specified
			without argument, annotated output is suppressed
			completely.  With an argument, annotated output
			is suppressed only for the symbols selected by
			"symspec".  If the option is specified multiple
			times, annotated output is suppressed for the
			union of all symspecs.  This option has lower
			precedence than --annotated-source

-p[symspec]	--flat-profile[=symspec]
			Request output in the form of a flat profile
			(unless any other output-style option is specified,
			 this option is turned on by default).  If
			"symspec" is specified, include only symbols
			selected by "symspec" in flat profile.  If the
			option is specified multiple times, the flat
			profile includes symbols selected by the union
			of all symspecs.

-P[symspec]	--no-flat-profile[=symspec]
			Suppress output in the flat profile.  If given
			without an argument, the flat profile is suppressed
			completely.  If "symspec" is specified, suppress
			the selected symbols in the flat profile.  If the
			option is specified multiple times, the union of
			the selected symbols is suppressed.  This option
			has lower precedence than --flat-profile.

-q[symspec]	--graph[=symspec]
			Request output in the form of a call-graph
			(unless any other output-style option is specified,
			 this option is turned on by default).  If "symspec"
			is specified, include only symbols selected by
			"symspec" in the call-graph.  If the option is
			specified multiple times, the call-graph includes
			symbols selected by the union of all symspecs.

-Q[symspec]	--no-graph[=symspec]
			Suppress output in the call-graph.  If given without
			an argument, the call-graph is suppressed completely.
			With a "symspec", suppress the selected symbols
			from the call-graph.  If the option is specified
			multiple times, the union of the selected symbols
			is suppressed.  This option has lower precedence
			than --graph.

-C[symspec]	--exec-counts[=symspec]
			Request output in the form of execution counts.
			If "symspec" is present, include only symbols
			selected by "symspec" in the execution count
			listing.  If the option is specified multiple
			times, the execution count listing includes
			symbols selected by the union of all symspecs.

-Z[symspec]	--no-exec-counts[=symspec]
			Suppress output in the execution count listing.
			If given without an argument, the listing is
			suppressed completely.  With a "symspec", suppress
			the selected symbols from the call-graph.  If the
			option is specified multiple times, the union of
			the selected symbols is suppressed.  This option
			has lower precedence than --exec-counts.

-i		--file-info
			Print information about the profile files that
			are read.  The information consists of the
			number and types of records present in the
			profile file.  Currently, a profile file can
			contain any number and any combination of histogram,
			call-graph, or basic-block count records.

-s		--sum

-x		--all-lines
			This option affects annotated source output only.
			By default, only the lines at the beginning of
			a basic-block are annotated.  If this option is
			specified, every line in a basic-block is annotated
			by repeating the annotation for the first line.
			This option is identical to tcov's "-a".

-I dirs		--directory-path=dirs
			This option affects annotated source output only.
			Specifies the list of directories to be searched
			for source files.  The argument "dirs" is a colon
			separated list of directories.  By default, gprof
			searches for source files relative to the current
			working directory only.

-z		--display-unused-functions

-m num		--min-count=num
			This option affects annotated source and execution
			count output only.  Symbols that are executed
			less than "num" times are suppressed.  For annotated
			source output, suppressed symbols are marked
			by five hash-marks (#####).  In an execution count
			output, suppressed symbols do not appear at all.

-L		--print-path
			Normally, source filenames are printed with the path
			component suppressed.  With this option, gprof
			can be forced to print the full pathname of
			source filenames.  The full pathname is determined
			from symbolic debugging information in the image file
			and is relative to the directory in which the compiler
			was invoked.

-y		--separate-files
			This option affects annotated source output only.
			Normally, gprof prints annotated source files
			to standard-output.  If this option is specified,
			annotated source for a file named "path/filename"
			is generated in the file "filename-ann".  That is,
			annotated output is {\em always\/} generated in
			gprof's current working directory.  Care has to
			be taken if a program consists of files that have
			identical filenames, but distinct paths.

-c		--static-call-graph

-t num		--table-length=num
			This option affects annotated source output only.
			After annotating a source file, gprof generates
			an execution count summary consisting of a table
			of lines with the top execution counts.  By
			default, this table is ten entries long.
			This option can be used to change the table length
			or, by specifying an argument value of 0, it can be
			suppressed completely.

-n symspec	--time=symspec
			Only symbols selected by "symspec" are considered
			in total and percentage time computations.
			However, this option does not affect percentage time
			computation for the flat profile.
			If the option is specified multiple times, the union
			of all selected symbols is used in time computations.

-N		--no-time=symspec
			Exclude the symbols selected by "symspec" from
			total and percentage time computations.
			However, this option does not affect percentage time
			computation for the flat profile.
			This option is ignored if any --time options are
			specified.

-w num		--width=num
			Sets the output line width.  Currently, this option
			affects the printing of the call-graph function index
			only.

-e		<no long form---for backwards compatibility only>
-E		<no long form---for backwards compatibility only>
-f		<no long form---for backwards compatibility only>
-F		<no long form---for backwards compatibility only>
-k		<no long form---for backwards compatibility only>
-b		--brief
-dnum		--debug[=num]

-h		--help
			Prints a usage message.

-O name		--file-format=name
			Selects the format of the profile data files.
			Recognized formats are "auto", "bsd", "magic",
			and "prof".  The last one is not yet supported.
			Format "auto" attempts to detect the file format
			automatically (this is the default behavior).
			It attempts to read the profile data files as
			"magic" files and if this fails, falls back to
			the "bsd" format.  "bsd" forces gprof to read
			the data files in the BSD format.  "magic" forces
			gprof to read the data files in the "magic" format.

-T		--traditional
-v		--version

** File Format Changes

The old BSD-derived format used for profile data does not contain a
magic cookie that allows one to check whether a data file really is a
gprof file.  Furthermore, it does not provide a version number, thus
rendering changes to the file format almost impossible.  GNU gprof
uses a new file format that provides these features.  For backward
compatibility, GNU gprof continues to support the old BSD-derived
format, but not all features are supported with it.  For example,
basic-block execution counts cannot be accommodated by the old file
format.

The new file format is defined in header file \file{gmon_out.h}.  It
consists of a header containing the magic cookie and a version number,
as well as some spare bytes available for future extensions.  All data
in a profile data file is in the native format of the host on which
the profile was collected.  GNU gprof adapts automatically to the
byte-order in use.

In the new file format, the header is followed by a sequence of
records.  Currently, there are three different record types: histogram
records, call-graph arc records, and basic-block execution count
records.  Each file can contain any number of each record type.  When
reading a file, GNU gprof will ensure records of the same type are
compatible with each other and compute the union of all records.  For
example, for basic-block execution counts, the union is simply the sum
of all execution counts for each basic-block.

*** Histogram Records

Histogram records consist of a header that is followed by an array of
bins.  The header contains the text-segment range that the histogram
spans, the size of the histogram in bytes (unlike in the old BSD
format, this does not include the size of the header), the rate of the
profiling clock, and the physical dimension that the bin counts
represent after being scaled by the profiling clock rate.  The
physical dimension is specified in two parts: a long name of up to 15
characters and a single character abbreviation.  For example, a
histogram representing real-time would specify the long name as
"seconds" and the abbreviation as "s".  This feature is useful for
architectures that support performance monitor hardware (which,
fortunately, is becoming increasingly common).  For example, under DEC
OSF/1, the "uprofile" command can be used to produce a histogram of,
say, instruction cache misses.  In this case, the dimension in the
histogram header could be set to "i-cache misses" and the abbreviation
could be set to "1" (because it is simply a count, not a physical
dimension).  Also, the profiling rate would have to be set to 1 in
this case.

Histogram bins are 16-bit numbers and each bin represent an equal
amount of text-space.  For example, if the text-segment is one
thousand bytes long and if there are ten bins in the histogram, each
bin represents one hundred bytes.


*** Call-Graph Records

Call-graph records have a format that is identical to the one used in
the BSD-derived file format.  It consists of an arc in the call graph
and a count indicating the number of times the arc was traversed
during program execution.  Arcs are specified by a pair of addresses:
the first must be within caller's function and the second must be
within the callee's function.  When performing profiling at the
function level, these addresses can point anywhere within the
respective function.  However, when profiling at the line-level, it is
better if the addresses are as close to the call-site/entry-point as
possible.  This will ensure that the line-level call-graph is able to
identify exactly which line of source code performed calls to a
function.

*** Basic-Block Execution Count Records

Basic-block execution count records consist of a header followed by a
sequence of address/count pairs.  The header simply specifies the
length of the sequence.  In an address/count pair, the address
identifies a basic-block and the count specifies the number of times
that basic-block was executed.  Any address within the basic-address can
be used.

IMPLEMENTATION NOTE: gcc -a can be used to instrument a program to
record basic-block execution counts.  However, the __bb_exit_func()
that is currently present in libgcc2.c does not generate a gmon.out
file in a suitable format.  This should be fixed for future releases
of gcc.  In the meantime, contact davidm@cs.arizona.edu for a version
of __bb_exit_func() to is appropriate.

Copyright (C) 2012-2022 Free Software Foundation, Inc.

Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved.
