Constants never get names.
[oota-llvm.git] / docs / ProgrammersManual.html
index ec97e332f677ceb4e3675cc9f0f6370ef347ba70..6fc0ec211256f2799e2d2f05f680a99f1ac0ee3f 100644 (file)
   <li><a href="#introduction">Introduction</a></li>
   <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
---> </li>
+      <li><a href="#stl">The C++ Standard Template Library</a></li>
+<!--
+      <li>The <tt>-time-passes</tt> option</li>
+      <li>How to use the LLVM Makefile system</li>
+      <li>How to write a regression test</li>
+
+--> 
     </ul>
   </li>
   <li><a href="#apis">Important and useful LLVM APIs</a>
@@ -34,10 +36,11 @@ and the <tt>-debug-only</tt> option</a> </li>
         </ul>
       </li>
       <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
---> </li>
+option</a></li>
+<!--
+      <li>The <tt>InstVisitor</tt> template
+      <li>The general graph API
+--> 
     </ul>
   </li>
   <li><a href="#common">Helpful Hints for Common Operations</a>
@@ -68,6 +71,7 @@ use-def chains</a> </li>
           <li><a href="#schanges_replacing">Replacing an                <tt>Instruction</tt>
 with another <tt>Value</tt></a> </li>
         </ul>
+      </li>
 <!--
     <li>Working with the Control Flow Graph
     <ul>
@@ -75,49 +79,54 @@ with another <tt>Value</tt></a> </li>
       <li>
       <li>
     </ul>
---> </li>
+--> 
     </ul>
   </li>
   <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>
+      <li><a href="#Value">The <tt>Value</tt> class</a>
         <ul>
-          <li><a href="#Instruction">The <tt>Instruction</tt> class</a>
-            <ul>
-            <li><a href="#GetElementPtrInst">The <tt>GetElementPtrInst</tt>
-                class</a></li>
-            </ul></li>
-          <li><a href="#GlobalValue">The <tt>GlobalValue</tt> class</a>
+          <li><a href="#User">The <tt>User</tt> class</a>
             <ul>
-            <li><a href="#BasicBlock">The <tt>BasicBlock</tt>class</a></li>
-            <li><a href="#Function">The <tt>Function</tt> class</a></li>
-            <li><a href="#GlobalVariable">The <tt>GlobalVariable</tt> 
-                class</a></li>
-            </ul></li>
-          <li><a href="#Module">The <tt>Module</tt> class</a></li>
-          <li><a href="#Constant">The <tt>Constant</tt> class</a>
-          </li>
+              <li><a href="#Instruction">The <tt>Instruction</tt> class</a>
+                <ul>
+                  <li><a href="#GetElementPtrInst">The <tt>GetElementPtrInst</tt> class</a></li>
+                </ul>
+              </li>
+              <li><a href="#Module">The <tt>Module</tt> class</a></li>
+              <li><a href="#Constant">The <tt>Constant</tt> class</a>
+               <ul>
+                  <li><a href="#GlobalValue">The <tt>GlobalValue</tt> class</a>
+                    <ul>
+                      <li><a href="#BasicBlock">The <tt>BasicBlock</tt>class</a></li>
+                      <li><a href="#Function">The <tt>Function</tt> class</a></li>
+                      <li><a href="#GlobalVariable">The <tt>GlobalVariable</tt> class</a></li>
+                    </ul>
+                  </li>
+                </ul>
+              </li>
+           </ul>
+         </li>
           <li><a href="#Type">The <tt>Type</tt> class</a> </li>
-          <li><a href="#Argument">The <tt>Argument</tt> class</a> </li>
+          <li><a href="#Argument">The <tt>Argument</tt> class</a></li>
         </ul>
       </li>
-      <li>The <tt>SymbolTable</tt> class </li>
-      <li>The <tt>ilist</tt> and <tt>iplist</tt> classes
-        <ul>
-          <li>Creating, inserting, moving and deleting from LLVM lists </li>
-        </ul>
-      </li>
-      <li>Important iterator invalidation semantics to be aware of.</li>
     </ul>
   </li>
+  <li><a href="#SymbolTable">The <tt>SymbolTable</tt> class </a></li>
+  <li>The <tt>ilist</tt> and <tt>iplist</tt> classes
+    <ul>
+      <li>Creating, inserting, moving and deleting from LLVM lists </li>
+    </ul>
+  </li>
+  <li>Important iterator invalidation semantics to be aware of.</li>
 </ol>
 
 <div class="doc_author">    
   <p>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></p>
