| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 1 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"  | 
 | 2 |                       "http://www.w3.org/TR/html4/strict.dtd"> | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 3 | <html> | 
| Reid Spencer | d206bc9 | 2004-11-01 21:55:46 +0000 | [diff] [blame] | 4 | <head> | 
| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 5 |   <title>LLVM bugpoint tool: design and usage</title> | 
| Reid Spencer | d206bc9 | 2004-11-01 21:55:46 +0000 | [diff] [blame] | 6 |   <link rel="stylesheet" href="llvm.css" type="text/css"> | 
| Reid Spencer | d206bc9 | 2004-11-01 21:55:46 +0000 | [diff] [blame] | 7 | </head> | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 8 |  | 
| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 9 | <div class="doc_title"> | 
 | 10 |   LLVM bugpoint tool: design and usage | 
 | 11 | </div> | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 12 |  | 
| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 13 | <ul> | 
 | 14 |   <li><a href="#desc">Description</a></li> | 
 | 15 |   <li><a href="#design">Design Philosophy</a> | 
 | 16 |   <ul> | 
 | 17 |     <li><a href="#autoselect">Automatic Debugger Selection</a></li> | 
 | 18 |     <li><a href="#crashdebug">Crash debugger</a></li> | 
 | 19 |     <li><a href="#codegendebug">Code generator debugger</a></li> | 
 | 20 |     <li><a href="#miscompilationdebug">Miscompilation debugger</a></li> | 
 | 21 |   </ul></li> | 
 | 22 |   <li><a href="#advice">Advice for using <tt>bugpoint</tt></a></li> | 
 | 23 | </ul> | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 24 |  | 
| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 25 | <div class="doc_author"> | 
 | 26 | <p>Written by <a href="mailto:sabre@nondot.org">Chris Lattner</a></p> | 
 | 27 | </div> | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 28 |  | 
| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 29 | <!-- *********************************************************************** --> | 
 | 30 | <div class="doc_section"> | 
 | 31 | <a name="desc">Description</a> | 
 | 32 | </div> | 
 | 33 | <!-- *********************************************************************** --> | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 34 |  | 
| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 35 | <div class="doc_text"> | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 36 |  | 
| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 37 | <p><tt>bugpoint</tt> narrows down the source of problems in LLVM tools and | 
 | 38 | passes.  It can be used to debug three types of failures: optimizer crashes, | 
 | 39 | miscompilations by optimizers, or bad native code generation (including problems | 
 | 40 | in the static and JIT compilers).  It aims to reduce large test cases to small, | 
| Reid Spencer | 434262a | 2007-02-09 15:59:08 +0000 | [diff] [blame] | 41 | useful ones.  For example, if <tt>opt</tt> crashes while optimizing a | 
| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 42 | file, it will identify the optimization (or combination of optimizations) that | 
 | 43 | causes the crash, and reduce the file down to a small example which triggers the | 
 | 44 | crash.</p> | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 45 |  | 
| Reid Spencer | 434262a | 2007-02-09 15:59:08 +0000 | [diff] [blame] | 46 | <p>For detailed case scenarios, such as debugging <tt>opt</tt>, | 
 | 47 | <tt>llvm-ld</tt>, or one of the LLVM code generators, see <a | 
| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 48 | href="HowToSubmitABug.html">How To Submit a Bug Report document</a>.</p> | 
 | 49 |  | 
 | 50 | </div> | 
 | 51 |  | 
 | 52 | <!-- *********************************************************************** --> | 
 | 53 | <div class="doc_section"> | 
 | 54 | <a name="design">Design Philosophy</a> | 
 | 55 | </div> | 
 | 56 | <!-- *********************************************************************** --> | 
 | 57 |  | 
 | 58 | <div class="doc_text"> | 
 | 59 |  | 
 | 60 | <p><tt>bugpoint</tt> is designed to be a useful tool without requiring any | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 61 | hooks into the LLVM infrastructure at all.  It works with any and all LLVM | 
 | 62 | passes and code generators, and does not need to "know" how they work.  Because | 
 | 63 | of this, it may appear to do stupid things or miss obvious | 
 | 64 | simplifications.  <tt>bugpoint</tt> is also designed to trade off programmer | 
 | 65 | time for computer time in the compiler-debugging process; consequently, it may | 
 | 66 | take a long period of (unattended) time to reduce a test case, but we feel it | 
 | 67 | is still worth it. Note that <tt>bugpoint</tt> is generally very quick unless | 
 | 68 | debugging a miscompilation where each test of the program (which requires  | 
| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 69 | executing it) takes a long time.</p> | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 70 |  | 
| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 71 | </div> | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 72 |  | 
| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 73 | <!-- ======================================================================= --> | 
 | 74 | <div class="doc_subsection"> | 
 | 75 |   <a name="autoselect">Automatic Debugger Selection</a> | 
 | 76 | </div> | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 77 |  | 
| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 78 | <div class="doc_text"> | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 79 |  | 
| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 80 | <p><tt>bugpoint</tt> reads each <tt>.bc</tt> or <tt>.ll</tt> file specified on | 
 | 81 | the command line and links them together into a single module, called the test | 
 | 82 | program.  If any LLVM passes are specified on the command line, it runs these | 
 | 83 | passes on the test program.  If any of the passes crash, or if they produce | 
 | 84 | malformed output (which causes the verifier to abort), <tt>bugpoint</tt> starts | 
 | 85 | the <a href="#crashdebug">crash debugger</a>.</p> | 
 | 86 |  | 
 | 87 | <p>Otherwise, if the <tt>-output</tt> option was not specified, | 
 | 88 | <tt>bugpoint</tt> runs the test program with the C backend (which is assumed to | 
 | 89 | generate good code) to generate a reference output.  Once <tt>bugpoint</tt> has | 
 | 90 | a reference output for the test program, it tries executing it with the | 
 | 91 | selected code generator.  If the selected code generator crashes, | 
 | 92 | <tt>bugpoint</tt> starts the <a href="#crashdebug">crash debugger</a> on the | 
 | 93 | code generator.  Otherwise, if the resulting output differs from the reference | 
 | 94 | output, it assumes the difference resulted from a code generator failure, and | 
 | 95 | starts the <a href="#codegendebug">code generator debugger</a>.</p> | 
 | 96 |  | 
 | 97 | <p>Finally, if the output of the selected code generator matches the reference | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 98 | output, <tt>bugpoint</tt> runs the test program after all of the LLVM passes | 
 | 99 | have been applied to it.  If its output differs from the reference output, it | 
 | 100 | assumes the difference resulted from a failure in one of the LLVM passes, and | 
| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 101 | enters the <a href="#miscompilationdebug">miscompilation debugger</a>. | 
 | 102 | Otherwise, there is no problem <tt>bugpoint</tt> can debug.</p> | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 103 |  | 
| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 104 | </div> | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 105 |  | 
| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 106 | <!-- ======================================================================= --> | 
 | 107 | <div class="doc_subsection"> | 
 | 108 |   <a name="crashdebug">Crash debugger</a> | 
 | 109 | </div> | 
 | 110 |  | 
 | 111 | <div class="doc_text"> | 
 | 112 |  | 
 | 113 | <p>If an optimizer or code generator crashes, <tt>bugpoint</tt> will try as hard | 
 | 114 | as it can to reduce the list of passes (for optimizer crashes) and the size of | 
 | 115 | the test program.  First, <tt>bugpoint</tt> figures out which combination of | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 116 | optimizer passes triggers the bug. This is useful when debugging a problem | 
| Reid Spencer | 434262a | 2007-02-09 15:59:08 +0000 | [diff] [blame] | 117 | exposed by <tt>opt</tt>, for example, because it runs over 38 passes.</p> | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 118 |  | 
| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 119 | <p>Next, <tt>bugpoint</tt> tries removing functions from the test program, to | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 120 | reduce its size.  Usually it is able to reduce a test program to a single | 
 | 121 | function, when debugging intraprocedural optimizations.  Once the number of | 
 | 122 | functions has been reduced, it attempts to delete various edges in the control | 
 | 123 | flow graph, to reduce the size of the function as much as possible.  Finally, | 
 | 124 | <tt>bugpoint</tt> deletes any individual LLVM instructions whose absence does | 
 | 125 | not eliminate the failure.  At the end, <tt>bugpoint</tt> should tell you what | 
