fix warning when assertions disabled.
[oota-llvm.git] / docs / WritingAnLLVMPass.html
index f65b6791d31d36c2fdf25e524120282002e7b1e9..07e736da691e55ae8a2aa1325e72dc0c9e2205f1 100644 (file)
@@ -264,7 +264,7 @@ time.</p>
 
 <div class="doc_code"><pre>
      static char ID;
 
 <div class="doc_code"><pre>
      static char ID;
-     Hello() : FunctionPass((intptr_t)&ID) {}
+     Hello() : FunctionPass((intptr_t)&amp;ID) {}
 </pre></div><p>
 
 <p> This declares pass identifier used by LLVM to identify pass. This allows LLVM to
 </pre></div><p>
 
 <p> This declares pass identifier used by LLVM to identify pass. This allows LLVM to
@@ -292,13 +292,19 @@ function.</p>
 initialization value is not important.</p>
 
 <div class="doc_code"><pre>
 initialization value is not important.</p>
 
 <div class="doc_code"><pre>
-  RegisterPass&lt;Hello&gt; X("<i>hello</i>", "<i>Hello World Pass</i>");
+  RegisterPass&lt;Hello&gt; X("<i>hello</i>", "<i>Hello World Pass</i>",
+                        false /* Only looks at CFG */,
+                        false /* Analysis Pass */);
 }  <i>// end of anonymous namespace</i>
 </pre></div>
 
 <p>Lastly, we <a href="#registration">register our class</a> <tt>Hello</tt>, 
 giving it a command line
 }  <i>// end of anonymous namespace</i>
 </pre></div>
 
 <p>Lastly, we <a href="#registration">register our class</a> <tt>Hello</tt>, 
 giving it a command line
-argument "<tt>hello</tt>", and a name "<tt>Hello World Pass</tt>".</p>
+argument "<tt>hello</tt>", and a name "<tt>Hello World Pass</tt>".
+Last two RegisterPass arguments are optional. Their default value is false.
+If a pass walks CFG without modifying it then third argument is set to true. 
+If  a pass is an analysis pass, for example dominator tree pass, then true 
+is supplied as fourth argument. </p>
 
 <p>As a whole, the <tt>.cpp</tt> file looks like:</p>
 
 
 <p>As a whole, the <tt>.cpp</tt> file looks like:</p>
 
@@ -312,7 +318,7 @@ argument "<tt>hello</tt>", and a name "<tt>Hello World Pass</tt>".</p>
   <b>struct Hello</b> : <b>public</b> <a href="#FunctionPass">FunctionPass</a> {
     
     static char ID;
   <b>struct Hello</b> : <b>public</b> <a href="#FunctionPass">FunctionPass</a> {
     
     static char ID;
-    Hello() : FunctionPass((intptr_t)&ID) {}
+    Hello() : FunctionPass((intptr_t)&amp;ID) {}
 
     <b>virtual bool</b> <a href="#runOnFunction">runOnFunction</a>(Function &amp;F) {
       llvm::cerr &lt;&lt; "<i>Hello: </i>" &lt;&lt; F.getName() &lt;&lt; "\n";
 
     <b>virtual bool</b> <a href="#runOnFunction">runOnFunction</a>(Function &amp;F) {
       llvm::cerr &lt;&lt; "<i>Hello: </i>" &lt;&lt; F.getName() &lt;&lt; "\n";
@@ -320,6 +326,7 @@ argument "<tt>hello</tt>", and a name "<tt>Hello World Pass</tt>".</p>
     }
   };
   
     }
   };
   
+  char Hello::ID = 0;
   RegisterPass&lt;Hello&gt; X("<i>hello</i>", "<i>Hello World Pass</i>");
 }
 </pre></div>
   RegisterPass&lt;Hello&gt; X("<i>hello</i>", "<i>Hello World Pass</i>");
 }
 </pre></div>
@@ -347,8 +354,8 @@ use the <tt>opt</tt> tool to access it, once loaded.</p>
 
 <p>To test it, follow the example at the end of the <a
 href="GettingStarted.html">Getting Started Guide</a> to compile "Hello World" to
 
 <p>To test it, follow the example at the end of the <a
 href="GettingStarted.html">Getting Started Guide</a> to compile "Hello World" to
-LLVM.  We can now run the bytecode file (<tt>hello.bc</tt>) for the program
-through our transformation like this (or course, any bytecode file will
+LLVM.  We can now run the bitcode file (<tt>hello.bc</tt>) for the program
+through our transformation like this (or course, any bitcode file will
 work):</p>
 
 <div class="doc_code"><pre>
 work):</p>
 
 <div class="doc_code"><pre>