+                <a href="mailto:dhurjati@cs.uiuc.edu">Dinakar Dhurjati</a>, 
+                <a href="mailto:jstanley@cs.uiuc.edu">Joel Stanley</a>, and
+                <a href="mailto:rspencer@x10sys.com">Reid Spencer</a></p>
 </div>
 
 <!-- *********************************************************************** -->
@@ -188,9 +197,9 @@ reference</a> - an excellent reference for the STL and other parts of the
 standard C++ library.</li>
 
 <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
+O'Reilly book in the making.  It has a decent 
+Standard Library
+Reference that rivals Dinkumware's, and is unfortunately no longer free since the book has been 
 published.</li>
 
 <li><a href="http://www.parashift.com/c++-faq-lite/">C++ Frequently Asked
@@ -204,6 +213,10 @@ STL</a>.</li>
 <li><a href="http://www.research.att.com/%7Ebs/C++.html">Bjarne Stroustrup's C++
 Page</a></li>
 
+<li><a href="http://64.78.49.204/">
+Bruce Eckel's Thinking in C++, 2nd ed. Volume 2 Revision 4.0 (even better, get
+the book).</a></li>
+
 </ol>
   
 <p>You are also encouraged to take a look at the <a
@@ -219,12 +232,11 @@ to write maintainable code more than where to put your curly braces.</p>
 
 <div class="doc_text">
 
-<p>LLVM is currently using CVS as its source versioning system. You may find
-this reference handy:</p>
-
 <ol>
 <li><a href="http://www.psc.edu/%7Esemke/cvs_branches.html">CVS
 Branch and Tag Primer</a></li>
+<li><a href="http://www.fortran-2000.com/ArnaudRecipes/sharedlib.html">Using
+static and shared libraries across platforms</a></li>
 </ol>
 
 </div>
@@ -687,7 +699,7 @@ this, and in other situations, you may find that you want to treat
 most-specific common base class is <tt>Instruction</tt>, which includes lots of
 less closely-related things. For these cases, LLVM provides a handy wrapper
 class called <a
-href="http://llvm.cs.uiuc.edu/doxygen/classCallSite.html"><tt>CallSite</tt></a>.
+href="http://llvm.cs.uiuc.edu/doxygen/classllvm_1_1CallSite.html"><tt>CallSite</tt></a>.
 It is essentially a wrapper around an <tt>Instruction</tt> pointer, with some
 methods that provide functionality common to <tt>CallInst</tt>s and
 <tt>InvokeInst</tt>s.</p>
@@ -708,17 +720,18 @@ If you look at its definition, it has only a single pointer member.</p>
 <div class="doc_text">
 
 <p>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>:</p>
+href="/doxygen/structllvm_1_1Value.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>:</p>
 
   <pre>Function* F = ...;<br><br>for (Value::use_iterator i = F-&gt;use_begin(), e = F-&gt;use_end(); i != e; ++i) {<br>    if (Instruction *Inst = dyn_cast&lt;Instruction&gt;(*i)) {<br>        cerr &lt;&lt; "F is used in instruction:\n";<br>        cerr &lt;&lt; *Inst &lt;&lt; "\n";<br>    }<br>}<br></pre>
 
 <p>Alternately, it's common to have an instance of the <a
-href="/doxygen/classUser.html">User Class</a> and need to know what
+href="/doxygen/classllvm_1_1User.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
@@ -770,7 +783,7 @@ parameters. For example, an <tt>AllocaInst</tt> only <i>requires</i> a
 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
+href="/doxygen/classllvm_1_1Instruction.html">doxygen documentation for the subclass of
 Instruction</a> that you're interested in instantiating.</p>
 
 <p><i>Naming values</i></p>
@@ -805,7 +818,22 @@ into an existing sequence of instructions that form a <tt>BasicBlock</tt>:</p>
     <tt>BasicBlock</tt>, and a newly-created instruction we wish to insert
     before <tt>*pi</tt>, we do the following: </p>
 
