home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / lxopt122.zip / LXOPT.INF (.txt) < prev    next >
OS/2 Help File  |  1997-07-01  |  117KB  |  3,518 lines

  1.  
  2. ΓòÉΓòÉΓòÉ 1. Copyright and License Agreements  ΓòÉΓòÉΓòÉ
  3.  
  4.                         Copyright and License Agreements
  5.  
  6.  
  7. ΓòÉΓòÉΓòÉ 1.1. Copyright Notices  ΓòÉΓòÉΓòÉ
  8.  
  9.  Copyright Notices
  10.  
  11. LXOPT and the LXOPT logo are trademarks of Functional Software Limited. 
  12.  
  13. OS/2, C Set ++ and VisualAge C++ are trademarks of International Business 
  14. Machines Corporation. 
  15.  
  16. The LXOPT software and accompanying documentation may be distributed and used 
  17. free of charge but are copyright (C) 1994-1997 Functional Software Limited. All 
  18. rights reserved. 
  19.  
  20. Functional Software may be contacted via the internet at 
  21. funcsoft@cix.compulink.co.uk 
  22.  
  23.  
  24. ΓòÉΓòÉΓòÉ 1.2. LXOPT License Agreement  ΓòÉΓòÉΓòÉ
  25.  
  26.  LXOPT License Agreement
  27.  
  28. Definition of terms used in this agreement 
  29. LXOPT: The LXOPT software, utility programs and accompanying documentation. 
  30. USER: You, the purchaser of the LXOPT software. 
  31. FSL: Us, Functional Software Limited. 
  32. OUTPUT: Executable computer code, or derivative thereof, created or altered by 
  33. the LXOPT software. 
  34.  
  35. Acceptance 
  36. Use of LXOPT indicates acceptance by USER of the terms and conditions of this 
  37. agreement. 
  38.  
  39. If you do not agree to these terms and conditions you may not make use of LXOPT 
  40. and must destroy any and all installed copies of the software. 
  41.  
  42. Grant of License 
  43. The LXOPT software is copyright of Functional Software Limited.  FSL retains 
  44. ownership of LXOPT.  You are hereby granted a nonexclusive license to use LXOPT 
  45. subject to the permitted uses and restrictions contained in this agreement. 
  46.  
  47. Permitted Uses 
  48. LXOPT may be applied by USER to software owned by USER. 
  49.  
  50. LXOPT may be applied by USER to software licensed by USER where such actions 
  51. are consistent with that license. 
  52.  
  53. Copies of LXOPT may be freely distibuted provided that each copy is complete 
  54. and unaltered.  No fee may be made for distribution other than a nominal 
  55. distribution charge. 
  56.  
  57. USER may distribute unlimited copies of OUTPUT. 
  58.  
  59. USER may distribute unlimited copies of the files PRELOAD.EXE and PRELOAD.INF. 
  60.  
  61. Restrictions 
  62. USER may not alter LXOPT unless such alteration is approved by FSL. Such 
  63. prohibited alterations include, but are not limited to, the operation and 
  64. appearance of the software and the text of the documentation which shall 
  65. include this agreement and accompanying copyright notices. 
  66.  
  67. USER may not reverse compile, reverse engineer or reverse assemble any part of 
  68. the LXOPT software.  For the purposes of this agreement use of LXOPT as 
  69. described in the accompanying documentation shall not constitute reverse 
  70. engineering of the software. 
  71.  
  72. All rights not expressly granted by this agreement are retained by FSL. 
  73.  
  74. Limited Warranty 
  75. LXOPT does not work with all valid OS/2 executables.  Programming constructs 
  76. exist that defeat the mechanisms used within LXOPT.  It is the responsibility 
  77. of USER to test the suitability of LXOPT for USER's applications.  In view of 
  78. this USER assumes all liability and responsibility for the decision to use 
  79. LXOPT and all OUTPUT produced including any consequences thereof. 
  80.  
  81. LXOPT is supplied "AS IS", without warranty of any kind, either expressed or 
  82. implied, statutory or otherwise, including but not limited to the implied 
  83. warranties of merchantability or fitness for a particular purpose that may be 
  84. made by FSL or its software suppliers on this product.  No oral or written 
  85. information or advice given by FSL, its software suppliers, dealers, 
  86. distributors, agents or employees shall create a warranty and you cannot rely 
  87. on the correctness of any such information or advice. 
  88.  
  89. Neither FSL, its software suppliers, dealers, distributors, agents or employees 
  90. shall be liable for any direct, indirect, consequential or incidental damages. 
  91. Including but not limited to damages for loss of business profits, business 
  92. interruption or loss of business information, arising out of the use or 
  93. inability to use the software or accompanying documentation, whether or not FSL 
  94. has been advised of the possibility of such damages. 
  95.  
  96. Under no circumstances will FSL liability exceed the purchase price of the 
  97. software. 
  98.  
  99. Governing Law 
  100. This license is governed by the laws of England and USER agrees to submit to 
  101. the jurisdiction of the English courts. 
  102.  
  103. Where the local laws of USER prohibit the jurisdiction of English law this 
  104. license will be governed by the laws of the country in which LXOPT is used. 
  105.  
  106. FSL may, at its own discretion, elect to enforce, apply and interpret the terms 
  107. of this agreement under any applicable foreign jurisdiction. 
  108.  
  109. If any provision of this agreement is unenforceable, all others shall remain in 
  110. effect. Furthermore, any such unenforceable provision shall remain and be 
  111. interpreted in its strictest sense which remains consistent with governing law. 
  112.  
  113.  
  114. ΓòÉΓòÉΓòÉ 2. URGENT MESSAGE  ΓòÉΓòÉΓòÉ
  115.  
  116.  URGENT MESSAGE
  117.  
  118. This message only applies to OS/2 Warp 3.0 at FixPak level 10 or lower. Users 
  119. of OS/2 V2.x or Warp 3.0 users who have applied FixPak 11 or later may ignore 
  120. this message. All affected users are strongly advised to upgrade their OS/2 
  121. installation. 
  122.  
  123. There is an obscure software fault in the virtual memory manager of OS/2 WARP 
  124. V3.0 (PJ18014) where FixPak 11 or later has not been applied.  This fault can 
  125. result in the unpredictable corruption of a page of memory when an application 
  126. allocates memory in excess of the computers physical RAM and accesses/alters it 
  127. in a particular order forcing swapfile growth. 
  128.  
  129. Normal applications have little need to concern themselves with this problem. 
  130. Unfortunately LXOPT reliably reproduces the conditions for failure when 
  131. processing a large executable file.  For these purposes a file of 1Mb is 
  132. considered large, although the precise limit is unknown and will vary with 
  133. available RAM. 
  134.  
  135. The most common manifestation of the fault is the failure of an internal 
  136. consistency check resulting in an LXO0116 internal error.  Given the nature of 
  137. the fault errors can appear at any stage and some users have experienced the 
  138. generation of corrupt executable files where a page containing application code 
  139. has been corrupted before being written to disk.  Other users have experienced 
  140. protection violations or unexplained premature termination of the software. 
  141.  
  142. While all software faults are of concern, the unpredictability and potentially 
  143. undetectable nature of this fault make it particularly dangerous. 
  144.  
  145. A workaround involving the removal of the need for swapfile growth has fixed 
  146. all known manifestations of this problem.  This is achieved by pre-setting the 
  147. initial size of the swapfile in config.sys to a value that ensures that 
  148. execution of LXOPT will not require swapfile growth. 
  149.  
  150. To calculate the required figure multiply the size of the largest EXE/DLL to be 
  151. processed by 15 and add it to the 'normal' swapfile size as given by a 
  152. directory listing on your machine.  Obviously running other applications 
  153. simultaneously with LXOPT will affect swapfile requirements and the initial 
  154. swapfile size should be set accordingly.  Adding an additional 5 or 10Mb to the 
  155. resulting figure would be a wise precaution. 
  156.  
  157. The line below sets the initial swapfile size to 50Mb with a 2Mb minimum free 
  158. disk space limit. 
  159.  
  160.    SWAPPATH=D:\ 2048 51200
  161.  
  162. Regardless of file size, if you experience symptoms matching the description 
  163. above you should attempt this workaround. 
  164.  
  165.  
  166. ΓòÉΓòÉΓòÉ 3. This Software is FREE!  ΓòÉΓòÉΓòÉ
  167.  
  168.  This Software is FREE!
  169.  
  170. LXOPT is now freeware!  LXOPT was previously a commercial OS/2 development tool 
  171. but was withdrawn from sale at the end of January 1997.  Rather than allow the 
  172. software to disappear this final version is now distributed as unsupported 
  173. freeware. 
  174.  
  175. Unfortunately this also means that development for the OS/2 platform has 
  176. ceased.  Technical support for this freeware version is not available. 
  177.  
  178.  
  179. ΓòÉΓòÉΓòÉ 4. V1.22 - What's Changed?  ΓòÉΓòÉΓòÉ
  180.  
  181.  V1.22 - What's Changed?
  182.  
  183. Version 1.22 
  184.      Change to Freeware 
  185.      LXOPT is now distributed as unsupported freeware. 
  186.  
  187.  Version 1.21 
  188.      Demo Version Changes 
  189.      The LXOPT Demonstrator has been upgraded to include all the LXOPT utility 
  190.      programs and will now produce unrestricted applications when processing 
  191.      code of less than 256Kb in size. 
  192.  
  193.      TLINK Problems 
  194.      In some circumstances the Borland linker (TLINK) can generate invalid 
  195.      values in the fixup page table within executables.  LXOPT now detects and 
  196.      corrects illegal values. 
  197.  
  198.      Software Faults 
  199.      Fault corrected which could cause files arranged with /preload to reject 
  200.      preload requests. 
  201.  
  202.      Code recognition updated to prevent reported rejections of valid code 
  203.      sequences. 
  204.  
  205.      Code generation algorithm updated to prevent potentially endless 
  206.      application of transfer optimisation. 
  207.  
  208.  Version 1.2 
  209.      Code Preloader 
  210.      The new /preload option allows application code to be transferred to the 
  211.      swapfile at boot time.  A freely distributable preload utility works in 
  212.      combination with LXOPT processed code allowing users to selectively 
  213.      preload code.  Executed code is loaded direct from the swapfile with no 
  214.      need to apply fixups or for network traffic.  Preloads of network files 
  215.      may be automatically deferred until specific network drive(s) are 
  216.      available allowing preload requests (e.g. in startup.cmd) to be made prior 
  217.      to restoration of network connections. 
  218.  
  219.      Dead Code Elimination 
  220.      Code recognition algorithms have been revised to improve the detection and 
  221.      elimination of unused code/data in the processed code object.  Code 
  222.      previously included due to a cyclic reference or unused pointer reference 
  223.      (typically from unused CASE statement jump tables) is now removed. 
  224.  
  225.      Recording Efficiency 
  226.      Code path detection will now predict more code paths removing the need to 
  227.      record their use in the recording file.  Untraced sequences will execute 
  228.      faster and help reduce recording file sizes. 
  229.  
  230.      Fixup Encodings 
  231.      Generation of new fixup tables has been improved to allow the grouping of 
  232.      fixups with common targets.  Although previous versions of LXOPT performed 
  233.      this optimisation, some combinations were omitted.  This is particularly 
  234.      important for DLLs which typically contain a far larger quantity of fixups 
  235.      in relation to code size. 
  236.  
  237.      Undo Utility 
  238.      LXOPT now includes an undo utility.  Applied to processed DLL/EXE files 
  239.      this will restore the original unprocessed version of a file and delete 
  240.      any related files generated by LXOPT.  This utility is installed in the 
  241.      WPS as part of the installation process.  See UNLXOPT for more details. 
  242.  
  243.      DosGetMessage 
  244.      Code inserted from IBM libraries to handle DosGetMessage API calls 
  245.      violates an LXOPT restriction.  LXOPT now rejects such code which needs to 
  246.      be moved to another code object to operate correctly.  See the LXO0169 
  247.      error description for more details. 
  248.  
  249.      Default Recording File 
  250.      The default recording file pathname is now based on the absolute path name 
  251.      of the processed executable.  This forces recording files into the same 
  252.      directory as the executable by default.  Relative path names may still be 
  253.      specified using the /recFile option. 
  254.  
  255.      Software Faults 
  256.      Small EXE/DLL files produced by the Borland linker sometimes use 16 bit 
  257.      values to indicate entry points into 32 bit code.  This is a valid 
  258.      technique which is now correctly handled by LXOPT. 
  259.  
  260.      Some assembler routines in the Watcom floating point library contain 
  261.      operations which violate LXOPT restrictions.  V1.2 will now handle the 
  262.      violations which have been reported. 
  263.  
  264.      Assembler sequences inserted into code to help trace execution have been 
  265.      altered to avoid a potential memory update race condition with a store 
  266.      from an outstanding floating point instruction. 
  267.  
  268.      The method by which access to recording code is serialised has been 
  269.      updated.  This improves performance and prevents the deadlock that often 
  270.      occurred during recording sessions where multiple threads of varying 
  271.      priorities were executed. 
  272.  
  273.    Previous Changes
  274.  
  275.  Version 1.1 
  276.      Pricing 
  277.      The price of the single user license increased slightly and all 
  278.      distribution license fees were removed. 
  279.  
  280.      Processing Large EXE/DLL Files Under WARP 
  281.      Advice on how to avoid problems that may occur processing large EXE/DLL 
  282.      files under WARP has been revised.  It is important that LXOPT users are 
  283.      aware and act on this information.  See Urgent Message for details. 
  284.  
  285.      WARP Compressed Page Support 
  286.      LXOPT now supports the EXE/DLL file page compression introduced with OS/2 
  287.      WARP.  See the /pack2 option for more details. 
  288.  
  289.      New Arrangement Algorithms 
  290.      LXOPT has two new arrangement algorithms.  The binary algorithm arranges 
  291.      code based on the similarity of binary patterns of use and is the new 
  292.      default algorithm.  Parkonly, as the name suggests, parks unused code but 
  293.      performs no other arrangement.  It is intended for use where developers 
  294.      wish to retain control over the arrangement of executed code. 
  295.  
  296.      CPU Optimisations 
  297.      V1.1 contains the first LXOPT CPU oriented optimisations.  These focus on 
  298.      CPU instruction cache utilisation efficiency (see CPU Instruction Caching) 
  299.      and branch prediction.  New options giving greater control over alignment 
  300.      within the processed code object have also been provided.  See /alignCode, 
  301.      /alignData, /cLineSize and / cLineWaste for more details.  CPU bound 
  302.      applications should achieve performance improvements of between one and 
  303.      five per cent.  There are numerous other optimisation opportunities which 
  304.      will be included in future versions of LXOPT. 
  305.  
  306.      Special code arrangement pre and post processing have also been introduced 
  307.      to strike a better balance between CPU efficiency and working set tuning. 
  308.      This suppresses layout divisions within performance critical areas and 
  309.      significantly reduces the size of recording files. 
  310.  
  311.      Default Alignment 
  312.      The default alignment of code pointer targets is changed from 4 to 1. 
  313.      Performance related code alignment issues should be addressed using the 
  314.      new /cLineSize and /cLineWaste options.  Applications which rely on 
  315.      alignment to make the low order bits of addresses redundant should set 
  316.      alignment explicitly using the /align option. 
  317.  
  318.      ICC.EXE Patch for CSet++ V2.0 and 2.1 Users 
  319.      Linking initiated by ICC.EXE always forced a base address for EXE files 
  320.      resulting in the removal of internal fixups.  LXOPT requires internal 
  321.      fixups for correct processing of the input executable.  Although many 
  322.      users could avoid this problem by direct use of LINK386, C++ template 
  323.      users were forced to link directly via ICC preventing the use of LXOPT.  A 
  324.      patch for ICC.EXE is now included to remove this restriction.  See Patch 
  325.      for CSet++ V2.0 and 2.1 Users for a description of this patch and how to 
  326.      apply it. 
  327.  
  328.      Demo Version Restrictions 
  329.      Code arranged by the demonstration version will not produce a tone on 
  330.      start-up unless an error is encountered.  The tone has been replaced by a 
  331.      processed application lifetime limit of seven days.  A warning is also 
  332.      produced if the machine in use has not been recently rebooted to encourage 
  333.      testing in line with the new Performance Testing section. 
  334.  
  335.      This change also allows evaluators to time the execution of processed code 
  336.      without having to deduct the duration of the start-up and termination 
  337.      tones.  Code produced by the LXOPT Demo will now execute almost 
  338.      identically to that produced by the full product but may produce up to 
  339.      three additional page faults during the runtime of the processed 
  340.      application. 
  341.  
  342.      Recording Session Error Messages 
  343.      V1.0 of LXOPT placed error messages produced during recording sessions in 
  344.      the file "LXREC.ERR".  V1.1 retains this behaviour but when the message 
  345.      has been safely recorded it will now attempt to display the message on 
  346.      screen. 
  347.  
  348.      Code Offset Translations 
  349.      New options to translate code offsets between pre and post arrangement 
  350.      code are now provided.  These are designed to assist in debugging 
  351.      situations and to help trace instruction pointer based error messages back 
  352.      to the original source code.  See the /getOld and /getNew options for more 
  353.      details. 
  354.  
  355.      Code Disassembly 
  356.      Code within the processed code object can now be disassembled using the 
  357.      /disasm option. 
  358.  
  359.      Utility Programs 
  360.      New utility programs have been introduced to time application execution, 
  361.      simulate low memory conditions and translate EXE/DLL files between the 
  362.      OS/2 2.x and WARP compressed executable file formats.  See TimeRun, 
  363.      Thrash, LXWarp and LXUnWarp for more details. 
  364.  
  365.      Installation/WPS Set-up 
  366.      The installer now creates an LXOPT desktop folder.  The contained program 
  367.      objects are prepared to allow use of LXOPT and associated utilities direct 
  368.      from the WPS.  Alteration of DPATH is not required for the use of LXOPT 
  369.      V1.1. 
  370.  
  371.      Software Faults 
  372.      The LXOPT recorder has been redesigned to remove the problems some users 
  373.      experienced while attempting to perform multiple simultaneous recording 
  374.      sessions.  Unique recording DLLs are now created on a per application 
  375.      basis. 
  376.  
  377.      The code analyser has been updated to prevent rejection of code generated 
  378.      by the Watcom C++ compiler. 
  379.  
  380.      Run times on large files (>2Mb) have been reduced by improved efficiency 
  381.      in the file creation routines.  Note that LXOPT is not intended for use on 
  382.      a daily basis but as a final 'pre-shipment' optimiser.  Future design 
  383.      targets will permit arrangement times of up to 12 hours (i.e. over night) 
  384.      if optimisation rewards warrant it. 
  385.  
  386.  
  387. ΓòÉΓòÉΓòÉ 5. *** START HERE! ***  ΓòÉΓòÉΓòÉ
  388.  
  389.  *** START HERE! ***
  390.  
  391. Welcome to LXOPT 
  392. LXOPT is a unique tool for the OS/2 developer.  By working set tuning EXE/DLL 
  393. files LXOPT will typically halve the amount of memory required to store 
  394. application code.  The instruction stream is also processed to ensure maximum 
  395. CPU instruction cache efficiency and a new preloading option allows the 
  396. resulting code to be transferred to the swapfile allowing the fastest possible 
  397. application startup and paging.  See benefits for a full list of what LXOPT can 
  398. do or go to the Introduction section for a more complete introduction to the 
  399. software. 
  400.  
  401. You Can Now Use LXOPT Free! 
  402. LXOPT is now freeware, see This Software is FREE! for details. 
  403.  
  404. Quick Start 
  405. The installer has created program objects to process applications using 
  406. standard LXOPT defaults which appear on the Open menu of EXE and DLL files.  If 
  407. you are eager to get started go straight to Using LXOPT. 
  408.  
  409. Spreading the Word 
  410. Working set tuned applications page less and use less memory.  This leaves more 
  411. memory free for use by other applications, reducing their need to page.  When 
  412. users execute tuned code the entire system benefits.  Only when the majority of 
  413. applications have been working set tuned will the full benefits of tuning 
  414. appear.  Please help to spread the word by passing on this copy of LXOPT to 
  415. other OS/2 developers. 
  416.  
  417.  
  418. ΓòÉΓòÉΓòÉ 6. Introduction  ΓòÉΓòÉΓòÉ
  419.  
  420.                                   Introduction
  421.  
  422.  
  423. ΓòÉΓòÉΓòÉ 6.1. Background  ΓòÉΓòÉΓòÉ
  424.  
  425.  Background
  426.  
  427. With the release of OS/2 V2.0 came the introduction of the Linear Executable 
  428. file format, the format now used by all 32-bit OS/2 EXE and DLL files.  For the 
  429. first time the Linear Executable allowed code to be loaded into memory in 4Kb 
  430. units, the page size of the 80386 and later processors. 
  431.  
  432. This new efficient design changed the way code was loaded into memory. 
  433. Applications were no longer loaded on a per segment basis but used the virtual 
  434. memory mechanisms now used by the rest of the operating system. 
  435.  
  436. A code page is loaded into memory when an attempt is made to execute an 
  437. instruction within the page.  The 4Kb page is read from the disk and 
  438. relocations ( fixups ) are applied from data structures contained within the 
  439. Linear Executable.  When memory is heavily utilised code pages will be recycled 
  440. as with other system memory and the code is discarded.  If instructions on the 
  441. code page are later referenced the page must be reloaded from the disk and 
  442. fixups reapplied. 
  443.  
  444. An efficient program would ensure that all instructions on a single code page 
  445. were executed at roughly the same time to make sure that memory was used and 
  446. paged most efficiently. Unfortunately modern programming methods and 
  447. convenience favour grouping code logically rather than by time of execution. 
  448. During the run time of a typical application between 30% and 50% of the code 
  449. loaded is never executed.  Entire 4Kb code pages are often loaded to execute 
  450. only twenty or thirty bytes of code. 
  451.  
  452.  
  453. ΓòÉΓòÉΓòÉ 6.2. What is LXOPT?  ΓòÉΓòÉΓòÉ
  454.  
  455.  What is LXOPT?
  456.  
  457. LXOPT (Linear eXecutable OPTimiser) is a development tool designed to improve 
  458. the code layout of 32-bit OS/2 applications.  Applied directly to EXE and DLL 
  459. files LXOPT rearranges code at the assembler level to minimise page faults, 
  460. maximise CPU instruction cache efficiency and provides many other useful 
  461. benefits.  It is particularly effective on large applications forced to run in 
  462. low memory conditions and can reduce code load page faults by up to 95% in 
  463. extreme conditions. 
  464.  
  465. LXOPT can group together all unused assembler sequences and move them to other 
  466. code pages from where they will not occupy memory unless executed.  This 
  467. technique, known as 'Sleeping Code Parking', reduces the total code memory 
  468. requirements of a typical application by between 30% and 50%. 
  469.  
  470. LXOPT is unique in that it works at the assembler level and is able to change 
  471. the location of not just whole procedures but individual processor 
  472. instructions.  Code handling infrequently used branches of IF or CASE 
  473. statements may be moved to different code pages significantly reducing a 
  474. programs working set. 
  475.  
  476. LXOPT also produces minor CPU related performance improvements by improving CPU 
  477. cache efficiency and branch prediction.  CPU bound applications should achieve 
  478. performance improvements of between one and five percent. 
  479.  
  480. Applications to which LXOPT is to be applied must adhere to certain 
  481. restrictions or may require special caution, see restrictions for more 
  482. information. 
  483.  
  484. LXOPT operates directly on 32-bit code in OS/2 Linear Executable files and does 
  485. not normally require alteration or recompilation of source code.  Processed 
  486. applications may contain 16-bit code but this code is not optimised by LXOPT. 
  487.  
  488. LXOPT is not designed for daily use but intended as a final stage in the 
  489. development cycle.  A completed application should be processed by LXOPT as a 
  490. final optimisation phase before retesting and internal or external deployment. 
  491.  
  492. Note      The normal method of testing a performance enhancing tool is to 
  493.           compare the execution times of pre and post optimised code.  LXOPT 
  494.           primarily operates by improving the caching characteristics of 
  495.           application code and results are distorted by caching effects within 
  496.           the file and operating systems.  See Performance Testing for details 
  497.           of how to negate these effects. 
  498.  
  499.           If you intend using this software on files greater than 1Mb in size 
  500.           and are using OS/2 WARP 3.0 (without FixPak 11 or higher) there is a 
  501.           workaround for a software fault of which you MUST be aware.  See 
  502.           Urgent Message for details. 
  503.  
  504.  
  505. ΓòÉΓòÉΓòÉ 6.3. Benefits of LXOPT  ΓòÉΓòÉΓòÉ
  506.  
  507.  Benefits of LXOPT
  508.  
  509. Working Set Reduction 
  510. The primary benefit of LXOPT is its ability to identify an applications working 
  511. set and produce an optimised code layout based upon it.  Any application with 
  512. code greater than 4Kb in size may benefit from this effect.  The effect is most 
  513. apparent when an application is forced to execute in a restricted amount of 
  514. memory. 
  515.  
  516. Reduction of the working set reduces page faults which improves performance. 
  517. Large applications constrained by physical memory may benefit greatly from this 
  518. effect.  Small applications benefit from improved start up times and contribute 
  519. to a general reduction in system load. 
  520.  
  521. Code Parking 
  522. Users may be familiar with 'Dead Code Elimination', an optimisation used by 
  523. compilers to remove unused code.  LXOPT performs 'Sleeping Code Parking', the 
  524. moving of apparently unused code to the end of an applications code space. 
  525. 'Parked' code will not normally be loaded by your application BUT REMAINS 
  526. ACCESSIBLE should it be required. 
  527.  
  528. Code parking can significantly reduce the total amount of memory used by 
  529. application code, typically by 30% to 50%.  It is particularly useful in 
  530. reducing the memory overhead of largely dormant applications that run 
  531. continuously in the background. 
  532.  
  533. Code Removal 
  534. The LXOPT code analyser will detect and completely remove unreferenced 
  535. instruction sequences.  Although modern linkers are normally very good at 
  536. performing this function they are unable to detect some forms of unused code. 
  537. LXOPT identifies every byte of code, if any instruction is unreachable LXOPT 
  538. will remove it. 
  539.  
  540. Preloading 
  541. LXOPT includes a /preload option which permits application files to be 
  542. transferred to the swapfile on machine start-up.  This technique, formerly 
  543. reserved for OS/2 system DLLs, is now available to all applications. 
  544. Preloading permits faster application start-up and paging at the expense of an 
  545. extended boot time and increase in swapfile requirements. 
  546.  
  547. CPU Optimisations 
  548. Code arrangement and CPU caching related options allow the tuning of code for 
  549. maximum CPU cache efficiency.  Improved instruction caching aids performance 
  550. both by helping to reduce instruction fetch times and freeing the main memory 
  551. bus for other instruction/data accesses.  The execution history generated by 
  552. LXOPT is also used to assist in branch prediction. 
  553.  
  554. Ease of Use 
  555. LXOPT works directly on application EXE and DLL files.  Code usage gathering 
  556. and new layout generation are fully automated, no source code files are ever 
  557. examined or altered. 
  558.  
  559. Developers no longer need to alter code structure, insert compiler pragmas or 
  560. predict runtime code usage to tune their code layouts.  Near optimal code 
  561. layouts which can effectively halve code size can often be achieved with less 
  562. than an hours work. 
  563.  
  564. Users With Insufficient RAM 
  565. Despite declining memory prices many users still operate machines with 
  566. insufficient RAM for their requirements. 
  567.  
  568. For many applications LXOPT provides a means of quickly and effectively 
  569. supporting such users while providing a useful performance enhancement 
  570. regardless of the target machine. 
  571.  
  572. Multitasking 
  573. Users are often limited in running multiple concurrent applications by memory 
  574. constraints.  Multitasking applications compete with each other for valuable 
  575. system memory. 
  576.  
  577. Applications processed by LXOPT work more effectively in low memory conditions, 
  578. reducing system load when running several large programs concurrently. 
  579.  
  580. Fewer/Faster Disk Accesses 
  581. In addition to the reduction in disk activity due to fewer page faults, 
  582. optimised code layouts have other beneficial effects. 
  583.  
  584. Pages in the LXOPT processed application file will tend to be arranged in the 
  585. order in which they are used.  Once a page is loaded from disk following pages 
  586. are likely to be fully or partially loaded at the same time by disk 
  587. hardware/cache.  Subsequent page faults can therefore often avoid a disk hit, 
  588. significantly reducing the time taken to service the fault.  Even if not 
  589. already loaded, subsequent code pages will tend to be located at nearby 
  590. locations on the disk so reducing head movement. 
  591.  
  592. In addition LXOPT aligns each code page within the file to minimise the number 
  593. disk blocks which need to be read by the disk controller. 
  594.  
  595. Using Libraries 
  596. All application developers use libraries.  Some come with the compiler, others 
  597. are developed in house or purchased externally.  Normally these libraries are 
  598. developed for general use without regard for a specific application. 
  599.  
  600. LXOPT can process these libraries to optimise their memory usage with your 
  601. application.  Unused code in the libraries is parked where it causes least 
  602. overhead to your application. This benefit may be gained whether the library is 
  603. statically or dynamically linked. 
  604.  
  605. Error handling/Debugging code 
  606. Most software contains error handling for unexpected internal errors.  Often 
  607. such code is pre-processed out before final release.  While the tests for error 
  608. conditions remain, LXOPT will park the error handling itself. While your 
  609. application is operating normally the overhead of the error handler code is 
  610. reduced to the size of a single transfer instruction. 
  611.  
  612.  
  613. ΓòÉΓòÉΓòÉ 6.4. Restrictions  ΓòÉΓòÉΓòÉ
  614.  
  615.  Restrictions
  616.  
  617. Please ensure that all programmers involved in the development of the software 
  618. to be processed read the contents of this section. 
  619.  
  620. LXOPT may be applied to almost all OS/2 Linear Executable DLL or EXE files 
  621. containing a pageable 32 bit code object.  Some unusual programming techniques 
  622. may cause LXOPT to fail or require special caution. 
  623.  
  624. A 32 bit OS/2 linear executable application may contain many objects.  An 
  625. object is analogous to a segment within the old 16 bit file format with each 
  626. object typically containing a different type of information.  For example a 
  627. normal 32 bit executable file might contain 32 bit code object(s), data 
  628. object(s), resource object(s) and perhaps a 16 bit code object to interface 
  629. with some 16 bit APIs. LXOPT always applies itself to the largest 32 bit code 
  630. object. 
  631.  
  632. To function correctly LXOPT needs to identify all potential execution paths 
  633. through your program. LXOPT will work correctly with all transfers of control 
  634. generated by standard compilers and normal assembler techniques.  Some coding 
  635. techniques which rely on assumptions about code layout will cause LXOPT to fail 
  636. or require special caution.  Run times will also be reduced if users avoid 
  637. placing read-only application data within the processed code object. 
  638.  
  639. These following restrictions apply only when they involve the code object which 
  640. LXOPT processes.  A restriction may often be avoided by moving the offending 
  641. code/data to a different object.  This can be achieved by placing the code in a 
  642. named code segment via compiler options/pragmas and adding this name to the 
  643. module definition (.DEF) file in the SEGMENTS section. 
  644.  
  645. Pointer Alignment 
  646. If your code relies on the alignment of functions/data (i.e. lower bits used 
  647. for informational purposes and masked out before dereference) you must use a 
  648. consistent /align option value. 
  649.  
  650. Hard Coded Relative Distances 
  651. Your application may not make assumptions about relative distances between 
  652. functions or the absolute location thereof.  For example, a statement such as 
  653. ((NextFunc *)((char *)MyProc+10))() will cause your processed application to 
  654. expire just ahead of your programming career. 
  655.  
  656. In general the absolute distance between two locations within the processed 
  657. code object should never be used within a calculation.  The only exception to 
  658. this rule is where both addresses refer to data and no code exists between 
  659. them.  Assembler programmers may need to take particular care in observing this 
  660. restriction. 
  661.  
  662. A special case of this error occurs in code inserted by IBM compiler libraries 
  663. when handling a DosGetMessage call.  See the LXO0169 error for more details. 
  664.  
  665. Timing 
  666. During the recording process LXOPT increases the load on the CPU and generates 
  667. occasional disk activity.  If an application is timing sensitive this may 
  668. affect its operation.  CPU load/disk activity can often be reduced or 
  669. redistributed to reduce such problems.  See Creating a Recording Version for 
  670. more information. 
  671.  
  672. Exporting Code Object Data 
  673. LXOPT assumes all exports from the processed code object are 32 bit function 
  674. entry points.  Do not export data from your applications 32 bit code object as 
  675. this will cause failure of LXOPT or the resulting program. 
  676.  
  677. Self Referencing Code 
  678. Code that deliberately alters itself to effect transfers may fail. If your 
  679. application contains assembler that uses this technique disassemble the 
  680. resulting code to ensure it has been translated correctly.  LXOPT will issue a 
  681. warning if the code object it is processing is writeable. 
  682.  
  683. Invalid SS:ESP 
  684. LXOPT uses the applications stack during recording sessions.  To ensure correct 
  685. operation of the recorder SS:ESP must be valid at all transfers of control 
  686. within your application (e.g. during a JMP instruction).  If your 32 bit code 
  687. receives control with an invalid or 16 bit stack a valid SS:ESP pair must be 
  688. created before the next transfer is executed. 
  689.  
  690. LXOPT also uses the DS register.  All recording operations are suspended while 
  691. the DS register contains a value other than that in effect at application 
  692. start-up. 
  693.  
  694.  
  695. ΓòÉΓòÉΓòÉ 6.5. An Example  ΓòÉΓòÉΓòÉ
  696.  
  697.  An Example
  698.  
  699. The effect of LXOPT on code is best demonstrated by example.  The caption below 
  700. shows a simple piece of disassembled 'C' code which opens a file and checks 
  701. that it contains the correct version number. 
  702.  
  703. /* open the file */
  704. fp = fopen(filePath, "r");
  705.         PUSH "r"
  706.         PUSH filePath
  707.         CALL fopen
  708.         MOV  fp, EAX
  709.  
  710. /* check if opened ok */
  711. if (!fp) {
  712.         CMP EAX, EAX
  713.         JNE DO_FSCANF
  714.    ReportError(RE_OPEN_FAIL, filePath);
  715.         PUSH filePath
  716.         PUSH RE_OPEN_FAIL
  717.         CALL ReportError
  718.    return FALSE;
  719.         MOV EAX, 0
  720.         RET
  721. }
  722.  
  723. /* read in the version number */
  724. fscanf(fp, "VERSION %d", & version);
  725.         PUSH & version
  726.         PUSH "VERSION %d"
  727.         PUSH fp
  728.         CALL fscanf
  729.  
  730. /* test the version number */
  731. if (version != APP_VERSION) {
  732.         CMP version, APP_VERSION
  733.         JE  VERSION_OK
  734.    ReportError(RE_WRONG_VERSION, filePath);
  735.         PUSH filePath
  736.         PUSH RE_WRONG_VERSION
  737.         CALL ReportError
  738.    return FALSE;
  739.         MOV EAX, 0
  740.         RET
  741. }
  742.  
  743. The code performs some simple error checking typical of this type of operation. 
  744. In normal use the error handling code will not be executed yet is always loaded 
  745. due to its proximity to the other code. 
  746.  
  747. LXOPT uses the execution history to identify the error handling as 'Sleeping 
  748. Code' and moves it to another code page.  This produces the new instruction 
  749. sequence below. 
  750.  
  751.         ...
  752.         PUSH "r"
  753.         PUSH filePath
  754.         CALL fopen
  755.         MOV  fp, EAX
  756.  
  757.         CMP EAX, EAX
  758.         JE  NOT_OPENED
  759.  
  760.         PUSH & version
  761.         PUSH "VERSION %d"
  762.         PUSH fp
  763.         CALL fscanf
  764.  
  765.         CMP version, APP_VERSION
  766.         JNE  WRONG_VERSION
  767.         ...
  768.  
  769. The twenty two instructions of the original code sequence is reduced to twelve 
  770. while the application executes normally.  If a file access error does occur the 
  771. error handling is loaded and executed normally. 
  772.  
  773. LXOPT improvements don't stop there.  The entire 'ReportError' function is also 
  774. parked and code from the library functions for 'fopen' and 'fscanf' will be 
  775. separated from the other library code allowing it to be moved to the code page 
  776. on which it is used.  Also 'fscanf' is a powerful function which contains code 
  777. capable of reading many data types and includes floating point conversions. 
  778. LXOPT breaks the function into its component parts and only moves the code from 
  779. 'fscanf' which specifically handles the input formats specified by your 
  780. application. 
  781.  
  782. The result is a code sequence that is effectively halved in size and which only 
  783. needs a single code page to contain all the required code. 
  784.  
  785.  
  786. ΓòÉΓòÉΓòÉ 7. User Guide  ΓòÉΓòÉΓòÉ
  787.  
  788.                                    User Guide
  789.  
  790.  
  791. ΓòÉΓòÉΓòÉ 7.1. Using LXOPT  ΓòÉΓòÉΓòÉ
  792.  
  793.  Using LXOPT
  794.  
  795. Use of LXOPT is divided into four stages. 
  796.  
  797. Preparation 
  798. The EXE/DLL file to be processed may need some special preparation.  What 
  799. preparation is needed (if any) is described in preparing your application. 
  800.  
  801. Creating a Recording Version 
  802. Next a special version of your application must be created.  This will execute 
  803. as normal but will create a recording detailing where and when all code is 
  804. used.  LXOPT creates this special version of your application for you.  See 
  805. Creating a Recording Version for more details. 
  806.  
  807. Running the Special Version 
  808. The special recording version of the application is then executed to generate a 
  809. recording.  This is the most important part of the optimisation process.  See 
  810. Recording Program Statistics for details. 
  811.  
  812. Arrangement 
  813. Finally LXOPT is used again, this time with the /arrange parameter to create an 
  814. optimised code arrangement.  Options may also be specified to compress pages in 
  815. the output file (/pack2) or to allow the created file to be preloaded 
  816. (/preload). 
  817.  
  818. Arrangement issues are discussed in Creating An Optimised Code Arrangement 
  819.  
  820. The result is a leaner, faster application with dramatically improved 
  821. performance characteristics when forced to run in low memory conditions. 
  822.  
  823.  
  824. ΓòÉΓòÉΓòÉ 7.1.1. Preparing Programs  ΓòÉΓòÉΓòÉ
  825.  
  826.  Preparing Programs
  827.  
  828. EXE File Preparation 
  829. LXOPT can process both EXE and DLL files.  To process EXE files they must 
  830. contain internal fixups which are normally removed by the linker when the 
  831. executable is given a base address. 
  832.  
  833. LINK386 users must ensure that EXE files have been linked without the /base 
  834. linker option.  ICC.EXE in CSet++ V2.0 and V2.1 automatically provides 
  835. /base:65536 as an option to LINK386 when initiating a link.  Users of this 
  836. compiler should invoke LINK386 separately.  This is not possible where the code 
  837. to be processed uses templates and for these users a patch for ICC.EXE is 
  838. included to allow use of LXOPT.  See Patch For Cset++ V2.0 and V2.1 Users for 
  839. more details. 
  840.  
  841. Users of VisualAge C++ should use ILINK with the '/nobase' option.  Do not link 
  842. using ICC.EXE, this provides the /base option to a link even if /nobase is 
  843. specified. 
  844.  
  845. Watcom created EXE files need the 'op int' linker option to ensure internal 
  846. fixups are retained. 
  847.  
  848. DLL File Preparation 
  849. Standard DLL's always retain internal fixups and require no special 
  850. preparation. 
  851.  
  852. DosGetMessage 
  853. Code within the IBM CSet/VAC libraries violates an LXOPT restriction when 
  854. handling a DosGetMessage call.  Even where an application does not make direct 
  855. use of this function it will often be included to handle messages required by 
  856. the compiler library. 
  857.  
  858. LXOPT detects use of this technique and produces an LXO0169 error.  See the 
  859. description of this error for information on how to avoid this problem. 
  860.  
  861. Restrictions and Stack Use 
  862. Before using LXOPT please read the Restrictions section to ensure that it is 
  863. suitable for your application. 
  864.  
  865. LXOPT uses up to 2Kb of your applications stack while recording.  To reduce 
  866. stack size problems LXOPT intercepts thread creation within the recording 
  867. application and increases the allocated stack by 4Kb.  The main application 
  868. stack is not altered. 
  869.  
  870.  
  871. ΓòÉΓòÉΓòÉ 7.1.2. Creating a Recording Version  ΓòÉΓòÉΓòÉ
  872.  
  873.  Creating a Recording Version
  874.  
  875. To create a recording version of your EXE or DLL file it must be processed by 
  876. LXOPT using the /prep parameter. If the /arrange parameter is not specified 
  877. then /prep is assumed by default.  To prepare an application using default 
  878. options select LXOPT Prepare from the Open menu or using the command line type: 
  879.  
  880.    LXOPT <exe/dll path name>
  881. LXOPT searches the file for 32 bit code objects and selects the largest for 
  882. processing. 
  883.  
  884. Although most applications will be processed in under five minutes, LXOPT is 
  885. effectively reconstructing your entire application including any libraries to 
  886. which it is statically linked.  Processing may take up to a few hours for multi 
  887. Mb application files. 
  888.  
  889. Errors and Warnings 
  890. LXOPT detects all unreferenced bytes in the processed code object.  Often these 
  891. bytes are initialised data or unused code.  For each unused byte sequence which 
  892. contains fixups LXOPT produces a LXO0150 warning.  It is normal for files to 
  893. produce several of these warnings during processing.  All unused bytes are 
  894. removed from the output executable. 
  895.  
  896. When LXOPT detects an error processing a file a simple error message is 
  897. produced.  More detailed information on the error and how to avoid it is 
  898. provided via the F1 key which provides a direct link to the reference section 
  899. in this documentation. 
  900.  
  901. Memory Use Analysis 
  902. During processing LXOPT identifies every byte within the processed code object. 
  903. There are three basic classifications; 'code', 'data' and 'unused'. 
  904.  
  905. 'Code' bytes are those used to form processor instructions and will normally be 
  906. the largest group. 
  907.  
  908. 'Data' bytes are read-only data placed within the code object.  Such data is 
  909. normally inserted by a compiler and are usually compile time constants or jump 
  910. tables used in the encoding of CASE statements. 
  911.  
  912. 'Unused' bytes are never referenced within the application.  Typically these 
  913. are padding used to adjust procedures and data to alignment boundaries.  Often 
  914. applications contain unused code or data that is linked into the final 
  915. executable image.  Some development tools and techniques can prevent standard 
  916. linkers from detecting unused code. 
  917.  
  918. Files Produced 
  919. When processing has completed the original application file is replaced by a 
  920. special recording version.  The original file is renamed to have an '.ORI' 
  921. extension. 
  922.  
  923. A special recording DLL is also created to assist with runtime recording.  The 
  924. name of this DLL is generated by placing an '@1' at the end of the root name 
  925. and adding a '.DLL' extension.  For example, processing of 'MYAPP.EXE' will 
  926. create the recording DLL 'MYAPP_@1.DLL'.  The numeric value is altered if 
  927. necessary to ensure generation of a unique file name. 
  928.  
  929. Special Options 
  930. Some applications may require special options for recording to increase 
  931. performance or alter the distribution of the overhead of the recording process. 
  932. Often the most simple solution for timing problems is to record on a higher 
  933. performance PC or remove timing sensitive code from the processed code object. 
  934.  
  935. See the /buff, /compress, /thread and /recfile options for more information. 
  936.  
  937. Note      If you intend using this software on files greater than 1Mb in size 
  938.           and are using OS/2 WARP prior to application of FixPak 11 there is a 
  939.           workaround for a software fault of which you MUST be aware.  See 
  940.           Urgent Message for details. 
  941.  
  942.  
  943. ΓòÉΓòÉΓòÉ 7.1.3. Recording Program Statistics  ΓòÉΓòÉΓòÉ
  944.  
  945.  Recording Program Statistics
  946.  
  947. To record program statistics run your prepared EXE/DLL performing the 
  948. operations to be typically performed by the user.  The quality of recording 
  949. information directly affects the performance of LXOPT and is the most important 
  950. part of the optimising process. 
  951.  
  952. During the recording process the recording DLL generated during preparation 
  953. (e.g. 'MYAPP_@1.DLL') must be somewhere on your LIBPATH.  By default this DLL 
  954. was created in the directory of the processed EXE/DLL file.  Typically LIBPATH 
  955. contains the current directory '.' which often allows the DLL to be found at 
  956. its default location. 
  957.  
  958. If your application consists of multiple EXE/DLL files you may prepare and 
  959. record all of them simultaneously. 
  960.  
  961. Recording Strategy 
  962. The purpose of recording is to tell LXOPT where and when instructions are 
  963. normally executed and identify which are rarely or not normally used.  During 
  964. the recording session you perform operations that you would normally expect of 
  965. the user.  Avoiding unusual program conditions while recording will greatly 
  966. enhance the effectiveness of LXOPT.  DO NOT be tempted to use preprepared test 
  967. scripts designed to test program stability, these rarely mimic true user 
  968. behaviour. 
  969.  
  970. A good general rule is to start your application and do the most commonly 
  971. performed actions first.  Then progress through the interface in order based on 
  972. expected frequency of use.  If you wish to focus tuning on a specific area of 
  973. the code simply execute that code more frequently. 
  974.  
  975. Recording (.REC) Files 
  976. During execution your application will create a recording file which by default 
  977. is the name of the processed file with a '.REC' extension. Your application may 
  978. be used for more than one recording session, each session appends its results 
  979. to the existing recording. 
  980.  
  981. Recording sessions may also be performed on separate machines, the files 
  982. concatenated later to form one continuous recording.  If you wish to record 
  983. multiple instances of your application at the same time a separate recording 
  984. file is created for each instance. These special circumstances require special 
  985. treatment of the recording file(s), see the /recfile option for more details. 
  986.  
  987. Special Options 
  988. If recording seems slow or your application is timing sensitive the /buff, 
  989. /thread, /compress and /recfile options can all help to reduce the recording 
  990. overhead if used when creating a recording version. 
  991.  
  992. If an error is detected during recording a two pitch alternating tone is 
  993. generated and an error message placed in the file 'LXREC.ERR'.  An attempt will 
  994. then be made to display the error message on screen.  This will normally 
  995. succeed but given the unknown state of the application it cannot be guaranteed. 
  996. The application will then terminate with error code 99. 
  997.  
  998. WARNING 
  999.  
  1000. Recording may create large recording files ranging from a few Kb to several 
  1001. hundred Mb in size.  Running out of disk space will cause recording to fail and 
  1002. may impair other applications if recording files are placed on the same drive 
  1003. as your swap file. 
  1004.  
  1005. The recording file pathname may be specified using the /recfile option and the 
  1006. recording file may be reduced in size by the /compress option.  You are advised 
  1007. to start with a short recording session to judge the disk space requirements 
  1008. for your application. 
  1009.  
  1010.  
  1011. ΓòÉΓòÉΓòÉ 7.1.4. Creating An Optimised Code Arrangement  ΓòÉΓòÉΓòÉ
  1012.  
  1013.  Creating An Optimised Code Arrangement
  1014.  
  1015. When a recording has been created LXOPT is used with the /arrange parameter to 
  1016. create an optimised layout. 
  1017.  
  1018. To use all defaults select LXOPT Arrange from the Open menu or using the 
  1019. command line type: 
  1020.  
  1021.     LXOPT <exe/dll path name> /arrange
  1022.  
  1023. If you wish to preload the resulting file you must also specify the /preload 
  1024. parameter.  This option is also available as LXOPT Arrange Preload on the Open 
  1025. menu. 
  1026.  
  1027. As with preparation, LXOPT may take a significant time to complete when 
  1028. processing large input files. 
  1029.  
  1030. Performance Testing 
  1031. If you wish to compare performance between the original and optimised 
  1032. applications please read the Performance Testing section.  Caching effects of 
  1033. the operating system, network servers and disk caches need to be considered to 
  1034. ensure valid results. 
  1035.  
  1036. Files Produced 
  1037. When complete the optimised EXE/DLL file is created and overwrites the existing 
  1038. recording version. 
  1039.  
  1040. The recording version of the file is renamed with a '.PRP' extension. 
  1041.  
  1042. The original application file remains with a '.ORI' extension. 
  1043.  
  1044. Arrangement Report 
  1045. When a new arrangement has been created LXOPT performs a page fault simulation 
  1046. on the original and optimised versions.  The test simulates the execution of 
  1047. the entire recording session with the original and optimised versions of the 
  1048. application file.  The results are analysed and used to generate a comparative 
  1049. report for a series memory load conditions.  See Reading Reports for an 
  1050. explanation of the information displayed. 
  1051.  
  1052. Production of a report may be disabled using the /noreport option 
  1053.  
  1054. Recording Files 
  1055. LXOPT arrangement uses a single recording file which by default is the EXE/DLL 
  1056. path name with a '.REC' extension.  If you wish to specify another file or use 
  1057. multiple files please see the /recfile option for more details. 
  1058.  
  1059. Alternative Arrangement Algorithms 
  1060. LXOPT uses named arrangement algorithms to create optimised code layouts. 
  1061. Although the default algorithm is generally the best, algorithm performance is 
  1062. dependent on program structure and can vary dramatically.  For information on 
  1063. customising the optimisation phase refer to the /alg option. 
  1064.  
  1065. CS:EIP Based Messages 
  1066. Many applications use the current instruction pointer as part of their fatal 
  1067. error messages.  The default exception handler also provides this information. 
  1068. Developers often use a .MAP file to trace back these pointers to the offending 
  1069. code.  The movement of assembler sequences within the processed code object 
  1070. means that offsets within this region will have altered.  LXOPT provides the 
  1071. /getOld and /getnew options to translate these offsets between the old and new 
  1072. versions of the executable. 
  1073.  
  1074.  
  1075. ΓòÉΓòÉΓòÉ 7.2. Reading Reports  ΓòÉΓòÉΓòÉ
  1076.  
  1077.  Reading Reports
  1078.  
  1079. When the arrangement process is complete LXOPT generates a report to show how 
  1080. effectively the new instruction layout will reduce page faults due to the 
  1081. loading of application code. 
  1082.  
  1083. The data for this report is generated using a simulation of the page fault 
  1084. behaviour of the old and new code layouts for a range of available free memory. 
  1085. The execution history generated by the recording process is used to recreate 
  1086. the flow of control throughout the lifetime of the application. 
  1087.  
  1088. OS/2 is an advanced multitasking operating system and as such the resources 
  1089. allocated to an application will vary dynamically based on system load.  To 
  1090. allow production of a meaningful report page fault data is generated for fixed 
  1091. amounts of available memory. 
  1092.  
  1093. A typical report appears below: 
  1094.  
  1095. Calculating page faults loading instructions from code object 1 ...
  1096.  
  1097.  Memory (Kb)      Old Faults      New Faults      Percentage Reduction
  1098.           28           13187            4014             69%
  1099.           84            2048             290             85%
  1100.          140             743              58             92%
  1101.          196             461              43             90%
  1102.          252             337              43             87%
  1103.          308             240              43             82%
  1104.          364             182              43             76%
  1105.          420             160              43             73%
  1106.          476             144              43             70%
  1107.          532             131              43             67%
  1108.  
  1109.  
  1110.  375161 bytes (63%) of the code was parked.
  1111.  
  1112. Each row of the table details page fault behaviour for a fixed amount of 
  1113. available memory.  To take the first row, if code object 1 were restricted to 
  1114. the use of 28Kb of memory the old version would generate 13,187 page faults 
  1115. while executing the recording sequence.  The new code layout would generate 
  1116. 4,014 page faults, a 9,173 (69%) reduction. 
  1117.  
  1118. Code parking often has a significant effect on the arrangement process and in 
  1119. the above example roughly 366Kb was parked (i.e. 375,161 bytes of unused code 
  1120. fragments were collected from throughout the application and placed together at 
  1121. the end of the code area). 
  1122.  
  1123. The last row of the table shows the number of page faults generated when all 
  1124. the memory the code needs is available. This figure is never zero as 
  1125. application code is always loaded via page faults (*).  As no page is ever 
  1126. forced out the number of page faults is equal to the total number of pages 
  1127. referenced.  The old layout used 131 pages (524Kb) while the new code layout 
  1128. uses 43 pages (172Kb) a reduction of 88 pages (352Kb) or 67%.  This is the 
  1129. reason why for a range of available memory the new code layout causes 43 page 
  1130. faults, 43 pages (172Kb) of memory is all that is required to load all of the 
  1131. executed code. 
  1132.  
  1133. So has the applications total memory requirements been reduced by 67%?  No. 
  1134. All figures in the table relate to page faults loading instructions from the 
  1135. processed code object, all references to data and resources remain unaltered. 
  1136. If your application is relatively small but manipulates large amounts of data 
  1137. the effect may even go unnoticed.  If your applications memory requirements are 
  1138. primarily due to the size of the code then the effect can be transformative. 
  1139.  
  1140. (*) OS/2 V2.0 and later ignore the PRELOAD attribute specified in module 
  1141. definition files. 
  1142.  
  1143.  
  1144. ΓòÉΓòÉΓòÉ 7.3. Preloading  ΓòÉΓòÉΓòÉ
  1145.  
  1146.  Preloading
  1147.  
  1148. Preloading (transferring exe/dll files to the swapfile) can give a significant 
  1149. load time performance boost at the expense of additional swapfile space 
  1150. consumption and initial preloading delays (normally at boot/network connection 
  1151. time).  For a file to be preloaded it must have been arranged using the 
  1152. /preload option.  The resulting file will execute normally until preloaded 
  1153. using the Preload Utility. 
  1154.  
  1155. Use of preloading also raises other more subtle issues. 
  1156.  
  1157. DLL Initialisation 
  1158. Applications are preloaded by use of the DosStartSession and DosLoadModule 
  1159. APIs. 
  1160.  
  1161. When preloaded via the preload utility no DLL initialisation code is executed 
  1162. in DLLs that have been arranged with the /preload option.  This is required to 
  1163. ensure transparent operation and also to protect the preloading mechanism from 
  1164. harm.  No EXE file code is ever executed.  The only exception is for DLLs with 
  1165. global initialisation for which normal start-up is performed. 
  1166.  
  1167. When a DLL/EXE is loaded, so are all the DLLs on which it depends.  The DLLs 
  1168. not processed by LXOPT will initialise normally and are not preloaded. 
  1169.  
  1170. This places constraints on the actions that may be performed while executing 
  1171. the _DLL_InitTerm function within unprocessed or global init DLLs used by an 
  1172. LXOPT preloadable file.  In these circumstances the _DLL_InitTerm routine 
  1173. should not attempt any user interaction or perform any action likely to 
  1174. materially affect other client processes.  It should also not attempt to access 
  1175. functions exported by other LXOPT processed DLLs, their DLL initialisation will 
  1176. not have been performed making exported functions unreliable. 
  1177.  
  1178. Although it is very unusual for such DLL initialisation code to exist it is 
  1179. extremely important that this restriction is not violated. 
  1180.  
  1181. Philosophical Issues 
  1182. Preloading is a compromise.  It trades the performance boost of application 
  1183. paging against increased use of machine resources; namely swap space and 
  1184. preload (usually boot) time. 
  1185.  
  1186. Problems appear where each application considers itself "important" enough to 
  1187. be preloaded.  Clearly if a users machine were to load every piece of software 
  1188. they possess every time the machine booted preloading would quickly become 
  1189. counter productive. 
  1190.  
  1191. OS/2 used to permit the preloading of segments with the PRELOAD segment keyword 
  1192. in module definition files.  The loader would read all PRELOAD segments into 
  1193. memory on application start-up.  Unlike the LXOPT preload, this OS/2 preloading 
  1194. only took effect when the user attempted to start an application.  PRELOAD 
  1195. segments were loaded but often at the expense of other executing applications. 
  1196. Although tools still support this option and indicate preload requirements in 
  1197. the executable files they produce the operating system now ignores them.  A 
  1198. major factor in this is the potential abuse of PRELOAD to boost a single 
  1199. applications apparent performance at the expense of the rest of the system. 
  1200.  
  1201. LXOPT preloadable files are preload enabled, they do not automatically preload 
  1202. by themselves.  This is deliberate.  By requiring the use of the preload 
  1203. utility the decision to preload is taken away from the developer and given to 
  1204. the user. 
  1205.  
  1206. Your development tools are a good example of the issues involved.  If you use 
  1207. them on a daily basis then preloading all the executables and DLLs may be very 
  1208. beneficial but it is hardly warranted if development is confined to an annual 
  1209. tweak of an in-house utility. 
  1210.  
  1211. In general do not make assumptions about the desirability of preloading your 
  1212. application.  If you are working set tuning your software with LXOPT, enable 
  1213. preloading and deploy with the preload utility wherever possible.  Users 
  1214. sometimes run server applications intermittently while apparently trivial 
  1215. applications are often executed thousands of times within automated scripts. 
  1216.  
  1217. Deployment Issues 
  1218. The Preload Utility which accompanies LXOPT is freely distributable with your 
  1219. application.  Remember that a users installation may already be using the 
  1220. preload utility.  Two issues arise, where to put it and what to do if the files 
  1221. already exist.  Preload needs to be available prior to network availability. 
  1222. It is therefore recommended that the preload utility is stored in the 
  1223. "\PRELOAD" directory on the OS/2 boot drive.  If the utility already exists 
  1224. follow the simple rule that if the files have a more recent creation date than 
  1225. the ones supplied with your application, leave them alone!.  Future versions of 
  1226. the preload utility will maintain backwards compatibility. 
  1227.  
  1228. The preloader operates by copying the entire processed file into the swapfile. 
  1229. The original application file on disk is closed and all further page loading is 
  1230. performed directly from the swapfile.  While this reduces the page loading 
  1231. overhead it also increases disk space requirements on the swap drive.  Running 
  1232. out of swap space may make the system unstable.  If the problems are caused by 
  1233. commands in startup.cmd it will make recovery more difficult.  By default the 
  1234. preload utility will refuse to preload a file if there is less than 10Mb of 
  1235. free swap space.  If your application installation places preload commands in 
  1236. startup.cmd and predict the need for greater free space use the /M option. 
  1237.  
  1238.  
  1239. ΓòÉΓòÉΓòÉ 7.4. Working Set Tuning  ΓòÉΓòÉΓòÉ
  1240.  
  1241.  Working Set Tuning
  1242.  
  1243. Working set tuning is the act of optimising the arrangement of information to 
  1244. be stored in a cache to allow the most efficient operation of the caching 
  1245. mechanism. 
  1246.  
  1247. When an operating system manages pages of memory the system RAM effectively 
  1248. becomes a giant cache.  4Kb code and data pages travel via this cache from 
  1249. executable files or the swapfile on their way to the processor in the same way 
  1250. that files travel through a disk cache.  The success of caching relies on the 
  1251. non random nature of access requests.  The greater the locality of reference 
  1252. the more efficiently a cache operates. 
  1253.  
  1254. The path of execution through code is not random.  Instructions execute in 
  1255. sequences broken up by transfers of control such as CALL or JMP instructions. 
  1256. It is these transfers of control that often produce a 'cache miss' resulting in 
  1257. a disk access.  While the targets of these transfers are sometimes some 
  1258. distance from the current instruction pointer the destination is often known or 
  1259. predictable.  It is this predictability on which a working set tuner for code 
  1260. is based. 
  1261.  
  1262. Code Arrangement 
  1263. When applications are divided into pages it is done without regard to the 
  1264. underlying contents, every 4096 bytes the code is indiscriminately severed. 
  1265. Functions and even individual instructions are split across page boundaries. 
  1266. What appears on each page is dictated by the order of the code within the 
  1267. executable file.  What dictates that order?  You do. 
  1268.  
  1269. Within each compilation unit the order in which code appears is generated by 
  1270. the compiler.  It builds the instruction sequences and orders them roughly as 
  1271. they appear in the source file.  The linker takes each object file and 
  1272. concatenates the contents, appends any used libraries and outputs the 
  1273. executable.  The result is that code within an executable will appear in the 
  1274. order that it is typed in the source files and the order in which those files 
  1275. are processed by the linker. 
  1276.  
  1277. Well so what? - if code is only loaded when referenced then there's no problem, 
  1278. right?  Take a look at the two code layouts below where A to L are individual 
  1279. code sequences which for simplicity have been grouped 3 to each 4Kb page. 
  1280.  
  1281.                     ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1282.                     Γöé          Γöé Page 1 Γöé Page 2 Γöé Page 3 Γöé Page 4 Γöé
  1283.                     Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1284.                     Γöé Untuned: Γöé A,B,C  Γöé D,E,F  Γöé G,H,I  Γöé J,K,L  Γöé
  1285.                     Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1286.                     Γöé   Tuned: Γöé G,E,D  Γöé L,B,C  Γöé H,I,K  Γöé A,F,J  Γöé
  1287.                     ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1288.                                              Untuned vs Tuned Code Layout 
  1289.  
  1290.  Reduced Code Memory Requirements 
  1291.  If the normal path of execution is "GEDLBLBLBCHIK" the benefits of the tuned 
  1292.  layout become clearer.  The normal layout loads four pages in the sequence 
  1293.  3241, the tuned layout loads only three pages in the sequence 123. Both 
  1294.  layouts contained and executed the same code but the tuned layout avoided one 
  1295.  disk access and used 25% less memory. 
  1296.  
  1297.  This memory saving is a direct result of the sequences A, F and J not being 
  1298.  executed.  If this seems contrived consider that on average between 30% and 
  1299.  50% of a typical applications code is loaded but not executed during normal 
  1300.  operation.  If that sounds high examine your own code for error handling of 
  1301.  memory allocation, file access or OS/2 API errors.  Include with this the code 
  1302.  that your users will rarely execute such as routines handling the import of 
  1303.  that obscure file format, changing application configuration or displaying 
  1304.  that list of programmer credits (try clicking on the Warp desktop and then 
  1305.  press Ctrl-Alt-Shift-O).  Often such code appears within branches of IF or 
  1306.  CASE statements, lying dormant inside otherwise active functions.  In an 
  1307.  untuned code layout much of this code is loaded because it happens to share 
  1308.  part of a code page with some other active code sequence. 
  1309.  
  1310.  Performance In Low Memory Conditions 
  1311.  Limit the code sequence to the use of one 4Kb page as a crude simulation of 
  1312.  low memory conditions and more significant differences emerge.  The normal 
  1313.  layout will execute as "GEdLBLBLBcHiK" where an upper case character 
  1314.  represents the need to load a page from disk.  The result is a total of 10 
  1315.  page loads.  The tuned layout sequence is "GedLblblbcHik".  The total of 3 
  1316.  page loads has been unchanged by the restriction to one page of memory. 
  1317.  
  1318.  The reduction in page faults is due to the way that tuned code layouts group 
  1319.  code by time of execution.  When a tuned application executes a CALL or JMP 
  1320.  instruction the target is much more likely to be on the same page of memory. 
  1321.  In low memory conditions any attempt to execute an instruction on all but the 
  1322.  most recently used pages is likely to be punished by a page fault. 
  1323.  
  1324.  While this small example conveys the basic principles, in reality the 
  1325.  situation is much more complex. A typical code page contains not 3 but 300 
  1326.  separate code sequences and OS/2 recycles each page on approximately a least 
  1327.  recently used basis.  In low memory conditions applications and the operating 
  1328.  system compete for ownership of these memory pages, the number of pages 
  1329.  available to an application varying dynamically based on current demand.  As a 
  1330.  result, when working set tuned code is executed the reduced memory 
  1331.  requirements benefit not just the tuned software but all other executing 
  1332.  applications. 
  1333.  
  1334.  
  1335. ΓòÉΓòÉΓòÉ 7.5. CPU Instruction Caching  ΓòÉΓòÉΓòÉ
  1336.  
  1337.  CPU Instruction Caching
  1338.  
  1339. Level 1 CPU cache memory is a limited and valuable resource.  Modern processors 
  1340. require these caches to allow the instruction pipelines to be fed at their 
  1341. maximum rate.  The Intel Pentium processor implements an 8Kb on chip 
  1342. instruction cache.  Compared to the size of modern applications 8Kb is 
  1343. extremely small and operational efficiency depends on its ability to contain 
  1344. small repeatedly executed code sequences (such as program loops) in their 
  1345. entirety. 
  1346.  
  1347. There are three inefficiencies in the use of CPU instruction caches that LXOPT 
  1348. addresses. 
  1349.  
  1350. Processor Caching Algorithm 
  1351. The unit of storage within a cache is the 'cache line' which on a Pentium 
  1352. processor is 32 bytes long.  These cache lines are analogous to the 512 byte 
  1353. block storage units in a disk cache. 
  1354.  
  1355. Ideally an instruction cache would operate using a pure Least Recently Used 
  1356. algorithm to maximise the chances of keeping repetitive instruction sequences 
  1357. within the cache.  But caches are high speed devices, often with access times 
  1358. of less than 10 nanoseconds.  Time constraints prevent the implementation of 
  1359. optimal algorithms.  Early devices used a simple direct mapping approach where 
  1360. some bits from an address were used to directly address a cache line. 
  1361.  
  1362.                                 Tag        Line Adr
  1363.        Binary Address:  00110110110001001110001011000010
  1364.  
  1365. In the example above 8 bits are used from the address to identify the cache 
  1366. line to use.  This gives us 256 possible cache lines or 8Kb of total cache 
  1367. assuming a 32 byte line.  A problem occurs where two memory locations need to 
  1368. be cached that have the same bit pattern for the cache line address.  As each 
  1369. location is loaded the previous occupier of the cache line is pushed out.  For 
  1370. simple assembler loops this rarely occurs, but if the loop contains a call to a 
  1371. function with a clashing address performance suffers dramatically. 
  1372.  
  1373. Hardware designers responded to this problem with the set associative cache. 
  1374.  
  1375.                                   Tag       Line Adr
  1376.        Binary Address:  00110110110001001110001011000010
  1377.  
  1378. Here the cache line address is reduced to 7 bits giving a total of 128 
  1379. addresses but now the cache holds 2 cache lines per address.  The cache 
  1380. maintains an LRU mechanism within each group of two lines.  The total cache 
  1381. size is unchanged but it is now more flexible, reducing the number of clashes 
  1382. which force out useful cache lines.  The use of 2 cache lines per address (2 
  1383. way) set associative cache is the method used by the Pentium processor.  The 
  1384. Pentium Pro also uses an 8Kb 2 way set associative instruction cache.  The 486 
  1385. processor uses a 4 way set associative cache with a 16 byte cache line. 
  1386.  
  1387. Set associative caches reduce cache line address clashes but do not eliminate 
  1388. the problem.  Modern applications, unlike simple benchmark code, contain deep 
  1389. hierarchies of programming constructs that can significantly increase the risk 
  1390. of clashes.  When these occur not only is instruction fetching delayed but the 
  1391. use of the external bus blocks other data memory access.  When clashes occur 
  1392. subsequent sequential instruction fetches are also much more likely to push out 
  1393. reusable cache lines.  While these valuable cache lines are discarded, old 
  1394. unneeded lines are retained by virtue of their uncontested cache line address. 
  1395.  
  1396. LXOPT organises instructions such that commonly executed code is laid out in 
  1397. near sequential form.  This is the most efficient ordering for the instruction 
  1398. cache as it minimises the chances of related code sequences having the same 
  1399. cache line address.  The resulting more sequential order of cache line loads 
  1400. allows the cache to perform as if a near pure LRU algorithm had been 
  1401. implemented. 
  1402.  
  1403. Reduced Cache Line Wastage 
  1404. Grouping commonly executed code together has another simple benefit, it moves 
  1405. rarely executed code elsewhere. 
  1406.  
  1407. The Intel x86 instruction set was designed with memory efficiency as a high 
  1408. priority and many of the most commonly executed instructions are contained 
  1409. within a single byte.  The average size of an uninterrupted sequence of 
  1410. assembler instructions is only 13 bytes.  As a result almost every cache line 
  1411. will span two or more separate instruction sequences.  If these sequences are 
  1412. not closely grouped by time of execution then significant portions of the cache 
  1413. are wasted. 
  1414.  
  1415. LXOPT arranges code by dividing code into each uninterrupted sequence and 
  1416. tracing its use.  On arrangement these sequences are recombined based on time 
  1417. of execution, exactly the criteria for the least cache memory waste. 
  1418.  
  1419. Target Alignment 
  1420. The third instruction caching benefit is also the result of the sequential 
  1421. grouping of executed code.  Most modern compilers align code reached by 
  1422. transfer instructions (such as the start of procedures) on a 16 byte boundary. 
  1423. The principle is simple, once the procedure is reached the most efficient thing 
  1424. to do is minimise the number of cache line reads.  Up to 15 bytes of padding 
  1425. must be inserted to ensure 16 byte paragraph alignment. 
  1426.  
  1427. This is clearly a good strategy in normal circumstances but LXOPT processed 
  1428. code is no longer 'normal'.  After processing, the instructions immediately 
  1429. preceding the aligned procedure are very likely to already be inside the 
  1430. instruction cache.  LXOPT has grouped code by time of use.  Even if the code is 
  1431. not already in the cache it is likely to be needed in the immediate future. 
  1432. Padding code out to 16 byte boundaries is now a less attractive proposition. 
  1433. Most instruction padding becomes a waste of valuable CPU cache memory. 
  1434.  
  1435. The benefit of improved locality of reference is enhanced if the result of a 
  1436. transfer instruction has come as a surprise to the processors instruction 
  1437. prefetch mechanism.  If the new target is already in the cache the initial 
  1438. instructions may be fed directly to the execution unit, keeping it busy while 
  1439. the instruction prefetch struggles to regain its lead over the execution 
  1440. pipeline(s). 
  1441.  
  1442. Removal of all padding is not necessarily optimal even after LXOPT processing. 
  1443. Performance of the 486 processor can be degraded where an instruction crosses 
  1444. an alignment boundary. 
  1445.  
  1446. LXOPT removes padding between arranged code but allows the developer to choose 
  1447. how many bytes of CPU cache to waste to ensure alignment on a cache line 
  1448. boundary. /cLineSize (default 16) permits the developer to specify the target 
  1449. cache line size and /cLineWaste (default 3) specifies how many bytes of cache 
  1450. line you are willing to waste to ensure alignment. 
  1451.  
  1452.  
  1453. ΓòÉΓòÉΓòÉ 7.6. Performance Testing  ΓòÉΓòÉΓòÉ
  1454.  
  1455.  Performance Testing
  1456.  
  1457. The working set tuning benefits of LXOPT in percentage terms are reasonably 
  1458. consistent across applications but other factors affect how this translates 
  1459. into performance improvements. LXOPT reduces the overhead of loading code and 
  1460. the memory needed to store it. A 50Kb application that manipulates 10Mb of data 
  1461. will benefit little from working set tuning of code. If you are evaluating 
  1462. LXOPT for use on a large project do not performance test on a 'Hello World' 
  1463. type program. The only way to obtain reliable results is to test with the 
  1464. intended application. 
  1465.  
  1466. The first reaction of a developer after creating a new program arrangement is 
  1467. to test that the application behaves and performs as expected. 
  1468.  
  1469. Next is to reach for the stopwatch and test to see how much of a performance 
  1470. improvement has been achieved.  Normal performance testing involves executing 
  1471. the original and processed versions of the application through a pre-set 
  1472. sequence of tests and comparing the execution times.  There are several issues 
  1473. that a developer should be aware of when performance testing LXOPT processed 
  1474. code. 
  1475.  
  1476. Although LXOPT performs some minor CPU related optimisations, its primary role 
  1477. is still that of a working set tuner. 
  1478.  
  1479. When OS/2 manages the allocation and recycling of 4Kb pages of memory it is 
  1480. effectively performing the role of a cache controller.  In a virtual memory 
  1481. environment your system RAM has become a giant cache memory.  LXOPT operates by 
  1482. arranging your code to allow this cache to work as efficiently as possible. 
  1483.  
  1484. When your application executes it results in the loading of code pages from not 
  1485. only the application executable but from other DLLs on which it depends (e.g. 
  1486. PMMERGE.DLL).  When an application terminates many of these DLLs code pages 
  1487. remain in memory.  Execution of the application has changed the set of code 
  1488. pages that are loaded into memory.  This caching of code pages will result in 
  1489. varying execution times for actions which appear to the user to be equivalent. 
  1490.  
  1491. Caching is used not just by the OS/2 loader but by the file system(s) and often 
  1492. disk access hardware.  If you are working on a network your file server is 
  1493. caching there too.  This caching which is normally of great benefit is also a 
  1494. major obstacle to valid performance testing.  As a developer you may have 
  1495. recently created or executed the code to be tested.  Either way you will have 
  1496. caused the contents of the executable file to pass through the cache(s) on the 
  1497. way to or from the disk.  Program data files may benefit/suffer from similar 
  1498. effects. 
  1499.  
  1500. For valid testing we need an equal playing field with all code starting out on 
  1501. disk.  The most simple and effective way to do this is to restart your machine, 
  1502. wait for all disk activity to cease (wait for 3 whole minutes of inactivity) 
  1503. and then time the execution of the original application.  Repeat this process 
  1504. for the LXOPT processed version and the runtimes can be reliably compared. 
  1505. Avoid using code or data files on a shared file server for obvious reasons. 
  1506.  
  1507. The program utility TimeRun will assist in measuring the run time of an 
  1508. application. 
  1509.  
  1510. Remember also that OS/2 is a multitasking operating system and other tasks are 
  1511. always executing together with your own.  This may become a problem if these 
  1512. other tasks behave differently between test runs.  The simple act of moving a 
  1513. mouse pointer over another window or forcing an additional redraw may 
  1514. significantly affect results as code is loaded and executed to handle these 
  1515. actions. 
  1516.  
  1517. The ratio of code size to available system memory is another major influence. 
  1518. Developers tend to have the fastest disks, modern controllers and more system 
  1519. RAM than other types of computer users.  Working set tuning really shows its 
  1520. worth when a tuned application is executed in a restricted memory environment. 
  1521. When performance testing try using a machine typical of your users.  Using a 
  1522. machine with only 8Mb or less will help to simulate low memory conditions. 
  1523. Alternatively use the program utility Thrash while performance testing your 
  1524. application.  This utility will simulate the low memory conditions that can be 
  1525. created by other memory hungry applications. 
  1526.  
  1527. Ultimately memory savings will depend on application size.  Pages not used by 
  1528. your application are free for use by all.  These free pages are allocated to 
  1529. applications on demand by OS/2.  If your application is the major consumer of 
  1530. memory then it will have the greatest reward.  Trivial short-lived applications 
  1531. are usually not memory restricted as memory pages allocated to them will rarely 
  1532. be loaded long enough to reach the end of the LRU page queue.  The benefit here 
  1533. is a shortened load time and reduced impact on the rest of the system. 
  1534.  
  1535. In an ideal world all code would be working set tuned.  Assuming a 50:50 code 
  1536. to data ratio the combined effect would be equivalent to a RAM upgrade of 
  1537. approximately 33% for all OS/2 users. 
  1538.  
  1539.  
  1540. ΓòÉΓòÉΓòÉ 7.7. Patch for CSet++ V2.0 and 2.1 Users  ΓòÉΓòÉΓòÉ
  1541.  
  1542.  Patch for CSet++ V2.0 and 2.1 Users
  1543.  
  1544. LXOPT requires internal fixups to be retained within executable files.  LINK386 
  1545. will remove these internal fixups if it is invoked with the '/base' option. 
  1546. When ICC.EXE initiates a link of an EXE file it automatically passes this 
  1547. option to LINK386. 
  1548.  
  1549. Although many users can invoke LINK386 directly, ICC requires that applications 
  1550. using C++ templates use ICC to initiate the link.  Under these circumstances it 
  1551. is impossible to prevent the setting of a base address. 
  1552.  
  1553. LXOPT contains the program ICCPATCH.EXE which disables this behaviour in 
  1554. ICC.EXE.  The patch locates the parameter string within ICC.EXE and removes it, 
  1555. preventing it from being passed to the linker. 
  1556.  
  1557. Usage of ICCPATCH is: 
  1558.  
  1559. [C:\DEVTOOLS\IBMCPP\BIN] ICCPATCH ICC.EXE
  1560.  
  1561. Make a copy of the file before you patch it, the given file is altered in 
  1562. place.  If ICCPATCH reports that it is unable to open the file it is likely 
  1563. that ICC.EXE is still in memory.  Type 'ICC /tl-' and reattempt the patch. 
  1564.  
  1565. Providing a base address of 65536 for an EXE file is good practice and should 
  1566. normally always be observed.  Based executables will be a little smaller and 
  1567. load a little faster, which is the reason ICC provides a base address by 
  1568. default.  After applying the patch be sure to provide the '/base:65536' 
  1569. parameter to the linker via the ICC.EXE /B option for all executables which are 
  1570. not to be processed by LXOPT. 
  1571.  
  1572. DLLs require no such action and if you plan to apply LXOPT only to DLL files 
  1573. you should not apply this patch. 
  1574.  
  1575. If you later apply a CSet++ CSD you may have to reapply this patch.  Note that 
  1576. this patch is supplied by Functional Software Ltd and is not supported by IBM. 
  1577.  
  1578.  
  1579. ΓòÉΓòÉΓòÉ 8. Reference  ΓòÉΓòÉΓòÉ
  1580.  
  1581.                                     Reference
  1582.  
  1583.  
  1584. ΓòÉΓòÉΓòÉ 8.1. Options  ΓòÉΓòÉΓòÉ
  1585.  
  1586.  Options
  1587.  
  1588. Options are identified by a preceding / and are not case sensitive. 
  1589.  
  1590. If an option requires a value that value must immediately follow the option 
  1591. name separated by a colon. 
  1592.  
  1593.  e.g. /alg:stat 
  1594.  
  1595.  
  1596. ΓòÉΓòÉΓòÉ 8.1.1. /alg  ΓòÉΓòÉΓòÉ
  1597.  
  1598.  /alg
  1599.  
  1600. Syntax: /alg:<binary | firstuse | stat | parkonly> 
  1601.  
  1602. Specify the algorithm to be used to generate the new code arrangement. 
  1603.  
  1604. Available algorithms are binary, firstuse, parkonly and stat. 
  1605.  
  1606. Firstuse is a simple (and fast) arrangement algorithm which orders code blocks 
  1607. based on the order in which they are first used. 
  1608.  
  1609. Stat is a more powerful algorithm which identifies the pattern of executed code 
  1610. using statistical methods and uses this to order code blocks.  The 'stat' 
  1611. algorithm is capable of producing significantly better results than 'firstuse' 
  1612. but is extremely sensitive to its /groups option. 
  1613.  
  1614. Binary is a powerful arrangement algorithm which uses the recording history to 
  1615. create a binary pattern of usage for each code block.  Blocks are then grouped 
  1616. by similarity of the patterns produced. 
  1617.  
  1618. Parkonly performs no arrangement other than the parking of unused code.  It is 
  1619. intended for use by developers who wish to retain control over the location of 
  1620. executed code and is not recommended for normal use. 
  1621.  
  1622. Default is to use the binary algorithm. 
  1623.  
  1624.  
  1625. ΓòÉΓòÉΓòÉ 8.1.2. /align  ΓòÉΓòÉΓòÉ
  1626.  
  1627.  /align
  1628.  
  1629. Syntax: /align:<num> 
  1630.  
  1631. Specify the alignment to be given to both instruction and data pointer targets 
  1632. in the code area. Set to 1 (/align:1) for maximum compression. 
  1633.  
  1634. Alignment of code and data may be specified separately using the /alignCode and 
  1635. /alignData options.  The option /align:16 is equivalent to /alignCode:16 
  1636. /alignData:16. 
  1637.  
  1638. The default alignment is 1 for code pointer targets and 4 for data pointer 
  1639. targets. 
  1640.  
  1641. Use of alignment is not just a performance issue, it may be vital for some 
  1642. types of program, see restrictions for more information. 
  1643.  
  1644. Alignment of code for performance reasons is better addressed via the 
  1645. /cLineSize and /cLineWaste options.  See CPU Instruction Caching for a 
  1646. discussion of the issues involved. 
  1647.  
  1648.  
  1649. ΓòÉΓòÉΓòÉ 8.1.3. /alignCode  ΓòÉΓòÉΓòÉ
  1650.  
  1651.  /alignCode
  1652.  
  1653. Syntax: /alignCode:<num> 
  1654.  
  1655. Specify the alignment to be given to processor instructions in the processed 
  1656. code object that are referenced by a pointer.  Default is 1 for maximum 
  1657. compression. 
  1658.  
  1659. Use of alignment is not just a performance issue, it may be vital for some 
  1660. types of program, see restrictions for more information. 
  1661.  
  1662. Alignment of code is also affected by the more general /align option. 
  1663.  
  1664. Data in the processed code object may be aligned using the /alignData option. 
  1665.  
  1666. Alignment of code for performance reasons is better addressed via the 
  1667. /cLineSize and /cLineWaste options.  See CPU Instruction Caching for a 
  1668. discussion of the issues involved. 
  1669.  
  1670.  
  1671. ΓòÉΓòÉΓòÉ 8.1.4. /alignData  ΓòÉΓòÉΓòÉ
  1672.  
  1673.  /alignData
  1674.  
  1675. Syntax: /alignData:<num> 
  1676.  
  1677. Specify the alignment to be given to data in the processed code object. 
  1678. Default alignment is 4. 
  1679.  
  1680. Use of alignment is not just a performance issue, it may be vital for some 
  1681. types of program, see restrictions for more information. 
  1682.  
  1683. Alignment of data is also affected by the more general /align option. 
  1684.  
  1685. Code reached via pointer values in the processed code object may be aligned 
  1686. using the /alignCode option. 
  1687.  
  1688.  
  1689. ΓòÉΓòÉΓòÉ 8.1.5. /arrange  ΓòÉΓòÉΓòÉ
  1690.  
  1691.  /arrange
  1692.  
  1693. Syntax: /arrange 
  1694.  
  1695. Generate new code arrangement based on results of previous recording 
  1696. session(s).  Alternative is /prep. 
  1697.  
  1698. For an explanation of the arrangement process see Creating Optimised Code 
  1699. Arrangement. 
  1700.  
  1701.  
  1702. ΓòÉΓòÉΓòÉ 8.1.6. /base  ΓòÉΓòÉΓòÉ
  1703.  
  1704.  /base
  1705.  
  1706. Syntax: /base:<hex base address> (default - See below) 
  1707.  
  1708. Specify the new base address for the application file processed. 
  1709.  
  1710. By default EXE files will automatically be based at address 00010000H. 
  1711.  
  1712. By default DLL files will retain any existing base address.  If not previously 
  1713. based the DLL is given a default base of 00800000H. 
  1714.  
  1715.  
  1716. ΓòÉΓòÉΓòÉ 8.1.7. /buff  ΓòÉΓòÉΓòÉ
  1717.  
  1718.  /buff
  1719.  
  1720. Syntax: /buff:<size> (default 1024Kb) 
  1721.  
  1722. Specify the size of the recording buffer in Kb. 
  1723.  
  1724. This is the size of the recording buffer to be used while recording. 
  1725.  
  1726. Code references are stored in the buffer while recording.  Once the buffer is 
  1727. full it must be written to disk.  Writing is done as part of the application 
  1728. instance/thread being recorded. 
  1729.  
  1730. If your application is timing sensitive adjusting this value may remove timing 
  1731. problems while recording.  Valid values are from 4Kb to the maximum allocatable 
  1732. amount of virtual memory. 
  1733.  
  1734.  
  1735. ΓòÉΓòÉΓòÉ 8.1.8. /cLineSize  ΓòÉΓòÉΓòÉ
  1736.  
  1737.  /cLineSize
  1738.  
  1739. Syntax: /cLineSize:<cache_line_size> (default 16) 
  1740.  
  1741. Specifies the cache line size (and hence alignment) to be assumed for CPU cache 
  1742. optimisation.  Default is 16 bytes. 
  1743.  
  1744. Only code which cannot be reached after executing the preceding instruction in 
  1745. memory is affected by this option.  A typical example of such code is the first 
  1746. instruction of a procedure in a high level language. 
  1747.  
  1748. Together with /cLineWaste this option controls the performance related 
  1749. alignment of code within the processed code object.  In combination these 
  1750. options allow the developer to influence CPU cache efficiency. 
  1751.  
  1752. See CPU Instruction Caching for a discussion of the issues involved. 
  1753.  
  1754.  
  1755. ΓòÉΓòÉΓòÉ 8.1.9. /cLineWaste  ΓòÉΓòÉΓòÉ
  1756.  
  1757.  /cLineWaste
  1758.  
  1759. Syntax: /cLineWaste:<cache_waste_bytes> (default 3) 
  1760.  
  1761. Specifies the number of bytes of a CPU cache line the developer is willing to 
  1762. waste to ensure that code reached only via transfer instructions aligns on a 
  1763. cache line boundary.  Default is 3 bytes. 
  1764.  
  1765. Only code which cannot be reached after executing the preceding instruction in 
  1766. memory is affected by this option.  A typical example of such code is the first 
  1767. instruction of a procedure in a high level language. 
  1768.  
  1769. Together with /cLineSize this option controls the performance related alignment 
  1770. of code within the processed code object.  In combination these options allow 
  1771. the developer to influence CPU cache efficiency. 
  1772.  
  1773. See CPU Instruction Caching for a discussion of the issues involved. 
  1774.  
  1775.  
  1776. ΓòÉΓòÉΓòÉ 8.1.10. /compress  ΓòÉΓòÉΓòÉ
  1777.  
  1778.  /compress
  1779.  
  1780. Syntax: /compress:<comp_distance> (default 50) 
  1781.  
  1782. Compress recording by only recording code references not used within the last 
  1783. 'comp_distance' recorded items. 
  1784.  
  1785. As each use of code is detected the recorder checks to see how recently this 
  1786. code was last recorded.  If within 'comp_distance' the use of the code is not 
  1787. recorded.  This significantly reduces the size of the recording file saving 
  1788. disk space and the time taken to write the data. 
  1789.  
  1790. Compressed recording has a higher CPU and memory overhead but this overhead is 
  1791. unaffected by the size of 'comp_distance'. 
  1792.  
  1793. Performance of the stat arrangement algorithm is progressively degraded by 
  1794. increasing values of 'comp_distance'.  Performance of the other arrangement 
  1795. algorithms is relatively unaffected by compression. 
  1796.  
  1797. The frequency with which recordings are flushed to disk may be altered by the 
  1798. /buff option. 
  1799.  
  1800.  
  1801. ΓòÉΓòÉΓòÉ 8.1.11. /disasm  ΓòÉΓòÉΓòÉ
  1802.  
  1803.  /disasm
  1804.  
  1805. Syntax: /disasm:<hex offset> (default 0) 
  1806.  
  1807. Perform disassembly beginning at the given offset into the code object. 
  1808.  
  1809. For performance reasons the disassembly does not take advantage of the code 
  1810. identification features of LXOPT but performs a 'blind' disassembly as 
  1811. typically provided by a debugging tool. 
  1812.  
  1813. The default number of bytes to disassemble is 50 but can be altered via the 
  1814. /dislen option. 
  1815.  
  1816.  
  1817. ΓòÉΓòÉΓòÉ 8.1.12. /dislen  ΓòÉΓòÉΓòÉ
  1818.  
  1819.  /dislen
  1820.  
  1821. Syntax: /dislen:<count> (default 50) 
  1822.  
  1823. Set the number of bytes to disassemble when using the /disasm option. 
  1824.  
  1825. The locations are given and provided as hexadecimal offsets into the processed 
  1826. code object.  Offsets within other objects are not affected by LXOPT.  Note 
  1827. that translated offsets of transfer instructions may point to a different 
  1828. (possibly zero length) transfer instruction sequence in the original executable 
  1829. file. 
  1830.  
  1831. The corresponding /getNew option provides the reverse of this translation. 
  1832.  
  1833.  
  1834. ΓòÉΓòÉΓòÉ 8.1.13. /forceIntFix  ΓòÉΓòÉΓòÉ
  1835.  
  1836.  /forceIntFix
  1837.  
  1838. Syntax: /forceIntFix (default OFF) 
  1839.  
  1840. The setting of the internal fixups flag in the executable file header has 
  1841. proven to vary between development tools.  LXOPT now ignores the header flag 
  1842. and searches for internal fixups within the fixup section.  This option 
  1843. disables this test and forces LXOPT to assume that all required internal fixups 
  1844. are present in the file. 
  1845.  
  1846. This option is provided to cover the rare but theoretically possible situation 
  1847. where a file (most probably a code only DLL) does not require a single internal 
  1848. fixup.  Inappropriate use of this option will cause the produced recording 
  1849. version of the application to fail with an access violation.  DO NOT USE THIS 
  1850. OPTION UNLESS YOU ARE SURE YOUR EXE/DLL FILE DOES NOT CONTAIN A SINGLE DIRECT 
  1851. MEMORY REFERENCE. 
  1852.  
  1853.  
  1854. ΓòÉΓòÉΓòÉ 8.1.14. /getOld  ΓòÉΓòÉΓòÉ
  1855.  
  1856.  /getOld
  1857.  
  1858. Syntax: /getOld:<hex_offset> 
  1859.  
  1860. Find the original position of the code/data that is located at the given offset 
  1861. into the processed code object in the optimised executable file. 
  1862.  
  1863. The locations are given and provided as hexadecimal offsets into the processed 
  1864. code object.  Offsets within other objects are not affected by LXOPT.  Note 
  1865. that LXOPT alters, inserts and removes transfer instructions (JMP, JNZ etc) as 
  1866. part of the optimisation process.  When using the offsets of transfer 
  1867. instructions the translated offset may point to a different instruction 
  1868. sequence but will represent the same logical position in the path of execution. 
  1869.  
  1870. The corresponding /getNew option provides the reverse of this translation. 
  1871.  
  1872.  
  1873. ΓòÉΓòÉΓòÉ 8.1.15. /getNew  ΓòÉΓòÉΓòÉ
  1874.  
  1875.  /getNew
  1876.  
  1877. Syntax: /getNew:<hex offset> 
  1878.  
  1879. Find the new position of the code/data that was located at the given offset 
  1880. into the processed code object in the original executable file. 
  1881.  
  1882. The locations are given and provided as offsets into the processed code object. 
  1883. Offsets within other objects are not affected by LXOPT.  Note that unused code 
  1884. or data from the original version of the executable may be removed by LXOPT 
  1885. optimisation and so will have no corresponding new offset. 
  1886.  
  1887. Translated offsets of transfer instructions may point to a different transfer 
  1888. instruction sequence or the transfer sequence may have been optimised out 
  1889. entirely. 
  1890.  
  1891. The /getOld option provides the reverse of this translation process. 
  1892.  
  1893.  
  1894. ΓòÉΓòÉΓòÉ 8.1.16. /groups  ΓòÉΓòÉΓòÉ
  1895.  
  1896.  /groups
  1897.  
  1898. Syntax: /groups:<group_count> (default 3) 
  1899.  
  1900. Specify the number of distribution groups into which to divide code blocks when 
  1901. using the stat algorithm. 
  1902.  
  1903. The optimum value for this setting is application specific and may require 
  1904. experimentation to achieve the best result. 
  1905.  
  1906.  
  1907. ΓòÉΓòÉΓòÉ 8.1.17. /ignoreMsgSeg  ΓòÉΓòÉΓòÉ
  1908.  
  1909.  /ignoreMsgSeg
  1910.  
  1911. Syntax: /ignoreMsgSeg 
  1912.  
  1913. WARNING:             USE OF THIS OPTION WILL CAUSE PROCESSED CODE TO FAIL ON 
  1914.                     THE FIRST ATTEMPT TO RETRIEVE DosGetMessage DATA. 
  1915.  
  1916.  Force LXOPT to ignore DosGetMessage data within application code.  This data 
  1917.  bypasses normal fixup referencing and is incompatible with LXOPT processing. 
  1918.  
  1919.  To avoid problems with DosGetMessage data refer to the instructions given with 
  1920.  the LXO0169 error.  Only use the /ignoreMsgSeg option if you are unable to 
  1921.  relink the exe/dll. 
  1922.  
  1923.  The DosGetMessage data is detected by searching for a (0xFF,"_MSGSEG") byte 
  1924.  sequence within the processed code.  This option should only be used where the 
  1925.  detection is believed to be incorrect (BEWARE - DosGetMessage is often 
  1926.  included and used by library code) or if it is known that code logic prevents 
  1927.  any calls to DosGetMessage. 
  1928.  
  1929.  
  1930. ΓòÉΓòÉΓòÉ 8.1.18. /lxinfo  ΓòÉΓòÉΓòÉ
  1931.  
  1932.  /lxinfo
  1933.  
  1934. Syntax: /lxinfo:<path> 
  1935.  
  1936. Specify path name for information gathered from source. 
  1937.  
  1938. The default is to use the application name with a .LXI extension.  Use this 
  1939. option to place the file in another location. 
  1940.  
  1941. This option must be consistent across use of the /prep and /arrange options. 
  1942.  
  1943.  
  1944. ΓòÉΓòÉΓòÉ 8.1.19. /noreport  ΓòÉΓòÉΓòÉ
  1945.  
  1946.  /noreport
  1947.  
  1948. Syntax: /noreport 
  1949.  
  1950. Do not generate comparative report on old and new code arrangements. See the 
  1951. /report option for a description of report generation. 
  1952.  
  1953.  
  1954. ΓòÉΓòÉΓòÉ 8.1.20. /orig  ΓòÉΓòÉΓòÉ
  1955.  
  1956.  /orig
  1957.  
  1958. Syntax: /orig:<path> 
  1959.  
  1960. Specify path name to which the original application file should be renamed. If 
  1961. this file already exists it is deleted. 
  1962.  
  1963. Default is to use the application name with a .ORI extension. 
  1964.  
  1965. This option must be consistent across use of the /prep and /arrange options. 
  1966.  
  1967.  
  1968. ΓòÉΓòÉΓòÉ 8.1.21. /overwrite  ΓòÉΓòÉΓòÉ
  1969.  
  1970.  /overwrite
  1971.  
  1972. Syntax: /overwrite 
  1973.  
  1974. Disable test which checks that original EXE/DLL file has not been updated 
  1975. before overwriting it after a new code arrangement has been generated. 
  1976.  
  1977. During arrangement LXOPT will normally check that an application file has not 
  1978. changed since it was prepared.  If it has confirmation is sought that the file 
  1979. may be overwritten.  This option switches off that test and always overwrites 
  1980. the original file. 
  1981.  
  1982. This option is only relevant when used with the /arrange option. 
  1983.  
  1984.  
  1985. ΓòÉΓòÉΓòÉ 8.1.22. /pack2  ΓòÉΓòÉΓòÉ
  1986.  
  1987.  /pack2
  1988.  
  1989. Syntax: /pack2[:<reduction threshold% (default 15)>] (default auto) 
  1990.  
  1991. Force the use of executable file page compression as introduced with OS/2 WARP. 
  1992. Each page in the file is compressed and the reduction in size calculated.  If 
  1993. the percentage reduction is greater than 15% the compressed form of the page is 
  1994. used.  The threshold of 15% may be varied by providing the new threshold to be 
  1995. used as a numeric parameter.  FILES USING PAGE LEVEL COMPRESSION WILL NOT 
  1996. EXECUTE ON VERSIONS OF OS/2 PRIOR TO WARP. 
  1997.  
  1998. To preserve the operating system version compatibility of the existing software 
  1999. LXOPT will only use page compression if the file already contains compressed 
  2000. pages or if the /pack2 option is specified.  All pages in the file including 
  2001. those containing data and resources are candidates for compression. 
  2002.  
  2003. The use of /pack2:100 will remove all compression from the resulting 
  2004. executable. 
  2005.  
  2006.  
  2007. ΓòÉΓòÉΓòÉ 8.1.23. /preload  ΓòÉΓòÉΓòÉ
  2008.  
  2009.  /preload
  2010.  
  2011. Syntax: /preload 
  2012.  
  2013. Allow the produced EXE/DLL file to be used with the Preload Utility. This 
  2014. option should be used in combination with the /arrange option. 
  2015.  
  2016. Preloading raises important development and performance issues.  See the 
  2017. section on Preloading Code for a discussion of when and how to use files 
  2018. prepared with this option. 
  2019.  
  2020. Use of /preload causes LXOPT to intercept EXE/DLL initialisation and insert a 
  2021. small preloading code stub of approximately 200 bytes.  The resulting file may 
  2022. be used normally or preloaded using the Preload Utility.  Files with 16 bit 
  2023. initialisation entry points may be not be preloaded. 
  2024.  
  2025. The inserted code stub is activated by the Preload Utility when a request is 
  2026. made to preload the file. 
  2027.  
  2028.  
  2029. ΓòÉΓòÉΓòÉ 8.1.24. /prep  ΓòÉΓòÉΓòÉ
  2030.  
  2031.  /prep
  2032.  
  2033. Syntax: /prep (default) 
  2034.  
  2035. Prepare the given exe/dll for a recording session. Alternative is /arrange. 
  2036.  
  2037. For an explanation of the preparation process see Creating a Recording Version. 
  2038.  
  2039.  
  2040. ΓòÉΓòÉΓòÉ 8.1.25. /recfile  ΓòÉΓòÉΓòÉ
  2041.  
  2042.  /recfile
  2043.  
  2044. Syntax: /recfile:<path> 
  2045.  
  2046. Specify path name of recording file. If the file already exists when recording 
  2047. starts the new recording is appended. 
  2048.  
  2049. The path name is used exactly as entered.  A relative path name will be used to 
  2050. open/create the recording file if one is specified.  For example, 
  2051. /recfile:MYAPP.REC will create the recording file MYAPP.REC in the current 
  2052. directory of the executing program.  This can be useful if recording is to be 
  2053. performed on other machines 
  2054.  
  2055. The default is to use the full application path name with a .REC extension. 
  2056.  
  2057. Moving data from the recording buffer to the recording file can form a 
  2058. significant part of the overhead of the recording process.  Recording files 
  2059. should ideally be placed on the fastest available local drive. 
  2060.  
  2061. Certain applications and DLLs have more than one instance while running.  When 
  2062. multiple instances are detected the recording DLL creates a new recording file 
  2063. for each instance.  The name for this file is generated by appending the 
  2064. instance number separated by a dot to the normal recording file name.  Thus 3 
  2065. instances of a DLL during recording might create: 
  2066.  
  2067. MYDLL.REC
  2068. MYDLL.REC.2
  2069. MYDLL.REC.3
  2070.  
  2071. If recording onto a FAT based partition you will need to use a /recfile path 
  2072. without an extension to allow production of valid 8.3 filenames. 
  2073.  
  2074. When using the /arrange option only one recfile may be specified.  To use 
  2075. multiple files concatenate them into one file with the OS/2 COPY command and 
  2076. specify the result as the recording file (e.g. COPY C:\RECDIR\*.REC* 
  2077. COMBINED.REC).  File concatenation also allows multiple recordings to be 
  2078. created at different times or on different machines and then combined before 
  2079. use. 
  2080.  
  2081.  
  2082. ΓòÉΓòÉΓòÉ 8.1.26. /reckeep  ΓòÉΓòÉΓòÉ
  2083.  
  2084.  /reckeep
  2085.  
  2086. Syntax: /recKeep:<path> 
  2087.  
  2088. Specify path name to which the previously generated recording application 
  2089. should be renamed. If this file already exists it is deleted. 
  2090.  
  2091. When a new arrangement is created LXOPT keeps the recording version of the 
  2092. application to allow further recording if required. 
  2093.  
  2094. Valid only with the /arrange option, this option allows the user to specify the 
  2095. path name to which the recording version should be renamed. 
  2096.  
  2097. Default is to use application path name with a .PRP extension. 
  2098.  
  2099.  
  2100. ΓòÉΓòÉΓòÉ 8.1.27. /report  ΓòÉΓòÉΓòÉ
  2101.  
  2102.  /report
  2103.  
  2104. Syntax: /report (default) 
  2105.  
  2106. Show comparative page fault report using old and new arrangements. 
  2107.  
  2108. LXOPT can use the recording file to simulate program page fault behaviour under 
  2109. various available memory conditions.  This is used to provide a comparison 
  2110. between the old and new code arrangements. 
  2111.  
  2112. Note: LXOPT can only simulate code accesses. If data is stored within the code 
  2113. object page faults caused by references to it will not be simulated. 
  2114.  
  2115. While informative a report may take some time to calculate and may be disabled 
  2116. by the alternative /noreport option. 
  2117.  
  2118.  
  2119. ΓòÉΓòÉΓòÉ 8.1.28. /thread  ΓòÉΓòÉΓòÉ
  2120.  
  2121.  /thread
  2122.  
  2123. Syntax: /thread:<single | multi | async | crit> 
  2124.  
  2125. Specifies the how the target application uses threads.  This information is 
  2126. used to decide if or how the LXOPT recorder should protect itself from 
  2127. interruption.  Users need not use this option unless they experience 
  2128. performance problems while recording. 
  2129.  
  2130. single 
  2131. Target application is single threaded.  Recording code does not need to guard 
  2132. against interruption by another thread.  This involves the least overhead 
  2133. during recording and should be used whenever possible. 
  2134.  
  2135. multi 
  2136. Target application is multi-threaded but does not terminate/suspend threads 
  2137. asynchronously.  Recording code guards against interruption by another thread 
  2138. but assumes that no thread halts execution of another by use of 
  2139. DosKillThread(otherThread) or DosSuspendThread(otherThread).  This option 
  2140. carries a slightly greater overhead during recording than the 'single' option. 
  2141.  
  2142. async 
  2143. Target application is multi-threaded and may terminate/suspend threads 
  2144. asynchronously.  Recording code ensures that it is not halted inside critical 
  2145. instruction sequences.  This involves a higher overhead during recording but 
  2146. does not allow for multiple threads of differing priorities. 
  2147.  
  2148. crit (Default) 
  2149. Target application is multi-threaded, may terminate/suspend threads 
  2150. asynchronously and may vary thread priorities.  Recording code ensures that no 
  2151. thread can ever interrupt critical instruction sequences.  This involves a 
  2152. higher overhead during recording but is the safest option. 
  2153.  
  2154. Use the option with the least overhead that your application allows.  If you 
  2155. are unsure which option is correct for your application use 'crit'. If a thread 
  2156. safety level lower than required is used your application may lock-up, deadlock 
  2157. on semaphores or fail during recording. 
  2158.  
  2159. The /thread option takes effect only with the /prep option. 
  2160.  
  2161.  
  2162. ΓòÉΓòÉΓòÉ 8.2. Glossary  ΓòÉΓòÉΓòÉ
  2163.  
  2164.                                     Glossary
  2165.  
  2166.  
  2167. ΓòÉΓòÉΓòÉ 8.2.1. Binary Arrangement Algorithm  ΓòÉΓòÉΓòÉ
  2168.  
  2169.  Binary Arrangement Algorithm
  2170.  
  2171. An algorithm to calculate a new code layout based on code usage information 
  2172. obtained while recording. 
  2173.  
  2174. The binary arrangement algorithm is the default LXOPT arrangement algorithm. 
  2175.  
  2176. The recording history is used to generate a binary pattern with bits set 
  2177. corresponding to time of use in the executing application.  A pattern is 
  2178. created for each code block within the application.  Blocks are then grouped 
  2179. together based on similarity of these patterns.  For many applications the 
  2180. binary algorithm will produce the best results. 
  2181.  
  2182. Algorithms are chosen by use of the /alg option. 
  2183.  
  2184.  
  2185. ΓòÉΓòÉΓòÉ 8.2.2. Firstuse Arrangement Algorithm  ΓòÉΓòÉΓòÉ
  2186.  
  2187.  Firstuse Arrangement Algorithm
  2188.  
  2189. An algorithm to calculate a new code layout based on code usage information 
  2190. obtained while recording. 
  2191.  
  2192. The firstuse algorithm arranges code on disk in the order in which it is first 
  2193. executed. This is a simple but effective algorithm which is best used on small 
  2194. applications and those with a simple flow of control. 
  2195.  
  2196. Algorithms are chosen by use of the /alg option. 
  2197.  
  2198.  
  2199. ΓòÉΓòÉΓòÉ 8.2.3. Fixup  ΓòÉΓòÉΓòÉ
  2200.  
  2201.  Fixup
  2202.  
  2203. When an application is loaded any absolute references to other parts of the 
  2204. application and all external references such as calls to the operating system 
  2205. must be resolved. 
  2206.  
  2207. For this to be achieved information must be retained in the exe/dll file 
  2208. describing the references which need to be 'fixed'.  This information, known as 
  2209. 'relocations' or 'fixups', allows code to be located at a position in memory 
  2210. chosen by the operating system.  Fixups are automatically applied as each code 
  2211. (or data) page is loaded from the executable file. 
  2212.  
  2213.  
  2214. ΓòÉΓòÉΓòÉ 8.2.4. Page Fault  ΓòÉΓòÉΓòÉ
  2215.  
  2216.  Page Fault
  2217.  
  2218. All code for normal applications is divided into 4Kb pages.  A page fault is 
  2219. generated when an attempt is made to reference an address within a page that is 
  2220. not already in memory (*). 
  2221.  
  2222. When a page fault is generated OS/2 must load the page from disk, apply fixups 
  2223. to the page and return control to the application.  All application code is 
  2224. loaded via page faults.  When an application is started OS/2 does not 
  2225. immediately read any application code from the disk (**).  Code is loaded into 
  2226. memory only as a result of page faults generated as the path of execution 
  2227. strays on to each new page.  Execution of the errant thread is suspended until 
  2228. the page is loaded and available for use.  It is this effect which often causes 
  2229. the system to appear slow or 'jerky', most noticeably at application start-up 
  2230. or after the use of a large memory hungry application. 
  2231.  
  2232. The problem is compounded in low memory conditions where OS/2 is forced to 
  2233. release the contents of one memory page to provide space for another.  If the 
  2234. original page is later referenced it must be reloaded, again taking space from 
  2235. another.  Servicing page faults can represent a significant overhead for both 
  2236. your application and the system as a whole. 
  2237.  
  2238. LXOPT optimises your code layout to minimise the number of page faults required 
  2239. to run your application. 
  2240.  
  2241. * Not all page faults result in a disk access.  OS/2 will mark pages 'not 
  2242. present' and use resulting page faults to detect page references.  This 
  2243. mechanism helps to prevent repeatedly accessed pages being removed from memory. 
  2244. These 'artificial' page faults have only a small CPU impact, the page is found 
  2245. in memory and will not be read from disk. 
  2246.  
  2247. ** OS/2 V2.0 and later ignore EXE/DLL preload pages created by use of the 
  2248. PRELOAD keyword used in module definition files. 
  2249.  
  2250.  
  2251. ΓòÉΓòÉΓòÉ 8.2.5. Parked Code  ΓòÉΓòÉΓòÉ
  2252.  
  2253.  Parked Code
  2254.  
  2255. Code that is logically reachable but is not normally executed by your 
  2256. application.  Such code is detected by LXOPT and placed or 'parked' in your 
  2257. applications executable file on code pages where it causes least overhead. 
  2258.  
  2259. See Creating Optimised Code Arrangement for more details. 
  2260.  
  2261.  
  2262. ΓòÉΓòÉΓòÉ 8.2.6. ParkOnly Arrangement Algorithm  ΓòÉΓòÉΓòÉ
  2263.  
  2264.  ParkOnly Arrangement Algorithm
  2265.  
  2266. An algorithm to calculate a new code layout based on code usage information 
  2267. obtained while recording. 
  2268.  
  2269. The parkonly arrangement algorithm does not attempt to perform any code 
  2270. arrangement other than parking any unused code. 
  2271.  
  2272. This algorithm is intended to allow developers with special code arrangement 
  2273. needs to retain control over the arrangement of executed code while still 
  2274. gaining the benefit of code parking.  This algorithm is not intended for normal 
  2275. use and should only be chosen by developers who have created manual code 
  2276. layouts to match their special requirements. 
  2277.  
  2278. Algorithms are chosen by use of the /alg option. 
  2279.  
  2280.  
  2281. ΓòÉΓòÉΓòÉ 8.2.7. Recording File  ΓòÉΓòÉΓòÉ
  2282.  
  2283.  Recording File
  2284.  
  2285. A file generated during the recording phase of LXOPT usage.  This file is 
  2286. created and expanded as your application runs, recording the paths of execution 
  2287. through your code. 
  2288.  
  2289. See /recfile for more information and how to specify the recording file path. 
  2290.  
  2291.  
  2292. ΓòÉΓòÉΓòÉ 8.2.8. Sleeping Code  ΓòÉΓòÉΓòÉ
  2293.  
  2294.  Sleeping Code
  2295.  
  2296. Code not normally executed by your application.  Such code is typically used to 
  2297. handle unusual situations not encountered by your application during recording. 
  2298. This code may also be logically unreachable. 
  2299.  
  2300. LXOPT can place such code in your applications executable file in a location 
  2301. where it causes the least overhead while remaining accessible. 
  2302.  
  2303. See Creating Optimised Code Arrangement for more details. 
  2304.  
  2305.  
  2306. ΓòÉΓòÉΓòÉ 8.2.9. Statistical Arrangement Algorithm  ΓòÉΓòÉΓòÉ
  2307.  
  2308.  Statistical Arrangement Algorithm
  2309.  
  2310. An algorithm to calculate a new code layout based on code usage information 
  2311. obtained while recording. 
  2312.  
  2313. The stat algorithm uses statistics to detect the pattern of use of each code 
  2314. sequence throughout the life of the application. Code sequences are grouped by 
  2315. this pattern and then arranged within the group based on the most frequently 
  2316. used ordering.  The optimum number of groups into which to split the code is 
  2317. dependant on your application and is specified with the /groups option. 
  2318. Experiment with this option using different group values to find the optimum 
  2319. value for your application.  This is typically between 1 and 20. 
  2320.  
  2321. Performance of the stat algorithm is degraded when using high values for the 
  2322. /compress option. 
  2323.  
  2324. The stat algorithm is best suited to large applications or those with a complex 
  2325. flow of control. Experiment with values for the /groups option to achieve the 
  2326. best results. 
  2327.  
  2328. Algorithms are chosen by use of the /alg option. 
  2329.  
  2330.  
  2331. ΓòÉΓòÉΓòÉ 8.3. Program Messages  ΓòÉΓòÉΓòÉ
  2332.  
  2333.                                 Program Messages
  2334.  
  2335.  
  2336. ΓòÉΓòÉΓòÉ 8.3.1. Internal Errors  ΓòÉΓòÉΓòÉ
  2337.  
  2338.  Internal Errors
  2339.  
  2340. The LXOPT software performs numerous internal consistency checks during its 
  2341. operation.  If one of these tests should fail an internal error is produced. 
  2342.  
  2343. If you have not read the restrictions section please do so now, it is likely 
  2344. that some code has violated a restriction.  Try moving suspect code out of the 
  2345. processed code object (put it in a separate named segment) and reattempt LXOPT 
  2346. processing. 
  2347.  
  2348.  
  2349. ΓòÉΓòÉΓòÉ 8.3.2. LXO0100  ΓòÉΓòÉΓòÉ
  2350.  
  2351.  LXO0100
  2352.  
  2353. Failed to expand program fixup records. 
  2354.  
  2355. LXOPT failed to expand the applications fixup records.  Check that the 
  2356. application file is not corrupt (e.g. run exehdr on it). 
  2357.  
  2358.  
  2359. ΓòÉΓòÉΓòÉ 8.3.3. LXO0101  ΓòÉΓòÉΓòÉ
  2360.  
  2361.  LXO0101
  2362.  
  2363. Unable to create dump file. 
  2364.  
  2365. Dump files are used for debugging purposes and are created with the name "dump" 
  2366. in the current directory of the application. 
  2367.  
  2368.  
  2369. ΓòÉΓòÉΓòÉ 8.3.4. LXO0102  ΓòÉΓòÉΓòÉ
  2370.  
  2371.  LXO0102
  2372.  
  2373. Unable to pursue code instruction sequence. 
  2374.  
  2375. LXOPT was unable to pursue a sequence of bytes which it assumed to be code. 
  2376. This may be caused by exporting data from your applications code segment or by 
  2377. an internal error in LXOPT. 
  2378.  
  2379. To rectify export problems move any exported data to a separate object. 
  2380.  
  2381. To rectify code recognition problems move read-only application data out of 
  2382. your code object to a read-only data object. 
  2383.  
  2384.  
  2385. ΓòÉΓòÉΓòÉ 8.3.5. LXO0103  ΓòÉΓòÉΓòÉ
  2386.  
  2387.  LXO0103
  2388.  
  2389. Preparation of new code arrangement failed. 
  2390.  
  2391. An error occurred preparing the structures for the new application. Please 
  2392. ensure your original application file is valid. 
  2393.  
  2394.  
  2395. ΓòÉΓòÉΓòÉ 8.3.6. LXO0104  ΓòÉΓòÉΓòÉ
  2396.  
  2397.  LXO0104
  2398.  
  2399. Failed to create/write LXI file. 
  2400.  
  2401. A disk error occurred creating or writing the .LXI file.  Check that sufficient 
  2402. disk space is available and usage of the /lxinfo option. 
  2403.  
  2404.  
  2405. ΓòÉΓòÉΓòÉ 8.3.7. LXO0105  ΓòÉΓòÉΓòÉ
  2406.  
  2407.  LXO0105
  2408.  
  2409. Cannot copy program to "pathname" 
  2410.  
  2411. Failed to copy the original application file.  Check that the /orig option 
  2412. parameter.  If the file is a DLL check that it is not currently loaded by 
  2413. another application. 
  2414.  
  2415.  
  2416. ΓòÉΓòÉΓòÉ 8.3.8. LXO0106  ΓòÉΓòÉΓòÉ
  2417.  
  2418.  LXO0106
  2419.  
  2420. Cannot create file "pathname" 
  2421.  
  2422. Failed to create the given file.  Check the path is valid, there is sufficient 
  2423. free disk space, the file is not in use and the required access rights to the 
  2424. target directory are available. 
  2425.  
  2426.  
  2427. ΓòÉΓòÉΓòÉ 8.3.9. LXO0107  ΓòÉΓòÉΓòÉ
  2428.  
  2429.  LXO0107
  2430.  
  2431. Failed to write new program file. 
  2432.  
  2433. A failure occurred while writing the new executable.  Check disk space. 
  2434.  
  2435.  
  2436. ΓòÉΓòÉΓòÉ 8.3.10. LXO0108  ΓòÉΓòÉΓòÉ
  2437.  
  2438.  LXO0108
  2439.  
  2440. Failed to read LXI file "pathname" 
  2441.  
  2442. The LXI file could not be read or is invalid.  Check use of the /lxinfo option. 
  2443.  
  2444.  
  2445. ΓòÉΓòÉΓòÉ 8.3.11. LXO0109  ΓòÉΓòÉΓòÉ
  2446.  
  2447.  LXO0109
  2448.  
  2449. Invalid parameter or value for option: "option". 
  2450.  
  2451. The option or its parameter given to LXOPT was not recognised. 
  2452.  
  2453.  
  2454. ΓòÉΓòÉΓòÉ 8.3.12. LXO0110  ΓòÉΓòÉΓòÉ
  2455.  
  2456.  LXO0110
  2457.  
  2458. Failed to open "pathname" 
  2459.  
  2460. Could not open the given file.  Check that the pathname is valid, the file 
  2461. exists and you have sufficient access rights to its directory. 
  2462.  
  2463.  
  2464. ΓòÉΓòÉΓòÉ 8.3.13. LXO0111  ΓòÉΓòÉΓòÉ
  2465.  
  2466.  LXO0111
  2467.  
  2468. File "pathname" is not a valid linear executable 
  2469.  
  2470. Could not load the specified file.  The file is corrupt or is not an OS/2 
  2471. 2.x/WARP Linear eXecutable file. 
  2472.  
  2473.  
  2474. ΓòÉΓòÉΓòÉ 8.3.14. LXO0112  ΓòÉΓòÉΓòÉ
  2475.  
  2476.  LXO0112
  2477.  
  2478. See Internal Errors 
  2479.  
  2480.  
  2481. ΓòÉΓòÉΓòÉ 8.3.15. LXO0113  ΓòÉΓòÉΓòÉ
  2482.  
  2483.  LXO0113
  2484.  
  2485. Input offset is out of range. 
  2486.  
  2487. The supplied offset does not exist.  This message appears if an incorrect 
  2488. parameter is used with the /getOld or /getNew options.  Check that the value 
  2489. given is the offset in hex from the start of the processed code object. 
  2490.  
  2491. If this message appears during LXOPT preparation or arrangement this is an 
  2492. Internal Error. 
  2493.  
  2494.  
  2495. ΓòÉΓòÉΓòÉ 8.3.16. LXO0114  ΓòÉΓòÉΓòÉ
  2496.  
  2497.  LXO0114
  2498.  
  2499. See LXO0113 
  2500.  
  2501.  
  2502. ΓòÉΓòÉΓòÉ 8.3.17. LXO0115  ΓòÉΓòÉΓòÉ
  2503.  
  2504.  LXO0115
  2505.  
  2506. See LXO0113 
  2507.  
  2508.  
  2509. ΓòÉΓòÉΓòÉ 8.3.18. LXO0116  ΓòÉΓòÉΓòÉ
  2510.  
  2511.  LXO0116
  2512.  
  2513. See Internal Errors 
  2514.  
  2515. Although an internal error, this message has only previously occurred where a 
  2516. user is not following the advice in the Urgent Message section.  This is 
  2517. important advice, do not ignore it. 
  2518.  
  2519.  
  2520. ΓòÉΓòÉΓòÉ 8.3.19. LXO0117  ΓòÉΓòÉΓòÉ
  2521.  
  2522.  LXO0117
  2523.  
  2524. See Internal Errors 
  2525.  
  2526.  
  2527. ΓòÉΓòÉΓòÉ 8.3.20. LXO0118  ΓòÉΓòÉΓòÉ
  2528.  
  2529.  LXO0118
  2530.  
  2531. See Internal Errors 
  2532.  
  2533.  
  2534. ΓòÉΓòÉΓòÉ 8.3.21. LXO0119  ΓòÉΓòÉΓòÉ
  2535.  
  2536.  LXO0119
  2537.  
  2538. See Internal Errors 
  2539.  
  2540.  
  2541. ΓòÉΓòÉΓòÉ 8.3.22. LXO0120  ΓòÉΓòÉΓòÉ
  2542.  
  2543.  LXO0120
  2544.  
  2545. Information (.LXI) file was not created by this version of LXOPT. 
  2546.  
  2547. The LXI file you have attempted to use was created by another version of LXOPT. 
  2548.  
  2549. Applications must be prepared and arranged using the same version of LXOPT. 
  2550. Prepare and generate new recording information for the application using the 
  2551. current version of the LXOPT software. 
  2552.  
  2553.  
  2554. ΓòÉΓòÉΓòÉ 8.3.23. LXO0121  ΓòÉΓòÉΓòÉ
  2555.  
  2556.  LXO0121
  2557.  
  2558.  Recording (.REC) file does not belong to the processed application. 
  2559.  
  2560. Your recording file was not made by the application being processed. 
  2561.  
  2562. Check that you are attempting to arrange the correct application and that you 
  2563. are not using a recording file intended for an earlier version or a different 
  2564. application. 
  2565.  
  2566. See also the /recfile option. 
  2567.  
  2568.  
  2569. ΓòÉΓòÉΓòÉ 8.3.24. LXO0122  ΓòÉΓòÉΓòÉ
  2570.  
  2571.  LXO0122
  2572.  
  2573.  .REC file is not valid. 
  2574.  
  2575. The given recording file has been corrupted or is not a recording file. Check 
  2576. use of the /recfile option parameter. 
  2577.  
  2578.  
  2579. ΓòÉΓòÉΓòÉ 8.3.25. LXO0123  ΓòÉΓòÉΓòÉ
  2580.  
  2581.  LXO0123
  2582.  
  2583. Unrecognised arrangement algorithm "alg-name" 
  2584.  
  2585. The given arrangement algorithm name is not recognised. See the /alg option for 
  2586. more details. 
  2587.  
  2588.  
  2589. ΓòÉΓòÉΓòÉ 8.3.26. LXO0124  ΓòÉΓòÉΓòÉ
  2590.  
  2591.  LXO0124
  2592.  
  2593. See Internal Errors 
  2594.  
  2595.  
  2596. ΓòÉΓòÉΓòÉ 8.3.27. LXO0125  ΓòÉΓòÉΓòÉ
  2597.  
  2598.  LXO0125
  2599.  
  2600. See Internal Errors 
  2601.  
  2602.  
  2603. ΓòÉΓòÉΓòÉ 8.3.28. LXO0126  ΓòÉΓòÉΓòÉ
  2604.  
  2605.  LXO0126
  2606.  
  2607. See Internal Errors 
  2608.  
  2609.  
  2610. ΓòÉΓòÉΓòÉ 8.3.29. LXO0127  ΓòÉΓòÉΓòÉ
  2611.  
  2612.  LXO0127
  2613.  
  2614. See Internal Errors 
  2615.  
  2616.  
  2617. ΓòÉΓòÉΓòÉ 8.3.30. LXO0128  ΓòÉΓòÉΓòÉ
  2618.  
  2619.  LXO0128
  2620.  
  2621. See Internal Errors 
  2622.  
  2623.  
  2624. ΓòÉΓòÉΓòÉ 8.3.31. LXO0129  ΓòÉΓòÉΓòÉ
  2625.  
  2626.  LXO0129
  2627.  
  2628. See Internal Errors 
  2629.  
  2630.  
  2631. ΓòÉΓòÉΓòÉ 8.3.32. LXO0130  ΓòÉΓòÉΓòÉ
  2632.  
  2633.  LXO0130
  2634.  
  2635. See Internal Errors 
  2636.  
  2637.  
  2638. ΓòÉΓòÉΓòÉ 8.3.33. LXO0131  ΓòÉΓòÉΓòÉ
  2639.  
  2640.  LXO0131
  2641.  
  2642. See Internal Errors 
  2643.  
  2644.  
  2645. ΓòÉΓòÉΓòÉ 8.3.34. LXO0132  ΓòÉΓòÉΓòÉ
  2646.  
  2647.  LXO0132
  2648.  
  2649. See Internal Errors 
  2650.  
  2651.  
  2652. ΓòÉΓòÉΓòÉ 8.3.35. LXO0133  ΓòÉΓòÉΓòÉ
  2653.  
  2654.  LXO0133
  2655.  
  2656. See Internal Errors 
  2657.  
  2658.  
  2659. ΓòÉΓòÉΓòÉ 8.3.36. LXO0134  ΓòÉΓòÉΓòÉ
  2660.  
  2661.  LXO0134
  2662.  
  2663. See Internal Errors 
  2664.  
  2665.  
  2666. ΓòÉΓòÉΓòÉ 8.3.37. LXO0135  ΓòÉΓòÉΓòÉ
  2667.  
  2668.  LXO0135
  2669.  
  2670. See Internal Errors 
  2671.  
  2672.  
  2673. ΓòÉΓòÉΓòÉ 8.3.38. LXO0136  ΓòÉΓòÉΓòÉ
  2674.  
  2675.  LXO0136
  2676.  
  2677. See Internal Errors 
  2678.  
  2679.  
  2680. ΓòÉΓòÉΓòÉ 8.3.39. LXO0137  ΓòÉΓòÉΓòÉ
  2681.  
  2682.  LXO0137
  2683.  
  2684. See Internal Errors 
  2685.  
  2686.  
  2687. ΓòÉΓòÉΓòÉ 8.3.40. LXO0138  ΓòÉΓòÉΓòÉ
  2688.  
  2689.  LXO0138
  2690.  
  2691.  Code object exports a 286 call gate entry point. 
  2692.  
  2693. LXOPT has detected an exported 16 bit call gate entry which refers to the 32 
  2694. bit code object which is being processed.  It is likely that when control is 
  2695. received via this entry point that some 16 bit selectors will be in effect. 
  2696. LXOPT is designed to be applied to 32 bit code.  You cannot export 16 bit call 
  2697. gate entry points from the processed 32 bit code object. 
  2698.  
  2699.  
  2700. ΓòÉΓòÉΓòÉ 8.3.41. LXO0139  ΓòÉΓòÉΓòÉ
  2701.  
  2702.  LXO0139
  2703.  
  2704. See Internal Errors 
  2705.  
  2706.  
  2707. ΓòÉΓòÉΓòÉ 8.3.42. LXO0140  ΓòÉΓòÉΓòÉ
  2708.  
  2709.  LXO0140
  2710.  
  2711. See Internal Errors 
  2712.  
  2713.  
  2714. ΓòÉΓòÉΓòÉ 8.3.43. LXO0141  ΓòÉΓòÉΓòÉ
  2715.  
  2716.  LXO0141
  2717.  
  2718. See Internal Errors 
  2719.  
  2720.  
  2721. ΓòÉΓòÉΓòÉ 8.3.44. LXO0142  ΓòÉΓòÉΓòÉ
  2722.  
  2723.  LXO0142
  2724.  
  2725. See Internal Errors 
  2726.  
  2727.  
  2728. ΓòÉΓòÉΓòÉ 8.3.45. LXO0143  ΓòÉΓòÉΓòÉ
  2729.  
  2730.  LXO0143
  2731.  
  2732. See Internal Errors 
  2733.  
  2734.  
  2735. ΓòÉΓòÉΓòÉ 8.3.46. LXO0144  ΓòÉΓòÉΓòÉ
  2736.  
  2737.  LXO0144
  2738.  
  2739. See Internal Errors 
  2740.  
  2741.  
  2742. ΓòÉΓòÉΓòÉ 8.3.47. LXO0145  ΓòÉΓòÉΓòÉ
  2743.  
  2744.  LXO0145
  2745.  
  2746. See Internal Errors 
  2747.  
  2748.  
  2749. ΓòÉΓòÉΓòÉ 8.3.48. LXO0146  ΓòÉΓòÉΓòÉ
  2750.  
  2751.  LXO0146
  2752.  
  2753. Out of memory. 
  2754.  
  2755. LXOPT ran out of memory while processing the application.  Up to approximately 
  2756. 15 times the size of the application code size will need to be allocated for 
  2757. processing to succeed.  Check that there is sufficient free disk space on your 
  2758. swap partition. 
  2759.  
  2760.  
  2761. ΓòÉΓòÉΓòÉ 8.3.49. LXO0147  ΓòÉΓòÉΓòÉ
  2762.  
  2763.  LXO0147
  2764.  
  2765. Failed to follow code pointer. 
  2766.  
  2767. See LXO0102 
  2768.  
  2769.  
  2770. ΓòÉΓòÉΓòÉ 8.3.50. LXO0148  ΓòÉΓòÉΓòÉ
  2771.  
  2772.  LXO0148
  2773.  
  2774. No objects in program module. 
  2775.  
  2776. The processed application does not contain any code. 
  2777.  
  2778.  
  2779. ΓòÉΓòÉΓòÉ 8.3.51. LXO0149  ΓòÉΓòÉΓòÉ
  2780.  
  2781.  LXO0149
  2782.  
  2783. No pages in program module. 
  2784.  
  2785. The processed application does not contain any code. 
  2786.  
  2787.  
  2788. ΓòÉΓòÉΓòÉ 8.3.52. LXO0150  ΓòÉΓòÉΓòÉ
  2789.  
  2790.  LXO0150
  2791.  
  2792. Unused area "start address" to "end address" contains fixups. 
  2793.  
  2794. The bytes between the start and end offsets have been detected as unused. 
  2795. However they represent either valid code or initialised data. 
  2796.  
  2797. This warning will appear for almost all applications processed and demonstrates 
  2798. LXOPT's effectiveness at finding unused code or data.  Often such code is 
  2799. contained in libraries to which your application is linked.  Offsets are 
  2800. relative to the start of the processed code object.  Unused code or data is not 
  2801. referenced by any part of the application and is removed by LXOPT 
  2802.  
  2803. If your application contains assembler code that you suspect might be violating 
  2804. LXOPT restrictions you can use the address range and your map file to identify 
  2805. the source code. 
  2806.  
  2807.  
  2808. ΓòÉΓòÉΓòÉ 8.3.53. LXO0151  ΓòÉΓòÉΓòÉ
  2809.  
  2810.  LXO0151
  2811.  
  2812. Code object "object-number" is writeable. 
  2813.  
  2814. The given code object is writeable.  Although LXOPT can still process the 
  2815. application writeable code objects can indicate that programming techniques 
  2816. that violate LXOPT restrictions may be in use. This is particularly true if the 
  2817. object named is the one being processed. 
  2818.  
  2819.  
  2820. ΓòÉΓòÉΓòÉ 8.3.54. LXO0152  ΓòÉΓòÉΓòÉ
  2821.  
  2822.  LXO0152
  2823.  
  2824. See Internal Errors 
  2825.  
  2826.  
  2827. ΓòÉΓòÉΓòÉ 8.3.55. LXO0153  ΓòÉΓòÉΓòÉ
  2828.  
  2829.  LXO0153
  2830.  
  2831. See Internal Errors 
  2832.  
  2833.  
  2834. ΓòÉΓòÉΓòÉ 8.3.56. LXO0154  ΓòÉΓòÉΓòÉ
  2835.  
  2836.  LXO0154
  2837.  
  2838. Base not multiple of 64Kb.  The specified new program base is not a multiple of 
  2839. 64Kb.  This warning normally appears when the new base has been incorrectly 
  2840. specified.  Base values are entered as an address in hex. 
  2841.  
  2842. See the /base option for correct usage. 
  2843.  
  2844.  
  2845. ΓòÉΓòÉΓòÉ 8.3.57. LXO0155  ΓòÉΓòÉΓòÉ
  2846.  
  2847.  LXO0155
  2848.  
  2849. Module is not standard EXE or DLL. 
  2850.  
  2851. The application file is of a type not processed by LXOPT.  Typically this 
  2852. message is produced by an attempt to apply LXOPT to a physical or virtual 
  2853. device driver. 
  2854.  
  2855.  
  2856. ΓòÉΓòÉΓòÉ 8.3.58. LXO0156  ΓòÉΓòÉΓòÉ
  2857.  
  2858.  LXO0156
  2859.  
  2860. See Internal Errors 
  2861.  
  2862.  
  2863. ΓòÉΓòÉΓòÉ 8.3.59. LXO0157  ΓòÉΓòÉΓòÉ
  2864.  
  2865.  LXO0157
  2866.  
  2867. Internal fixups have been removed. 
  2868.  
  2869. The EXE file has been given a base address.  Applying a base address when 
  2870. linking strips internal fixups from EXE files.  LXOPT needs internal fixups to 
  2871. enable it to correctly process your application. 
  2872.  
  2873. See Preparing Applications for more information. 
  2874.  
  2875.  
  2876. ΓòÉΓòÉΓòÉ 8.3.60. LXO0158  ΓòÉΓòÉΓòÉ
  2877.  
  2878.  LXO0158
  2879.  
  2880. File contains an unknown page type. 
  2881.  
  2882. The processed file contains code/data encoded in a manner unknown to LXOPT or 
  2883. OS/2 V2.1.  This is probably due to the use of a new linker or other 
  2884. development tool. 
  2885.  
  2886. To rectify the problem choose options with the new linker/tool that will allow 
  2887. the resulting application to run under OS/2 V2.x or WARP.  Check also that you 
  2888. are using the latest available version of LXOPT. 
  2889.  
  2890.  
  2891. ΓòÉΓòÉΓòÉ 8.3.61. LXO0159  ΓòÉΓòÉΓòÉ
  2892.  
  2893.  LXO0159
  2894.  
  2895. Failed to decompress EXEPACK2 page, file corrupted?. 
  2896.  
  2897. The processed file contains code or data identified as compressed using the 
  2898. technique introduced by OS/2 V3.0 (Warp).  A compressed page did not expand 
  2899. correctly. 
  2900.  
  2901. It is likely that the file is corrupted.  Please regenerate any files created 
  2902. via the resource compiler -X2 option and relink the application. 
  2903.  
  2904.  
  2905. ΓòÉΓòÉΓòÉ 8.3.62. LXO0160  ΓòÉΓòÉΓòÉ
  2906.  
  2907.  LXO0160
  2908.  
  2909.  Information (.LXI) file does not belong to the processed application. 
  2910.  
  2911. Your information file was not made by the application being processed. 
  2912.  
  2913. Check that you are attempting to arrange the correct application and that you 
  2914. are not using an information file intended for an earlier version or a 
  2915. different application. 
  2916.  
  2917. See also the /lxinfo option. 
  2918.  
  2919.  
  2920. ΓòÉΓòÉΓòÉ 8.3.63. LXO0161  ΓòÉΓòÉΓòÉ
  2921.  
  2922.  LXO0161
  2923.  
  2924.  The preload option or LXOPT demo version cannot process files with 16 bit 
  2925. library initialisation code. 
  2926.  
  2927. The /preload option needs to alter library initialisation to ensure the DLL is 
  2928. correctly loaded. Your DLL contains a 16 bit entry point and LXOPT is unable to 
  2929. process the initialisation sequence. 
  2930.  
  2931. To use the /preload option with this DLL you must move your library 
  2932. initialisation to 32 bit code.  Alternatively do not use /preload with this 
  2933. DLL.  A 16 bit main entry point indicates that the restrictions section will 
  2934. need to be read with particular notice to the section on SS:ESP. 
  2935.  
  2936.  
  2937. ΓòÉΓòÉΓòÉ 8.3.64. LXO0162  ΓòÉΓòÉΓòÉ
  2938.  
  2939.  LXO0162
  2940.  
  2941.  No recorder dll name available. 
  2942.  
  2943. LXOPT has failed to generate a unique name for your application specific 
  2944. recording DLL. 
  2945.  
  2946. It is likely that over a period of time a large number of unused recording DLLs 
  2947. has built up in your development directory.  Delete all old versions and 
  2948. reattempt preparation. 
  2949.  
  2950.  
  2951. ΓòÉΓòÉΓòÉ 8.3.65. LXO0163  ΓòÉΓòÉΓòÉ
  2952.  
  2953.  LXO0163
  2954.  
  2955.  Cannot locate LXOPT recorder data.  Check your PATH and installation. 
  2956.  
  2957. LXOPT failed to find its installation directory where vital data is stored. 
  2958.  
  2959. Please ensure that the LXOPT installation directory is on your PATH and that 
  2960. installation completed successfully. 
  2961.  
  2962.  
  2963. ΓòÉΓòÉΓòÉ 8.3.66. LXO0164  ΓòÉΓòÉΓòÉ
  2964.  
  2965.  LXO0164
  2966.  
  2967.  Disk access failure creating recorder DLL. 
  2968.  
  2969. Creation of a recorder DLL failed due to a file access failure. 
  2970.  
  2971. Check that you have enough available disk space and that you have sufficient 
  2972. access rights if the target directory is on a network.  Check also that an 
  2973. existing recording DLL is not in use. 
  2974.  
  2975.  
  2976. ΓòÉΓòÉΓòÉ 8.3.67. LXO0165  ΓòÉΓòÉΓòÉ
  2977.  
  2978.  LXO0165
  2979.  
  2980. See Internal Errors 
  2981.  
  2982.  
  2983. ΓòÉΓòÉΓòÉ 8.3.68. LXO0166  ΓòÉΓòÉΓòÉ
  2984.  
  2985.  LXO0166
  2986.  
  2987.  High number of layout attempts: <N>, continuing... 
  2988.  
  2989. LXOPT is having difficulty recreating your EXE/DLL. 
  2990.  
  2991. Some large applications make take a significant number of attempts before a 
  2992. successful layout can be achieved.  LXOPT should always eventually succeed. 
  2993.  
  2994.  
  2995. ΓòÉΓòÉΓòÉ 8.3.69. LXO0167  ΓòÉΓòÉΓòÉ
  2996.  
  2997.  LXO0167
  2998.  
  2999. Cannot copy prepared recording program to "pathname" 
  3000.  
  3001. Failed to copy the prepared application file.  Check disk space or 
  3002. file/directory access permissions. 
  3003.  
  3004.  
  3005. ΓòÉΓòÉΓòÉ 8.3.70. LXO0168  ΓòÉΓòÉΓòÉ
  3006.  
  3007.  LXO0168
  3008.  
  3009. See Internal Errors 
  3010.  
  3011.  
  3012. ΓòÉΓòÉΓòÉ 8.3.71. LXO0169  ΓòÉΓòÉΓòÉ
  3013.  
  3014.  LXO0169
  3015.  
  3016. Active DosGetMessage data (MSGSEG32) detected in code area. 
  3017.  
  3018. Some message data used by DosGetMessage is contained within the code object 
  3019. processed by LXOPT.  This message data is retrieved during execution of 
  3020. DosGetMessage code using the address of the containing code object and adding a 
  3021. predetermined offset to it.  This mechanism bypasses normal code/data 
  3022. referencing and is incompatible with LXOPT processing. 
  3023.  
  3024. This data is often introduced by use of functions within the IBM CSet/VAC 
  3025. libraries which in turn depend on DosGetMessage for their own message handling. 
  3026.  
  3027. To prevent this problem move the message data to another code object by 
  3028. identifying the 'segment' in your module definition (.DEF) file.  If the 
  3029. processed file was an executable which does not currently have a .DEF file, 
  3030. create a file <exe-name>.DEF and insert the lines below.  Remember to include 
  3031. your definition file when you relink. 
  3032.  
  3033. NAME <exe-name> <WINDOWAPI | WINDOWCOMPAT | NOTWINOWCOMPAT>
  3034.  
  3035. SEGMENTS
  3036.   _MSGSEG32 CLASS 'CODE'
  3037.  
  3038. For existing .DEF files simply add the line containing _MSGSEG32 to the 
  3039. SEGMENTS section. 
  3040.  
  3041. MSGSEG32 data is detected by searching for data which starts with a 0xFF byte 
  3042. followed by the text MSGSEG32.  In the unlikely event that your code contains 
  3043. this data sequence for another purpose or you are SURE that it is not used this 
  3044. LXOPT test may be disabled, see the /ignoreMsgSeg option for more details. 
  3045.  
  3046.  
  3047. ΓòÉΓòÉΓòÉ 9. Utilities  ΓòÉΓòÉΓòÉ
  3048.  
  3049.                                     Utilities
  3050.  
  3051.  
  3052. ΓòÉΓòÉΓòÉ 9.1. LXWarp - Apply OS/2 WARP compression to 2.x executables  ΓòÉΓòÉΓòÉ
  3053.  
  3054.  LXWarp - Apply OS/2 WARP compression to 2.x executables
  3055.  
  3056. Usage: LXWARP <filename> [/clear] [/bakfile:<backup_pathname>] 
  3057. [/threshold:<reduction_threshold>] 
  3058.  
  3059.  Examples: 
  3060.  
  3061.  To compress 'myapp.dll' and delete the backup file on successful completion. 
  3062.     LXWARP myapp.dll /clear 
  3063.  
  3064.  Compress 'myapp.dll' pages where compression reduces the page size by more 
  3065.  than 20%.  Original file stored as 'myapp.wbk'. 
  3066.     LXWARP myapp.dll /threshold:20 
  3067.  
  3068.  LXWARP takes an existing executable and applies OS/2 WARP page compression to 
  3069.  it.  The EXE/DLL file created will occupy less disk space and take less time 
  3070.  to be loaded by the operating system. This new file will not execute under 
  3071.  versions of OS/2 prior to WARP. 
  3072.  
  3073.  LXWARP allows OS/2 WARP users of 2.x targeted code to gain the benefits of 
  3074.  page level compression.  Developers may also use LXWARP to process third party 
  3075.  2.x targeted DLLs for use with their OS/2 WARP specific applications. 
  3076.  
  3077.  
  3078. ΓòÉΓòÉΓòÉ 9.1.1. /clear  ΓòÉΓòÉΓòÉ
  3079.  
  3080.  /clear
  3081.  
  3082. Syntax: /clear (default OFF) 
  3083.  
  3084. Delete the copy of the original executable file when LXWARP/LXUNWARP processing 
  3085. is successfully completed. 
  3086.  
  3087. The LXWARP and LXUNWARP applications both keep backup copies of the original 
  3088. file during processing.  If an error occurs the original file is automatically 
  3089. restored.  If the new executable is successfully created use of this option 
  3090. will cause the backup file to be deleted. 
  3091.  
  3092.  
  3093. ΓòÉΓòÉΓòÉ 9.1.2. /bakfile  ΓòÉΓòÉΓòÉ
  3094.  
  3095.  /bakfile
  3096.  
  3097. Syntax: /bakfile:<pathname> (default see below) 
  3098.  
  3099. Specify the name of the backup file in which to keep the unprocessed 
  3100. executable. 
  3101.  
  3102. Both LXWARP and LXWARP always create a copy of the original file before 
  3103. processing.  By default this backup file is created with the same root name and 
  3104. in the same directory as the original file.  By default LXWARP backup files 
  3105. have the extension 'WBK', LXUNWARP backup files have the extension 'UBK'. 
  3106.  
  3107.  
  3108. ΓòÉΓòÉΓòÉ 9.1.3. /threshold  ΓòÉΓòÉΓòÉ
  3109.  
  3110.  /threshold
  3111.  
  3112. Syntax: /threshold:<threshold%> (default 15) 
  3113.  
  3114. Specify the reduction in page size required for compression to be used. 
  3115.  
  3116. Each page in the file is compressed and the reduction in size compared with the 
  3117. original page size.  If the percentage reduction is greater than the value 
  3118. supplied by this parameter the compressed form of the page is used. 
  3119.  
  3120.  
  3121. ΓòÉΓòÉΓòÉ 9.2. LXUnWarp - Remove OS/2 WARP compression from executables  ΓòÉΓòÉΓòÉ
  3122.  
  3123.  LXUnWarp - Remove OS/2 WARP compression from executables
  3124.  
  3125. Usage: LXUNWARP <filename> [/clear] [/bakfile:<backup_pathname>] 
  3126.  
  3127. Example: LXUNWARP myapp.dll 
  3128.  
  3129. LXUNWARP takes an existing executable file and expands OS/2 WARP compressed 
  3130. pages. 
  3131.  
  3132. Although the resulting file will be loadable by OS/2 V2.x the application may 
  3133. still not execute due to OS/2 WARP specific API dependencies. 
  3134.  
  3135. Expanded pages are tested for normal iterated data encoding which is performed 
  3136. as required. 
  3137.  
  3138. LXUNWARP allows OS/2 2.x users to run code linked specifically for OS/2 WARP 
  3139. installations.  It can also be used to undo prior use of the LXWARP command. 
  3140. Use of LXUNWARP on an LXWARPed file may not result in an exact copy of the 
  3141. original file due to page alignment issues and choice of iteration strategy. 
  3142.  
  3143.  
  3144. ΓòÉΓòÉΓòÉ 9.3. Preload - Transfer executables to swapfile  ΓòÉΓòÉΓòÉ
  3145.  
  3146.  Preload - Transfer executables to swapfile
  3147.  
  3148. Usage:    PRELOAD [options] [<exe/dll path>] [options] 
  3149.           /Q             .- Quiet mode (suppress copyright notice) 
  3150.           /S             - Silent mode (suppress all output) 
  3151.           /G:<name>      - Group name (default is exe/dll file name) 
  3152.           /I             - Make Preload Manager invisible (remove from task 
  3153.                          list) 
  3154.           /V             - Make Preload Manager visible (add to task list) 
  3155.           /U             - Unload file/group, unload ALL if none specified 
  3156.           /L             - List previous active load instructions 
  3157.           /W:<drvs>      - Wait for drive letters to become available. e.g. 
  3158.                          /W:FGH 
  3159.           /X             - Unload all and terminate the preload manager 
  3160.           /T:<num>       - Exe load time-out in seconds <default 120> 
  3161.           /M:<num>       - Deny request if below <num>Mb free swap space 
  3162.                          (default 10) 
  3163.           /? or /h       - Display options 
  3164.  
  3165.  The preload utility allows users to selectively preload and unload LXOPT 
  3166.  produced EXE/DLL files arranged with the /preload option.  There are important 
  3167.  DLL initialisation, disk space requirements, boot time and user control issues 
  3168.  raised by preloading code, see the Preloading section for more details. 
  3169.  
  3170.  The utility (PRELOAD.EXE) and its accompanying on-line documentation 
  3171.  (PRELOAD.INF) are included with the LXOPT software package and these two files 
  3172.  may also be distributed with LXOPT processed files. 
  3173.  
  3174.  The program operates in three modes, as a command line utility as described 
  3175.  above, in background Wait Mode awaiting network drive availability and as a 
  3176.  continuously active Preload Manager.  The preload utility automatically 
  3177.  activates a manager process if one is not currently running.  All utility 
  3178.  requests are passed on to the manager to be performed. 
  3179.  
  3180.  Preload Manager 
  3181.  The preload manager performs commands supplied via the preload utility. 
  3182.  Started by the first use of the preload utility the manager runs continuously 
  3183.  in the background.  When made visible by the /V option the preload process 
  3184.  appears to the user as a normal windowable VIO application.  If made invisible 
  3185.  via the /I option the process is hidden, removed from the PM task list and 
  3186.  prevented from rejecting an operating system shutdown.  When operating 
  3187.  invisibly the process may only be interacted with via the preload utility. 
  3188.  
  3189.  Termination of the manager will cause all preloaded programs to be unloaded as 
  3190.  the use count of each module drops to zero.  The manager may be terminated by 
  3191.  closing the visible manager session or via the preload utility with the /X 
  3192.  option. 
  3193.  
  3194.  Although the preload manager uses the Presentation Manager API it does not 
  3195.  require PM to be present.  If running with another shell (e.g. TSHELL) 
  3196.  interaction with the task list is not attempted and sessions are started using 
  3197.  parameters compatible with TSHELL operation. 
  3198.  
  3199.  Wait Mode 
  3200.  Permanently invisible, a wait mode process is started to handle a preload 
  3201.  request where the /W parameter is used and the drives specified are not 
  3202.  currently available.  The wait mode process performs the actions normally 
  3203.  performed by the preload utility, it simply waits for the specified drives to 
  3204.  become available before issuing the load request to the preload manager. 
  3205.  
  3206.  Wait Mode is vital for PRELOAD to be able to operate effectively in a customer 
  3207.  network environment.  Users/installation programs are able to insert preload 
  3208.  requests into startup.cmd without concern for network availability. 
  3209.  
  3210.  Preload Utility 
  3211.  The preload utility provides a simple command line interface to the preload 
  3212.  manager.  The utility has options to suppress output (/Q /S), control manager 
  3213.  visibility (/V /I), list current active loads (/L) as well as provide the 
  3214.  basic file loading interface. 
  3215.  
  3216.  DLL files are loaded into the Preload Manager process, each executable is 
  3217.  provided with its own session.  Execution of normal initialisation is 
  3218.  suppressed in LXOPT processed EXE files and per instance initialised DLLs. 
  3219.  This is designed to ensure preloading is both transparent and does not 
  3220.  adversely affect normally loaded versions of the code.  LXOPT processed 
  3221.  globally initialised DLLs and all unprocessed DLLs will initialise normally. 
  3222.  For a fuller discussion of initialisation and the issues raised see Preloading 
  3223.  
  3224.  Files are loaded into named groups.  By default the group name is the filename 
  3225.  derived from the pathname specified on the command line.  For example 
  3226.  
  3227.      PRELOAD C:\APPS\FAST_APP.EXE
  3228.  will preload the LXOPT processed executable file FAST_APP.EXE, LXOPT processed 
  3229.  DLLs on which it depends and load normally any other DLLs which it requires. 
  3230.  These files are treated as a single loadable unit under the group name 
  3231.  FAST_APP.EXE.  Group names become useful when a user wishes to unload all the 
  3232.  preloaded files associated with a single product.  For example 
  3233.  
  3234.      PRELOAD C:\APPS\FAST_APP.EXE /G:FAST_SUITE
  3235.      PRELOAD C:\APPS\FAST_SRV.EXE /G:FAST_SUITE
  3236.      PRELOAD C:\APPS\FAST_WPS.DLL /G:FAST_SUITE
  3237.  preloads the 'FAST' application, background server and workplace shell object 
  3238.  DLL under the single name 'FAST_SUITE'.  To release the preload on all these 
  3239.  files requires one command 
  3240.  
  3241.      PRELOAD /G:FAST_SUITE /U
  3242.   The preloader uses the operating system calls DosStartSession and 
  3243.  DosLoadModule to load files and then transfers them to the swapfile.  This can 
  3244.  be a time consuming process and by default the preloader will wait for up to 
  3245.  120 seconds for a load request to complete.  This time limit may be adjusted 
  3246.  using the /T option. 
  3247.  
  3248.  Preload requests where the amount of free swap space is less than 10Mb will be 
  3249.  rejected.  This limit may be varied by use of the /M option.  /M:0 will 
  3250.  disable free swap space testing but is not recommended, particularly for 
  3251.  preload requests in startup.cmd. 
  3252.  
  3253.  Preload requests may be issued if some or all of the requested files are 
  3254.  already active.  The preload operation is transparent to any existing 
  3255.  executing code.  When complete all instances of preloaded code, including 
  3256.  those previously running, will benefit from the preloading effect. 
  3257.  
  3258.  
  3259. ΓòÉΓòÉΓòÉ 9.4. TimeRun - Measure application run-time  ΓòÉΓòÉΓòÉ
  3260.  
  3261.  TimeRun - Measure application run-time
  3262.  
  3263. Usage:    TIMERUN <application-name> [parameters] 
  3264.  
  3265.  Example: 
  3266.  
  3267.    TIMERUN touch data.txt               Execute touch.exe with the parameter 
  3268.                                         'data.txt' 
  3269.  
  3270.  TIMERUN executes the given application and displays the total execution time 
  3271.  on termination.  This is the total time elapsed from start-up to termination. 
  3272.  This is not a measure of CPU time. 
  3273.  
  3274.  Before executing the application TIMERUN waits 5 seconds to ensure disk 
  3275.  activity due to delayed writes has completed. 
  3276.  
  3277.  Repeating the same command often results in a reduced execution time due to 
  3278.  caching effects.  Subsequent execution times may then vary due to the activity 
  3279.  of background processes.  This can make reliable comparative performance 
  3280.  testing very difficult, see Performance Testing for more details. 
  3281.  
  3282.  TIMERUN uses CMD.EXE to execute the given command.  Total time elapsed may be 
  3283.  dominated by the time taken to invoke the command processor where total run 
  3284.  time is less than 10 seconds. 
  3285.  
  3286.  
  3287. ΓòÉΓòÉΓòÉ 9.5. Thrash - Create high memory load for performance testing  ΓòÉΓòÉΓòÉ
  3288.  
  3289.  Thrash - Create high memory load for performance testing
  3290.  
  3291. Usage:    THRASH <n | n% | nP> 
  3292.  
  3293.  Examples: 
  3294.  
  3295.    THRASH 4              Allocate and continuously access 4Mb of memory. 
  3296.  
  3297.    THRASH 50%            Allocate an amount of memory equivalent to 50% of 
  3298.                          system RAM and continuously access it. 
  3299.  
  3300.    THRASH 75P            Allocate an amount of memory equivalent to 75% of 
  3301.                          system RAM and continuously access it. 
  3302.  
  3303.  THRASH allocates the given amount of memory and continuously accesses it. 
  3304.  Order of access is updated dynamically to maximise the amount of the 
  3305.  allocation retained in system RAM. 
  3306.  
  3307.  THRASH provides a simple way to produce a constant high memory load as might 
  3308.  be generated by several large background applications.  This can be very 
  3309.  useful for testing software performance under low memory conditions. 
  3310.  
  3311.  The alternative of 'P' for the '%' trailing character is provided to simplify 
  3312.  the passing of parameters via a WPS program object. 
  3313.  
  3314.  Use THRASH with caution. Thrashing large quantities of memory may cause your 
  3315.  system to run unacceptably slowly.  Any keyboard input to THRASH will cause it 
  3316.  to release the allocated memory and terminate. 
  3317.  
  3318.  
  3319. ΓòÉΓòÉΓòÉ 9.6. UnLXOPT - Undo processing and delete LXOPTed files  ΓòÉΓòÉΓòÉ
  3320.  
  3321.  UnLXOPT - Undo processing and delete LXOPTed files
  3322.  
  3323. Usage:    UNLXOPT <application-name> 
  3324.  
  3325.  Example: 
  3326.  
  3327.    UNLXOPT MYAPP.DLL                    Restore original MYAPP.DLL and delete 
  3328.                                         LXOPT created files 
  3329.  
  3330.  UNLXOPT is a simple tool that restores the original version of the LXOPTed 
  3331.  file and then deletes any .REC, .PRP, .ORI and automatically generated 
  3332.  recording DLL.  The file names to be deleted are generated by using the 
  3333.  default names that would be used by LXOPT when processing the supplied 
  3334.  application file. 
  3335.  
  3336.  
  3337. ΓòÉΓòÉΓòÉ 10. FAQs  ΓòÉΓòÉΓòÉ
  3338.  
  3339.                                       FAQs
  3340.  
  3341.  
  3342. ΓòÉΓòÉΓòÉ 10.1. How Do I Trace CS:EIP Back to My Source Code?  ΓòÉΓòÉΓòÉ
  3343.  
  3344.  How Do I Trace CS:EIP Back to My Source Code?
  3345.  
  3346. This is in fact two questions: how to find the original CS:EIP of a location in 
  3347. an LXOPTed file and then how to trace that back to the source code. 
  3348.  
  3349. CS:EIP values are typically provided as <object_number>:<offset> pairs.  LXOPT 
  3350. only alters the offsets of code within the largest code object so if the object 
  3351. number is not the same as the one LXOPT processed that offset will not have 
  3352. been altered by LXOPT processing. 
  3353.  
  3354. If the object number is the one processed by LXOPT use the LXOPT /getOld option 
  3355. to find the original offset value. 
  3356.  
  3357. Once you have obtained the original offset value you can then search your map 
  3358. file to find the containing function or examine the code in a debugger to 
  3359. locate the instruction that caused the error. 
  3360.  
  3361.  
  3362. ΓòÉΓòÉΓòÉ 10.2. Isn't /BASE:65536 Better With EXE Files?  ΓòÉΓòÉΓòÉ
  3363.  
  3364.  Isn't /BASE:65536 Better With EXE Files?
  3365.  
  3366. The simple answer is yes.  All EXE files produced by LXOPT are automatically 
  3367. based at address 65536 and the internal fixups removed. 
  3368.  
  3369. LXOPT only requires input EXE files to avoid this option to ensure the file 
  3370. contains all the information required for correct processing.  This has no 
  3371. adverse affect on the resulting LXOPT processed executable. 
  3372.  
  3373.  
  3374. ΓòÉΓòÉΓòÉ 10.3. Which is the Best Arrangement Algorithm?  ΓòÉΓòÉΓòÉ
  3375.  
  3376.  Which is the Best Arrangement Algorithm?
  3377.  
  3378. There is no single algorithm that out performs all others for all 
  3379. situations/executables. 
  3380.  
  3381. The binary algorithm introduced with V1.1 is now the default algorithm and is 
  3382. most likely to produce the best overall results. 
  3383.  
  3384. Choice of algorithm is best made by experimentation.  There may not always be a 
  3385. clear winner, sometimes the best algorithm for a 100Kb memory restriction will 
  3386. be beaten by another at 200Kb. 
  3387.  
  3388. Due to the 'Least Recently Used' algorithm used to recycle pages of memory, 
  3389. applications with a short runtime are unlikely to ever be memory restricted 
  3390. unless they require large quantities of system RAM.  Such applications have 
  3391. little need for complex arrangements and may be better suited to the firstuse 
  3392. algorithm.  This algorithm produces the most sequential code which may result 
  3393. in more efficient page loads and cpu caching. 
  3394.  
  3395. The Stat arrangement algorithm may be used on larger applications with long 
  3396. complex runtimes.  Use of Stat is complicated by its /groups option and will 
  3397. often be out performed by the binary algorithm. 
  3398.  
  3399.  
  3400. ΓòÉΓòÉΓòÉ 10.4. Where is my Recording File?  ΓòÉΓòÉΓòÉ
  3401.  
  3402.  Where is my Recording File?
  3403.  
  3404. First be sure you have executed the recording version of the code.  If you 
  3405. invoke your code via a program object it may now reference the .ORI file.  If a 
  3406. previous version of an EXE/DLL is preloaded this old version will still be 
  3407. executed even though a new file exists. 
  3408.  
  3409. Recording files are created by an LXOPT prepared application while it executes. 
  3410. By default this file has the full path name of the executable provided to LXOPT 
  3411. but with a .REC extension. 
  3412.  
  3413. If the executable file name provided via /recfile does not have a full path 
  3414. (e.g. .\MYAPP.REC) then when the recording version of the application executes 
  3415. it will also attempt to create a file without a full path.  As no full path is 
  3416. used this file will be created based on the current drive/directory at time of 
  3417. creation.  This can be useful where recording is performed on a separate 
  3418. machine and facilitates simultaneous use of the recording version with 
  3419. different machines on the same network.  This can however cause problems where 
  3420. the current drive/directory is not predictable and in these circumstances 
  3421. specify a full pathname for the recording file by use of the /recfile option. 
  3422.  
  3423.  
  3424. ΓòÉΓòÉΓòÉ 10.5. LXOPT Just Hangs During Processing!  ΓòÉΓòÉΓòÉ
  3425.  
  3426.  LXOPT Just Hangs During Processing!
  3427.  
  3428. Although LXOPT may appear to be a simple tuning utility it requires a 
  3429. considerable amount of CPU time and memory to process large input files. 
  3430. Preparation/arrangement times of over 5 hours have been reported.  Run times 
  3431. can be particularly long where a large file is processed on a machine with 8Mb 
  3432. or less of RAM. 
  3433.  
  3434. During processing LXOPT is effectively recompiling and relinking your entire 
  3435. application in addition to performing its working set tuning function.  If you 
  3436. suspect LXOPT has hung please allow it to run uninterrupted overnight before 
  3437. reporting the problem. 
  3438.  
  3439.  
  3440. ΓòÉΓòÉΓòÉ 10.6. Why Isn't my Application 50% Faster?  ΓòÉΓòÉΓòÉ
  3441.  
  3442.  Why Isn't my Application 50% Faster?
  3443.  
  3444. LXOPT rearranges application code to reduce the total memory occupied by code 
  3445. and the time taken to load it.  The percentages reported by the arrangement 
  3446. process are expected reductions in page faults, not overall run time. 
  3447.  
  3448. It follows that any performance improvement in this area is dictated by how 
  3449. much time the original application spent loading its code.  If your application 
  3450. is a 30Kb executable searching for prime numbers then performance improvements 
  3451. are likely to be restricted to CPU caching benefits.  These CPU caching 
  3452. improvements are unlikely to produce more than a 5% performance boost. 
  3453.  
  3454. Working set tuning, like any efficiency measure, shows its worth when the 
  3455. commodity in question is in short supply.  Examination of an arrangement report 
  3456. shows that page fault reductions improve under increasingly restricted memory 
  3457. conditions.  The improvement is not just in percentage terms, but much more 
  3458. significantly in total number of faults.  The greater the page fault load, the 
  3459. better LXOPT performs. 
  3460.  
  3461.  
  3462. ΓòÉΓòÉΓòÉ 10.7. Why Does my Page Fault Monitor Report More Page Faults?  ΓòÉΓòÉΓòÉ
  3463.  
  3464.  Why Does my Page Fault Monitor Report More Page Faults?
  3465.  
  3466. When LXOPT produces an arrangement report it shows the expected number of page 
  3467. faults loading code from the processed code object.  LXOPT only tunes the code 
  3468. arrangement within this processed object.  LXOPT does not tune data accesses or 
  3469. attempt to simulate page faults generated by any other means. 
  3470.  
  3471. Your application will generate page faults loading application data and 
  3472. executing code in other DLLs such as Presentation Manager APIs.  Performance 
  3473. monitoring tools tend to collect and report all such page fault data in 
  3474. combined form. 
  3475.  
  3476. Although the number of page faults reported by such tools will differ from that 
  3477. provided by LXOPT, they can still be used to assess the improvement in an LXOPT 
  3478. processed applications performance.  Use your tool on the original and 
  3479. processed versions of the application and examine the reduction in total page 
  3480. faults.  If your test mimics the actions performed during LXOPT recording this 
  3481. reduction should agree the numeric reduction in page faults predicted by LXOPT. 
  3482.  
  3483. Page fault monitoring tools will not reveal CPU caching or reduced disk seek 
  3484. time benefits. 
  3485.  
  3486.  
  3487. ΓòÉΓòÉΓòÉ 10.8. Why Does my Application Make a Beeping Noise?  ΓòÉΓòÉΓòÉ
  3488.  
  3489.  Why Does my Application Make a Beeping Noise?
  3490.  
  3491. Applications produced by LXOPT produce an alternating tone when attempting to 
  3492. display an LXOPT message to the user.  If a message does not appear it is 
  3493. likely that the LXOPT installation directory is not on your PATH.  Add the 
  3494. LXOPT directory to the path and retry the application. 
  3495.  
  3496. Tones generated by a recording version of an application are an indication that 
  3497. an error has occurred.  If an error message is not displayed examine the file 
  3498. 'LXREC.ERR' to identify the source of the error.  This is typically a failure 
  3499. writing to the recording file due to an invalid file name or insufficient disk 
  3500. space. 
  3501.  
  3502. LXOPT initiated tones or messages are not generated by optimised EXE/DLL files. 
  3503. These files will perform identically to their unoptimised originals and do not 
  3504. require access to any LXOPT support files. 
  3505.  
  3506.  
  3507. ΓòÉΓòÉΓòÉ 10.9. My Application Fails - Cannot Find <app-name>@1?  ΓòÉΓòÉΓòÉ
  3508.  
  3509.  My Application Fails - Cannot Find <app-name>@1?
  3510.  
  3511. The system could not execute the recording version of your application because 
  3512. it could not find the file <app-name>@1.DLL.  This DLL was created for your 
  3513. application by LXOPT to aid in the recording process. 
  3514.  
  3515. This file is located in the directory in which the original EXE/DLL file was 
  3516. processed.  Copy the DLL to a directory on your LIBPATH. 
  3517.  
  3518.