The -OW and -Ow command-line options require a comma-separated list of whole-program-optimization
options. These are strings, each string denotes an option. The following is a list of available
options:
-
all
- This enables all available whole program optimizations.
-
devirtcalls
- Changes virtual method calls into normal (static) method calls when the
compiler can determine that a virtual method call will always go to the same static
method. This makes such code both smaller and faster. In general, it is mainly an
enabling optimization for other optimizations, because it makes the program easier to
analyse due to the fact that it reduces indirect control flow.
There are 2 limitations to this option:
- The current implementation is context-insensitive. This means that the compiler
only looks at the program as a whole and determines for each class type which
methods can be devirtualised, rather than that it looks at each call statement and
the surrounding code to determine whether or not this call can be devirtualised;
- The current implementation does not yet devirtualise interface method calls. Not
when calling them via an interface instance, nor when calling them via a class
instance.
-
optvmts
- This optimization looks at which class types can be instantiated and which virtual
methods can be called in a program, and based on this information it replaces virtual method
table (VMT) entries that can never be called with references to FPC_ABSTRACTERROR.
This means that such methods, unless they are called directly via an inherited call from a
child class/object, can be removed by the linker. It has little or no effect on speed, but can
help reducing code size.
This option has 2 limitations:
- Methods that are published, or getters/setters of published properties, can never
be optimized in this way, because they can always be referred to and called via
the RTTI (which the compiler cannot detect).
- Such optimizations are not yet done for virtual class methods.
-
wsymbolliveness
- This parameter does not perform any optimization by itself. It simply tells the
compiler to record which functions/procedures were kept by the linker in the final
program. During a subsequent wpo pass, the compiler can then ignore the removed
functions/procedures as far as WPO is concerned (e.g., if a particular class type is only
constructed in one unused procedure, then ignoring this procedure can improve the
effectiveness of the previous two optimizations).
Again, there are some limitations:
- This optimization requires that the nm utility is installed on the system. For
Linux binaries, objdump will also work. In the future, this information could also
be extracted from the internal linker for the platforms that it supports.
- Collecting information for this optimization (using -OWsymbolliveness) requires
that smart linking is enabled (-XX) and that symbol stripping is disabled (-Xs-).
When only using such previously collected information, these limitations do not
apply.