-      <pre>  BasicBlock *pb = ...;<br>  Instruction *pi = ...;<br>  Instruction *newInst = new Instruction(...);<br>  pb-&gt;getInstList().insert(pi, newInst); // inserts newInst before pi in pb<br></pre></li>
+      <pre>  BasicBlock *pb = ...;<br>  Instruction *pi = ...;<br>  Instruction *newInst = new Instruction(...);<br>  pb-&gt;getInstList().insert(pi, newInst); // inserts newInst before pi in pb<br></pre>
+
+    <p>Appending to the end of a <tt>BasicBlock</tt> is so common that
+    the <tt>Instruction</tt> class and <tt>Instruction</tt>-derived
+    classes provide constructors which take a pointer to a
+    <tt>BasicBlock</tt> to be appended to. For example code that
+    looked like: </p>
+
+      <pre>  BasicBlock *pb = ...;<br>  Instruction *newInst = new Instruction(...);<br>  pb-&gt;getInstList().push_back(newInst); // appends newInst to pb<br></pre>
+
+    <p>becomes: </p>
+
+      <pre>  BasicBlock *pb = ...;<br>  Instruction *newInst = new Instruction(..., pb);<br></pre>
+
+    <p>which is much cleaner, especially if you are creating
+    long instruction streams.</p></li>
 
   <li>Insertion into an implicit instruction list
 
@@ -876,7 +904,7 @@ and <tt>ReplaceInstWithInst</tt>.</p>
     <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
+    <tt>AllocaInst</tt> that allocates memory for a single integer with a null
     pointer to an integer.</p>
 
       <pre>AllocaInst* instToReplace = ...;<br>BasicBlock::iterator ii(instToReplace);<br>ReplaceInstWithValue(instToReplace-&gt;getParent()-&gt;getInstList(), ii,<br>                     Constant::getNullValue(PointerType::get(Type::IntTy)));<br></pre></li>
@@ -894,8 +922,8 @@ and <tt>ReplaceInstWithInst</tt>.</p>
 
 <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
+doxygen documentation for the <a href="/doxygen/structllvm_1_1Value.html">Value Class</a>
+and <a href="/doxygen/classllvm_1_1User.html">User Class</a>, respectively, for more
 information.</p>
 
 <!-- Value::replaceAllUsesWith User::replaceUsesOfWith Point out:
@@ -928,7 +956,7 @@ the <tt>lib/VMCore</tt> directory.</p>
 
 <p><tt>#include "<a href="/doxygen/Value_8h-source.html">llvm/Value.h</a>"</tt>
 <br> 
-doxygen info: <a href="/doxygen/classValue.html">Value Class</a></p>
+doxygen info: <a href="/doxygen/structllvm_1_1Value.html">Value Class</a></p>
 
 <p>The <tt>Value</tt> class is the most important class in the LLVM Source
 base.  It represents a typed value that may be used (among other things) as an
@@ -1029,7 +1057,7 @@ be aware of the <a href="#nameWarning">precaution above</a>.</p>
   
 <p>
 <tt>#include "<a href="/doxygen/User_8h-source.html">llvm/User.h</a>"</tt><br>
-doxygen info: <a href="/doxygen/classUser.html">User Class</a><br>
+doxygen info: <a href="/doxygen/classllvm_1_1User.html">User Class</a><br>
 Superclass: <a href="#Value"><tt>Value</tt></a></p>
 
 <p>The <tt>User</tt> class is the common base class of all LLVM nodes that may
@@ -1064,9 +1092,9 @@ convenient form for direct access.</p></li>
 
   <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
+    <tt>op_iterator op_begin()</tt> - Get an iterator to the start of 
+the operand list.<br>
+    <tt>op_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></li>
@@ -1083,7 +1111,7 @@ the operands of a <tt>User</tt>.</p></li>
 
 <p><tt>#include "</tt><tt><a
 href="/doxygen/Instruction_8h-source.html">llvm/Instruction.h</a>"</tt><br>
-doxygen info: <a href="/doxygen/classInstruction.html">Instruction Class</a><br>
+doxygen info: <a href="/doxygen/classllvm_1_1Instruction.html">Instruction Class</a><br>
 Superclasses: <a href="#User"><tt>User</tt></a>, <a
 href="#Value"><tt>Value</tt></a></p>
 
@@ -1108,7 +1136,7 @@ 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 confuses doxygen, so these enum values don't show up correctly in the
-<a href="/doxygen/classInstruction.html">doxygen output</a>.</p>
+<a href="/doxygen/classllvm_1_1Instruction.html">doxygen output</a>.</p>
 
 </div>
 
@@ -1145,8 +1173,10 @@ and it has no name</p></li>
 
 <div class="doc_text">
 
-<p><tt>#include "<a href="/doxygen/BasicBlock_8h-source.html">llvm/BasicBlock.h</a>"</tt><br>
-doxygen info: <a href="/doxygen/classBasicBlock.html">BasicBlock Class</a><br>
+<p><tt>#include "<a
+href="/doxygen/BasicBlock_8h-source.html">llvm/BasicBlock.h</a>"</tt><br>
+doxygen info: <a href="/doxygen/structllvm_1_1BasicBlock.html">BasicBlock
+Class</a><br>
 Superclass: <a href="#Value"><tt>Value</tt></a></p>
 
 <p>This class represents a single entry multiple exit section of the code,
