| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 1 | <html> | 
 | 2 | <title>LLVM: bugpoint tool</title> | 
 | 3 |  | 
 | 4 | <body bgcolor=white> | 
 | 5 |  | 
 | 6 | <center><h1>LLVM: <tt>bugpoint</tt> tool</h1></center> | 
 | 7 | <HR> | 
 | 8 |  | 
 | 9 | <h3>NAME</h3> | 
 | 10 | <tt>bugpoint</tt> | 
 | 11 |  | 
 | 12 | <h3>SYNOPSIS</h3> | 
 | 13 | <tt>bugpoint [options] [input LLVM ll/bc files] [LLVM passes] --args <program arguments>...</tt> | 
 | 14 |  | 
| Chris Lattner | 5706f25 | 2004-07-01 20:41:43 +0000 | [diff] [blame] | 15 | <img src="img/Debugging.gif" width=444 height=314 align=right> | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 16 | <h3>DESCRIPTION</h3> | 
 | 17 |  | 
 | 18 | The <tt>bugpoint</tt> tool narrows down the source of | 
 | 19 | problems in LLVM tools and passes.  It can be used to debug three types of | 
 | 20 | failures: optimizer crashes, miscompilations by optimizers, or bad native | 
 | 21 | code generation (including problems in the static and JIT compilers).  It aims  | 
 | 22 | to reduce large test cases to small, useful ones.  For example, | 
| Chris Lattner | 5706f25 | 2004-07-01 20:41:43 +0000 | [diff] [blame] | 23 | if <tt><a href="CommandGuide/gccas.html">gccas</a></tt> crashes while optimizing a file, it | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 24 | will identify the optimization (or combination of optimizations) that causes the | 
 | 25 | crash, and reduce the file down to a small example which triggers the crash.<p> | 
 | 26 |  | 
 | 27 | <a name="designphilosophy"> | 
 | 28 | <h4>Design Philosophy</h4> | 
 | 29 |  | 
 | 30 | <tt>bugpoint</tt> is designed to be a useful tool without requiring any | 
 | 31 | hooks into the LLVM infrastructure at all.  It works with any and all LLVM | 
 | 32 | passes and code generators, and does not need to "know" how they work.  Because | 
 | 33 | of this, it may appear to do stupid things or miss obvious | 
 | 34 | simplifications.  <tt>bugpoint</tt> is also designed to trade off programmer | 
 | 35 | time for computer time in the compiler-debugging process; consequently, it may | 
 | 36 | take a long period of (unattended) time to reduce a test case, but we feel it | 
 | 37 | is still worth it. Note that <tt>bugpoint</tt> is generally very quick unless | 
 | 38 | debugging a miscompilation where each test of the program (which requires  | 
 | 39 | executing it) takes a long time.<p> | 
 | 40 |  | 
 | 41 | <a name="automaticdebuggerselection"> | 
 | 42 | <h4>Automatic Debugger Selection</h4> | 
 | 43 |  | 
 | 44 | <tt>bugpoint</tt> reads each <tt>.bc</tt> or <tt>.ll</tt> file | 
 | 45 | specified on the command line and links them together into a single module, | 
 | 46 | called the test program.  If any LLVM passes are | 
 | 47 | specified on the command line, it runs these passes on the test program.  If | 
 | 48 | any of the passes crash, or if they produce malformed output (which causes the  | 
 | 49 | verifier to abort), | 
 | 50 | <tt>bugpoint</tt> starts the <a href="#crashdebug">crash debugger</a>.<p> | 
 | 51 |  | 
 | 52 | Otherwise, if the <a href="#opt_output"><tt>-output</tt></a> option was not | 
 | 53 | specified, <tt>bugpoint</tt> runs the test program with the C backend (which is | 
 | 54 | assumed to generate good code) to generate a reference output.  Once | 
 | 55 | <tt>bugpoint</tt> has a reference output for the test program, it tries | 
 | 56 | executing it with the <a href="#opt_run-">selected</a> code generator.  If the | 
 | 57 | selected code generator crashes, <tt>bugpoint</tt> starts the <a | 
 | 58 | href="#crashdebug">crash debugger</a> on the code generator.  Otherwise, if the | 
 | 59 | resulting output differs from the reference output, it assumes the difference | 
 | 60 | resulted from a code generator failure, and starts the <a | 
 | 61 | href="#codegendebug">code generator debugger</a>.<p> | 
 | 62 |  | 
 | 63 | Finally, if the output of the selected code generator matches the reference | 
 | 64 | output, <tt>bugpoint</tt> runs the test program after all of the LLVM passes | 
 | 65 | have been applied to it.  If its output differs from the reference output, it | 
 | 66 | assumes the difference resulted from a failure in one of the LLVM passes, and | 
 | 67 | enters the <a href="#miscompilationdebug">miscompilation | 
 | 68 | debugger</a>. Otherwise, there is no problem <tt>bugpoint</tt> can debug.<p> | 
 | 69 |  | 
 | 70 | <a name="crashdebug"> | 
 | 71 | <h4>Crash debugger</h4> | 
 | 72 |  | 
 | 73 | If an optimizer or code generator crashes, <tt>bugpoint</tt> will try as hard as | 
 | 74 | it can to reduce the list of passes (for optimizer crashes) and the size of the | 
 | 75 | test program.  First, <tt>bugpoint</tt> figures out which combination of | 
 | 76 | optimizer passes triggers the bug. This is useful when debugging a problem | 
 | 77 | exposed by <tt>gccas</tt>, for example, because it runs over 38 passes.<p> | 
 | 78 |  | 
 | 79 | Next, <tt>bugpoint</tt> tries removing functions from the test program, to | 
 | 80 | reduce its size.  Usually it is able to reduce a test program to a single | 
 | 81 | function, when debugging intraprocedural optimizations.  Once the number of | 
 | 82 | functions has been reduced, it attempts to delete various edges in the control | 
 | 83 | flow graph, to reduce the size of the function as much as possible.  Finally, | 
 | 84 | <tt>bugpoint</tt> deletes any individual LLVM instructions whose absence does | 
 | 85 | not eliminate the failure.  At the end, <tt>bugpoint</tt> should tell you what | 
 | 86 | passes crash, give you a bytecode file, and give you instructions on how to | 
