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 optimisations.
     
- 
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 optimisation for other optimisations, 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 optimisation 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 optimised in this way, because they can always be referred to and called via
         the RTTI (which the compiler cannot detect).
         
- Such optimisations are not yet done for virtual class methods.
 
- 
wsymbolliveness 
- This parameter does not perform any optimisation 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 optimisations).
     Again, there are some limitations:
          
         - This optimisation 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 optimisation (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.