@@ -1177,42 +1207,52 @@ like branches and can go in the switch tables. <tt>BasicBlock</tt>s have type
 <div class="doc_text">
 
 <ul>
-  <li><tt>BasicBlock(const std::string &amp;Name = "", </tt><tt><a
+
+<li><tt>BasicBlock(const std::string &amp;Name = "", </tt><tt><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 optionally takes
-a name for the new block, and 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>
-  <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>STL style functions for accessing the instruction list.
-    <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>
-  <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>
-  <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>
-  <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></li>
+
+<p>The <tt>BasicBlock</tt> constructor is used to create new basic blocks for
+insertion into a function.  The constructor optionally takes a name for the new
+block, and 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>
+
+<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> -
+STL-style functions for accessing the instruction list.
+
+<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>
+
+<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>
+
+<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>
+
+<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></li>
+
 </ul>
 
 </div>
@@ -1226,7 +1266,8 @@ terminator, then a null pointer is returned.</p></li>
 
 <p><tt>#include "<a
 href="/doxygen/GlobalValue_8h-source.html">llvm/GlobalValue.h</a>"</tt><br>
-doxygen info: <a href="/doxygen/classGlobalValue.html">GlobalValue Class</a><br>
+doxygen info: <a href="/doxygen/classllvm_1_1GlobalValue.html">GlobalValue
+Class</a><br>
 Superclasses: <a href="#User"><tt>User</tt></a>, <a
 href="#Value"><tt>Value</tt></a></p>
 
@@ -1237,7 +1278,7 @@ 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, as
-defined by the <tt>LinkageTypes</tt> enumerator.</p>
+defined by the <tt>LinkageTypes</tt> enumeration.</p>
 
 <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
@@ -1294,8 +1335,8 @@ GlobalValue is currently embedded into.</p></li>
 
 <p><tt>#include "<a
 href="/doxygen/Function_8h-source.html">llvm/Function.h</a>"</tt><br> doxygen
-info: <a href="/doxygen/classFunction.html">Function Class</a><br> Superclasses:
-<a href="#GlobalValue"><tt>GlobalValue</tt></a>, <a
+info: <a href="/doxygen/classllvm_1_1Function.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>
 
 <p>The <tt>Function</tt> class represents a single procedure in LLVM.  It is
@@ -1332,6 +1373,9 @@ 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>
 
+<p>Note that <tt>Function</tt> is a <a href="#GlobalValue">GlobalValue</a>
+and therefore also a <a href="#Constant">Constant</a>. The value of the function
+is its address (after linking) which is guaranteed to be constant.</p>
 </div>
 
 <!-- _______________________________________________________________________ -->
@@ -1344,12 +1388,12 @@ href="#Argument"><tt>Argument</tt></a>s in the function body.</p>
 
 <ul>
   <li><tt>Function(const </tt><tt><a href="#FunctionType">FunctionType</a>
-  *Ty, bool isInternal, const std::string &amp;N = "", Module* Parent = 0)</tt>
+  *Ty, LinkageTypes Linkage, const std::string &amp;N = "", Module* Parent = 0)</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. The&nbsp;<a href="#FunctionType"><tt>FunctionType</tt></a> argument
+    create and what type of linkage the function should have. The <a 
+    href="#FunctionType"><tt>FunctionType</tt></a> argument
     specifies the formal arguments and return value for the function. The same
     <a href="#FunctionTypel"><tt>FunctionType</tt></a> value can be used to
     create multiple functions. The <tt>Parent</tt> argument specifies the Module
@@ -1428,7 +1472,7 @@ iterator<br>
 <p><tt>#include "<a
 href="/doxygen/GlobalVariable_8h-source.html">llvm/GlobalVariable.h</a>"</tt>
 <br>
-doxygen info: <a href="/doxygen/classGlobalVariable.html">GlobalVariable
+doxygen info: <a href="/doxygen/classllvm_1_1GlobalVariable.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>
 
@@ -1497,7 +1541,7 @@ change at runtime).</p>
 
 <p><tt>#include "<a
 href="/doxygen/Module_8h-source.html">llvm/Module.h</a>"</tt><br> doxygen info:
-<a href="/doxygen/classModule.html">Module Class</a></p>
+<a href="/doxygen/classllvm_1_1Module.html">Module Class</a></p>
 
 <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
