Assume you have two representative input files to use for profiling, input.file1 and input.file2. Now execute the following three commands:

$ sample.inst < input.file1

$ sample.inst < input.file2 $ mv flow.data sample.data

The first invocation of sample.inst creates the flow.data file and places an entry for that executable file in the data file. The second invocation increments the counters for sample.inst in the flow.data file. The third command moves the flow.data file to a file named sample.data. Step 3 Optimize To perform profile based optimizations on this application, relink the program as follows:

$ cc -v -o sample.opt +P +pgm sample.inst \ +df sample.data sample.o

/usr/ccs/bin/ld /usr/ccs/lib/crt0.o -u main -o sample.opt \ +pgm sample.inst +df sample.data sample.o -P -lc

Note that it is not necessary to recompile the source file. The +pgm option is used because the executable name used during instrumentation, sample.inst, does not match the current output file name, sample.opt. The +df option is necessary because the profile database file for the program has been moved from flow.data to sample.data.

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 -Ioption 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 -voption. For example, to instrument the file sample.c, to name the executable sample.inst, to perform level 2 optimizations (the compiler option -Ois 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 -Ioption 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 .

206 Improving Your Application Performance