aboutsummaryrefslogtreecommitdiff
path: root/docs/ProgrammersManual.html
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2002-09-06 02:50:58 +0000
committerChris Lattner <sabre@nondot.org>2002-09-06 02:50:58 +0000
commit9355b479c36a857b44862e8a4621f963b2991aef (patch)
treefaaae96b45d6ac1021d0653bec63d709951754e6 /docs/ProgrammersManual.html
parent4af3ccbbea4f6d2cf2d90b9b004c3da59f33510c (diff)
Initial checkin of the first part of the Programmer's Manual
There is still much to be done, but it's a good start. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3589 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'docs/ProgrammersManual.html')
-rw-r--r--docs/ProgrammersManual.html847
1 files changed, 847 insertions, 0 deletions
diff --git a/docs/ProgrammersManual.html b/docs/ProgrammersManual.html
new file mode 100644
index 0000000000..b539e34d73
--- /dev/null
+++ b/docs/ProgrammersManual.html
@@ -0,0 +1,847 @@
+<!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 isa&lt;&gt;, cast&lt;&gt; and dyn_cast&lt;&gt; templates
+ </ul>
+ <li><a href="#coreclasses">The Core LLVM Class Heirarchy</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>
+ <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>
+
+<!--
+III. Useful things to know about the LLVM source base:
+
+III.1 Useful links that introduce the STL
+III.2 isa<>, cast<>, dyn_cast<>
+III.3 Makefiles, useful options
+III.4 How to use opt & analyze to debug stuff
+III.5 How to write a regression test
+III.6 DEBUG() and Statistics (-debug & -stats)
+III.7 The -time-passes option
+III.8 ... more as needed ...
+
+-->
+
+ <p><b>Written by <a href="mailto:dhurjati@cs.uiuc.edu">Dinakar Dhurjati</a>
+ and <a href="mailto:sabre@nondot.org">Chris Lattner</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 hi-light some of the important classes and interfaces
+available in the LLVM source-base. This manual is not indended 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/htm_cpl/index.html">Dinkumware C++
+Library reference</a> - an excellent reference for the STL and other parts of
+the standard C++ library.<br>
+
+<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="coreclasses">The Core LLVM Class Heirarchy
+</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 accessable 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>
+
+
+<!-- _______________________________________________________________________ -->
+</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 hasSideEffects()</tt><p>
+
+Returns true if the instruction has side effects, 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>
+
+<!--
+
+\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>bool hasSymbolTable() const</tt><p>
+
+Return true if the <tt>Function</tt> has a symbol table allocated to it and if
+there is at least one entry in it.<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> or a null pointer if one has not been allocated (because there
+are no named values in the function).<p>
+
+<li><tt><a href="#SymbolTable">SymbolTable</a> *getSymbolTableSure()</tt><p>
+
+Return a pointer to the <a href="#SymbolTable"><tt>SymbolTable</tt></a> for this
+<tt>Function</tt> or allocate a new <a
+href="#SymbolTable"><tt>SymbolTable</tt></a> if one is not already around. This
+should only be used when adding elements to the <a
+href="#SymbolTable"><tt>SymbolTable</tt></a>, so that empty symbol tables are
+not left laying around.<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>
+
+
+A GlobalVariable is a subclass of GlobalValue and defines the interface to
+global variables in the SSA program. It can have a name and an
+initializer. (initial constant Value)
+
+Can be constant.
+
+
+<!-- _______________________________________________________________________ -->
+</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>
+
+<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 intializer<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