blob: 86ee32a442652f7d3ee39711600a96529b83d207 [file] [log] [blame]
<html>
<head>
<title>LLVM Visualization Tool User Guide</title>
</head>
<body>
<h2><img src="images/llvmtv-logo.png" alt="[LLVM-TV Logo]">LLVM Visualization Tool User Guide</h2>
<h3><u>Required Software:</u></h3>
In order to compile and run the LLVM Visualization Tool (LLVM-TV), the following software
must be installed:
<ul>
<li><b>The Low Level Virtual Machine (LLVM) Compiler Infrastructure:</b> You
must check out the latest version from CVS. LLVM-TV does not work with
LLVM version 1.2, the latest released version at the time of this writing.
See the <a href="http://llvm.cs.uiuc.edu/docs/GettingStarted.html">LLVM Getting
Started Guide</a> for details.</li>
<li><b>Dot</b>: Included in the AT&T Research <a href="http://www.research.att.com/sw/tools/graphviz/">Graphviz</a> package, LLVM-TV uses Dot to draw directed
graphs. For best results, make sure you have TrueType fonts installed.</li>
</ul>
<p>
<h3><u>Download:</u></h3>
<p>Once you have unpacked and compiled LLVM, download the LLVM Visualization
Tool sources and unpack them in the <tt>projects</tt> subdirectory of your LLVM
source tree.</p>
<pre>
% cd llvm/projects
% tar xzvf llvm-tv.tgz
% cd llvm-tv
</pre>
<p>
<h3><u>Compiling:</u></h3>
<p>You must then compile the LLVM Visualization Tool.</p>
<pre>
% ./configure --with-llvmsrc=[path] --with-llvmobj=[path]
</pre>
<p><i>If you're building in llvm/projects/llvm-tv, then you don't need
to specify these --with options.</i></p>
<pre>
% cd lib/wxwindows
% ./configure --enable-debug --prefix=`pwd`
</pre>
<p><i>Make absolutely sure that wxWindows's configure script detects the same
C++ compiler that you used to compile LLVM. Otherwise, you may get
weird link errors when trying to link the llvm-tv tool.</i></p>
<pre>
% cd ../..
% gmake
</pre>
<p>
<h3><u>Using the LLVM Visualization Tool:</u></h3>
The main purpose of the LLVM Visualization tool is to view the effects of transformations written in the LLVM framework. We call the points in time after a transformation has been run "snapshots." <p>
Note: opt-snap and llvm-tv.exe may be found in the tools/Debug directory.
<p>
<h4>Acquiring a Snapshot:</h4>
<p>Using the LLVM tool 'opt', one runs transformations on an LLVM Bytecode file.
Please see the <a href="http://llvm.cs.uiuc.edu/docs/CommandGuide/opt.html">man
page</a> on opt for details on what transformations are available.</p>
<p>In order to acquire snapshots after a transformation or a series of
transformations have been applied, you use the 'opt-snap' tool. You simply place
the option '-snapshot' after specifying your transformation options. You may ask
for a snapshot any number of times.</p>
<p>Here is an example of using opt to acquire snapshots. We will run two
optimizations (loop-invariant code motion and global common-subexpression
elimination) on the program whose LLVM bytecode is in the file
<tt>bytecode-file.bc</tt>, and take a snapshot after each pass completes:</p>
<pre>
% opt-snap -debug -licm -snapshot -gcse -snapshot < bytecode-file.bc > /dev/null
</pre>
<p>All snapshots are placed in the directory
<tt>/tmp/llvm-tv-<i>username</i>/snapshots</tt>, where <tt><i>username</i></tt>
is your login name.</p>
<h4>Viewing a Snapshot:</h4>
<p>Begin by starting up the LLVM Visualization tool GUI. Make sure llvm-tv.exe
is in your PATH, then type:</p>
<pre>
% llvm-tv.exe
</pre>
<p>This should pop up a window such as the following:</p>
<img src="images/llvmtv-firstopen.jpg"><p>
<p>Notice that all the snapshots are listed in the tree view structure on the left
side of the frame. Compilation units in LLVM have a simple, hierarchical
structure:
a Module contains Functions, which contain BasicBlocks, which contain
Instructions. The tree view will show you functions within the snapshot you are viewing.</p>
<p>
From this screen shot, you can see that we have expanded a module revealing that it has several functions within it.</p>
<img src="images/llvmtv-expandmodule.jpg">
<p>
To the right of the tree view is a tabbed pane that allows you to easily browse
different views of the snapshot.</p>
<b>TextView:</b><br>
<p>The text view is a direct disassembly of the Module, showing the pointer size
of the target architecture for which it was compiled, endianness, the
user-defined types present in the module, global variables, and all function
definitions.</p>
<img src="images/llvmtv-TextView.jpg"><p>
<b>HTMLView:</b><br>
<p>The HTML view is a syntax-highlighted view with LLVM keywords in blue, types
in green, and BasicBlock names in red. For brevity, the Module view does not
include the types and the functions are given as prototypes. External functions,
for which the Module has no code, are prepended with a `declare' keyword. Other
functions' code can be viewed by clicking on the appropriate node in the tree
list.</p>
<img src="images/llvmtv-HTMLView.jpg"><p>
<b>DSGraph Views:</b><br>
<p>LLVM has a powerful alias analysis framework and here we are showcasing its
novel Data Structure Analysis (DSA) algorithm. It has 3 components: the
Bottom-Up DSGraph, Top-down DSGraph, and Local DSGraph. These graphs show
points-to results analysis for global variables and other pointers in a
program. Here we see the results of a local data-structure analysis run:</p>
<img src="images/llvmtv-LocalDSGraph.jpg"><p>
<b>CodeView:</b><br>
<p>Because LLVM is in SSA (Static Single Assignment) form, any use of a variable must
be preceded by exactly one definition. We can thus form def-use chains which
connect definitions of variables to their uses. The CodeView enables one to
click on any value and see where the uses of the variable occur, allowing a
visual way to inspect code. As a side effect, clicking on a BasicBlock entry
shows all users of the BasicBlock, which are branches that have the BasicBlock
as a target, thus showing how many incoming control-flow edges a block has.</p>
<img src="images/llvmtv-CodeView.jpg"><p>
<p>There are also more views under the View menu. Selecting one of these views will
open up a new window with that view in it. There are two new views that we have
not seen before: Call Graph view and Control Flow Graph view.</p>
<img src="images/llvmtv-ViewMenu.jpg"><p>
<b>Call Graph:</b><br>
<p>The Call Graph shows the callers and callees of each function in the module. A graph of
functions, here each node represents a function and an arrow from node A to node
B means that function A calls function B at least once in its code.</p>
<b>Control Flow Graph:</b><br>
<p>The control flow graph displays graphically the control flow of the function,
identifying each basic block as a node and labeling all branches between blocks
as arrows.</p>
<img src="images/llvmtv-ControlFlow.jpg"><p>
Additionally, you can use the File menu to add more snapshots to the visualizer.
<br>
<img src="images/llvmtv-FileMenu.jpg"><p>
<b>Add Module:</b><br>
<p>This will add a given Module to the list of snapshots without having to run
opt-snap to deposit it into the snapshot collection. This is useful if you
want to compare different programs, instead of looking at multiple views
of the same program.</p>
<b>Refresh:</b><br>
<p>This option will re-read the snapshot collection directory to see if any new
Modules have been added manually by the user (by copying directly through the
filesystem).</p>
<h4>Snapshots and Signaling:</h4>
<p>
A neat feature of the LLVM Visualization tool is that the GUI will automatically
refresh the snapshot listing when opt-snap signals that a new snapshot has been
generated. This is primarily useful for long-running optimizations.
</p>
</body>
</html>