@@ -372,7 +379,7 @@ interesting way, we just throw away the result of <tt>opt</tt> (sending it to
 $ opt -load ../../../Debug/lib/Hello.so --help
 OVERVIEW: llvm .bc -&gt; .bc modular optimizer
 
 $ opt -load ../../../Debug/lib/Hello.so --help
 OVERVIEW: llvm .bc -&gt; .bc modular optimizer
 
-USAGE: opt [options] &lt;input bytecode&gt;
+USAGE: opt [options] &lt;input bitcode&gt;
 
 OPTIONS:
   Optimizations available:
 
 OPTIONS:
   Optimizations available:
@@ -407,7 +414,7 @@ Hello: main
   Total Execution Time: 0.02 seconds (0.0479059 wall clock)
 
    ---User Time---   --System Time--   --User+System--   ---Wall Time---  --- Pass Name ---
   Total Execution Time: 0.02 seconds (0.0479059 wall clock)
 
    ---User Time---   --System Time--   --User+System--   ---Wall Time---  --- Pass Name ---
-   0.0100 (100.0%)   0.0000 (  0.0%)   0.0100 ( 50.0%)   0.0402 ( 84.0%)  Bytecode Writer
+   0.0100 (100.0%)   0.0000 (  0.0%)   0.0100 ( 50.0%)   0.0402 ( 84.0%)  Bitcode Writer
    0.0000 (  0.0%)   0.0100 (100.0%)   0.0100 ( 50.0%)   0.0031 (  6.4%)  Dominator Set Construction
    0.0000 (  0.0%)   0.0000 (  0.0%)   0.0000 (  0.0%)   0.0013 (  2.7%)  Module Verifier
  <b>  0.0000 (  0.0%)   0.0000 (  0.0%)   0.0000 (  0.0%)   0.0033 (  6.9%)  Hello World Pass</b>
    0.0000 (  0.0%)   0.0100 (100.0%)   0.0100 ( 50.0%)   0.0031 (  6.4%)  Dominator Set Construction
    0.0000 (  0.0%)   0.0000 (  0.0%)   0.0000 (  0.0%)   0.0013 (  2.7%)  Module Verifier
  <b>  0.0000 (  0.0%)   0.0000 (  0.0%)   0.0000 (  0.0%)   0.0033 (  6.9%)  Hello World Pass</b>
@@ -485,7 +492,7 @@ refering to function bodies in no predictable order, or adding and removing
 functions.  Because nothing is known about the behavior of <tt>ModulePass</tt>
 subclasses, no optimization can be done for their execution. A module pass
 can use function level passes (e.g. dominators) using getAnalysis interface
 functions.  Because nothing is known about the behavior of <tt>ModulePass</tt>
 subclasses, no optimization can be done for their execution. A module pass
 can use function level passes (e.g. dominators) using getAnalysis interface
-<tt> getAnalysis<DominatorTree>(Function)</tt>. </p> 
+<tt> getAnalysis&lt;DominatorTree&gt;(Function)</tt>. </p> 
 
 <p>To write a correct <tt>ModulePass</tt> subclass, derive from
 <tt>ModulePass</tt> and overload the <tt>runOnModule</tt> method with the
 
 <p>To write a correct <tt>ModulePass</tt> subclass, derive from
 <tt>ModulePass</tt> and overload the <tt>runOnModule</tt> method with the
@@ -537,7 +544,7 @@ href="#BasicBlockPass">BasicBlockPass</a></tt>, you should derive from
 <li>... <em>not allowed</em> to modify any <tt>Function</tt>s that are not in
 the current SCC.</li>
 
 <li>... <em>not allowed</em> to modify any <tt>Function</tt>s that are not in
 the current SCC.</li>
 
-<li>... <em>allowed</em> to inspect any Function's other than those in the
+<li>... <em>not allowed</em> to inspect any Function's other than those in the
 current SCC and the direct callees of the SCC.</li>
 
 <li>... <em>required</em> to preserve the current CallGraph object, updating it
 current SCC and the direct callees of the SCC.</li>
 
 <li>... <em>required</em> to preserve the current CallGraph object, updating it
@@ -746,7 +753,7 @@ program, or false if they didn't. </p>
   <b>virtual bool</b> doInitialization(Loop *, LPPassManager &amp;LPM);
 </pre></div>
 
   <b>virtual bool</b> doInitialization(Loop *, LPPassManager &amp;LPM);
 </pre></div>
 
-The <tt>doInitialization</tt> method is designed to do simple initialization 
+<p>The <tt>doInitialization</tt> method is designed to do simple initialization 
 type of stuff that does not depend on the functions being processed.  The 
 <tt>doInitialization</tt> method call is not scheduled to overlap with any 
 other pass executions (thus it should be very fast). LPPassManager 
 type of stuff that does not depend on the functions being processed.  The 
 <tt>doInitialization</tt> method call is not scheduled to overlap with any 
 other pass executions (thus it should be very fast). LPPassManager 
@@ -995,7 +1002,7 @@ depended on.</p>
 
 <div class="doc_text">
 
 
 <div class="doc_text">
 
-<p>One of the main responsibilities of the <tt>PassManager</tt> is the make sure
+<p>One of the main responsibilities of the <tt>PassManager</tt> is to make sure
 that passes interact with each other correctly.  Because <tt>PassManager</tt>
 tries to <a href="#passmanager">optimize the execution of passes</a> it must
 know how the passes interact with each other and what dependencies exist between
 that passes interact with each other correctly.  Because <tt>PassManager</tt>
 tries to <a href="#passmanager">optimize the execution of passes</a> it must
 know how the passes interact with each other and what dependencies exist between
@@ -1159,7 +1166,7 @@ For example:</p>
    }
 </pre></div>
 
    }
 </pre></div>
 
