<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>LLVM Programmer's Manual</title></head>

<body bgcolor=white>

<table width="100%" bgcolor="#330077" border=0 cellpadding=4 cellspacing=0>
<tr><td>&nbsp; <font size=+3 color="#EEEEFF" face="Georgia,Palatino,Times,Roman"><b>LLVM Programmer's Manual</b></font></td>
</tr></table>
 
<ol>
  <li><a href="#introduction">Introduction</a>
  <li><a href="#general">General Information</a>
  <ul>
    <li><a href="#stl">The C++ Standard Template Library</a>
<!--
    <li>The <tt>-time-passes</tt> option
    <li>How to use the LLVM Makefile system
    <li>How to write a regression test
-->
  </ul>
  <li><a href="#apis">Important and useful LLVM APIs</a>
  <ul>
    <li><a href="#isa">The <tt>isa&lt;&gt;</tt>, <tt>cast&lt;&gt;</tt> and
                       <tt>dyn_cast&lt;&gt;</tt> templates</a>
    <li><a href="#DEBUG">The <tt>DEBUG()</tt> macro &amp;
                       <tt>-debug</tt> option</a>
    <li><a href="#Statistic">The <tt>Statistic</tt> template &amp;
                       <tt>-stats</tt> option</a>
<!--
    <li>The <tt>InstVisitor</tt> template
    <li>The general graph API
-->
  </ul>
  <li><a href="#common">Helpful Hints for Common Operations</a>
  <ul>
    <li><a href="#inspection">Basic Inspection and Traversal Routines</a>
    <ul>
      <li><a href="#iterate_function">Iterating over the <tt>BasicBlock</tt>s
                                       in a <tt>Function</tt></a>
      <li><a href="#iterate_basicblock">Iterating over the <tt>Instruction</tt>s
                                       in a <tt>BasicBlock</tt></a>
      <li><a href="#iterate_institer">Iterating over the <tt>Instruction</tt>s
                                       in a <tt>Function</tt></a>
      <li><a href="#iterate_convert">Turning an iterator into a class
                                        pointer</a>
      <li><a href="#iterate_complex">Finding call sites: a more complex
                                        example</a>
      <li><a href="#iterate_chains">Iterating over def-use &amp; use-def
                                    chains</a>
    </ul>
    <li><a href="#simplechanges">Making simple changes</a>
    <ul>
      <li><a href="#schanges_creating">Creating and inserting new
		  <tt>Instruction</tt>s</a>
      <li><a href="#schanges_deleting">Deleting
		  <tt>Instruction</tt>s</a> 
      <li><a href="#schanges_replacing">Replacing an
		  <tt>Instruction</tt> with another <tt>Value</tt></a>
    </ul>
<!--
    <li>Working with the Control Flow Graph
    <ul>
      <li>Accessing predecessors and successors of a <tt>BasicBlock</tt>
      <li>
      <li>
    </ul>
-->
  </ul>
  <li><a href="#coreclasses">The Core LLVM Class Hierarchy Reference</a>
  <ul>
    <li><a href="#Value">The <tt>Value</tt> class</a>
    <ul>
      <li><a href="#User">The <tt>User</tt> class</a>
      <ul>
        <li><a href="#Instruction">The <tt>Instruction</tt> class</a>
        <ul>
        <li>
        </ul>
        <li><a href="#GlobalValue">The <tt>GlobalValue</tt> class</a>
        <ul>
          <li><a href="#BasicBlock">The <tt>BasicBlock</tt> class</a>
          <li><a href="#Function">The <tt>Function</tt> class</a>
          <li><a href="#GlobalVariable">The <tt>GlobalVariable</tt> class</a>
        </ul>
        <li><a href="#Module">The <tt>Module</tt> class</a>
        <li><a href="#Constant">The <tt>Constant</tt> class</a>
        <ul>
        <li>
        <li>
        </ul>
      </ul>
      <li><a href="#Type">The <tt>Type</tt> class</a>
      <li><a href="#Argument">The <tt>Argument</tt> class</a>
    </ul>
    <li>The <tt>SymbolTable</tt> class
    <li>The <tt>ilist</tt> and <tt>iplist</tt> classes
    <ul>
      <li>Creating, inserting, moving and deleting from LLVM lists
    </ul>
    <li>Important iterator invalidation semantics to be aware of
  </ul>

  <p><b>Written by <a href="mailto:sabre@nondot.org">Chris Lattner</a>,
        <a href="mailto:dhurjati@cs.uiuc.edu">Dinakar Dhurjati</a>, and
      <a href="mailto:jstanley@cs.uiuc.edu">Joel Stanley</a></b><p>
</ol>


<!-- *********************************************************************** -->
<table width="100%" bgcolor="#330077" border=0 cellpadding=4 cellspacing=0>
<tr><td align=center><font color="#EEEEFF" size=+2 face="Georgia,Palatino"><b>
<a name="introduction">Introduction
</b></font></td></tr></table><ul>
<!-- *********************************************************************** -->

This document is meant to highlight some of the important classes and interfaces
available in the LLVM source-base.  This manual is not intended to explain what
LLVM is, how it works, and what LLVM code looks like.  It assumes that you know
the basics of LLVM and are interested in writing transformations or otherwise
analyzing or manipulating the code.<p>

This document should get you oriented so that you can find your way in the
continuously growing source code that makes up the LLVM infrastructure.  Note
that this manual is not intended to serve as a replacement for reading the
source code, so if you think there should be a method in one of these classes to
do something, but it's not listed, check the source.  Links to the <a
href="/doxygen/">doxygen</a> sources are provided to make this as easy as
possible.<p>

The first section of this document describes general information that is useful
to know when working in the LLVM infrastructure, and the second describes the
Core LLVM classes.  In the future this manual will be extended with information
describing how to use extension libraries, such as dominator information, CFG
traversal routines, and useful utilities like the <tt><a
href="/doxygen/InstVisitor_8h-source.html">InstVisitor</a></tt> template.<p>


<!-- *********************************************************************** -->
</ul><table width="100%" bgcolor="#330077" border=0 cellpadding=4 cellspacing=0>
<tr><td align=center><font color="#EEEEFF" size=+2 face="Georgia,Palatino"><b>
<a name="general">General Information
</b></font></td></tr></table><ul>
<!-- *********************************************************************** -->

This section contains general information that is useful if you are working in
the LLVM source-base, but that isn't specific to any particular API.<p>


<!-- ======================================================================= -->
</ul><table width="100%" bgcolor="#441188" border=0 cellpadding=4 cellspacing=0>
<tr><td>&nbsp;</td><td width="100%">&nbsp; 
<font color="#EEEEFF" face="Georgia,Palatino"><b>
<a name="stl">The C++ Standard Template Library</a>
</b></font></td></tr></table><ul>

LLVM makes heavy use of the C++ Standard Template Library (STL), perhaps much
more than you are used to, or have seen before.  Because of this, you might want
to do a little background reading in the techniques used and capabilities of the
library.  There are many good pages that discuss the STL, and several books on
the subject that you can get, so it will not be discussed in this document.<p>

Here are some useful links:<p>
<ol>
<li><a href="http://www.dinkumware.com/refxcpp.html">Dinkumware C++
Library reference</a> - an excellent reference for the STL and other parts of
the standard C++ library.

<li><a href="http://www.tempest-sw.com/cpp/">C++ In a Nutshell</a> - This is an
O'Reilly book in the making.  It has a decent <a
href="http://www.tempest-sw.com/cpp/ch13-libref.html">Standard Library
Reference</a> that rivals Dinkumware's, and is actually free until the book is
published.

<li><a href="http://www.parashift.com/c++-faq-lite/">C++ Frequently Asked
Questions</a>

<li><a href="http://www.sgi.com/tech/stl/">SGI's STL Programmer's Guide</a> -
Contains a useful <a
href="http://www.sgi.com/tech/stl/stl_introduction.html">Introduction to the
STL</a>.

<li><a href="http://www.research.att.com/~bs/C++.html">Bjarne Stroustrup's C++
Page</a>

</ol><p>

You are also encouraged to take a look at the <a
href="CodingStandards.html">LLVM Coding Standards</a> guide which focuses on how
to write maintainable code more than where to put your curly braces.<p>


<!-- *********************************************************************** -->
</ul><table width="100%" bgcolor="#330077" border=0 cellpadding=4 cellspacing=0>
<tr><td align=center><font color="#EEEEFF" size=+2 face="Georgia,Palatino"><b>
<a name="apis">Important and useful LLVM APIs
</b></font></td></tr></table><ul>
<!-- *********************************************************************** -->

Here we highlight some LLVM APIs that are generally useful and good to know
about when writing transformations.<p>

<!-- ======================================================================= -->
</ul><table width="100%" bgcolor="#441188" border=0 cellpadding=4 cellspacing=0>
<tr><td>&nbsp;</td><td width="100%">&nbsp; 
<font color="#EEEEFF" face="Georgia,Palatino"><b>
<a name="isa">The isa&lt;&gt;, cast&lt;&gt; and dyn_cast&lt;&gt; templates</a>
</b></font></td></tr></table><ul>

The LLVM source-base makes extensive use of a custom form of RTTI.  These
templates have many similarities to the C++ <tt>dynamic_cast&lt;&gt;</tt>
operator, but they don't have some drawbacks (primarily stemming from the fact
that <tt>dynamic_cast&lt;&gt;</tt> only works on classes that have a v-table).
Because they are used so often, you must know what they do and how they work.
All of these templates are defined in the <a
href="/doxygen/Casting_8h-source.html"><tt>Support/Casting.h</tt></a> file (note
that you very rarely have to include this file directly).<p>

<dl>

<dt><tt>isa&lt;&gt;</tt>:

<dd>The <tt>isa&lt;&gt;</tt> operator works exactly like the Java
"<tt>instanceof</tt>" operator.  It returns true or false depending on whether a
reference or pointer points to an instance of the specified class.  This can be
very useful for constraint checking of various sorts (example below).<p>


<dt><tt>cast&lt;&gt;</tt>:

<dd>The <tt>cast&lt;&gt;</tt> operator is a "checked cast" operation.  It
converts a pointer or reference from a base class to a derived cast, causing an
assertion failure if it is not really an instance of the right type.  This
should be used in cases where you have some information that makes you believe
that something is of the right type.  An example of the <tt>isa&lt;&gt;</tt> and
<tt>cast&lt;&gt;</tt> template is:<p>

<pre>
static bool isLoopInvariant(const <a href="#Value">Value</a> *V, const Loop *L) {
  if (isa&lt;<a href="#Constant">Constant</a>&gt;(V) || isa&lt;<a href="#Argument">Argument</a>&gt;(V) || isa&lt;<a href="#GlobalValue">GlobalValue</a>&gt;(V))
    return true;

  <i>// Otherwise, it must be an instruction...</i>
  return !L->contains(cast&lt;<a href="#Instruction">Instruction</a>&gt;(V)->getParent());
</pre><p>

Note that you should <b>not</b> use an <tt>isa&lt;&gt;</tt> test followed by a
<tt>cast&lt;&gt;</tt>, for that use the <tt>dyn_cast&lt;&gt;</tt> operator.<p>


<dt><tt>dyn_cast&lt;&gt;</tt>:

<dd>The <tt>dyn_cast&lt;&gt;</tt> operator is a "checking cast" operation.  It
checks to see if the operand is of the specified type, and if so, returns a
pointer to it (this operator does not work with references).  If the operand is
not of the correct type, a null pointer is returned.  Thus, this works very much
like the <tt>dynamic_cast</tt> operator in C++, and should be used in the same
circumstances.  Typically, the <tt>dyn_cast&lt;&gt;</tt> operator is used in an
<tt>if</tt> statement or some other flow control statement like this:<p>

<pre>
  if (<a href="#AllocationInst">AllocationInst</a> *AI = dyn_cast&lt;<a href="#AllocationInst">AllocationInst</a>&gt;(Val)) {
    ...
  }
</pre><p>

This form of the <tt>if</tt> statement effectively combines together a call to
<tt>isa&lt;&gt;</tt> and a call to <tt>cast&lt;&gt;</tt> into one statement,
which is very convenient.<p>

Another common example is:<p>

<pre>
  <i>// Loop over all of the phi nodes in a basic block</i>
  BasicBlock::iterator BBI = BB->begin();
  for (; <a href="#PhiNode">PHINode</a> *PN = dyn_cast&lt;<a href="#PHINode">PHINode</a>&gt;(BBI); ++BBI)
    cerr &lt;&lt; *PN;
</pre><p>

Note that the <tt>dyn_cast&lt;&gt;</tt> operator, like C++'s
<tt>dynamic_cast</tt> or Java's <tt>instanceof</tt> operator, can be abused.  In
particular you should not use big chained <tt>if/then/else</tt> blocks to check
for lots of different variants of classes.  If you find yourself wanting to do
this, it is much cleaner and more efficient to use the InstVisitor class to
dispatch over the instruction type directly.<p>


<dt><tt>cast_or_null&lt;&gt;</tt>:

<dd>The <tt>cast_or_null&lt;&gt;</tt> operator works just like the
<tt>cast&lt;&gt;</tt> operator, except that it allows for a null pointer as an
argument (which it then propagates).  This can sometimes be useful, allowing you
to combine several null checks into one.<p>


<dt><tt>dyn_cast_or_null&lt;&gt;</tt>:

<dd>The <tt>dyn_cast_or_null&lt;&gt;</tt> operator works just like the
<tt>dyn_cast&lt;&gt;</tt> operator, except that it allows for a null pointer as
an argument (which it then propagates).  This can sometimes be useful, allowing
you to combine several null checks into one.<p>

</dl>

These five templates can be used with any classes, whether they have a v-table
or not.  To add support for these templates, you simply need to add
<tt>classof</tt> static methods to the class you are interested casting to.
Describing this is currently outside the scope of this document, but there are
lots of examples in the LLVM source base.<p>


<!-- ======================================================================= -->
</ul><table width="100%" bgcolor="#441188" border=0 cellpadding=4 cellspacing=0>
<tr><td>&nbsp;</td><td width="100%">&nbsp; 
<font color="#EEEEFF" face="Georgia,Palatino"><b>
<a name="DEBUG">The <tt>DEBUG()</tt> macro &amp; <tt>-debug</tt> option</a>
</b></font></td></tr></table><ul>

Often when working on your pass you will put a bunch of debugging printouts and
other code into your pass.  After you get it working, you want to remove
it... but you may need it again in the future (to work out new bugs that you run
across).<p>

Naturally, because of this, you don't want to delete the debug printouts, but
you don't want them to always be noisy.  A standard compromise is to comment
them out, allowing you to enable them if you need them in the future.<p>

The "<tt><a
href="/doxygen/Statistic_8h-source.html">Support/Statistic.h</a></tt>"
file provides a macro named <tt>DEBUG()</tt> that is a much nicer solution to
this problem.  Basically, you can put arbitrary code into the argument of the
<tt>DEBUG</tt> macro, and it is only executed if '<tt>opt</tt>' is run with the
'<tt>-debug</tt>' command line argument:

<pre>
     ... 
     DEBUG(std::cerr &lt;&lt; "I am here!\n");
     ...
</pre><p>

Then you can run your pass like this:<p>

<pre>
  $ opt &lt; a.bc &gt; /dev/null -mypass
    &lt;no output&gt;
  $ opt &lt; a.bc &gt; /dev/null -mypass -debug
    I am here!
  $
</pre><p>

Using the <tt>DEBUG()</tt> macro instead of a home brewed solution allows you to
now have to create "yet another" command line option for the debug output for
your pass.  Note that <tt>DEBUG()</tt> macros are disabled for optimized builds,
so they do not cause a performance impact at all (for the same reason, they
should also not contain side-effects!).<p>

One additional nice thing about the <tt>DEBUG()</tt> macro is that you can
enable or disable it directly in gdb.  Just use "<tt>set DebugFlag=0</tt>" or
"<tt>set DebugFlag=1</tt>" from the gdb if the program is running.  If the
program hasn't been started yet, you can always just run it with
<tt>-debug</tt>.<p>


<!-- ======================================================================= -->
</ul><table width="100%" bgcolor="#441188" border=0 cellpadding=4 cellspacing=0>
<tr><td>&nbsp;</td><td width="100%">&nbsp; 
<font color="#EEEEFF" face="Georgia,Palatino"><b>
<a name="Statistic">The <tt>Statistic</tt> template &amp; <tt>-stats</tt>
option</a>
</b></font></td></tr></table><ul>

The "<tt><a
href="/doxygen/Statistic_8h-source.html">Support/Statistic.h</a></tt>"
file provides a template named <tt>Statistic</tt> that is used as a unified way
to keeping track of what the LLVM compiler is doing and how effective various
optimizations are.  It is useful to see what optimizations are contributing to
making a particular program run faster.<p>

Often you may run your pass on some big program, and you're interested to see
how many times it makes a certain transformation.  Although you can do this with
hand inspection, or some ad-hoc method, this is a real pain and not very useful
for big programs.  Using the <tt>Statistic</tt> template makes it very easy to
keep track of this information, and the calculated information is presented in a
uniform manner with the rest of the passes being executed.<p>

There are many examples of <tt>Statistic</tt> users, but this basics of using it
are as follows:<p>

<ol>
<li>Define your statistic like this:<p>

<pre>
static Statistic&lt;&gt; NumXForms("mypassname", "The # of times I did stuff");
</pre><p>

The <tt>Statistic</tt> template can emulate just about any data-type, but if you
do not specify a template argument, it defaults to acting like an unsigned int
counter (this is usually what you want).<p>

<li>Whenever you make a transformation, bump the counter:<p>

<pre>
   ++NumXForms;   // I did stuff
</pre><p>

</ol><p>

That's all you have to do.  To get '<tt>opt</tt>' to print out the statistics
gathered, use the '<tt>-stats</tt>' option:<p>

<pre>
   $ opt -stats -mypassname &lt; program.bc &gt; /dev/null
    ... statistic output ...
</pre><p>

When running <tt>gccas</tt> on a C file from the SPEC benchmark suite, it gives
a report that looks like this:<p>

<pre>
   7646 bytecodewriter  - Number of normal instructions
    725 bytecodewriter  - Number of oversized instructions
 129996 bytecodewriter  - Number of bytecode bytes written
   2817 raise           - Number of insts DCEd or constprop'd
   3213 raise           - Number of cast-of-self removed
   5046 raise           - Number of expression trees converted
     75 raise           - Number of other getelementptr's formed
    138 raise           - Number of load/store peepholes
     42 deadtypeelim    - Number of unused typenames removed from symtab
    392 funcresolve     - Number of varargs functions resolved
     27 globaldce       - Number of global variables removed
      2 adce            - Number of basic blocks removed
    134 cee             - Number of branches revectored
     49 cee             - Number of setcc instruction eliminated
    532 gcse            - Number of loads removed
   2919 gcse            - Number of instructions removed
     86 indvars         - Number of cannonical indvars added
     87 indvars         - Number of aux indvars removed
     25 instcombine     - Number of dead inst eliminate
    434 instcombine     - Number of insts combined
    248 licm            - Number of load insts hoisted
   1298 licm            - Number of insts hoisted to a loop pre-header
      3 licm            - Number of insts hoisted to multiple loop preds (bad, no loop pre-header)
     75 mem2reg         - Number of alloca's promoted
   1444 cfgsimplify     - Number of blocks simplified
</pre><p>

Obviously, with so many optimizations, having a unified framework for this stuff
is very nice.  Making your pass fit well into the framework makes it more
maintainable and useful.<p>


<!-- *********************************************************************** -->
</ul><table width="100%" bgcolor="#330077" border=0 cellpadding=4 cellspacing=0>
<tr><td align=center><font color="#EEEEFF" size=+2 face="Georgia,Palatino"><b>
<a name="common">Helpful Hints for Common Operations
</b></font></td></tr></table><ul> <!--
*********************************************************************** -->

This section describes how to perform some very simple transformations of LLVM
code.  This is meant to give examples of common idioms used, showing the
practical side of LLVM transformations.<p>

Because this is a "how-to" section, you should also read about the main classes
that you will be working with.  The <a href="#coreclasses">Core LLVM Class
Hierarchy Reference</a> contains details and descriptions of the main classes
that you should know about.<p>

<!-- NOTE: this section should be heavy on example code -->


<!-- ======================================================================= -->
</ul><table width="100%" bgcolor="#441188" border=0 cellpadding=4 cellspacing=0>
<tr><td>&nbsp;</td><td width="100%">&nbsp; 
<font color="#EEEEFF" face="Georgia,Palatino"><b>
<a name="inspection">Basic Inspection and Traversal Routines</a>
</b></font></td></tr></table><ul>

The LLVM compiler infrastructure have many different data structures that may be
traversed.  Following the example of the C++ standard template library, the
techniques used to traverse these various data structures are all basically the
same.  For a enumerable sequence of values, the <tt>XXXbegin()</tt> function (or
method) returns an iterator to the start of the sequence, the <tt>XXXend()</tt>
function returns an iterator pointing to one past the last valid element of the
sequence, and there is some <tt>XXXiterator</tt> data type that is common
between the two operations.<p>

Because the pattern for iteration is common across many different aspects of the
program representation, the standard template library algorithms may be used on
them, and it is easier to remember how to iterate.  First we show a few common
examples of the data structures that need to be traversed.  Other data
structures are traversed in very similar ways.<p>


<!-- _______________________________________________________________________ -->
</ul><h4><a name="iterate_function"><hr size=0>Iterating over the <a
href="#BasicBlock"><tt>BasicBlock</tt></a>s in a <a
href="#Function"><tt>Function</tt></a> </h4><ul>

It's quite common to have a <tt>Function</tt> instance that you'd like
to transform in some way; in particular, you'd like to manipulate its
<tt>BasicBlock</tt>s.  To facilitate this, you'll need to iterate over
all of the <tt>BasicBlock</tt>s that constitute the <tt>Function</tt>.
The following is an example that prints the name of a
<tt>BasicBlock</tt> and the number of <tt>Instruction</tt>s it
contains:

<pre>
  // func is a pointer to a Function instance
  for(Function::iterator i = func->begin(), e = func->end(); i != e; ++i) {

      // print out the name of the basic block if it has one, and then the
      // number of instructions that it contains

      cerr &lt;&lt "Basic block (name=" &lt;&lt i-&gt;getName() &lt;&lt; ") has " 
           &lt;&lt i-&gt;size() &lt;&lt " instructions.\n";
  }
</pre>

Note that i can be used as if it were a pointer for the purposes of
invoking member functions of the <tt>Instruction</tt> class.  This is
because the indirection operator is overloaded for the iterator
classes.  In the above code, the expression <tt>i->size()</tt> is
exactly equivalent to <tt>(*i).size()</tt> just like you'd expect.

<!-- _______________________________________________________________________ -->
</ul><h4><a name="iterate_basicblock"><hr size=0>Iterating over the <a
href="#Instruction"><tt>Instruction</tt></a>s in a <a
href="#BasicBlock"><tt>BasicBlock</tt></a> </h4><ul>

Just like when dealing with <tt>BasicBlock</tt>s in
<tt>Function</tt>s, it's easy to iterate over the individual
instructions that make up <tt>BasicBlock</tt>s.  Here's a code snippet
that prints out each instruction in a <tt>BasicBlock</tt>:

<pre>
  // blk is a pointer to a BasicBlock instance
  for(BasicBlock::iterator i = blk-&gt;begin(), e = blk-&gt;end(); i != e; ++i)
     // the next statement works since operator&lt;&lt;(ostream&amp;,...) 
     // is overloaded for Instruction&amp;
     cerr &lt;&lt; *i &lt;&lt; "\n";
</pre>

However, this isn't really the best way to print out the contents of a
<tt>BasicBlock</tt>!  Since the ostream operators are overloaded for
virtually anything you'll care about, you could have just invoked the
print routine on the basic block itself: <tt>cerr &lt;&lt; *blk &lt;&lt;
"\n";</tt>.<p>

Note that currently operator&lt;&lt; is implemented for <tt>Value*</tt>, so it 
will print out the contents of the pointer, instead of 
the pointer value you might expect.  This is a deprecated interface that will
be removed in the future, so it's best not to depend on it.  To print out the
pointer value for now, you must cast to <tt>void*</tt>.<p>


<!-- _______________________________________________________________________ -->
</ul><h4><a name="iterate_institer"><hr size=0>Iterating over the <a
href="#Instruction"><tt>Instruction</tt></a>s in a <a
href="#Function"><tt>Function</tt></a></h4><ul>

If you're finding that you commonly iterate over a <tt>Function</tt>'s
<tt>BasicBlock</tt>s and then that <tt>BasicBlock</tt>'s
<tt>Instruction</tt>s, <tt>InstIterator</tt> should be used instead.
You'll need to include <a href="/doxygen/InstIterator_8h-source.html"><tt>llvm/Support/InstIterator.h</tt></a>, and then
instantiate <tt>InstIterator</tt>s explicitly in your code.  Here's a
small example that shows how to dump all instructions in a function to
stderr (<b>Note:</b> Dereferencing an <tt>InstIterator</tt> yields an
<tt>Instruction*</tt>, <i>not</i> an <tt>Instruction&amp</tt>!):

<pre>
#include "<a href="/doxygen/InstIterator_8h-source.html">llvm/Support/InstIterator.h</a>"
...
// Suppose F is a ptr to a function
for(inst_iterator i = inst_begin(F), e = inst_end(F); i != e; ++i)
  cerr &lt;&lt **i &lt;&lt "\n";
</pre>

Easy, isn't it?  You can also use <tt>InstIterator</tt>s to fill a
worklist with its initial contents.  For example, if you wanted to
initialize a worklist to contain all instructions in a
<tt>Function</tt> F, all you would need to do is something like:

<pre>
std::set&lt;Instruction*&gt worklist;
worklist.insert(inst_begin(F), inst_end(F));
</pre>

The STL set <tt>worklist</tt> would now contain all instructions in
the <tt>Function</tt> pointed to by F.

<!-- _______________________________________________________________________ -->
</ul><h4><a name="iterate_convert"><hr size=0>Turning an iterator into a class
pointer (and vice-versa) </h4><ul>

Sometimes, it'll be useful to grab a reference (or pointer) to a class
instance when all you've got at hand is an iterator.  Well, extracting
a reference or a pointer from an iterator is very straightforward.
Assuming that <tt>i</tt> is a <tt>BasicBlock::iterator</tt> and
<tt>j</tt> is a <tt>BasicBlock::const_iterator</tt>:

<pre>
    Instruction&amp; inst = *i;   // grab reference to instruction reference
    Instruction* pinst = &amp;*i; // grab pointer to instruction reference
    const Instruction&amp; inst = *j;
</pre>
However, the iterators you'll be working with in the LLVM framework
are special: they will automatically convert to a ptr-to-instance type
whenever they need to.  Instead of dereferencing the iterator and then
taking the address of the result, you can simply assign the iterator
to the proper pointer type and you get the dereference and address-of
operation as a result of the assignment (behind the scenes, this is a
result of overloading casting mechanisms).  Thus the last line of the
last example,

<pre>Instruction* pinst = &amp;*i;</pre>

is semantically equivalent to

<pre>Instruction* pinst = i;</pre>

It's also possible to turn a class pointer into the corresponding
iterator.  Usually, this conversion is quite inexpensive.  The
following code snippet illustrates use of the conversion constructors
provided by LLVM iterators.  By using these, you can explicitly grab
the iterator of something without actually obtaining it via iteration
over some structure:

<pre>
void printNextInstruction(Instruction* inst) {
    BasicBlock::iterator it(inst);
    ++it; // after this line, it refers to the instruction after *inst.
    if(it != inst-&gt;getParent()->end()) cerr &lt;&lt; *it &lt;&lt; "\n";
}
</pre>
Of course, this example is strictly pedagogical, because it'd be much
better to explicitly grab the next instruction directly from inst.


<!--_______________________________________________________________________-->
</ul><h4><a name="iterate_complex"><hr size=0>Finding call sites: a slightly
more complex example </h4><ul>

Say that you're writing a FunctionPass and would like to count all the
locations in the entire module (that is, across every
<tt>Function</tt>) where a certain function (i.e., some
<tt>Function</tt>*) is already in scope.  As you'll learn later, you may
want to use an <tt>InstVisitor</tt> to accomplish this in a much more
straightforward manner, but this example will allow us to explore how
you'd do it if you didn't have <tt>InstVisitor</tt> around.  In
pseudocode, this is what we want to do:

<pre>
initialize callCounter to zero
for each Function f in the Module
    for each BasicBlock b in f
      for each Instruction i in b
        if(i is a CallInst and calls the given function)
          increment callCounter
</pre>

And the actual code is (remember, since we're writing a
<tt>FunctionPass</tt>, our <tt>FunctionPass</tt>-derived class simply
has to override the <tt>runOnFunction</tt> method...):

<pre>
Function* targetFunc = ...;

class OurFunctionPass : public FunctionPass {
  public:
    OurFunctionPass(): callCounter(0) { }

    virtual runOnFunction(Function&amp; F) {
 	for(Function::iterator b = F.begin(), be = F.end(); b != be; ++b) {
 	    for(BasicBlock::iterator i = b-&gt;begin(); ie = b-&gt;end(); i != ie; ++i) {
 		if (<a href="#CallInst">CallInst</a>* callInst = <a href="#isa">dyn_cast</a>&lt;<a href="#CallInst">CallInst</a>&gt;(&amp;*i)) {
 		    // we know we've encountered a call instruction, so we
 		    // need to determine if it's a call to the
	            // function pointed to by m_func or not.
  
 		    if(callInst-&gt;getCalledFunction() == targetFunc)
 			++callCounter;
 	    }
 	}
    }
    
  private:
    unsigned  callCounter;
};
</pre>

<!--_______________________________________________________________________-->
</ul><h4><a name="iterate_chains"><hr size=0>Iterating over def-use &amp;
use-def chains</h4><ul>

Frequently, we might have an instance of the <a
href="/doxygen/classValue.html">Value Class</a> and we want to
determine which <tt>User</tt>s use the <tt>Value</tt>.  The list of
all <tt>User</tt>s of a particular <tt>Value</tt> is called a
<i>def-use</i> chain.  For example, let's say we have a
<tt>Function*</tt> named <tt>F</tt> to a particular function
<tt>foo</tt>. Finding all of the instructions that <i>use</i>
<tt>foo</tt> is as simple as iterating over the <i>def-use</i> chain of
<tt>F</tt>:

<pre>
Function* F = ...;

for(Value::use_iterator i = F-&gt;use_begin(), e = F-&gt;use_end(); i != e; ++i) {
    if(Instruction* Inst = dyn_cast&lt;Instruction&gt;(*i)) {
        cerr &lt;&lt; "F is used in instruction:\n";
        cerr &lt;&lt; *Inst &lt;&lt; "\n";
    }
}
</pre>

Alternately, it's common to have an instance of the <a
href="/doxygen/classUser.html">User Class</a> and need to know what
<tt>Value</tt>s are used by it.  The list of all <tt>Value</tt>s used
by a <tt>User</tt> is known as a <i>use-def</i> chain.  Instances of
class <tt>Instruction</tt> are common <tt>User</tt>s, so we might want
to iterate over all of the values that a particular instruction uses
(that is, the operands of the particular <tt>Instruction</tt>):

<pre>
Instruction* pi = ...;

for(User::op_iterator i = pi-&gt;op_begin(), e = pi-&gt;op_end(); i != e; ++i) {
    Value* v = *i;
    ...
}
</pre>
    

<!--
  def-use chains ("finding all users of"): Value::use_begin/use_end
  use-def chains ("finding all values used"): User::op_begin/op_end [op=operand]
-->

<!-- ======================================================================= -->
</ul><table width="100%" bgcolor="#441188" border=0 cellpadding=4 cellspacing=0>
<tr><td>&nbsp;</td><td width="100%">&nbsp; 
<font color="#EEEEFF" face="Georgia,Palatino"><b>
<a name="simplechanges">Making simple changes</a>
</b></font></td></tr></table><ul>

There are some primitive transformation operations present in the LLVM
infrastructure that are worth knowing about.  When performing
transformations, it's fairly common to manipulate the contents of
basic blocks.  This section describes some of the common methods for
doing so and gives example code.

<!--_______________________________________________________________________-->
</ul><h4><a name="schanges_creating"><hr size=0>Creating and inserting
    new <tt>Instruction</tt>s</h4><ul> 

<i>Instantiating Instructions</i>

<p>Creation of <tt>Instruction</tt>s is straightforward: simply call the
constructor for the kind of instruction to instantiate and provide the
necessary parameters.  For example, an <tt>AllocaInst</tt> only
<i>requires</i> a (const-ptr-to) <tt>Type</tt>.  Thus:

<pre>AllocaInst* ai = new AllocaInst(Type::IntTy);</pre> 

will create an <tt>AllocaInst</tt> instance that represents the
allocation of one integer in the current stack frame, at runtime.
Each <tt>Instruction</tt> subclass is likely to have varying default
parameters which change the semantics of the instruction, so refer to
the <a href="/doxygen/classInstruction.html">doxygen documentation for
the subclass of Instruction</a> that you're interested in
instantiating.</p>

<p><i>Naming values</i></p>

<p>
It is very useful to name the values of instructions when you're able
to, as this facilitates the debugging of your transformations.  If you
end up looking at generated LLVM machine code, you definitely want to
have logical names associated with the results of instructions!  By
supplying a value for the <tt>Name</tt> (default) parameter of the
<tt>Instruction</tt> constructor, you associate a logical name with
the result of the instruction's execution at runtime.  For example,
say that I'm writing a transformation that dynamically allocates space
for an integer on the stack, and that integer is going to be used as
some kind of index by some other code.  To accomplish this, I place an
<tt>AllocaInst</tt> at the first point in the first
<tt>BasicBlock</tt> of some <tt>Function</tt>, and I'm intending to
use it within the same <tt>Function</tt>.  I might do:

<pre>AllocaInst* pa = new AllocaInst(Type::IntTy, 0, "indexLoc");</pre>

where <tt>indexLoc</tt> is now the logical name of the instruction's
execution value, which is a pointer to an integer on the runtime
stack.
</p>

<p><i>Inserting instructions</i></p>

<p>
There are essentially two ways to insert an <tt>Instruction</tt> into
an existing sequence of instructions that form a <tt>BasicBlock</tt>:
<ul>
<li>Insertion into an explicit instruction list

<p>Given a <tt>BasicBlock* pb</tt>, an <tt>Instruction* pi</tt> within
that <tt>BasicBlock</tt>, and a newly-created instruction
we wish to insert before <tt>*pi</tt>, we do the following:

<pre>
BasicBlock* pb = ...;
Instruction* pi = ...;
Instruction* newInst = new Instruction(...);
pb->getInstList().insert(pi, newInst); // inserts newInst before pi in pb
</pre>
</p>

<li>Insertion into an implicit instruction list
<p><tt>Instruction</tt> instances that are already in
<tt>BasicBlock</tt>s are implicitly associated with an existing
instruction list: the instruction list of the enclosing basic block.
Thus, we could have accomplished the same thing as the above code
without being given a <tt>BasicBlock</tt> by doing:
<pre>
Instruction* pi = ...;
Instruction* newInst = new Instruction(...);
pi->getParent()->getInstList().insert(pi, newInst);
</pre>
In fact, this sequence of steps occurs so frequently that the
<tt>Instruction</tt> class and <tt>Instruction</tt>-derived classes
provide constructors which take (as a default parameter) a pointer to
an <tt>Instruction</tt> which the newly-created <tt>Instruction</tt>
should precede.  That is, <tt>Instruction</tt> constructors are
capable of inserting the newly-created instance into the
<tt>BasicBlock</tt> of a provided instruction, immediately before that
instruction.  Using an <tt>Instruction</tt> constructor with a
<tt>insertBefore</tt> (default) parameter, the above code becomes:
<pre>
Instruction* pi = ...;
Instruction* newInst = new Instruction(..., pi);
</pre>
which is much cleaner, especially if you're creating a lot of
instructions and adding them to <tt>BasicBlock</tt>s.
 </p>
</p>
</ul>

<!--_______________________________________________________________________-->
</ul><h4><a name="schanges_deleting"><hr size=0>Deleting
<tt>Instruction</tt>s</h4><ul>

Deleting an instruction from an existing sequence of instructions that form a <a
href="#BasicBlock"><tt>BasicBlock</tt></a> is very straightforward. First, you
must have a pointer to the instruction that you wish to delete.  Second, you
need to obtain the pointer to that instruction's basic block. You use the
pointer to the basic block to get its list of instructions and then use the
erase function to remove your instruction.<p>

For example:<p>

<pre>
  <a href="#Instruction">Instruction</a> *I = .. ;
  <a href="#BasicBlock">BasicBlock</a> *BB = I-&gt;getParent();
  BB-&gt;getInstList().erase(I);
</pre><p>

<!--_______________________________________________________________________-->
</ul><h4><a name="schanges_replacing"><hr size=0>Replacing an
    <tt>Instruction</tt> with another <tt>Value</tt></h4><ul>

<p><i>Replacing individual instructions</i></p>
<p>
Including "<a
href="/doxygen/BasicBlockUtils_8h-source.html">llvm/Transforms/Utils/BasicBlockUtils.h</a>" permits use of two very useful replace functions:
<tt>ReplaceInstWithValue</tt> and <tt>ReplaceInstWithInst</tt>.  

<ul>

<li><tt>ReplaceInstWithValue</tt>

<p>This function replaces all uses (within a basic block) of a given
instruction with a value, and then removes the original instruction.
The following example illustrates the replacement of the result of a
particular <tt>AllocaInst</tt> that allocates memory for a single
integer with an null pointer to an integer.</p>

<pre>
AllocaInst* instToReplace = ...;
BasicBlock::iterator ii(instToReplace);
ReplaceInstWithValue(instToReplace-&gt;getParent()-&gt;getInstList(), ii,
                     Constant::getNullValue(PointerType::get(Type::IntTy)));
</pre>

<li><tt>ReplaceInstWithInst</tt>

<p>This function replaces a particular instruction with another
instruction.  The following example illustrates the replacement of one
<tt>AllocaInst</tt> with another.<p>

<pre>
AllocaInst* instToReplace = ...;
BasicBlock::iterator ii(instToReplace);
ReplaceInstWithInst(instToReplace-&gt;getParent()-&gt;getInstList(), ii,
                    new AllocaInst(Type::IntTy, 0, "ptrToReplacedInt"));
</pre>

</ul>
<p><i>Replacing multiple uses of <tt>User</tt>s and
		    <tt>Value</tt>s</i></p>
  
You can use <tt>Value::replaceAllUsesWith</tt> and
<tt>User::replaceUsesOfWith</tt> to change more than one use at a
time.  See the doxygen documentation for the <a
href="/doxygen/classValue.html">Value Class</a> and <a
href="/doxygen/classUser.html">User Class</a>, respectively, for more
information.

<!-- Value::replaceAllUsesWith User::replaceUsesOfWith Point out:
include/llvm/Transforms/Utils/ especially BasicBlockUtils.h with:
ReplaceInstWithValue, ReplaceInstWithInst
-->

<!-- *********************************************************************** -->
</ul><table width="100%" bgcolor="#330077" border=0 cellpadding=4 cellspacing=0>
<tr><td align=center><font color="#EEEEFF" size=+2 face="Georgia,Palatino"><b>
<a name="coreclasses">The Core LLVM Class Hierarchy Reference
</b></font></td></tr></table><ul>
<!-- *********************************************************************** -->

The Core LLVM classes are the primary means of representing the program being
inspected or transformed.  The core LLVM classes are defined in header files in
the <tt>include/llvm/</tt> directory, and implemented in the <tt>lib/VMCore</tt>
directory.<p>


<!-- ======================================================================= -->
</ul><table width="100%" bgcolor="#441188" border=0 cellpadding=4 cellspacing=0>
<tr><td>&nbsp;</td><td width="100%">&nbsp; 
<font color="#EEEEFF" face="Georgia,Palatino"><b>
<a name="Value">The <tt>Value</tt> class</a>
</b></font></td></tr></table><ul>

<tt>#include "<a href="/doxygen/Value_8h-source.html">llvm/Value.h</a>"</tt></b><br>
doxygen info: <a href="/doxygen/classValue.html">Value Class</a><p>


The <tt>Value</tt> class is the most important class in LLVM Source base.  It
represents a typed value that may be used (among other things) as an operand to
an instruction.  There are many different types of <tt>Value</tt>s, such as <a
href="#Constant"><tt>Constant</tt></a>s, <a
href="#Argument"><tt>Argument</tt></a>s, and even <a
href="#Instruction"><tt>Instruction</tt></a>s and <a
href="#Function"><tt>Function</tt></a>s are <tt>Value</tt>s.<p>

A particular <tt>Value</tt> may be used many times in the LLVM representation
for a program.  For example, an incoming argument to a function (represented
with an instance of the <a href="#Argument">Argument</a> class) is "used" by
every instruction in the function that references the argument.  To keep track
of this relationship, the <tt>Value</tt> class keeps a list of all of the <a
href="#User"><tt>User</tt></a>s that is using it (the <a
href="#User"><tt>User</tt></a> class is a base class for all nodes in the LLVM
graph that can refer to <tt>Value</tt>s).  This use list is how LLVM represents
def-use information in the program, and is accessible through the <tt>use_</tt>*
methods, shown below.<p>

Because LLVM is a typed representation, every LLVM <tt>Value</tt> is typed, and
this <a href="#Type">Type</a> is available through the <tt>getType()</tt>
method.  <a name="#nameWarning">In addition, all LLVM values can be named.  The
"name" of the <tt>Value</tt> is symbolic string printed in the LLVM code:<p>

<pre>
   %<b>foo</b> = add int 1, 2
</pre>

The name of this instruction is "foo".  <b>NOTE</b> that the name of any value
may be missing (an empty string), so names should <b>ONLY</b> be used for
debugging (making the source code easier to read, debugging printouts), they
should not be used to keep track of values or map between them.  For this
purpose, use a <tt>std::map</tt> of pointers to the <tt>Value</tt> itself
instead.<p>

One important aspect of LLVM is that there is no distinction between an SSA
variable and the operation that produces it.  Because of this, any reference to
the value produced by an instruction (or the value available as an incoming
argument, for example) is represented as a direct pointer to the class that
represents this value.  Although this may take some getting used to, it
simplifies the representation and makes it easier to manipulate.<p>


<!-- _______________________________________________________________________ -->
</ul><h4><a name="m_Value"><hr size=0>Important Public Members of
the <tt>Value</tt> class</h4><ul>

<li><tt>Value::use_iterator</tt> - Typedef for iterator over the use-list<br>
    <tt>Value::use_const_iterator</tt>
                 - Typedef for const_iterator over the use-list<br>
    <tt>unsigned use_size()</tt> - Returns the number of users of the value.<br>
    <tt>bool use_empty()</tt> - Returns true if there are no users.<br>
    <tt>use_iterator use_begin()</tt>
                 - Get an iterator to the start of the use-list.<br>
    <tt>use_iterator use_end()</tt>
                 - Get an iterator to the end of the use-list.<br>
    <tt><a href="#User">User</a> *use_back()</tt>
                 - Returns the last element in the list.<p>

These methods are the interface to access the def-use information in LLVM.  As with all other iterators in LLVM, the naming conventions follow the conventions defined by the <a href="#stl">STL</a>.<p>

<li><tt><a href="#Type">Type</a> *getType() const</tt><p>
This method returns the Type of the Value.

<li><tt>bool hasName() const</tt><br>
    <tt>std::string getName() const</tt><br>
    <tt>void setName(const std::string &amp;Name)</tt><p>

This family of methods is used to access and assign a name to a <tt>Value</tt>,
be aware of the <a href="#nameWarning">precaution above</a>.<p>


<li><tt>void replaceAllUsesWith(Value *V)</tt><p>

This method traverses the use list of a <tt>Value</tt> changing all <a
href="#User"><tt>User</tt>s</a> of the current value to refer to "<tt>V</tt>"
instead.  For example, if you detect that an instruction always produces a
constant value (for example through constant folding), you can replace all uses
of the instruction with the constant like this:<p>

<pre>
  Inst-&gt;replaceAllUsesWith(ConstVal);
</pre><p>



<!-- ======================================================================= -->
</ul><table width="100%" bgcolor="#441188" border=0 cellpadding=4 cellspacing=0>
<tr><td>&nbsp;</td><td width="100%">&nbsp; 
<font color="#EEEEFF" face="Georgia,Palatino"><b>
<a name="User">The <tt>User</tt> class</a>
</b></font></td></tr></table><ul>

<tt>#include "<a href="/doxygen/User_8h-source.html">llvm/User.h</a>"</tt></b><br>
doxygen info: <a href="/doxygen/classUser.html">User Class</a><br>
Superclass: <a href="#Value"><tt>Value</tt></a><p>


The <tt>User</tt> class is the common base class of all LLVM nodes that may
refer to <a href="#Value"><tt>Value</tt></a>s.  It exposes a list of "Operands"
that are all of the <a href="#Value"><tt>Value</tt></a>s that the User is
referring to.  The <tt>User</tt> class itself is a subclass of
<tt>Value</tt>.<p>

The operands of a <tt>User</tt> point directly to the LLVM <a
href="#Value"><tt>Value</tt></a> that it refers to.  Because LLVM uses Static
Single Assignment (SSA) form, there can only be one definition referred to,
allowing this direct connection.  This connection provides the use-def
information in LLVM.<p>

<!-- _______________________________________________________________________ -->
</ul><h4><a name="m_User"><hr size=0>Important Public Members of
the <tt>User</tt> class</h4><ul>

The <tt>User</tt> class exposes the operand list in two ways: through an index
access interface and through an iterator based interface.<p>

<li><tt>Value *getOperand(unsigned i)</tt><br>
    <tt>unsigned getNumOperands()</tt><p>

These two methods expose the operands of the <tt>User</tt> in a convenient form
for direct access.<p>

<li><tt>User::op_iterator</tt> - Typedef for iterator over the operand list<br>
    <tt>User::op_const_iterator</tt>
    <tt>use_iterator op_begin()</tt>
                 - Get an iterator to the start of the operand list.<br>
    <tt>use_iterator op_end()</tt>
                 - Get an iterator to the end of the operand list.<p>

Together, these methods make up the iterator based interface to the operands of
a <tt>User</tt>.<p>



<!-- ======================================================================= -->
</ul><table width="100%" bgcolor="#441188" border=0 cellpadding=4 cellspacing=0>
<tr><td>&nbsp;</td><td width="100%">&nbsp; 
<font color="#EEEEFF" face="Georgia,Palatino"><b>
<a name="Instruction">The <tt>Instruction</tt> class</a>
</b></font></td></tr></table><ul>

<tt>#include "<a
href="/doxygen/Instruction_8h-source.html">llvm/Instruction.h</a>"</tt></b><br>
doxygen info: <a href="/doxygen/classInstruction.html">Instruction Class</a><br>
Superclasses: <a href="#User"><tt>User</tt></a>, <a
href="#Value"><tt>Value</tt></a><p>

The <tt>Instruction</tt> class is the common base class for all LLVM
instructions.  It provides only a few methods, but is a very commonly used
class.  The primary data tracked by the <tt>Instruction</tt> class itself is the
opcode (instruction type) and the parent <a
href="#BasicBlock"><tt>BasicBlock</tt></a> the <tt>Instruction</tt> is embedded
into.  To represent a specific type of instruction, one of many subclasses of
<tt>Instruction</tt> are used.<p>

Because the <tt>Instruction</tt> class subclasses the <a
href="#User"><tt>User</tt></a> class, its operands can be accessed in the same
way as for other <a href="#User"><tt>User</tt></a>s (with the
<tt>getOperand()</tt>/<tt>getNumOperands()</tt> and
<tt>op_begin()</tt>/<tt>op_end()</tt> methods).<p>

An important file for the <tt>Instruction</tt> class is the
<tt>llvm/Instruction.def</tt> file.  This file contains some meta-data about the
various different types of instructions in LLVM.  It describes the enum values
that are used as opcodes (for example <tt>Instruction::Add</tt> and
<tt>Instruction::SetLE</tt>), as well as the concrete sub-classes of
<tt>Instruction</tt> that implement the instruction (for example <tt><a
href="#BinaryOperator">BinaryOperator</a></tt> and <tt><a
href="#SetCondInst">SetCondInst</a></tt>).  Unfortunately, the use of macros in
this file confused doxygen, so these enum values don't show up correctly in the
<a href="/doxygen/classInstruction.html">doxygen output</a>.<p>


<!-- _______________________________________________________________________ -->
</ul><h4><a name="m_Instruction"><hr size=0>Important Public Members of
the <tt>Instruction</tt> class</h4><ul>

<li><tt><a href="#BasicBlock">BasicBlock</a> *getParent()</tt><p>

Returns the <a href="#BasicBlock"><tt>BasicBlock</tt></a> that this
<tt>Instruction</tt> is embedded into.<p>

<li><tt>bool mayWriteToMemory()</tt><p>

Returns true if the instruction writes to memory, i.e. it is a <tt>call</tt>,
<tt>free</tt>, <tt>invoke</tt>, or <tt>store</tt>.<p>

<li><tt>unsigned getOpcode()</tt><p>

Returns the opcode for the <tt>Instruction</tt>.<p>

<li><tt><a href="#Instruction">Instruction</a> *clone() const</tt><p>

Returns another instance of the specified instruction, identical in all ways to
the original except that the instruction has no parent (ie it's not embedded
into a <a href="#BasicBlock"><tt>BasicBlock</tt></a>), and it has no name.<p>



<!--

\subsection{Subclasses of Instruction :} 
\begin{itemize}
<li>BinaryOperator : This subclass of Instruction defines a general interface to the all the instructions involvong  binary operators in LLVM.
	\begin{itemize}
	<li><tt>bool swapOperands()</tt>: Exchange the two operands to this instruction. If the instruction cannot be reversed (i.e. if it's a Div), it returns true. 
	\end{itemize}
<li>TerminatorInst : This subclass of Instructions defines an interface for all instructions that can terminate a BasicBlock.
	\begin{itemize}
	 <li> <tt>unsigned getNumSuccessors()</tt>: Returns the number of successors for this terminator instruction.
	<li><tt>BasicBlock *getSuccessor(unsigned i)</tt>: As the name suggests returns the ith successor BasicBlock.
	<li><tt>void setSuccessor(unsigned i, BasicBlock *B)</tt>: sets BasicBlock B as the ith succesor to this terminator instruction.
	\end{itemize}

<li>PHINode : This represents the PHI instructions in the SSA form. 
	\begin{itemize}
	<li><tt> unsigned getNumIncomingValues()</tt>: Returns the number of incoming edges to this PHI node.
	<li><tt> Value *getIncomingValue(unsigned i)</tt>: Returns the ith incoming Value.
	<li><tt>void setIncomingValue(unsigned i, Value *V)</tt>: Sets the ith incoming Value as V 
	<li><tt>BasicBlock *getIncomingBlock(unsigned i)</tt>: Returns the Basic Block corresponding to the ith incoming Value.
	<li><tt> void addIncoming(Value *D, BasicBlock *BB)</tt>: 
	Add an incoming value to the end of the PHI list
	<li><tt> int getBasicBlockIndex(const BasicBlock *BB) const</tt>: 
	Returns the first index of the specified basic block in the value list for this PHI.  Returns -1 if no instance.
	\end{itemize}
<li>CastInst : In LLVM all casts have to be done through explicit cast instructions. CastInst defines the interface to the cast instructions.
<li>CallInst : This defines an interface to the call instruction in LLVM. ARguments to the function are nothing but operands of the instruction.
	\begin{itemize}
	<li>: <tt>Function *getCalledFunction()</tt>: Returns a handle to the function that is being called by this Function. 
	\end{itemize}
<li>LoadInst, StoreInst, GetElemPtrInst : These subclasses represent load, store and getelementptr instructions in LLVM.
	\begin{itemize}
	<li><tt>Value * getPointerOperand()</tt>: Returns the Pointer Operand which is typically the 0th operand.
	\end{itemize}
<li>BranchInst : This is a subclass of TerminatorInst and defines the interface for conditional and unconditional branches in LLVM.
	\begin{itemize}
	<li><tt>bool isConditional()</tt>: Returns true if the branch is a conditional branch else returns false
	<li> <tt>Value *getCondition()</tt>: Returns the condition if it is a conditional branch else returns null.
	<li> <tt>void setUnconditionalDest(BasicBlock *Dest)</tt>: Changes the current branch to an unconditional one targetting the specified block.
	\end{itemize}

\end{itemize}

-->


<!-- ======================================================================= -->
</ul><table width="100%" bgcolor="#441188" border=0 cellpadding=4 cellspacing=0>
<tr><td>&nbsp;</td><td width="100%">&nbsp; 
<font color="#EEEEFF" face="Georgia,Palatino"><b>
<a name="BasicBlock">The <tt>BasicBlock</tt> class</a>
</b></font></td></tr></table><ul>

<tt>#include "<a
href="/doxygen/BasicBlock_8h-source.html">llvm/BasicBlock.h</a>"</tt></b><br>
doxygen info: <a href="/doxygen/classBasicBlock.html">BasicBlock Class</a><br>
Superclass: <a href="#Value"><tt>Value</tt></a><p>


This class represents a single entry multiple exit section of the code, commonly
known as a basic block by the compiler community.  The <tt>BasicBlock</tt> class
maintains a list of <a href="#Instruction"><tt>Instruction</tt></a>s, which form
the body of the block.  Matching the language definition, the last element of
this list of instructions is always a terminator instruction (a subclass of the
<a href="#TerminatorInst"><tt>TerminatorInst</tt></a> class).<p>

In addition to tracking the list of instructions that make up the block, the
<tt>BasicBlock</tt> class also keeps track of the <a
href="#Function"><tt>Function</tt></a> that it is embedded into.<p>

Note that <tt>BasicBlock</tt>s themselves are <a
href="#Value"><tt>Value</tt></a>s, because they are referenced by instructions
like branches and can go in the switch tables.  <tt>BasicBlock</tt>s have type
<tt>label</tt>.<p>


<!-- _______________________________________________________________________ -->
</ul><h4><a name="m_BasicBlock"><hr size=0>Important Public Members of
the <tt>BasicBlock</tt> class</h4><ul>

<li><tt>BasicBlock(const std::string &amp;Name = "", <a 
href="#Function">Function</a> *Parent = 0)</tt><p>

The <tt>BasicBlock</tt> constructor is used to create new basic blocks for
insertion into a function.  The constructor simply takes a name for the new
block, and optionally a <a href="#Function"><tt>Function</tt></a> to insert it
into.  If the <tt>Parent</tt> parameter is specified, the new
<tt>BasicBlock</tt> is automatically inserted at the end of the specified <a
href="#Function"><tt>Function</tt></a>, if not specified, the BasicBlock must be
manually inserted into the <a href="#Function"><tt>Function</tt></a>.<p>

<li><tt>BasicBlock::iterator</tt> - Typedef for instruction list iterator<br>
    <tt>BasicBlock::const_iterator</tt> - Typedef for const_iterator.<br>
    <tt>begin()</tt>, <tt>end()</tt>, <tt>front()</tt>, <tt>back()</tt>,
    <tt>size()</tt>, <tt>empty()</tt>, <tt>rbegin()</tt>, <tt>rend()</tt><p>

These methods and typedefs are forwarding functions that have the same semantics
as the standard library methods of the same names.  These methods expose the
underlying instruction list of a basic block in a way that is easy to
manipulate.  To get the full complement of container operations (including
operations to update the list), you must use the <tt>getInstList()</tt>
method.<p>

<li><tt>BasicBlock::InstListType &amp;getInstList()</tt><p>

This method is used to get access to the underlying container that actually
holds the Instructions.  This method must be used when there isn't a forwarding
function in the <tt>BasicBlock</tt> class for the operation that you would like
to perform.  Because there are no forwarding functions for "updating"
operations, you need to use this if you want to update the contents of a
<tt>BasicBlock</tt>.<p>

<li><tt><A href="#Function">Function</a> *getParent()</tt><p>

Returns a pointer to <a href="#Function"><tt>Function</tt></a> the block is
embedded into, or a null pointer if it is homeless.<p>

<li><tt><a href="#TerminatorInst">TerminatorInst</a> *getTerminator()</tt><p>

Returns a pointer to the terminator instruction that appears at the end of the
<tt>BasicBlock</tt>.  If there is no terminator instruction, or if the last
instruction in the block is not a terminator, then a null pointer is
returned.<p>


<!-- ======================================================================= -->
</ul><table width="100%" bgcolor="#441188" border=0 cellpadding=4 cellspacing=0>
<tr><td>&nbsp;</td><td width="100%">&nbsp; 
<font color="#EEEEFF" face="Georgia,Palatino"><b>
<a name="GlobalValue">The <tt>GlobalValue</tt> class</a>
</b></font></td></tr></table><ul>

<tt>#include "<a
href="/doxygen/GlobalValue_8h-source.html">llvm/GlobalValue.h</a>"</tt></b><br>
doxygen info: <a href="/doxygen/classGlobalValue.html">GlobalValue Class</a><br>
Superclasses: <a href="#User"><tt>User</tt></a>, <a
href="#Value"><tt>Value</tt></a><p>

Global values (<A href="#GlobalVariable"><tt>GlobalVariable</tt></a>s or <a
href="#Function"><tt>Function</tt></a>s) are the only LLVM values that are
visible in the bodies of all <a href="#Function"><tt>Function</tt></a>s.
Because they are visible at global scope, they are also subject to linking with
other globals defined in different translation units.  To control the linking
process, <tt>GlobalValue</tt>s know their linkage rules.  Specifically,
<tt>GlobalValue</tt>s know whether they have internal or external linkage.<p>

If a <tt>GlobalValue</tt> has internal linkage (equivalent to being
<tt>static</tt> in C), it is not visible to code outside the current translation
unit, and does not participate in linking.  If it has external linkage, it is
visible to external code, and does participate in linking.  In addition to
linkage information, <tt>GlobalValue</tt>s keep track of which <a
href="#Module"><tt>Module</tt></a> they are currently part of.<p>

Because <tt>GlobalValue</tt>s are memory objects, they are always referred to by
their address.  As such, the <a href="#Type"><tt>Type</tt></a> of a global is
always a pointer to its contents.  This is explained in the LLVM Language
Reference Manual.<p>


<!-- _______________________________________________________________________ -->
</ul><h4><a name="m_GlobalValue"><hr size=0>Important Public Members of
the <tt>GlobalValue</tt> class</h4><ul>

<li><tt>bool hasInternalLinkage() const</tt><br>
    <tt>bool hasExternalLinkage() const</tt><br>
    <tt>void setInternalLinkage(bool HasInternalLinkage)</tt><p>

These methods manipulate the linkage characteristics of the
<tt>GlobalValue</tt>.<p>

<li><tt><a href="#Module">Module</a> *getParent()</tt><p>

This returns the <a href="#Module"><tt>Module</tt></a> that the GlobalValue is
currently embedded into.<p>



<!-- ======================================================================= -->
</ul><table width="100%" bgcolor="#441188" border=0 cellpadding=4 cellspacing=0>
<tr><td>&nbsp;</td><td width="100%">&nbsp; 
<font color="#EEEEFF" face="Georgia,Palatino"><b>
<a name="Function">The <tt>Function</tt> class</a>
</b></font></td></tr></table><ul>

<tt>#include "<a
href="/doxygen/Function_8h-source.html">llvm/Function.h</a>"</tt></b><br>
doxygen info: <a href="/doxygen/classFunction.html">Function Class</a><br>
Superclasses: <a href="#GlobalValue"><tt>GlobalValue</tt></a>, <a
href="#User"><tt>User</tt></a>, <a href="#Value"><tt>Value</tt></a><p>

The <tt>Function</tt> class represents a single procedure in LLVM.  It is
actually one of the more complex classes in the LLVM heirarchy because it must
keep track of a large amount of data.  The <tt>Function</tt> class keeps track
of a list of <a href="#BasicBlock"><tt>BasicBlock</tt></a>s, a list of formal <a
href="#Argument"><tt>Argument</tt></a>s, and a <a
href="#SymbolTable"><tt>SymbolTable</tt></a>.<p>

The list of <a href="#BasicBlock"><tt>BasicBlock</tt></a>s is the most commonly
used part of <tt>Function</tt> objects.  The list imposes an implicit ordering
of the blocks in the function, which indicate how the code will be layed out by
the backend.  Additionally, the first <a
href="#BasicBlock"><tt>BasicBlock</tt></a> is the implicit entry node for the
<tt>Function</tt>.  It is not legal in LLVM explicitly branch to this initial
block.  There are no implicit exit nodes, and in fact there may be multiple exit
nodes from a single <tt>Function</tt>.  If the <a
href="#BasicBlock"><tt>BasicBlock</tt></a> list is empty, this indicates that
the <tt>Function</tt> is actually a function declaration: the actual body of the
function hasn't been linked in yet.<p>

In addition to a list of <a href="#BasicBlock"><tt>BasicBlock</tt></a>s, the
<tt>Function</tt> class also keeps track of the list of formal <a
href="#Argument"><tt>Argument</tt></a>s that the function receives.  This
container manages the lifetime of the <a href="#Argument"><tt>Argument</tt></a>
nodes, just like the <a href="#BasicBlock"><tt>BasicBlock</tt></a> list does for
the <a href="#BasicBlock"><tt>BasicBlock</tt></a>s.<p>

The <a href="#SymbolTable"><tt>SymbolTable</tt></a> is a very rarely used LLVM
feature that is only used when you have to look up a value by name.  Aside from
that, the <a href="#SymbolTable"><tt>SymbolTable</tt></a> is used internally to
make sure that there are not conflicts between the names of <a
href="#Instruction"><tt>Instruction</tt></a>s, <a
href="#BasicBlock"><tt>BasicBlock</tt></a>s, or <a
href="#Argument"><tt>Argument</tt></a>s in the function body.<p>


<!-- _______________________________________________________________________ -->
</ul><h4><a name="m_Function"><hr size=0>Important Public Members of
the <tt>Function</tt> class</h4><ul>

<li><tt>Function(const <a href="#FunctionType">FunctionType</a> *Ty, bool isInternal, const std::string &amp;N = "")</tt><p>

Constructor used when you need to create new <tt>Function</tt>s to add the the
program.  The constructor must specify the type of the function to create and
whether or not it should start out with internal or external linkage.<p>

<li><tt>bool isExternal()</tt><p>

Return whether or not the <tt>Function</tt> has a body defined.  If the function
is "external", it does not have a body, and thus must be resolved by linking
with a function defined in a different translation unit.<p>


<li><tt>Function::iterator</tt> - Typedef for basic block list iterator<br>
    <tt>Function::const_iterator</tt> - Typedef for const_iterator.<br>
    <tt>begin()</tt>, <tt>end()</tt>, <tt>front()</tt>, <tt>back()</tt>,
    <tt>size()</tt>, <tt>empty()</tt>, <tt>rbegin()</tt>, <tt>rend()</tt><p>

These are forwarding methods that make it easy to access the contents of a
<tt>Function</tt> object's <a href="#BasicBlock"><tt>BasicBlock</tt></a>
list.<p>

<li><tt>Function::BasicBlockListType &amp;getBasicBlockList()</tt><p>

Returns the list of <a href="#BasicBlock"><tt>BasicBlock</tt></a>s.  This is
neccesary to use when you need to update the list or perform a complex action
that doesn't have a forwarding method.<p>


<li><tt>Function::aiterator</tt> - Typedef for the argument list iterator<br>
    <tt>Function::const_aiterator</tt> - Typedef for const_iterator.<br>
    <tt>abegin()</tt>, <tt>aend()</tt>, <tt>afront()</tt>, <tt>aback()</tt>,
    <tt>asize()</tt>, <tt>aempty()</tt>, <tt>arbegin()</tt>, <tt>arend()</tt><p>

These are forwarding methods that make it easy to access the contents of a
<tt>Function</tt> object's <a href="#Argument"><tt>Argument</tt></a> list.<p>

<li><tt>Function::ArgumentListType &amp;getArgumentList()</tt><p>

Returns the list of <a href="#Argument"><tt>Argument</tt></a>s.  This is
neccesary to use when you need to update the list or perform a complex action
that doesn't have a forwarding method.<p>



<li><tt><a href="#BasicBlock">BasicBlock</a> &getEntryNode()</tt><p>

Returns the entry <a href="#BasicBlock"><tt>BasicBlock</tt></a> for the
function.  Because the entry block for the function is always the first block,
this returns the first block of the <tt>Function</tt>.<p>

<li><tt><a href="#Type">Type</a> *getReturnType()</tt><br>
    <tt><a href="#FunctionType">FunctionType</a> *getFunctionType()</tt><p>

This traverses the <a href="#Type"><tt>Type</tt></a> of the <tt>Function</tt>
and returns the return type of the function, or the <a
href="#FunctionType"><tt>FunctionType</tt></a> of the actual function.<p>

<li><tt><a href="#SymbolTable">SymbolTable</a> *getSymbolTable()</tt><p>

Return a pointer to the <a href="#SymbolTable"><tt>SymbolTable</tt></a> for this
<tt>Function</tt>.<p>



<!-- ======================================================================= -->
</ul><table width="100%" bgcolor="#441188" border=0 cellpadding=4 cellspacing=0>
<tr><td>&nbsp;</td><td width="100%">&nbsp; 
<font color="#EEEEFF" face="Georgia,Palatino"><b>
<a name="GlobalVariable">The <tt>GlobalVariable</tt> class</a>
</b></font></td></tr></table><ul>

<tt>#include "<a
href="/doxygen/GlobalVariable_8h-source.html">llvm/GlobalVariable.h</a>"</tt></b><br>
doxygen info: <a href="/doxygen/classGlobalVariable.html">GlobalVariable Class</a><br>
Superclasses: <a href="#GlobalValue"><tt>GlobalValue</tt></a>, <a
href="#User"><tt>User</tt></a>, <a href="#Value"><tt>Value</tt></a><p>

Global variables are represented with the (suprise suprise)
<tt>GlobalVariable</tt> class.  Like functions, <tt>GlobalVariable</tt>s are
also subclasses of <a href="#GlobalValue"><tt>GlobalValue</tt></a>, and as such
are always referenced by their address (global values must live in memory, so
their "name" refers to their address).  Global variables may have an initial
value (which must be a <a href="#Constant"><tt>Constant</tt></a>), and if they
have an initializer, they may be marked as "constant" themselves (indicating
that their contents never change at runtime).<p>


<!-- _______________________________________________________________________ -->
</ul><h4><a name="m_GlobalVariable"><hr size=0>Important Public Members of the
<tt>GlobalVariable</tt> class</h4><ul>

<li><tt>GlobalVariable(const <a href="#Type">Type</a> *Ty, bool isConstant, bool
isInternal, <a href="#Constant">Constant</a> *Initializer = 0, const std::string
&amp;Name = "")</tt><p>

Create a new global variable of the specified type.  If <tt>isConstant</tt> is
true then the global variable will be marked as unchanging for the program, and
if <tt>isInternal</tt> is true the resultant global variable will have internal
linkage.  Optionally an initializer and name may be specified for the global variable as well.<p>


<li><tt>bool isConstant() const</tt><p>

Returns true if this is a global variable is known not to be modified at
runtime.<p>


<li><tt>bool hasInitializer()</tt><p>

Returns true if this <tt>GlobalVariable</tt> has an intializer.<p>


<li><tt><a href="#Constant">Constant</a> *getInitializer()</tt><p>

Returns the intial value for a <tt>GlobalVariable</tt>.  It is not legal to call
this method if there is no initializer.<p>


<!-- ======================================================================= -->
</ul><table width="100%" bgcolor="#441188" border=0 cellpadding=4 cellspacing=0>
<tr><td>&nbsp;</td><td width="100%">&nbsp; 
<font color="#EEEEFF" face="Georgia,Palatino"><b>
<a name="Module">The <tt>Module</tt> class</a>
</b></font></td></tr></table><ul>

<tt>#include "<a
href="/doxygen/Module_8h-source.html">llvm/Module.h</a>"</tt></b><br>
doxygen info: <a href="/doxygen/classModule.html">Module Class</a><p>

The <tt>Module</tt> class represents the top level structure present in LLVM
programs.  An LLVM module is effectively either a translation unit of the
original program or a combination of several translation units merged by the
linker.  The <tt>Module</tt> class keeps track of a list of <a
href="#Function"><tt>Function</tt></a>s, a list of <a
href="#GlobalVariable"><tt>GlobalVariable</tt></a>s, and a <a
href="#SymbolTable"><tt>SymbolTable</tt></a>.  Additionally, it contains a few
helpful member functions that try to make common operations easy.<p>


<!-- _______________________________________________________________________ -->
</ul><h4><a name="m_Module"><hr size=0>Important Public Members of the
<tt>Module</tt> class</h4><ul>

<li><tt>Module::iterator</tt> - Typedef for function list iterator<br>
    <tt>Module::const_iterator</tt> - Typedef for const_iterator.<br>
    <tt>begin()</tt>, <tt>end()</tt>, <tt>front()</tt>, <tt>back()</tt>,
    <tt>size()</tt>, <tt>empty()</tt>, <tt>rbegin()</tt>, <tt>rend()</tt><p>

These are forwarding methods that make it easy to access the contents of a
<tt>Module</tt> object's <a href="#Function"><tt>Function</tt></a>
list.<p>

<li><tt>Module::FunctionListType &amp;getFunctionList()</tt><p>

Returns the list of <a href="#Function"><tt>Function</tt></a>s.  This is
neccesary to use when you need to update the list or perform a complex action
that doesn't have a forwarding method.<p>

<!--  Global Variable -->
<hr size=0>

<li><tt>Module::giterator</tt> - Typedef for global variable list iterator<br>
    <tt>Module::const_giterator</tt> - Typedef for const_iterator.<br>
    <tt>gbegin()</tt>, <tt>gend()</tt>, <tt>gfront()</tt>, <tt>gback()</tt>,
    <tt>gsize()</tt>, <tt>gempty()</tt>, <tt>grbegin()</tt>, <tt>grend()</tt><p>

These are forwarding methods that make it easy to access the contents of a
<tt>Module</tt> object's <a href="#GlobalVariable"><tt>GlobalVariable</tt></a>
list.<p>

<li><tt>Module::GlobalListType &amp;getGlobalList()</tt><p>

Returns the list of <a href="#GlobalVariable"><tt>GlobalVariable</tt></a>s.
This is neccesary to use when you need to update the list or perform a complex
action that doesn't have a forwarding method.<p>


<!--  Symbol table stuff -->
<hr size=0>

<li><tt><a href="#SymbolTable">SymbolTable</a> *getSymbolTable()</tt><p>

Return a reference to the <a href="#SymbolTable"><tt>SymbolTable</tt></a> for
this <tt>Module</tt>.<p>


<!--  Convenience methods -->
<hr size=0>

<li><tt><a href="#Function">Function</a> *getFunction(const std::string &amp;Name, const <a href="#FunctionType">FunctionType</a> *Ty)</tt><p>

Look up the specified function in the <tt>Module</tt> <a
href="#SymbolTable"><tt>SymbolTable</tt></a>. If it does not exist, return
<tt>null</tt>.<p>


<li><tt><a href="#Function">Function</a> *getOrInsertFunction(const std::string
         &amp;Name, const <a href="#FunctionType">FunctionType</a> *T)</tt><p>

Look up the specified function in the <tt>Module</tt> <a
href="#SymbolTable"><tt>SymbolTable</tt></a>. If it does not exist, add an
external declaration for the function and return it.<p>


<li><tt>std::string getTypeName(const <a href="#Type">Type</a> *Ty)</tt><p>

If there is at least one entry in the <a
href="#SymbolTable"><tt>SymbolTable</tt></a> for the specified <a
href="#Type"><tt>Type</tt></a>, return it.  Otherwise return the empty
string.<p>


<li><tt>bool addTypeName(const std::string &Name, const <a href="#Type">Type</a>
*Ty)</tt><p>

Insert an entry in the <a href="#SymbolTable"><tt>SymbolTable</tt></a> mapping
<tt>Name</tt> to <tt>Ty</tt>. If there is already an entry for this name, true
is returned and the <a href="#SymbolTable"><tt>SymbolTable</tt></a> is not
modified.<p>


<!-- ======================================================================= -->
</ul><table width="100%" bgcolor="#441188" border=0 cellpadding=4 cellspacing=0>
<tr><td>&nbsp;</td><td width="100%">&nbsp; 
<font color="#EEEEFF" face="Georgia,Palatino"><b>
<a name="Constant">The <tt>Constant</tt> class and subclasses</a>
</b></font></td></tr></table><ul>

Constant represents a base class for different types of constants. It is
subclassed by ConstantBool, ConstantInt, ConstantSInt, ConstantUInt,
ConstantArray etc for representing the various types of Constants.<p>


<!-- _______________________________________________________________________ -->
</ul><h4><a name="m_Value"><hr size=0>Important Public Methods</h4><ul>

<li><tt>bool isConstantExpr()</tt>: Returns true if it is a ConstantExpr


<hr>
Important Subclasses of Constant<p>

<ul>
<li>ConstantSInt : This subclass of Constant represents a signed integer constant.
<ul>
	<li><tt>int64_t getValue() const</tt>: Returns the underlying value of this constant.
</ul>
<li>ConstantUInt : This class represents an unsigned integer.
<ul>
	<li><tt>uint64_t getValue() const</tt>: Returns the underlying value of this constant.
</ul>
<li>ConstantFP : This class represents a floating point constant.
<ul>
	<li><tt>double getValue() const</tt>: Returns the underlying value of this constant.
</ul>
<li>ConstantBool : This represents a boolean constant.
<ul>
	<li><tt>bool getValue() const</tt>: Returns the underlying value of this constant.
</ul>
<li>ConstantArray : This represents a constant array.
<ul>
	<li><tt>const std::vector<Use> &amp;getValues() const</tt>: Returns a Vecotr of component constants that makeup this array.
</ul>
<li>ConstantStruct : This represents a constant struct.
<ul>
	<li><tt>const std::vector<Use> &amp;getValues() const</tt>: Returns a Vecotr of component constants that makeup this array.
</ul>
<li>ConstantPointerRef : This represents a constant pointer value that is initialized to point to a global value, which lies at a constant fixed address.
<ul>
<li><tt>GlobalValue *getValue()</tt>: Returns the global value to which this pointer is pointing to.
</ul>
</ul>


<!-- ======================================================================= -->
</ul><table width="100%" bgcolor="#441188" border=0 cellpadding=4 cellspacing=0>
<tr><td>&nbsp;</td><td width="100%">&nbsp; 
<font color="#EEEEFF" face="Georgia,Palatino"><b>
<a name="Type">The <tt>Type</tt> class and Derived Types</a>
</b></font></td></tr></table><ul>

Type as noted earlier is also a subclass of a Value class.  Any primitive
type (like int, short etc) in LLVM is an instance of Type Class.  All
other types are instances of subclasses of type like FunctionType,
ArrayType etc. DerivedType is the interface for all such dervied types
including FunctionType, ArrayType, PointerType, StructType. Types can have
names. They can be recursive (StructType). There exists exactly one instance 
of any type structure at a time. This allows using pointer equality of Type *s for comparing types. 

<!-- _______________________________________________________________________ -->
</ul><h4><a name="m_Value"><hr size=0>Important Public Methods</h4><ul>

<li><tt>PrimitiveID getPrimitiveID() const</tt>: Returns the base type of the type.
<li><tt> bool isSigned() const</tt>: Returns whether an integral numeric type is signed. This is true for SByteTy, ShortTy, IntTy, LongTy. Note that this is not true for Float and Double.
<li><tt>bool isUnsigned() const</tt>: Returns whether a numeric type is unsigned. This is not quite the complement of isSigned... nonnumeric types return false as they do with isSigned. This returns true for UByteTy, UShortTy, UIntTy, and ULongTy. 
<li><tt> bool isInteger() const</tt>: Equilivent to isSigned() || isUnsigned(), but with only a single virtual function invocation. 
<li><tt>bool isIntegral() const</tt>: Returns true if this is an integral type, which is either Bool type or one of the Integer types.

<li><tt>bool isFloatingPoint()</tt>: Return true if this is one of the two floating point types.
<li><tt>bool isRecursive() const</tt>: Returns rue if the type graph contains a cycle.
<li><tt>isLosslesslyConvertableTo (const Type *Ty) const</tt>: Return true if this type can be converted to 'Ty' without any reinterpretation of bits. For example, uint to int.
<li><tt>bool isPrimitiveType() const</tt>: Returns true if it is a primitive type.
<li><tt>bool isDerivedType() const</tt>: Returns true if it is a derived type.
<li><tt>const Type * getContainedType (unsigned i) const</tt>: 
This method is used to implement the type iterator. For derived types, this returns the types 'contained' in the derived type, returning 0 when 'i' becomes invalid. This allows the user to iterate over the types in a struct, for example, really easily.
<li><tt>unsigned getNumContainedTypes() const</tt>: Return the number of types in the derived type. 

<p>

<hr>
Derived Types<p>

<ul>
<li>SequentialType : This is subclassed by ArrayType and PointerType 
<ul>
	<li><tt>const Type * getElementType() const</tt>: Returns the type of each of the elements in the sequential type.
</ul>
<li>ArrayType : This is a subclass of SequentialType and defines interface for array types.
<ul>
	<li><tt>unsigned getNumElements() const</tt>: Returns the number of elements in the array.
</ul>
<li>PointerType : Subclass of SequentialType for  pointer types.
<li>StructType : subclass of DerivedTypes for struct types
<li>FunctionType : subclass of DerivedTypes for function types.

<ul>
	
	<li><tt>bool isVarArg() const</tt>: Returns true if its a vararg function
	<li><tt> const Type * getReturnType() const</tt>: Returns the return type of the function.
	<li><tt> const ParamTypes &amp;getParamTypes() const</tt>: Returns a vector of parameter types.
	<li><tt>const Type * getParamType (unsigned i)</tt>: Returns the type of the ith parameter.
	<li><tt> const unsigned getNumParams() const</tt>: Returns the number of formal parameters.
</ul>
</ul>




<!-- ======================================================================= -->
</ul><table width="100%" bgcolor="#441188" border=0 cellpadding=4 cellspacing=0>
<tr><td>&nbsp;</td><td width="100%">&nbsp; 
<font color="#EEEEFF" face="Georgia,Palatino"><b>
<a name="Argument">The <tt>Argument</tt> class</a>
</b></font></td></tr></table><ul>

This subclass of Value defines the interface for incoming formal arguments to a
function. A Function maitanis a list of its formal arguments. An argument has a
pointer to the parent Function.




<!-- *********************************************************************** -->
</ul>
<!-- *********************************************************************** -->

<hr><font size-1>
<address>By: <a href="mailto:dhurjati@cs.uiuc.edu">Dinakar Dhurjati</a> and
<a href="mailto:sabre@nondot.org">Chris Lattner</a></address>
<!-- Created: Tue Aug  6 15:00:33 CDT 2002 -->
<!-- hhmts start -->
Last modified: Wed Apr 23 11:21:57 CDT 2003
<!-- hhmts end -->
</font></body></html>