@@ -1629,66 +1673,56 @@ ConstantArray etc for representing the various types of Constants.</p>
 
 <!-- _______________________________________________________________________ -->
 <div class="doc_subsubsection">
-  <a name="m_Value">Important Public Methods</a>
+  <a name="m_Constant">Important Public Methods</a>
 </div>
-
 <div class="doc_text">
+</div>
 
+<!-- _______________________________________________________________________ -->
+<div class="doc_subsubsection">Important Subclasses of Constant </div>
+<div class="doc_text">
 <ul>
-  <li><tt>bool isConstantExpr()</tt>: Returns true if it is a
-ConstantExpr
-    <hr> Important Subclasses of Constant
-    <p> </p>
+  <li>ConstantSInt : This subclass of Constant represents a signed integer 
+  constant.
     <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. </li>
-        </ul>
-      </li>
-      <li>ConstantUInt : This class represents an unsigned integer.
-        <ul>
-       <li><tt>uint64_t getValue() const</tt>: Returns the underlying value
-of this constant. </li>
-        </ul>
-      </li>
-      <li>ConstantFP : This class represents a floating point constant.
-        <ul>
-       <li><tt>double getValue() const</tt>: Returns the underlying value of
-this constant. </li>
-        </ul>
-      </li>
-      <li>ConstantBool : This represents a boolean constant.
-        <ul>
-       <li><tt>bool getValue() const</tt>: Returns the underlying value of
-this constant. </li>
-        </ul>
-      </li>
-      <li>ConstantArray : This represents a constant array.
-        <ul>
-       <li><tt>const std::vector&lt;Use&gt; &amp;getValues() const</tt>:
-Returns a Vecotr of component constants that makeup this array. </li>
-        </ul>
-      </li>
-      <li>ConstantStruct : This represents a constant struct.
-        <ul>
-       <li><tt>const std::vector&lt;Use&gt; &amp;getValues() const</tt>:
-Returns a Vecotr of component constants that makeup this array. </li>
-        </ul>
-      </li>
-      <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. </li>
-        </ul>
-      </li>
+      <li><tt>int64_t getValue() const</tt>: Returns the underlying value of
+      this constant. </li>
+    </ul>
+  </li>
+  <li>ConstantUInt : This class represents an unsigned integer.
+    <ul>
+      <li><tt>uint64_t getValue() const</tt>: Returns the underlying value of 
+      this constant. </li>
+    </ul>
+  </li>
+  <li>ConstantFP : This class represents a floating point constant.
+    <ul>
+      <li><tt>double getValue() const</tt>: Returns the underlying value of 
+      this constant. </li>
     </ul>
   </li>
+  <li>ConstantBool : This represents a boolean constant.
+    <ul>
+      <li><tt>bool getValue() const</tt>: Returns the underlying value of this 
+      constant. </li>
+    </ul>
+  </li>
+  <li>ConstantArray : This represents a constant array.
+    <ul>
+      <li><tt>const std::vector&lt;Use&gt; &amp;getValues() const</tt>: Returns 
+      a vector of component constants that makeup this array. </li>
+    </ul>
+  </li>
+  <li>ConstantStruct : This represents a constant struct.
+    <ul>
+      <li><tt>const std::vector&lt;Use&gt; &amp;getValues() const</tt>: Returns 
+      a vector of component constants that makeup this array. </li>
+    </ul>
+  </li>
+  <li>GlobalValue : This represents either a global variable or a function. In 
+  either case, the value is a constant fixed address (after linking). 
+  </li>
 </ul>
-
 </div>
 
 <!-- ======================================================================= -->
@@ -1727,8 +1761,7 @@ types.</p>
   return false as they do with isSigned. This returns true for UByteTy,
   UShortTy, UIntTy, and ULongTy. </li>
 
-  <li><tt>bool isInteger() const</tt>: Equilivent to isSigned() || isUnsigned(),
-  but with only a single virtual function invocation.</li>
+  <li><tt>bool isInteger() const</tt>: Equivalent to isSigned() || isUnsigned().</li>
 
   <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>
@@ -1739,42 +1772,43 @@ types.</p>
   <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 or one pointer type to another.</li>
+</ul>
+</div>
 
-<br>
-    <p>Derived Types</p>
-
+<!-- _______________________________________________________________________ -->
+<div class="doc_subsubsection">
+  <a name="m_Value">Important Derived Types</a>
+</div>
+<div class="doc_text">
+<ul>
+  <li>SequentialType : This is subclassed by ArrayType and PointerType
     <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. </li>