-In above example, runOnFunction for DominatorTree is called by pass manager
+<p>In above example, runOnFunction for DominatorTree is called by pass manager
 before returning a reference to the desired pass.</p>
 
 <p>
 before returning a reference to the desired pass.</p>
 
 <p>
@@ -1186,7 +1193,7 @@ it is active.  For example:</p>
 
 <div class="doc_text">
 
 
 <div class="doc_text">
 
-<p>Now that we understand the basics of how passes are defined, how the are
+<p>Now that we understand the basics of how passes are defined, how they are
 used, and how they are required from other passes, it's time to get a little bit
 fancier.  All of the pass relationships that we have seen so far are very
 simple: one pass depends on one other specific pass to be run before it can run.
 used, and how they are required from other passes, it's time to get a little bit
 fancier.  All of the pass relationships that we have seen so far are very
 simple: one pass depends on one other specific pass to be run before it can run.
@@ -1308,8 +1315,9 @@ no problem.</p>
 <p>Here we show how the default implementation is specified (using the extra
 argument to the <tt>RegisterAnalysisGroup</tt> template).  There must be exactly
 one default implementation available at all times for an Analysis Group to be
 <p>Here we show how the default implementation is specified (using the extra
 argument to the <tt>RegisterAnalysisGroup</tt> template).  There must be exactly
 one default implementation available at all times for an Analysis Group to be
-used.  Here we declare that the <tt><a
-href="http://llvm.org/doxygen/structBasicAliasAnalysis.html">BasicAliasAnalysis</a></tt>
+used.  Only default implementation can derive from <tt>ImmutablePass</tt>. 
+Here we declare that the
+ <tt><a href="http://llvm.org/doxygen/structBasicAliasAnalysis.html">BasicAliasAnalysis</a></tt>
 pass is the default implementation for the interface.</p>
 
 </div>
 pass is the default implementation for the interface.</p>
 
 </div>
@@ -1374,7 +1382,8 @@ the LLVM program representation for a single function at a time, instead of
 traversing the entire program.  It reduces the memory consumption of compiler,
 because, for example, only one <a
 href="http://llvm.org/doxygen/classllvm_1_1DominatorSet.html"><tt>DominatorSet</tt></a>
 traversing the entire program.  It reduces the memory consumption of compiler,
 because, for example, only one <a
 href="http://llvm.org/doxygen/classllvm_1_1DominatorSet.html"><tt>DominatorSet</tt></a>
-needs to be calculated at a time.  This also makes it possible some <a
+needs to be calculated at a time.  This also makes it possible to implement
+some <a
 href="#SMP">interesting enhancements</a> in the future.</p></li>
 
 </ol>
 href="#SMP">interesting enhancements</a> in the future.</p></li>
 
 </ol>
@@ -1412,8 +1421,8 @@ Module Pass Manager
     Module Verifier
 --  Dominator Set Construction
 --  Module Verifier
     Module Verifier
 --  Dominator Set Construction
 --  Module Verifier
-  Bytecode Writer
---Bytecode Writer
+  Bitcode Writer
+--Bitcode Writer
 </pre></div>
 
 <p>This output shows us when passes are constructed and when the analysis
 </pre></div>
 
 <p>This output shows us when passes are constructed and when the analysis
@@ -1453,8 +1462,8 @@ Module Pass Manager
     Module Verifier
 --  Dominator Set Construction
 --  Module Verifier
     Module Verifier
 --  Dominator Set Construction
 --  Module Verifier
-  Bytecode Writer
---Bytecode Writer
+  Bitcode Writer
+--Bitcode Writer
 Hello: __main
 Hello: puts
 Hello: main
 Hello: __main
 Hello: puts
 Hello: main
@@ -1493,8 +1502,8 @@ Module Pass Manager
     Module Verifier
 --  Dominator Set Construction
 --  Module Verifier
     Module Verifier
 --  Dominator Set Construction
 --  Module Verifier
-  Bytecode Writer
---Bytecode Writer
+  Bitcode Writer
+--Bitcode Writer
 Hello: __main
 Hello: puts
 Hello: main
 Hello: __main
 Hello: puts
 Hello: main
@@ -1797,6 +1806,8 @@ places (for global resources).  Although this is a simple extension, we simply
 haven't had time (or multiprocessor machines, thus a reason) to implement this.
 Despite that, we have kept the LLVM passes SMP ready, and you should too.</p>
 
 haven't had time (or multiprocessor machines, thus a reason) to implement this.
 Despite that, we have kept the LLVM passes SMP ready, and you should too.</p>
 
+</div>
+
 <!-- *********************************************************************** -->
 <hr>
 <address>
 <!-- *********************************************************************** -->
 <hr>
 <address>