blob: 04f45b57243a9652fc43a871e6862de15fb78b83 [file] [log] [blame]
Chris Lattner1213bc72003-10-07 20:33:30 +00001<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>
Chris Lattner83273d52003-10-07 20:33:52 +000013<tt>bugpoint [options] [input llvm ll/bc files] [LLVM passes] --args &lt;program arguments&gt;...</tt>
Chris Lattner1213bc72003-10-07 20:33:30 +000014
15<img src="../Debugging.gif" width=444 height=314 align=right>
16<h3>DESCRIPTION</h3>
17
18The <tt>bugpoint</tt> tool is a generally useful tool for narrowing down
Chris Lattnerd1eb6f72003-10-18 20:36:15 +000019problems in LLVM tools and passes. It can be used to debug three types of
20failures: optimizer crashes, miscompilations by optimizers, or invalid native
21code generation. It aims to reduce testcases to something useful. For example,
22if <tt><a href="gccas.html">gccas</a></tt> crashes while optimizing a file, it
23will identify the optimization (or combination of optimizations) that causes the
24crash, and reduce the file down to a small example which triggers the crash.<p>
Chris Lattner1213bc72003-10-07 20:33:30 +000025
Chris Lattner5cd840c2003-10-18 20:54:37 +000026<tt>bugpoint</tt> has been designed to be a useful tool without requiring any
27hooks into the LLVM intrastructure at all. It works with any and all LLVM
28passes and code generators, and does not need to "know" how they work. Because
29of this, it may appear to do a lot of stupid things or miss obvious
30simplifications. Remember, however, that computer time is much cheaper than
31programmer time, so if it takes a long time to reduce a testcase it is still
32worth it. :)<p>
33
34<a name="crashdebug">
35<h4>Automatic Mode Selection</h4>
36
Chris Lattnerd1eb6f72003-10-18 20:36:15 +000037<tt>bugpoint</tt> reads the specified list of <tt>.bc</tt> or <tt>.ll</tt> files
38specified on the command-line and links them together. If any LLVM passes are
39specified on the command line, it runs these passes on the resultant module. If
Chris Lattner5cd840c2003-10-18 20:54:37 +000040any of the passes crash, or if they produce a malformed LLVM module,
41<tt>bugpoint</tt> enters <a href="#crashdebug">crash debugging mode</a>.<p>
Chris Lattner1213bc72003-10-07 20:33:30 +000042
Chris Lattnerd1eb6f72003-10-18 20:36:15 +000043Otherwise, if the <a href="#opt_output"><tt>-output</tt></a> option was not
44specified, <tt>bugpoint</tt> runs the initial program with the C backend (which
45is assumed to generate good code) to generate a reference output. Once
46<tt>bugpoint</tt> has a reference output to match, it tries executing the
47original program with the <a href="#opt_run-">selected</a> code generator. If
48the resultant output is different than the reference output, it exters <a
49href="#codegendebug">code generator debugging mode</a>.<p>
50
51Otherwise, <tt>bugpoint</tt> runs the LLVM program after all of the LLVM passes
52have been applied to it. If the executed program matches the reference output,
53there is no problem <tt>bugpoint</tt> can debug. Otherwise, it enters <a
54href="#miscompilationdebug">miscompilation debugging mode</a>.<p>
55
56<a name="crashdebug">
Chris Lattner1213bc72003-10-07 20:33:30 +000057<h4>Crash debugging mode</h4>
58
Chris Lattnerd1eb6f72003-10-18 20:36:15 +000059If an optimizer crashes, <tt>bugpoint</tt> will try a variety of techniques to
60narrow down the list of passes and the code to a more manageable amount. First,
61<tt>bugpoint</tt> figures out which combination of passes trigger the bug. This
62is useful when debugging a problem exposed by <tt>gccas</tt> for example,
63because it has over 30 optimization it runs.<p>
Misha Brukman3f717222003-10-16 18:14:43 +000064
Chris Lattnerd1eb6f72003-10-18 20:36:15 +000065Next, <tt>bugpoint</tt> tries removing functions from the module, to reduce the
66size of the testcase to a reasonable amount. Usually it is able to get it down
67to a single function for intraprocedural optimizations. Once the number of
68functions has been reduced, it attempts to delete various edges in the control
69flow graph, to reduce the size of the function as much as possible. Finally,
70<tt>bugpoint</tt> deletes any individual LLVM instructions whose absense does
71not eliminate the failure. At the end, <tt>bugpoint</tt> should tell you what
72passes crash, give you a bytecode file, and give you instructions on how to
73reproduce the failure with <tt><a href="opt.html">opt</a></tt> or
74<tt><a href="analyze.html">analyze</a></tt>.<p>
Chris Lattner1213bc72003-10-07 20:33:30 +000075
Chris Lattnerd1eb6f72003-10-18 20:36:15 +000076<a name="codegendebug">
77<h4>Code generator debugging mode</h4>
Chris Lattner1213bc72003-10-07 20:33:30 +000078
Chris Lattner5cd840c2003-10-18 20:54:37 +000079The code generator debugger attempts to narrow down the amount of code that is
80being miscompiled by the <a href="#opt_run-">selected</a> code generator. To do
81this, it takes the LLVM program and partitions it into two pieces: one piece
82which it compiles with the C backend (into a shared object), and one piece which
83it runs with either the JIT or the static LLC compiler. It uses several
84techniques to reduce the amount of code pushed through the LLVM code generator,
85to reduce the potential scope of the problem. After it is finished, it emits
86two bytecode files (the "test" [to be compiled with the code generator] and
87"safe" [to be compiled with the C backend] modules), and instructions for
88reproducing the problem. This module assume the C backend produces good
89code.<p>
90
91If you are using this mode and get an error message that says "Non-instruction
92is using an external function!", try using the <tt>-run-llc</tt> option instead
93of the <tt>-run-jit</tt> option. This is due to an unimplemented feature in the
94code generator debugging mode.<p>
Chris Lattner1213bc72003-10-07 20:33:30 +000095
Chris Lattnerd1eb6f72003-10-18 20:36:15 +000096<a name="miscompilationdebug">
97<h4>Miscompilation debugging mode</h4>
Chris Lattner1213bc72003-10-07 20:33:30 +000098
Chris Lattner5cd840c2003-10-18 20:54:37 +000099The miscompilation debugging mode works similarly to the code generator
100debugging mode. It works by splitting the program into two pieces, running the
101optimizations specified on one piece, relinking the program, then executing it.
102It attempts to narrow down the list of passes to the one (or few) which are
103causing the miscompilation, then reduce the portion of the program which is
104being miscompiled. This module assumes that the selected code generator is
105working properly.<p>
Chris Lattner1213bc72003-10-07 20:33:30 +0000106
107
Chris Lattner634ec562003-10-18 21:34:15 +0000108<a name="bugpoint notes">
109<h4>Advice for using <tt>bugpoint</tt></h4>
110
111<tt>bugpoint</tt> can be a remarkably useful tool, but it sometimes works in
112non-obvious ways. Here are some hints and tips:<p>
113
114<ol>
115<li>In code generator and miscompilation debugging modes, <tt>bugpoint</tt> only
116 works with programs that have deterministic output. Thus, if the program
117 outputs the date, time, or any other "random" data, it should be masked out.
118
119<li>In code generator and miscompilation debugging modes, debugging will go
120 faster if you manually modify the program or its inputs to reduce the
121 runtime, but still exhibit the problem.
122
123<li><tt>bugpoint</tt> is extremely useful when working on a new optimization:
124 it helps track down regressions quickly. To avoid having to relink
125 <tt>bugpoint</tt> every time you change your optization however, have
126 <tt>bugpoint</tt> dynamically load your optimization with the <a
127 href="#opt_load"><tt>-load</tt></a> option.
128
129<li><tt>bugpoint</tt> can generate a lot of output and run for a long period of
130 time. It is often useful to capture the output of the program to file. For
131 example:<br>
132 <tt>bugpoint ..... |& tee bugpoint.log</tt><p>
133
134</ol>
135
136
Chris Lattner1213bc72003-10-07 20:33:30 +0000137<h3>OPTIONS</h3>
138
139<ul>
Chris Lattner5cd840c2003-10-18 20:54:37 +0000140 <li><tt>-additional-so &lt;library.so&gt;</tt><br>
Chris Lattner1213bc72003-10-07 20:33:30 +0000141
Chris Lattner5cd840c2003-10-18 20:54:37 +0000142 Use this option to specify .so files which must be loaded by the program
143 when it is run. This is useful if you are debugging programs which
144 depend on non-LLVM libraries (such as the X or curses libraries) to
145 run.<p>
146
147 <li><tt>-args &lt;arguments&gt;</tt><br>
Chris Lattner0b4ffea2003-10-18 20:57:23 +0000148
Chris Lattner5cd840c2003-10-18 20:54:37 +0000149 All arguments specified after <tt>-args</tt> are passed into the
Chris Lattner0b4ffea2003-10-18 20:57:23 +0000150 executed program when the program must be executed. Note that if the
151 program takes an argument which starts with a '-', you should use:
152 <p>
153 <tt>bugpoint .... -args -- (the arguments here)</tt>
154 <p>
155 The "<tt>--</tt>" right after the <tt>-args</tt> option tells
156 <tt>bugpoint</tt> to consider any options starting with <tt>-</tt> to be
157 part of the <tt>-args</tt> option, not as options to <tt>bugpoint</tt>
158 itself.<p>
Chris Lattner5cd840c2003-10-18 20:54:37 +0000159
160 <li><tt>-disable-(adce,dce,final-cleanup,simplifycfg)</tt><br>
Chris Lattner1213bc72003-10-07 20:33:30 +0000161 <tt>bugpoint</tt> uses several passes internally for cleanup routines to
John Criswell589d91f2003-10-16 20:15:17 +0000162 reduce the size of the program. If you're trying to find a bug in one
Chris Lattner1213bc72003-10-07 20:33:30 +0000163 of these passes, <tt>bugpoint</tt> may crash. These options tell
Chris Lattner5cd840c2003-10-18 20:54:37 +0000164 <tt>bugpoint</tt> not use the specified passes.<p>
Chris Lattner1213bc72003-10-07 20:33:30 +0000165
Chris Lattner5cd840c2003-10-18 20:54:37 +0000166 <li> <tt>-help</tt><br>
167 Print a summary of command line options.<p>
Chris Lattner1213bc72003-10-07 20:33:30 +0000168
Chris Lattner5cd840c2003-10-18 20:54:37 +0000169 <a name="opt_input"><li><tt>-input &lt;filename&gt;</tt><br>
Chris Lattner1213bc72003-10-07 20:33:30 +0000170 Specify the contents of &lt;stdin&gt; when the program must be executed.
171 <p>
172
Chris Lattner634ec562003-10-18 21:34:15 +0000173 <a name="opt_load"><li> <tt>-load &lt;plugin.so&gt;</tt><br>
Chris Lattner1213bc72003-10-07 20:33:30 +0000174 Load the dynamic object plugin.so. This object should register new
175 optimization passes. Once loaded, the object will add new command line
176 options to enable various optimizations. To see the new complete list
177 of optimizations, use the -help and -load options together:
178 <p>
179 <tt>opt -load &lt;plugin.so&gt; -help</tt>
180 <p>
181
Chris Lattner5cd840c2003-10-18 20:54:37 +0000182 <a name="opt_output"><li><tt>-output &lt;filename&gt;</tt><br>
183 Specify a reference output for the &lt;stdout&gt; file stream.<p>
Chris Lattner1213bc72003-10-07 20:33:30 +0000184
Chris Lattner5cd840c2003-10-18 20:54:37 +0000185 <a name="opt_run-"><li><tt>-run-(int|jit|llc|cbe)</tt><br>
Chris Lattner1213bc72003-10-07 20:33:30 +0000186 Specify which code generator <tt>bugpoint</tt> should use to run the
Chris Lattner5cd840c2003-10-18 20:54:37 +0000187 program. You may choose the interpreter, the JIT compiler, the static
188 native code compiler, or the C backend.<p>
Chris Lattner1213bc72003-10-07 20:33:30 +0000189</ul>
190
191<h3>EXIT STATUS</h3>
192
193If <tt>bugpoint</tt> succeeds in finding a problem, it will exit with 0.
194Otherwise, if an error occurs, it will exit with a non-zero value.
195
196<h3>SEE ALSO</h3>
John Criswell589d91f2003-10-16 20:15:17 +0000197<a href="opt.html"><tt>opt</tt></a>,
Chris Lattner1213bc72003-10-07 20:33:30 +0000198<a href="analyze.html"><tt>analyze</tt></a>
199
200<HR>
201Maintained by the <a href="http://llvm.cs.uiuc.edu">LLVM Team</a>.
202</body>
203</html>
204