-        </ul>
-      </li>
-      <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. </li>
-        </ul>
-      </li>
-      <li>PointerType : Subclass of SequentialType for  pointer types. </li>
-      <li>StructType : subclass of DerivedTypes for struct types </li>
-      <li>FunctionType : subclass of DerivedTypes for function types.
-        <ul>
-         <li><tt>bool isVarArg() const</tt>: Returns true if its a vararg
-          function</li>
-          <li><tt> const Type * getReturnType() const</tt>: Returns the
-          return type of the function.</li>
-          <li><tt>const Type * getParamType (unsigned i)</tt>: Returns
-          the type of the ith parameter.</li>
-          <li><tt> const unsigned getNumParams() const</tt>: Returns the
-          number of formal parameters.</li>
-        </ul>
-      </li>
+      <li><tt>const Type * getElementType() const</tt>: Returns the type of each
+      of the elements in the sequential type. </li>
+    </ul>
+  </li>
+  <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. </li>
+    </ul>
+  </li>
+  <li>PointerType : Subclass of SequentialType for  pointer types. </li>
+  <li>StructType : subclass of DerivedTypes for struct types </li>
+  <li>FunctionType : subclass of DerivedTypes for function types.
+    <ul>
+      <li><tt>bool isVarArg() const</tt>: Returns true if its a vararg
+      function</li>
+      <li><tt> const Type * getReturnType() const</tt>: Returns the
+      return type of the function.</li>
+      <li><tt>const Type * getParamType (unsigned i)</tt>: Returns
+      the type of the ith parameter.</li>
+      <li><tt> const unsigned getNumParams() const</tt>: Returns the
+      number of formal parameters.</li>
     </ul>
   </li>
 </ul>
-
 </div>
 
 <!-- ======================================================================= -->
@@ -1785,11 +1819,236 @@ elements in the array. </li>
 <div class="doc_text">
 
 <p>This subclass of Value defines the interface for incoming formal
-arguments to a function. A Function maitanis a list of its formal
+arguments to a function. A Function maintains a list of its formal
 arguments. An argument has a pointer to the parent Function.</p>
 
 </div>
 
