The word 'independent' has no 'a'.
[oota-llvm.git] / docs / ProgrammersManual.html
index 421f3021ed323c4f5cd71dfe640a64bdebd7e4d8..63e803ba71cacb51323a372fe815c277540a4a6c 100644 (file)
   <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>
       <li>
     </ul>
-    <li>Useful LLVM APIs
-    <ul>
-      <li>The general graph API
-      <li>The <tt>InstVisitor</tt> template
-      <li>The DEBUG() macro
-      <li>The <tt>Statistic</tt> template
--->
-    </ul>
-<!--
-    <li>Useful related topics
-    <ul>
-      <li>The <tt>-time-passes</tt> option
-      <li>How to use the LLVM Makefile system
-      <li>How to write a regression test
-      <li>
-    </ul>
 -->
   </ul>
   <li><a href="#coreclasses">The Core LLVM Class Hierarchy Reference</a>
@@ -161,9 +161,15 @@ 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++
+<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.<br>
+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>
@@ -183,6 +189,16 @@ 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; 
@@ -292,13 +308,152 @@ 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>
-<!-- *********************************************************************** -->
+</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
@@ -669,8 +824,7 @@ pb->getInstList().insert(pi, newInst); // inserts newInst before pi in pb
 </p>
 
 <li>Insertion into an implicit instruction list
-<p>
-<tt>Instruction</tt> instances that are already in
+<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
@@ -695,7 +849,7 @@ 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>
 </p>
 </ul>
 
@@ -714,21 +868,65 @@ For example:<p>
 
 <pre>
   <a href="#Instruction">Instruction</a> *I = .. ;
-  <a href="#BasicBlock">BasicBlock</a> *BB = I->getParent();
-  BB->getInstList().erase(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>
 
-<!-- Value::replaceAllUsesWith
-     User::replaceUsesOfWith
-  Point out: include/llvm/Transforms/Utils/
-    especially BasicBlockUtils.h with:
-         ReplaceInstWithValue, ReplaceInstWithInst
+<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
 -->
 
 <!-- *********************************************************************** -->
@@ -938,9 +1136,9 @@ the <tt>Instruction</tt> class</h4><ul>
 Returns the <a href="#BasicBlock"><tt>BasicBlock</tt></a> that this
 <tt>Instruction</tt> is embedded into.<p>
 
-<li><tt>bool hasSideEffects()</tt><p>
+<li><tt>bool mayWriteToMemory()</tt><p>
 
-Returns true if the instruction has side effects, i.e. it is a <tt>call</tt>,
+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>
@@ -988,7 +1186,7 @@ into a <a href="#BasicBlock"><tt>BasicBlock</tt></a>), and it has no name.<p>
        \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.
+       <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}
@@ -1243,26 +1441,10 @@ 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>
+<tt>Function</tt>.<p>
 
 
 
@@ -1382,25 +1564,10 @@ action that doesn't have a forwarding method.<p>
 <!--  Symbol table stuff -->
 <hr size=0>
 
-<li><tt>bool hasSymbolTable() const</tt><p>
-
-Return true if the <tt>Module</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>Module</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>Module</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>
+Return a reference to the <a href="#SymbolTable"><tt>SymbolTable</tt></a> for
+this <tt>Module</tt>.<p>
 
 
 <!--  Convenience methods -->
@@ -1456,39 +1623,39 @@ ConstantArray etc for representing the various types of Constants.<p>
 <li><tt>bool isConstantExpr()</tt>: Returns true if it is a ConstantExpr
 
 
+<hr>
+Important Subclasses of Constant<p>
 
-
-\subsection{Important Subclasses of Constant}
-\begin{itemize}
+<ul>
 <li>ConstantSInt : This subclass of Constant represents a signed integer constant.
-       \begin{itemize}
-       <li><tt>int64_t getValue () const</tt>: Returns the underlying value of this constant.
-       \end{itemize}
+<ul>
+       <li><tt>int64_t getValue() const</tt>: Returns the underlying value of this constant.
+</ul>
 <li>ConstantUInt : This class represents an unsigned integer.
-       \begin{itemize}
-       <li><tt>uint64_t getValue () const</tt>: Returns the underlying value of this constant.
-       \end{itemize}
+<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.
-       \begin{itemize}
-       <li><tt>double getValue () const</tt>: Returns the underlying value of this constant.
-       \end{itemize}
+<ul>
+       <li><tt>double getValue() const</tt>: Returns the underlying value of this constant.
+</ul>
 <li>ConstantBool : This represents a boolean constant.
-       \begin{itemize}
-       <li><tt>bool getValue () const</tt>: Returns the underlying value of this constant.
-       \end{itemize}
+<ul>
+       <li><tt>bool getValue() const</tt>: Returns the underlying value of this constant.
+</ul>
 <li>ConstantArray : This represents a constant array.
-       \begin{itemize}
+<ul>
        <li><tt>const std::vector<Use> &amp;getValues() const</tt>: Returns a Vecotr of component constants that makeup this array.
-       \end{itemize}
+</ul>
 <li>ConstantStruct : This represents a constant struct.
-       \begin{itemize}
+<ul>
        <li><tt>const std::vector<Use> &amp;getValues() const</tt>: Returns a Vecotr of component constants that makeup this array.
-       \end{itemize}
+</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.
-       \begin{itemize}
+<ul>
 <li><tt>GlobalValue *getValue()</tt>: Returns the global value to which this pointer is pointing to.
-       \end{itemize}
-\end{itemize}
+</ul>
+</ul>
 
 
 <!-- ======================================================================= -->
@@ -1509,45 +1676,48 @@ of any type structure at a time. This allows using pointer equality of Type *s f
 <!-- _______________________________________________________________________ -->
 </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>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>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>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. 
+<li><tt>unsigned getNumContainedTypes() const</tt>: Return the number of types in the derived type. 
 
+<p>
 
+<hr>
+Derived Types<p>
 
-\subsection{Derived Types} 
-\begin{itemize}
+<ul>
 <li>SequentialType : This is subclassed by ArrayType and PointerType 
-       \begin{itemize}
-       <li><tt>const Type * getElementType () const</tt>: Returns the type of each of the elements in the sequential type.
-       \end{itemize}
+<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.
-       \begin{itemize}
-       <li><tt>unsigned getNumElements () const</tt>: Returns the number of elements in the array.
-       \end{itemize}
+<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.
-       \begin{itemize}
+
+<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>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.
-       \end{itemize}
-\end{itemize}
+       <li><tt> const unsigned getNumParams() const</tt>: Returns the number of formal parameters.
+</ul>
+</ul>
 
 
 
@@ -1575,6 +1745,6 @@ pointer to the parent Function.
 <a href="mailto:sabre@nondot.org">Chris Lattner</a></address>
 <!-- Created: Tue Aug  6 15:00:33 CDT 2002 -->
 <!-- hhmts start -->
-Last modified: Tue Sep 17 17:41:54 CDT 2002
+Last modified: Mon Feb 24 14:45:19 CST 2003
 <!-- hhmts end -->
 </font></body></html>