Chapter 8 277
Ways to Improve Performance
Profile-Based Optimization
Instrumenting (+I/-I)
Although you can use the linker alone to perform PBO, the best
optimizations result if you use the compiler as well; this section describes
this approach.
To instrument an application (with C, C++, and FORTRAN), compile the
source with the +I compiler command line option. This causes the
compiler to generate a .o file containing intermediate code, rather than
the usual object code. (Intermediate code is a representation of your
code that is lower-level than the source code, but higher level than the
object code.) A file containing such intermediate code is referred to as an
I-SOM file.
After creating an I-SOM file for each source file, the compiler invokes the
linker as follows:
1. In 32-bit mode, instead of using the startup file
/usr/ccs/lib/crt0.o, the compiler specifies a special startup file
named /opt/langtools/lib/icrt0.o. When building a shared
library, the compiler uses /usr/ccs/lib/scrt0.o. In 64-bit mode,
the linker automatically adds
/usr.css/lib/pa20_64/fdp_init.o or
/usr.css/lib/pa20_64/fdp_init_sl.o to the link when detects
that -I crt0.o is not changed.
2. The compiler passes the -I option to the linker, causing it to place
instrumentation code in the resulting executable.
You can see how the compiler invokes the linker by specifying the -v
option. For example, to instrument the file sample.c, to name the
executable sample.inst, to perform level 2 optimizations (the compiler
option -O is equivalent to +O2), and to see verbose output (-v):
$ cc -v -o sample.inst +I -O sample.c
/opt/langtools/lbin/cpp sample.c /var/tmp/ctm123
/opt/ansic/lbin/ccom /var/tmp/ctm123 sample.o -O2 -I
/usr/ccs/bin/ld /opt/langtools/lib/icrt0.o -u main -o \
sample.inst sample.o -I -lc
Notice in the linker command line (starting with /usr/ccs/bin/ld),
the application is linked with /opt/langtools/lib/icrt0.o and the
-I option is given.
To save the profile data to a file other than flow.data in the current
working directory, use the FLOW_DATA environment variable as
described in “Specifying a Different flow.data with FLOW_DATA”.