+<!-- ======================================================================= -->
+<div class="doc_subsection">
+  <a name="SymbolTable">The <tt>SymbolTable</tt> class</a>
+</div>
+<div class="doc_text">
+<p>This class provides a symbol table that the
+<a href="#Function"><tt>Function</tt></a> and <a href="#Module">
+<tt>Module</tt></a> classes use for naming definitions. The symbol table can 
+provide a name for any <a href="#Value"><tt>Value</tt></a> or 
+<a href="#Type"><tt>Type</tt></a>.  <tt>SymbolTable</tt> is an abstract data 
+type. It hides the data it contains and provides access to it through a 
+controlled interface.</p>
+
+<p>To use the <tt>SymbolTable</tt> well, you need to understand the 
+structure of the information it holds. The class contains two 
+<tt>std::map</tt> objects. The first, <tt>pmap</tt>, is a map of 
+<tt>Type*</tt> to maps of name (<tt>std::string</tt>) to <tt>Value*</tt>. 
+The second, <tt>tmap</tt>, is a map of names to <tt>Type*</tt>. Thus, Values
+are stored in two-dimensions and accessed by <tt>Type</tt> and name. Types,
+however, are stored in a single dimension and accessed only by name.</p>
+
+<p>The interface of this class provides three basic types of operations:
+<ol>
+  <li><em>Accessors</em>. Accessors provide read-only access to information
+  such as finding a value for a name with the 
+  <a href="#SymbolTable_lookup">lookup</a> method.</li> 
+  <li><em>Mutators</em>. Mutators allow the user to add information to the
+  <tt>SymbolTable</tt> with methods like 
+  <a href="#SymbolTable_insert"><tt>insert</tt></a>.</li>
+  <li><em>Iterators</em>. Iterators allow the user to traverse the content
+  of the symbol table in well defined ways, such as the method
+  <a href="#SymbolTable_type_begin"><tt>type_begin</tt></a>.</li>
+</ol>
+
+<h3>Accessors</h3>
+<dl>
+  <dt><tt>Value* lookup(const Type* Ty, const std::string&amp; name) const</tt>:
+  </dt>
+  <dd>The <tt>lookup</tt> method searches the type plane given by the
+  <tt>Ty</tt> parameter for a <tt>Value</tt> with the provided <tt>name</tt>.
+  If a suitable <tt>Value</tt> is not found, null is returned.</dd>
+
+  <dt><tt>Type* lookupType( const std::string&amp; name) const</tt>:</dt>
+  <dd>The <tt>lookupType</tt> method searches through the types for a
+  <tt>Type</tt> with the provided <tt>name</tt>. If a suitable <tt>Type</tt>
+  is not found, null is returned.</dd>
+
+  <dt><tt>bool hasTypes() const</tt>:</dt>
+  <dd>This function returns true if an entry has been made into the type
+  map.</dd>
+
+  <dt><tt>bool isEmpty() const</tt>:</dt>
+  <dd>This function returns true if both the value and types maps are
+  empty</dd>
+
+  <dt><tt>std::string get_name(const Value*) const</tt>:</dt>
+  <dd>This function returns the name of the Value provided or the empty
+  string if the Value is not in the symbol table.</dd> 
+
+  <dt><tt>std::string get_name(const Type*) const</tt>:</dt>
+  <dd>This function returns the name of the Type provided or the empty
+  string if the Type is not in the symbol table.</dd>
+</dl>
+
+<h3>Mutators</h3>
+<dl>
+  <dt><tt>void insert(Value *Val)</tt>:</dt>
+  <dd>This method adds the provided value to the symbol table.  The Value must
+  have both a name and a type which are extracted and used to place the value
+  in the correct type plane under the value's name.</dd>
+
+  <dt><tt>void insert(const std::string&amp; Name, Value *Val)</tt>:</dt>
+  <dd> Inserts a constant or type into the symbol table with the specified
+  name. There can be a many to one mapping between names and constants
+  or types.</dd>
+
+  <dt><tt>void insert(const std::string&amp; Name, Type *Typ)</tt>:</dt>
+  <dd> Inserts a type into the symbol table with the specified name. There
+  can be a many-to-one mapping between names and types. This method
+  allows a type with an existing entry in the symbol table to get
+  a new name.</dd>
+
+  <dt><tt>void remove(Value* Val)</tt>:</dt>
+ <dd> This method removes a named value from the symbol table. The
+  type and name of the Value are extracted from \p N and used to
+  lookup the Value in the correct type plane. If the Value is
+  not in the symbol table, this method silently ignores the
+  request.</dd>
+
+  <dt><tt>void remove(Type* Typ)</tt>:</dt>
+  <dd> This method removes a named type from the symbol table. The
+  name of the type is extracted from \P T and used to look up
+  the Type in the type map. If the Type is not in the symbol
+  table, this method silently ignores the request.</dd>
+
+  <dt><tt>Value* remove(const std::string&amp; Name, Value *Val)</tt>:</dt>
+  <dd> Remove a constant or type with the specified name from the 
+  symbol table.</dd>
+
+  <dt><tt>Type* remove(const std::string&amp; Name, Type* T)</tt>:</dt>
+  <dd> Remove a type with the specified name from the symbol table.
+  Returns the removed Type.</dd>
+
+  <dt><tt>Value *value_remove(const value_iterator&amp; It)</tt>:</dt>
+  <dd> Removes a specific value from the symbol table. 
+  Returns the removed value.</dd>
+
+  <dt><tt>bool strip()</tt>:</dt>
+  <dd> This method will strip the symbol table of its names leaving
+  the type and values. </dd>
+
+  <dt><tt>void clear()</tt>:</dt>
+  <dd>Empty the symbol table completely.</dd>
+</dl>
+
+<h3>Iteration</h3>
+<p>The following functions describe three types of iterators you can obtain
+the beginning or end of the sequence for both const and non-const. It is
+important to keep track of the different kinds of iterators. There are
+three idioms worth pointing out:</p>
+<table>
+  <tr><th>Units</th><th>Iterator</th><th>Idiom</th></tr>
+  <tr>
+    <td align="left">Planes Of name/Value maps</td><td>PI</td>
+    <td align="left"><pre><tt>
+for (SymbolTable::plane_const_iterator PI = ST.plane_begin(),
+     PE = ST.plane_end(); PI != PE; ++PI ) {
+  PI-&gt;first // This is the Type* of the plane
+  PI-&gt;second // This is the SymbolTable::ValueMap of name/Value pairs
+    </tt></pre></td>
+  </tr>
+  <tr>
+    <td align="left">All name/Type Pairs</td><td>TI</td>
+    <td align="left"><pre><tt>
+for (SymbolTable::type_const_iterator TI = ST.type_begin(),
+     TE = ST.type_end(); TI != TE; ++TI )
+  TI-&gt;first  // This is the name of the type
+  TI-&gt;second // This is the Type* value associated with the name
+    </tt></pre></td>
+  </tr>
+  <tr>
+    <td align="left">name/Value pairs in a plane</td><td>VI</td>
+    <td align="left"><pre><tt>
+for (SymbolTable::value_const_iterator VI = ST.value_begin(SomeType),
+     VE = ST.value_end(SomeType); VI != VE; ++VI )
+  VI-&gt;first  // This is the name of the Value
+  VI-&gt;second // This is the Value* value associated with the name
+    </tt></pre></td>
+  </tr>
+</table>
+
+<p>Using the recommended iterator names and idioms will help you avoid
+making mistakes. Of particular note, make sure that whenever you use
+value_begin(SomeType) that you always compare the resulting iterator
+with value_end(SomeType) not value_end(SomeOtherType) or else you 
+will loop infinitely.</p>
+
+<dl>
+
+  <dt><tt>plane_iterator plane_begin()</tt>:</dt>
+  <dd>Get an iterator that starts at the beginning of the type planes.
+  The iterator will iterate over the Type/ValueMap pairs in the
+  type planes. </dd>
+
+  <dt><tt>plane_const_iterator plane_begin() const</tt>:</dt>
+  <dd>Get a const_iterator that starts at the beginning of the type 
+  planes.  The iterator will iterate over the Type/ValueMap pairs 
+  in the type planes. </dd>
+
+  <dt><tt>plane_iterator plane_end()</tt>:</dt>
+  <dd>Get an iterator at the end of the type planes. This serves as
+  the marker for end of iteration over the type planes.</dd>
+
+  <dt><tt>plane_const_iterator plane_end() const</tt>:</dt>
+  <dd>Get a const_iterator at the end of the type planes. This serves as
+  the marker for end of iteration over the type planes.</dd>
+
+  <dt><tt>value_iterator value_begin(const Type *Typ)</tt>:</dt>
+  <dd>Get an iterator that starts at the beginning of a type plane.
+  The iterator will iterate over the name/value pairs in the type plane.
+  Note: The type plane must already exist before using this.</dd>
+
+  <dt><tt>value_const_iterator value_begin(const Type *Typ) const</tt>:</dt>
+  <dd>Get a const_iterator that starts at the beginning of a type plane.
+  The iterator will iterate over the name/value pairs in the type plane.
+  Note: The type plane must already exist before using this.</dd>
+
+  <dt><tt>value_iterator value_end(const Type *Typ)</tt>:</dt>
+  <dd>Get an iterator to the end of a type plane. This serves as the marker
+  for end of iteration of the type plane.
+  Note: The type plane must already exist before using this.</dd>
+
+  <dt><tt>value_const_iterator value_end(const Type *Typ) const</tt>:</dt>
+  <dd>Get a const_iterator to the end of a type plane. This serves as the
+  marker for end of iteration of the type plane.
+  Note: the type plane must already exist before using this.</dd>
+
+  <dt><tt>type_iterator type_begin()</tt>:</dt>
+  <dd>Get an iterator to the start of the name/Type map.</dd>
+
+  <dt><tt>type_const_iterator type_begin() cons</tt>:</dt>
+  <dd> Get a const_iterator to the start of the name/Type map.</dd>
+
+  <dt><tt>type_iterator type_end()</tt>:</dt>
+  <dd>Get an iterator to the end of the name/Type map. This serves as the
+  marker for end of iteration of the types.</dd>
+
+  <dt><tt>type_const_iterator type_end() const</tt>:</dt>
+  <dd>Get a const-iterator to the end of the name/Type map. This serves 
+  as the marker for end of iteration of the types.</dd>
+
+  <dt><tt>plane_const_iterator find(const Type* Typ ) const</tt>:</dt>
+  <dd>This method returns a plane_const_iterator for iteration over
+  the type planes starting at a specific plane, given by \p Ty.</dd>
+
+  <dt><tt>plane_iterator find( const Type* Typ </tt>:</dt>
+  <dd>This method returns a plane_iterator for iteration over the
+  type planes starting at a specific plane, given by \p Ty.</dd>
+
+  <dt><tt>const ValueMap* findPlane( const Type* Typ ) cons</tt>:</dt>
+  <dd>This method returns a ValueMap* for a specific type plane. This
+  interface is deprecated and may go away in the future.</dd>
+</dl>
+</div>
+
 <!-- *********************************************************************** -->
 <hr>
 <address>
@@ -1806,3 +2065,5 @@ arguments. An argument has a pointer to the parent Function.</p>
 
 </body>
 </html>
+<!-- vim: sw=2 noai
+-->