cord - Rearrange procedures in an executable file to facilitate better cache mapping
cord [-v] [-o outfile] [-f] [-c cachesize] [-p maxphases] obj-file reorder-file
command accepts these options:
Print verbose information. This includes listing those procedures
considered part of other procedures and cannot be rearranged (these are basically
assembler procedures that may contain relative branches to other procedures
rather than relocatable ones). The listing also lists those procedures in
the flipped area (if any) and a mapping of old location to new.
Flip the first cachepage size procedures. The assumption when
cord was written was that procedures would be reordered by procedure density
(cycles/byte). This option ensures that the densest part of each page following
the first cachepage would conflict with the least-dense part of the first
Specify the cachesize (in bytes) of the machine on which you
want to execute. This only affects the
option. If not specified,
65536 is used.
Specifies the output file. If not specified,
specifies the maximum number phases allowed. The default is
The cord command rearranges procedures in an executable object file to maximize efficiency in a machine's cache. By rearranging the procedures properly, we end up reducing the instruction cache miss rates. The cord command does not attempt to determine the correct ordering, but is given a reorder file containing the desired procedure order. The reorder file is generated by the ftoc program, which in turn generates a reorder file from a set of profile feedback files (see prof(1)).
Processed lines in the reorder file are called procedure lines. Each procedure line must be on a separate source line. Each procedure line must contain the source name of the file, followed by a blank followed by a qualified procedure name. Nested procedures must be qualified x.y where x is the outer procedure. A newline or blank can follow the procedure name:
foo.c bar (everything else following is ignored)
Lines beginning with # are comments, lines beginning with $ are considered cord directive lines. The only directive currently understood is $phase. This directive will consider the rest of the file (until the end of file or next $phase) as a new phase of the program and will order the procedures accordingly. A procedure may appear in more than one phase, resulting in more than one copy of it in the final binary. First, cord will try to relocate procedure references to a copy of the procedure belonging to the requesting phase; otherwise it will relocate the references to a random copy.
Use the -cord option to a compiler driver like cc(1) rather than execute cord directly. cord options can be specified with -Wz,cordarg0,cordarg1,.... If you have to run cord by hand, you may want to run it once with the driver using the -v option on a simple program. This will enable you to see the exact passes and the arguments involved in using cord.
Since cord works from an input list of procedures generated from profile output, the resulting binary is data dependent. In other words, it may only perform well on the same input data that generated the profile information, and may perform worse than the original binary on other data. Furthermore, if the hot areas in the cache do not fit well into one cachepage, performance can degrade.
cc(1), ftoc(1), ld(1), prof(1)