| Chris Lattner | 5706f25 | 2004-07-01 20:41:43 +0000 | [diff] [blame] | 87 | reproduce the failure with <tt><a href="CommandGuide/opt.html">opt</a></tt>, <tt><a | 
 | 88 | href="CommandGuide/analyze.html">analyze</a></tt>, or <tt><a href="CommandGuide/llc.html">llc</a></tt>.<p> | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 89 |  | 
 | 90 | <a name="codegendebug"> | 
 | 91 | <h4>Code generator debugger</h4> | 
 | 92 |  | 
 | 93 | <p>The code generator debugger attempts to narrow down the amount of code that | 
 | 94 | is being miscompiled by the <a href="#opt_run-">selected</a> code generator.  To | 
 | 95 | do this, it takes the test program and partitions it into two pieces: one piece | 
 | 96 | which it compiles with the C backend (into a shared object), and one piece which | 
 | 97 | it runs with either the JIT or the static LLC compiler.  It uses several | 
 | 98 | techniques to reduce the amount of code pushed through the LLVM code generator, | 
 | 99 | to reduce the potential scope of the problem.  After it is finished, it emits | 
 | 100 | two bytecode files (called "test" [to be compiled with the code generator] and | 
 | 101 | "safe" [to be compiled with the C backend], respectively), and instructions for | 
 | 102 | reproducing the problem.  The code generator debugger assumes that the C backend | 
 | 103 | produces good code.</p> | 
 | 104 |  | 
 | 105 | <a name="miscompilationdebug"> | 
 | 106 | <h4>Miscompilation debugger</h4> | 
 | 107 |  | 
 | 108 | The miscompilation debugger works similarly to the code generator | 
 | 109 | debugger.  It works by splitting the test program into two pieces, running the | 
 | 110 | optimizations specified on one piece, linking the two pieces back together, | 
 | 111 | and then executing the result. | 
 | 112 | It attempts to narrow down the list of passes to the one (or few) which are | 
 | 113 | causing the miscompilation, then reduce the portion of the test program which is | 
 | 114 | being miscompiled.  The miscompilation debugger assumes that the selected | 
 | 115 | code generator is working properly.<p> | 
 | 116 |  | 
 | 117 | <a name="bugpoint notes"> | 
 | 118 | <h4>Advice for using <tt>bugpoint</tt></h4> | 
 | 119 |  | 
 | 120 | <tt>bugpoint</tt> can be a remarkably useful tool, but it sometimes works in | 
 | 121 | non-obvious ways.  Here are some hints and tips:<p> | 
 | 122 |  | 
 | 123 | <ol> | 
 | 124 | <li>In the code generator and miscompilation debuggers, <tt>bugpoint</tt> only | 
 | 125 |     works with programs that have deterministic output.  Thus, if the program | 
 | 126 |     outputs <tt>argv[0]</tt>, the date, time, or any other "random" data, <tt>bugpoint</tt> may | 
 | 127 |     misinterpret differences in these data, when output, as the result of a | 
 | 128 |     miscompilation.  Programs should be temporarily modified to disable | 
 | 129 |     outputs that are likely to vary from run to run. | 
 | 130 |  | 
 | 131 | <li>In the code generator and miscompilation debuggers, debugging will go | 
 | 132 |     faster if you manually modify the program or its inputs to reduce the | 
 | 133 |     runtime, but still exhibit the problem. | 
 | 134 |  | 
 | 135 | <li><tt>bugpoint</tt> is extremely useful when working on a new optimization: | 
 | 136 |     it helps track down regressions quickly.  To avoid having to relink | 
 | 137 |     <tt>bugpoint</tt> every time you change your optimization however, have | 
 | 138 |     <tt>bugpoint</tt> dynamically load your optimization with the <a | 
 | 139 |     href="#opt_load"><tt>-load</tt></a> option. | 
 | 140 |  | 
 | 141 | <li><tt>bugpoint</tt> can generate a lot of output and run for a long period of | 
 | 142 |     time.  It is often useful to capture the output of the program to file.  For | 
 | 143 |     example, in the C shell, you can type:<br> | 
 | 144 |     <tt>bugpoint  ..... |& tee bugpoint.log</tt> | 
 | 145 |     <br>to get a copy of <tt>bugpoint</tt>'s output in the file | 
 | 146 |     <tt>bugpoint.log</tt>, as well as on your terminal. | 
 | 147 |  | 
 | 148 | <li><tt>bugpoint</tt> cannot debug problems with the LLVM linker. If | 
 | 149 |     <tt>bugpoint</tt> crashes before you see its "All input ok" message, | 
 | 150 |     you might try <tt>llvm-link -v</tt> on the same set of input files. If | 
 | 151 |     that also crashes, you may be experiencing a linker bug. | 
 | 152 |  | 
 | 153 | <li>If your program is <b>supposed</b> to crash, <tt>bugpoint</tt> will be | 
 | 154 |     confused. One way to deal with this is to cause bugpoint to ignore the exit | 
 | 155 |     code from your program, by giving it the <tt>-check-exit-code=false</tt> | 
 | 156 |     option. | 
 | 157 |      | 
 | 158 | </ol> | 
 | 159 |  | 
 | 160 | <h3>OPTIONS</h3> | 
 | 161 |  | 
 | 162 | <ul> | 
 | 163 | 	<li><tt>-additional-so <library></tt><br> | 
 | 164 |     Load <tt><library></tt> into the test program whenever it is run. | 
 | 165 |     This is useful if you are debugging programs which depend on non-LLVM | 
 | 166 |     libraries (such as the X or curses libraries) to run.<p> | 
 | 167 |  | 
 | 168 | 	<li><tt>-args <program args></tt><br> | 
 | 169 | 	Pass all arguments specified after <tt>-args</tt> to the | 
 | 170 | 	test program whenever it runs.  Note that if any of | 
 | 171 | 	the <tt><program args></tt> start with a '-', you should use: | 
 | 172 |         <p> | 
 | 173 |         <tt>bugpoint <bugpoint args> -args -- <program args></tt> | 
 | 174 |         <p> | 
 | 175 |         The "<tt>--</tt>" right after the <tt>-args</tt> option tells | 
 | 176 |         <tt>bugpoint</tt> to consider any options starting with <tt>-</tt> to be | 
 | 177 |         part of the <tt>-args</tt> option, not as options to <tt>bugpoint</tt> | 
 | 178 |         itself.<p> | 
 | 179 |  | 
 | 180 | 	<li><tt>-tool-args <tool args></tt><br> | 
 | 181 | 	Pass all arguments specified after <tt>-tool-args</tt> to the | 
 | 182 | 	LLVM tool under test (llc, lli, etc.) whenever it runs. | 
 | 183 | 	You should use this option in the following way: | 
 | 184 |         <p> | 
 | 185 |         <tt>bugpoint <bugpoint args> -tool-args -- <tool args></tt> | 
 | 186 |         <p> | 
 | 187 |         The "<tt>--</tt>" right after the <tt>-tool-args</tt> option tells | 
 | 188 |         <tt>bugpoint</tt> to consider any options starting with <tt>-</tt> to be | 
 | 189 |         part of the <tt>-tool-args</tt> option, not as options to | 
 | 190 |         <tt>bugpoint</tt> itself. (See <tt>-args</tt>, above.)<p> | 
 | 191 |  | 
 | 192 | 	<li><tt>-check-exit-code={true,false}</tt><br> | 
 | 193 |     Assume a non-zero exit code or core dump from the test program is | 
 | 194 |     a failure. Defaults to true.<p> | 
 | 195 |  | 
 | 196 | 	<li><tt>-disable-{dce,simplifycfg}</tt><br> | 
 | 197 |     Do not run the specified passes to clean up and reduce the size of the | 
 | 198 |     test program. By default, <tt>bugpoint</tt> uses these passes internally | 
 | 199 |     when attempting to reduce test programs.  If you're trying to find | 
 | 200 |     a bug in one of these passes, <tt>bugpoint</tt> may crash.<p> | 
 | 201 |  | 
 | 202 | 	<li> <tt>-help</tt><br> | 
 | 203 | 	Print a summary of command line options.<p> | 
 | 204 |  | 
 | 205 | 	<a name="opt_input"><li><tt>-input <filename></tt><br> | 
 | 206 | 	Open <tt><filename></tt> and redirect the standard input of the | 
 | 207 |     test program, whenever it runs, to come from that file. | 
 | 208 | 	<p> | 
 | 209 |  | 
 | 210 | 	<a name="opt_load"><li> <tt>-load <plugin></tt><br> | 
 | 211 | 	Load the dynamic object <tt><plugin></tt> into <tt>bugpoint</tt> | 
 | 212 |     itself.  This object should register new | 
 | 213 | 	optimization passes.  Once loaded, the object will add new command line | 
 | 214 | 	options to enable various optimizations.  To see the new complete list | 
 | 215 | 	of optimizations, use the -help and -load options together: | 
 | 216 | 	<p> | 
 | 217 | 	<tt>bugpoint -load <plugin> -help</tt> | 
 | 218 | 	<p> | 
 | 219 |  | 
 | 220 | 	<a name="opt_output"><li><tt>-output <filename></tt><br> | 
 | 221 |     Whenever the test program produces output on its standard output | 
 | 222 |     stream, it should match the contents of <tt><filename></tt> | 
 | 223 |     (the "reference output"). If you do not use this option, | 
 | 224 |     <tt>bugpoint</tt> will attempt to generate a reference output by | 
 | 225 |     compiling the program with the C backend and running it.<p> | 
 | 226 |  | 
 | 227 | 	<li><tt>-profile-info-file <filename></tt><br> | 
 | 228 |     Profile file loaded by -profile-loader.<p> | 
 | 229 |  | 
 | 230 | 	<a name="opt_run-"><li><tt>-run-{int,jit,llc,cbe}</tt><br> | 
 | 231 |     Whenever the test program is compiled, <tt>bugpoint</tt> should generate | 
 | 232 |     code for it using the specified code generator.  These options allow | 
 | 233 |     you to choose the interpreter, the JIT compiler, the static native | 
 | 234 |     code compiler, or the C backend, respectively.<p> | 
 | 235 | </ul> | 
 | 236 |  | 
 | 237 | <h3>EXIT STATUS</h3> | 
 | 238 |  | 
 | 239 | If <tt>bugpoint</tt> succeeds in finding a problem, it will exit with 0. | 
 | 240 | Otherwise, if an error occurs, it will exit with a non-zero value. | 
 | 241 |  | 
| Brian Gaeke | 74f470b | 2004-07-01 20:10:40 +0000 | [diff] [blame] | 242 | <HR> | 
 | 243 | Maintained by the <a href="http://llvm.cs.uiuc.edu">LLVM Team</a>. | 
 | 244 | </body> | 
 | 245 | </html> |