| Gabor Greif | 04367bf | 2007-07-06 22:07:22 +0000 | [diff] [blame] | 126 | passes crash, give you a bitcode file, and give you instructions on how to | 
| Reid Spencer | 84f82f7 | 2006-08-28 00:34:19 +0000 | [diff] [blame] | 127 | reproduce the failure with <tt>opt</tt> or <tt>llc</tt>.</p> | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 128 |  | 
| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 129 | </div> | 
 | 130 |  | 
 | 131 | <!-- ======================================================================= --> | 
 | 132 | <div class="doc_subsection"> | 
 | 133 |   <a name="codegendebug">Code generator debugger</a> | 
 | 134 | </div> | 
 | 135 |  | 
 | 136 | <div class="doc_text"> | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 137 |  | 
 | 138 | <p>The code generator debugger attempts to narrow down the amount of code that | 
| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 139 | is being miscompiled by the selected code generator.  To do this, it takes the | 
 | 140 | test program and partitions it into two pieces: one piece which it compiles | 
 | 141 | with the C backend (into a shared object), and one piece which it runs with | 
 | 142 | either the JIT or the static LLC compiler.  It uses several techniques to | 
 | 143 | reduce the amount of code pushed through the LLVM code generator, to reduce the | 
| Gabor Greif | 04367bf | 2007-07-06 22:07:22 +0000 | [diff] [blame] | 144 | potential scope of the problem.  After it is finished, it emits two bitcode | 
| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 145 | files (called "test" [to be compiled with the code generator] and "safe" [to be | 
 | 146 | compiled with the C backend], respectively), and instructions for reproducing | 
 | 147 | the problem.  The code generator debugger assumes that the C backend produces | 
 | 148 | good code.</p> | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 149 |  | 
| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 150 | </div> | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 151 |  | 
| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 152 | <!-- ======================================================================= --> | 
 | 153 | <div class="doc_subsection"> | 
 | 154 |   <a name="miscompilationdebug">Miscompilation debugger</a> | 
 | 155 | </div> | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 156 |  | 
| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 157 | <div class="doc_text"> | 
 | 158 |  | 
 | 159 | <p>The miscompilation debugger works similarly to the code generator debugger. | 
 | 160 | It works by splitting the test program into two pieces, running the | 
 | 161 | optimizations specified on one piece, linking the two pieces back together, and | 
 | 162 | then executing the result.  It attempts to narrow down the list of passes to | 
 | 163 | the one (or few) which are causing the miscompilation, then reduce the portion | 
 | 164 | of the test program which is being miscompiled.  The miscompilation debugger | 
 | 165 | assumes that the selected code generator is working properly.</p> | 
 | 166 |  | 
 | 167 | </div> | 
 | 168 |  | 
 | 169 | <!-- *********************************************************************** --> | 
 | 170 | <div class="doc_section"> | 
 | 171 |   <a name="advice">Advice for using bugpoint</a> | 
 | 172 | </div> | 
 | 173 | <!-- *********************************************************************** --> | 
 | 174 |  | 
 | 175 | <div class="doc_text"> | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 176 |  | 
 | 177 | <tt>bugpoint</tt> can be a remarkably useful tool, but it sometimes works in | 
 | 178 | non-obvious ways.  Here are some hints and tips:<p> | 
 | 179 |  | 
 | 180 | <ol> | 
 | 181 | <li>In the code generator and miscompilation debuggers, <tt>bugpoint</tt> only | 
 | 182 |     works with programs that have deterministic output.  Thus, if the program | 
| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 183 |     outputs <tt>argv[0]</tt>, the date, time, or any other "random" data, | 
 | 184 |     <tt>bugpoint</tt> may misinterpret differences in these data, when output, | 
 | 185 |     as the result of a miscompilation.  Programs should be temporarily modified | 
 | 186 |     to disable outputs that are likely to vary from run to run. | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 187 |  | 
 | 188 | <li>In the code generator and miscompilation debuggers, debugging will go | 
 | 189 |     faster if you manually modify the program or its inputs to reduce the | 
 | 190 |     runtime, but still exhibit the problem. | 
 | 191 |  | 
 | 192 | <li><tt>bugpoint</tt> is extremely useful when working on a new optimization: | 
 | 193 |     it helps track down regressions quickly.  To avoid having to relink | 
 | 194 |     <tt>bugpoint</tt> every time you change your optimization however, have | 
| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 195 |     <tt>bugpoint</tt> dynamically load your optimization with the | 
 | 196 |     <tt>-load</tt> option. | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 197 |  | 
| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 198 | <li><p><tt>bugpoint</tt> can generate a lot of output and run for a long period | 
 | 199 |     of time.  It is often useful to capture the output of the program to file. | 
 | 200 |     For example, in the C shell, you can run:</p> | 
 | 201 |  | 
 | 202 | <div class="doc_code"> | 
 | 203 | <p><tt>bugpoint  ... |& tee bugpoint.log</tt></p> | 
 | 204 | </div> | 
 | 205 |  | 
 | 206 |     <p>to get a copy of <tt>bugpoint</tt>'s output in the file | 
 | 207 |     <tt>bugpoint.log</tt>, as well as on your terminal.</p> | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 208 |  | 
 | 209 | <li><tt>bugpoint</tt> cannot debug problems with the LLVM linker. If | 
 | 210 |     <tt>bugpoint</tt> crashes before you see its "All input ok" message, | 
 | 211 |     you might try <tt>llvm-link -v</tt> on the same set of input files. If | 
 | 212 |     that also crashes, you may be experiencing a linker bug. | 
 | 213 |  | 
| Patrick Jenkins | 8268166 | 2006-08-15 17:03:17 +0000 | [diff] [blame] | 214 | <li><tt>bugpoint</tt> is useful for proactively finding bugs in LLVM.  | 
 | 215 |     Invoking <tt>bugpoint</tt> with the <tt>-find-bugs</tt> option will cause | 
 | 216 |     the list of specified optimizations to be randomized and applied to the  | 
| Patrick Jenkins | 94f7850 | 2006-08-15 17:38:36 +0000 | [diff] [blame] | 217 |     program. This process will repeat until a bug is found or the user | 
| Patrick Jenkins | 8268166 | 2006-08-15 17:03:17 +0000 | [diff] [blame] | 218 |     kills <tt>bugpoint</tt>. | 
| Chris Lattner | 1e07905 | 2009-10-12 18:12:47 +0000 | [diff] [blame] | 219 |  | 
 | 220 | <li><p><tt>bugpoint</tt> does not understand the <tt>-O</tt> option | 
 | 221 |     that is used to specify optimization level to <tt>opt</tt>. You | 
 | 222 |     can use e.g.</p> | 
 | 223 |  | 
 | 224 | <div class="doc_code"> | 
 | 225 | <p><tt>opt -O2 -debug-pass=Arguments foo.bc -disable-output</tt></p> | 
 | 226 | </div> | 
 | 227 |  | 
 | 228 |     <p>to get a list of passes that are used with <tt>-O2</tt> and | 
 | 229 |     then pass this list to <tt>bugpoint</tt>.</p> | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 230 |      | 
 | 231 | </ol> | 
 | 232 |  | 
| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 233 | </div> | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 234 |  | 
| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 235 | <!-- *********************************************************************** --> | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 236 |  | 
| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 237 | <hr> | 
 | 238 | <address> | 
 | 239 |   <a href="http://jigsaw.w3.org/css-validator/check/referer"><img | 
| Misha Brukman | 4440870 | 2008-12-11 17:34:48 +0000 | [diff] [blame] | 240 |   src="http://jigsaw.w3.org/css-validator/images/vcss-blue" alt="Valid CSS"></a> | 
| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 241 |   <a href="http://validator.w3.org/check/referer"><img | 
| Misha Brukman | 4440870 | 2008-12-11 17:34:48 +0000 | [diff] [blame] | 242 |   src="http://www.w3.org/Icons/valid-html401-blue" alt="Valid HTML 4.01"></a> | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 243 |  | 
| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 244 |   <a href="mailto:sabre@nondot.org">Chris Lattner</a><br> | 
| Reid Spencer | 05fe4b0 | 2006-03-14 05:39:39 +0000 | [diff] [blame] | 245 |   <a href="http://llvm.org">LLVM Compiler Infrastructure</a><br> | 
| Misha Brukman | d97cb46 | 2004-12-09 20:26:20 +0000 | [diff] [blame] | 246 |   Last modified: $Date$ | 
 | 247 | </address> | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 248 |  | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 249 | </body> | 
 | 250 | </html> |