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.