<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" | |
"http://www.w3.org/TR/html4/strict.dtd"> | |
<html> | |
<head> | |
<title>LLVM bugpoint tool: design and usage</title> | |
<link rel="stylesheet" href="llvm.css" type="text/css"> | |
</head> | |
<h1> | |
LLVM bugpoint tool: design and usage | |
</h1> | |
<ul> | |
<li><a href="#desc">Description</a></li> | |
<li><a href="#design">Design Philosophy</a> | |
<ul> | |
<li><a href="#autoselect">Automatic Debugger Selection</a></li> | |
<li><a href="#crashdebug">Crash debugger</a></li> | |
<li><a href="#codegendebug">Code generator debugger</a></li> | |
<li><a href="#miscompilationdebug">Miscompilation debugger</a></li> | |
</ul></li> | |
<li><a href="#advice">Advice for using <tt>bugpoint</tt></a></li> | |
</ul> | |
<div class="doc_author"> | |
<p>Written by <a href="mailto:sabre@nondot.org">Chris Lattner</a></p> | |
</div> | |
<!-- *********************************************************************** --> | |
<h2> | |
<a name="desc">Description</a> | |
</h2> | |
<!-- *********************************************************************** --> | |
<div> | |
<p><tt>bugpoint</tt> narrows down the source of problems in LLVM tools and | |
passes. It can be used to debug three types of failures: optimizer crashes, | |
miscompilations by optimizers, or bad native code generation (including problems | |
in the static and JIT compilers). It aims to reduce large test cases to small, | |
useful ones. For example, if <tt>opt</tt> crashes while optimizing a | |
file, it will identify the optimization (or combination of optimizations) that | |
causes the crash, and reduce the file down to a small example which triggers the | |
crash.</p> | |
<p>For detailed case scenarios, such as debugging <tt>opt</tt>, | |
<tt>llvm-ld</tt>, or one of the LLVM code generators, see <a | |
href="HowToSubmitABug.html">How To Submit a Bug Report document</a>.</p> | |
</div> | |
<!-- *********************************************************************** --> | |
<h2> | |
<a name="design">Design Philosophy</a> | |
</h2> | |
<!-- *********************************************************************** --> | |
<div> | |
<p><tt>bugpoint</tt> is designed to be a useful tool without requiring any | |
hooks into the LLVM infrastructure at all. It works with any and all LLVM | |
passes and code generators, and does not need to "know" how they work. Because | |
of this, it may appear to do stupid things or miss obvious | |
simplifications. <tt>bugpoint</tt> is also designed to trade off programmer | |
time for computer time in the compiler-debugging process; consequently, it may | |
take a long period of (unattended) time to reduce a test case, but we feel it | |
is still worth it. Note that <tt>bugpoint</tt> is generally very quick unless | |
debugging a miscompilation where each test of the program (which requires | |
executing it) takes a long time.</p> | |
<!-- ======================================================================= --> | |
<h3> | |
<a name="autoselect">Automatic Debugger Selection</a> | |
</h3> | |
<div> | |
<p><tt>bugpoint</tt> reads each <tt>.bc</tt> or <tt>.ll</tt> file specified on | |
the command line and links them together into a single module, called the test | |
program. If any LLVM passes are specified on the command line, it runs these | |
passes on the test program. If any of the passes crash, or if they produce | |
malformed output (which causes the verifier to abort), <tt>bugpoint</tt> starts | |
the <a href="#crashdebug">crash debugger</a>.</p> | |
<p>Otherwise, if the <tt>-output</tt> option was not specified, | |
<tt>bugpoint</tt> runs the test program with the C backend (which is assumed to | |
generate good code) to generate a reference output. Once <tt>bugpoint</tt> has | |
a reference output for the test program, it tries executing it with the | |
selected code generator. If the selected code generator crashes, | |
<tt>bugpoint</tt> starts the <a href="#crashdebug">crash debugger</a> on the | |
code generator. Otherwise, if the resulting output differs from the reference | |
output, it assumes the difference resulted from a code generator failure, and | |
starts the <a href="#codegendebug">code generator debugger</a>.</p> | |
<p>Finally, if the output of the selected code generator matches the reference | |
output, <tt>bugpoint</tt> runs the test program after all of the LLVM passes | |
have been applied to it. If its output differs from the reference output, it | |
assumes the difference resulted from a failure in one of the LLVM passes, and | |
enters the <a href="#miscompilationdebug">miscompilation debugger</a>. | |
Otherwise, there is no problem <tt>bugpoint</tt> can debug.</p> | |
</div> | |
<!-- ======================================================================= --> | |
<h3> | |
<a name="crashdebug">Crash debugger</a> | |
</h3> | |
<div> | |
<p>If an optimizer or code generator crashes, <tt>bugpoint</tt> will try as hard | |
as it can to reduce the list of passes (for optimizer crashes) and the size of | |
the test program. First, <tt>bugpoint</tt> figures out which combination of | |
optimizer passes triggers the bug. This is useful when debugging a problem | |
exposed by <tt>opt</tt>, for example, because it runs over 38 passes.</p> | |
<p>Next, <tt>bugpoint</tt> tries removing functions from the test program, to | |
reduce its size. Usually it is able to reduce a test program to a single | |
function, when debugging intraprocedural optimizations. Once the number of | |
functions has been reduced, it attempts to delete various edges in the control | |
flow graph, to reduce the size of the function as much as possible. Finally, | |
<tt>bugpoint</tt> deletes any individual LLVM instructions whose absence does | |
not eliminate the failure. At the end, <tt>bugpoint</tt> should tell you what | |
passes crash, give you a bitcode file, and give you instructions on how to | |
reproduce the failure with <tt>opt</tt> or <tt>llc</tt>.</p> | |
</div> | |
<!-- ======================================================================= --> | |
<h3> | |
<a name="codegendebug">Code generator debugger</a> | |
</h3> | |
<div> | |
<p>The code generator debugger attempts to narrow down the amount of code that | |
is being miscompiled by the selected code generator. To do this, it takes the | |
test program and partitions it into two pieces: one piece which it compiles | |
with the C backend (into a shared object), and one piece which it runs with | |
either the JIT or the static LLC compiler. It uses several techniques to | |
reduce the amount of code pushed through the LLVM code generator, to reduce the | |
potential scope of the problem. After it is finished, it emits two bitcode | |
files (called "test" [to be compiled with the code generator] and "safe" [to be | |
compiled with the C backend], respectively), and instructions for reproducing | |
the problem. The code generator debugger assumes that the C backend produces | |
good code.</p> | |
</div> | |
<!-- ======================================================================= --> | |
<h3> | |
<a name="miscompilationdebug">Miscompilation debugger</a> | |
</h3> | |
<div> | |
<p>The miscompilation debugger works similarly to the code generator debugger. | |
It works by splitting the test program into two pieces, running the | |
optimizations specified on one piece, linking the two pieces back together, and | |
then executing the result. It attempts to narrow down the list of passes to | |
the one (or few) which are causing the miscompilation, then reduce the portion | |
of the test program which is being miscompiled. The miscompilation debugger | |
assumes that the selected code generator is working properly.</p> | |
</div> | |
</div> | |
<!-- *********************************************************************** --> | |
<h2> | |
<a name="advice">Advice for using bugpoint</a> | |
</h2> | |
<!-- *********************************************************************** --> | |
<div> | |
<tt>bugpoint</tt> can be a remarkably useful tool, but it sometimes works in | |
non-obvious ways. Here are some hints and tips:<p> | |
<ol> | |
<li>In the code generator and miscompilation debuggers, <tt>bugpoint</tt> only | |
works with programs that have deterministic output. Thus, if the program | |
outputs <tt>argv[0]</tt>, the date, time, or any other "random" data, | |
<tt>bugpoint</tt> may misinterpret differences in these data, when output, | |
as the result of a miscompilation. Programs should be temporarily modified | |
to disable outputs that are likely to vary from run to run. | |
<li>In the code generator and miscompilation debuggers, debugging will go | |
faster if you manually modify the program or its inputs to reduce the | |
runtime, but still exhibit the problem. | |
<li><tt>bugpoint</tt> is extremely useful when working on a new optimization: | |
it helps track down regressions quickly. To avoid having to relink | |
<tt>bugpoint</tt> every time you change your optimization however, have | |
<tt>bugpoint</tt> dynamically load your optimization with the | |
<tt>-load</tt> option. | |
<li><p><tt>bugpoint</tt> can generate a lot of output and run for a long period | |
of time. It is often useful to capture the output of the program to file. | |
For example, in the C shell, you can run:</p> | |
<div class="doc_code"> | |
<p><tt>bugpoint ... |& tee bugpoint.log</tt></p> | |
</div> | |
<p>to get a copy of <tt>bugpoint</tt>'s output in the file | |
<tt>bugpoint.log</tt>, as well as on your terminal.</p> | |
<li><tt>bugpoint</tt> cannot debug problems with the LLVM linker. If | |
<tt>bugpoint</tt> crashes before you see its "All input ok" message, | |
you might try <tt>llvm-link -v</tt> on the same set of input files. If | |
that also crashes, you may be experiencing a linker bug. | |
<li><tt>bugpoint</tt> is useful for proactively finding bugs in LLVM. | |
Invoking <tt>bugpoint</tt> with the <tt>-find-bugs</tt> option will cause | |
the list of specified optimizations to be randomized and applied to the | |
program. This process will repeat until a bug is found or the user | |
kills <tt>bugpoint</tt>. | |
</ol> | |
</div> | |
<!-- *********************************************************************** --> | |
<hr> | |
<address> | |
<a href="http://jigsaw.w3.org/css-validator/check/referer"><img | |
src="http://jigsaw.w3.org/css-validator/images/vcss-blue" alt="Valid CSS"></a> | |
<a href="http://validator.w3.org/check/referer"><img | |
src="http://www.w3.org/Icons/valid-html401-blue" alt="Valid HTML 4.01"></a> | |
<a href="mailto:sabre@nondot.org">Chris Lattner</a><br> | |
<a href="http://llvm.org/">LLVM Compiler Infrastructure</a><br> | |
Last modified: $Date: 2011-08-30 14:26:11 -0400 (Tue, 30 Aug 2011) $ | |
</address> | |
</body> | |
</html> |