Remove the very out-of-date listing of "very important LLVM areas". I don't
[oota-llvm.git] / docs / WritingAnLLVMPass.html
index 136f8fbd55713c6aac76fdad5988697ea3fb9544..af1ffa4fb7adeb8e3bd26d0b65b68a8467d624f1 100644 (file)
@@ -4,7 +4,7 @@
 <head>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
   <title>Writing an LLVM Pass</title>
-  <link rel="stylesheet" href="llvm.css" type="text/css">
+  <link rel="stylesheet" href="_static/llvm.css" type="text/css">
 </head>
 <body>
 
@@ -227,11 +227,13 @@ the pass itself.</p>
 <p>Now that we have a way to compile our new pass, we just have to write it.
 Start out with:</p>
 
-<div class="doc_code"><pre>
+<div class="doc_code">
+<pre>
 <b>#include</b> "<a href="http://llvm.org/doxygen/Pass_8h-source.html">llvm/Pass.h</a>"
 <b>#include</b> "<a href="http://llvm.org/doxygen/Function_8h-source.html">llvm/Function.h</a>"
 <b>#include</b> "<a href="http://llvm.org/doxygen/raw__ostream_8h.html">llvm/Support/raw_ostream.h</a>"
-</pre></div>
+</pre>
+</div>
 
 <p>Which are needed because we are writing a <tt><a
 href="http://llvm.org/doxygen/classllvm_1_1Pass.html">Pass</a></tt>,
@@ -240,53 +242,66 @@ href="http://llvm.org/doxygen/classllvm_1_1Function.html">Function</a></tt>'s,
 and we will be doing some printing.</p>
 
 <p>Next we have:</p>
-<div class="doc_code"><pre>
+
+<div class="doc_code">
+<pre>
 <b>using namespace llvm;</b>
-</pre></div>
+</pre>
+</div>
+
 <p>... which is required because the functions from the include files 
-live in the llvm namespace.
-</p>
+live in the llvm namespace.</p>
 
 <p>Next we have:</p>
 
-<div class="doc_code"><pre>
+<div class="doc_code">
+<pre>
 <b>namespace</b> {
-</pre></div>
+</pre>
+</div>
 
 <p>... which starts out an anonymous namespace.  Anonymous namespaces are to C++
 what the "<tt>static</tt>" keyword is to C (at global scope).  It makes the
-things declared inside of the anonymous namespace only visible to the current
+things declared inside of the anonymous namespace visible only to the current
 file.  If you're not familiar with them, consult a decent C++ book for more
 information.</p>
 
 <p>Next, we declare our pass itself:</p>
 
-<div class="doc_code"><pre>
+<div class="doc_code">
+<pre>
   <b>struct</b> Hello : <b>public</b> <a href="#FunctionPass">FunctionPass</a> {
-</pre></div><p>
+</pre>
+</div>
 
 <p>This declares a "<tt>Hello</tt>" class that is a subclass of <tt><a
 href="http://llvm.org/doxygen/classllvm_1_1FunctionPass.html">FunctionPass</a></tt>.
 The different builtin pass subclasses are described in detail <a
 href="#passtype">later</a>, but for now, know that <a
-href="#FunctionPass"><tt>FunctionPass</tt></a>'s operate a function at a
+href="#FunctionPass"><tt>FunctionPass</tt></a>'s operate on a function at a
 time.</p>
 
-<div class="doc_code"><pre>
-     static char ID;
-     Hello() : FunctionPass(ID) {}
-</pre></div><p>
+<div class="doc_code">
+<pre>
+    static char ID;
+    Hello() : FunctionPass(ID) {}
+</pre>
+</div>
 
-<p> This declares pass identifier used by LLVM to identify pass. This allows LLVM to
-avoid using expensive C++ runtime information.</p>
+<p>This declares pass identifier used by LLVM to identify pass. This allows LLVM
+to avoid using expensive C++ runtime information.</p>
 
-<div class="doc_code"><pre>
+<div class="doc_code">
+<pre>
     <b>virtual bool</b> <a href="#runOnFunction">runOnFunction</a>(Function &amp;F) {
-      errs() &lt;&lt; "<i>Hello: </i>" &lt;&lt; F.getName() &lt;&lt; "\n";
+      errs() &lt;&lt; "<i>Hello: </i>";
+      errs().write_escaped(F.getName()) &lt;&lt; "\n";
       <b>return false</b>;
     }
   };  <i>// end of struct Hello</i>
-</pre></div>
+}  <i>// end of anonymous namespace</i>
+</pre>
+</div>
 
 <p>We declare a "<a href="#runOnFunction"><tt>runOnFunction</tt></a>" method,
 which overloads an abstract virtual method inherited from <a
@@ -294,31 +309,34 @@ href="#FunctionPass"><tt>FunctionPass</tt></a>.  This is where we are supposed
 to do our thing, so we just print out our message with the name of each
 function.</p>
 
-<div class="doc_code"><pre>
-  char Hello::ID = 0;
-</pre></div>
+<div class="doc_code">
+<pre>
+char Hello::ID = 0;
+</pre>
+</div>
 
-<p> We initialize pass ID here. LLVM uses ID's address to identify pass so 
+<p>We initialize pass ID here. LLVM uses ID's address to identify a pass, so
 initialization value is not important.</p>
 
-<div class="doc_code"><pre>
-  static 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>
+<div class="doc_code">
+<pre>
+static RegisterPass&lt;Hello&gt; X("<i>hello</i>", "<i>Hello World Pass</i>",
+                             false /* Only looks at CFG */,
+                             false /* Analysis Pass */);
+</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>".
-Last two arguments describe its behavior.
-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>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>". The last two arguments describe its behavior: if a pass walks CFG
+without modifying it then the third argument is set to <tt>true</tt>; if a pass
+is an analysis pass, for example dominator tree pass, then <tt>true</tt> is
+supplied as the fourth argument.</p>
 
 <p>As a whole, the <tt>.cpp</tt> file looks like:</p>
 
-<div class="doc_code"><pre>
+<div class="doc_code">
+<pre>
 <b>#include</b> "<a href="http://llvm.org/doxygen/Pass_8h-source.html">llvm/Pass.h</a>"
 <b>#include</b> "<a href="http://llvm.org/doxygen/Function_8h-source.html">llvm/Function.h</a>"
 <b>#include</b> "<a href="http://llvm.org/doxygen/raw__ostream_8h.html">llvm/Support/raw_ostream.h</a>"
@@ -332,24 +350,26 @@ is supplied as fourth argument. </p>
     Hello() : FunctionPass(ID) {}
 
     <b>virtual bool</b> <a href="#runOnFunction">runOnFunction</a>(Function &amp;F) {
-      errs() &lt;&lt; "<i>Hello: </i>" &lt;&lt; F.getName() &lt;&lt; "\n";
+      errs() &lt;&lt; "<i>Hello: </i>";
+      errs().write_escaped(F.getName()) &lt;&lt; '\n';
       <b>return false</b>;
     }
+
   };
-  
-  char Hello::ID = 0;
-  static RegisterPass&lt;Hello&gt; X("hello", "Hello World Pass", false, false);
 }
-
-</pre></div>
+  
+char Hello::ID = 0;
+static RegisterPass&lt;Hello&gt; X("hello", "Hello World Pass", false, false);
+</pre>
+</div>
 
 <p>Now that it's all together, compile the file with a simple "<tt>gmake</tt>"
 command in the local directory and you should get a new file
 "<tt>Debug+Asserts/lib/Hello.so</tt>" under the top level directory of the LLVM
 source tree (not in the local directory).  Note that everything in this file is
-contained in an anonymous namespace: this reflects the fact that passes are self
-contained units that do not need external interfaces (although they can have
-them) to be useful.</p>
+contained in an anonymous namespace &mdash; this reflects the fact that passes
+are self contained units that do not need external interfaces (although they can
+have them) to be useful.</p>
 
 </div>
 
@@ -397,17 +417,17 @@ USAGE: opt [options] &lt;input bitcode&gt;
 OPTIONS:
   Optimizations available:
 ...
-    -funcresolve    - Resolve Functions
-    -gcse           - Global Common Subexpression Elimination
-    -globaldce      - Dead Global Elimination
-    <b>-hello          - Hello World Pass</b>
-    -indvars        - Canonicalize Induction Variables
-    -inline         - Function Integration/Inlining
-    -instcombine    - Combine redundant instructions
+    -globalopt                - Global Variable Optimizer
+    -globalsmodref-aa         - Simple mod/ref analysis for globals
+    -gvn                      - Global Value Numbering
+    <b>-hello                    - Hello World Pass</b>
+    -indvars                  - Induction Variable Simplification
+    -inline                   - Function Integration/Inlining
+    -insert-edge-profiling    - Insert instrumentation for edge profiling
 ...
 </pre></div>
 
-<p>The pass name get added as the information string for your pass, giving some
+<p>The pass name gets added as the information string for your pass, giving some
 documentation to users of <tt>opt</tt>.  Now that you have a working pass, you
 would go ahead and make it do the cool transformations you want.  Once you get
 it all working and tested, it may become useful to find out how fast your pass
@@ -525,7 +545,7 @@ following signature:</p>
 <div>
 
 <div class="doc_code"><pre>
-  <b>virtual bool</b> runOnModule(Module &amp;M) = 0;
+<b>virtual bool</b> runOnModule(Module &amp;M) = 0;
 </pre></div>
 
 <p>The <tt>runOnModule</tt> method performs the interesting work of the pass.
@@ -592,7 +612,7 @@ false if they didn't.</p>
 <div>
 
 <div class="doc_code"><pre>
-  <b>virtual bool</b> doInitialization(CallGraph &amp;CG);
+<b>virtual bool</b> doInitialization(CallGraph &amp;CG);
 </pre></div>
 
 <p>The <tt>doIninitialize</tt> method is allowed to do most of the things that
@@ -613,7 +633,7 @@ fast).</p>
 <div>
 
 <div class="doc_code"><pre>
-  <b>virtual bool</b> runOnSCC(CallGraphSCC &amp;SCC) = 0;
+<b>virtual bool</b> runOnSCC(CallGraphSCC &amp;SCC) = 0;
 </pre></div>
 
 <p>The <tt>runOnSCC</tt> method performs the interesting work of the pass, and
@@ -632,7 +652,7 @@ otherwise.</p>
 <div>
 
 <div class="doc_code"><pre>
-  <b>virtual bool</b> doFinalization(CallGraph &amp;CG);
+<b>virtual bool</b> doFinalization(CallGraph &amp;CG);
 </pre></div>
 
 <p>The <tt>doFinalization</tt> method is an infrequently used method that is
@@ -684,7 +704,7 @@ should return true if they modified the program, or false if they didn't.</p>
 <div>
 
 <div class="doc_code"><pre>
-  <b>virtual bool</b> doInitialization(Module &amp;M);
+<b>virtual bool</b> doInitialization(Module &amp;M);
 </pre></div>
 
 <p>The <tt>doIninitialize</tt> method is allowed to do most of the things that
@@ -712,7 +732,7 @@ free functions that it needs, adding prototypes to the module if necessary.</p>
 <div>
 
 <div class="doc_code"><pre>
-  <b>virtual bool</b> runOnFunction(Function &amp;F) = 0;
+<b>virtual bool</b> runOnFunction(Function &amp;F) = 0;
 </pre></div><p>
 
 <p>The <tt>runOnFunction</tt> method must be implemented by your subclass to do
@@ -731,7 +751,7 @@ be returned if the function is modified.</p>
 <div>
 
 <div class="doc_code"><pre>
-  <b>virtual bool</b> doFinalization(Module &amp;M);
+<b>virtual bool</b> doFinalization(Module &amp;M);
 </pre></div>
 
 <p>The <tt>doFinalization</tt> method is an infrequently used method that is
@@ -770,7 +790,7 @@ program, or false if they didn't. </p>
 <div>
 
 <div class="doc_code"><pre>
-  <b>virtual bool</b> doInitialization(Loop *, LPPassManager &amp;LPM);
+<b>virtual bool</b> doInitialization(Loop *, LPPassManager &amp;LPM);
 </pre></div>
 
 <p>The <tt>doInitialization</tt> method is designed to do simple initialization 
@@ -791,7 +811,7 @@ information.</p>
 <div>
 
 <div class="doc_code"><pre>
-  <b>virtual bool</b> runOnLoop(Loop *, LPPassManager &amp;LPM) = 0;
+<b>virtual bool</b> runOnLoop(Loop *, LPPassManager &amp;LPM) = 0;
 </pre></div><p>
 
 <p>The <tt>runOnLoop</tt> method must be implemented by your subclass to do
@@ -809,7 +829,7 @@ should be used to update loop nest.</p>
 <div>
 
 <div class="doc_code"><pre>
-  <b>virtual bool</b> doFinalization();
+<b>virtual bool</b> doFinalization();
 </pre></div>
 
 <p>The <tt>doFinalization</tt> method is an infrequently used method that is
@@ -849,7 +869,7 @@ methods should return true if they modified the program, or false if they didn n
 <div>
 
 <div class="doc_code"><pre>
-  <b>virtual bool</b> doInitialization(Region *, RGPassManager &amp;RGM);
+<b>virtual bool</b> doInitialization(Region *, RGPassManager &amp;RGM);
 </pre></div>
 
 <p>The <tt>doInitialization</tt> method is designed to do simple initialization
@@ -870,7 +890,7 @@ information.</p>
 <div>
 
 <div class="doc_code"><pre>
-  <b>virtual bool</b> runOnRegion(Region *, RGPassManager &amp;RGM) = 0;
+<b>virtual bool</b> runOnRegion(Region *, RGPassManager &amp;RGM) = 0;
 </pre></div><p>
 
 <p>The <tt>runOnRegion</tt> method must be implemented by your subclass to do
@@ -888,7 +908,7 @@ should be used to update region tree.</p>
 <div>
 
 <div class="doc_code"><pre>
-  <b>virtual bool</b> doFinalization();
+<b>virtual bool</b> doFinalization();
 </pre></div>
 
 <p>The <tt>doFinalization</tt> method is an infrequently used method that is
@@ -937,7 +957,7 @@ href="#FunctionPass"><tt>FunctionPass</tt></a>'s have, but also have the followi
 <div>
 
 <div class="doc_code"><pre>
-  <b>virtual bool</b> doInitialization(Function &amp;F);
+<b>virtual bool</b> doInitialization(Function &amp;F);
 </pre></div>
 
 <p>The <tt>doIninitialize</tt> method is allowed to do most of the things that
@@ -958,7 +978,7 @@ fast).</p>
 <div>
 
 <div class="doc_code"><pre>
-  <b>virtual bool</b> runOnBasicBlock(BasicBlock &amp;BB) = 0;
+<b>virtual bool</b> runOnBasicBlock(BasicBlock &amp;BB) = 0;
 </pre></div>
 
 <p>Override this function to do the work of the <tt>BasicBlockPass</tt>.  This
@@ -978,7 +998,7 @@ if the basic block is modified.</p>
 <div>
 
 <div class="doc_code"><pre>
-  <b>virtual bool</b> doFinalization(Function &amp;F);
+<b>virtual bool</b> doFinalization(Function &amp;F);
 </pre></div>
 
 <p>The <tt>doFinalization</tt> method is an infrequently used method that is
@@ -1031,7 +1051,7 @@ data)</li>
 <div>
 
 <div class="doc_code"><pre>
-  <b>virtual bool</b> runOnMachineFunction(MachineFunction &amp;MF) = 0;
+<b>virtual bool</b> runOnMachineFunction(MachineFunction &amp;MF) = 0;
 </pre></div>
 
 <p><tt>runOnMachineFunction</tt> can be considered the main entry point of a
@@ -1084,7 +1104,7 @@ implement the virtual <tt>print</tt> method:</p>
 <div>
 
 <div class="doc_code"><pre>
-  <b>virtual void</b> print(std::ostream &amp;O, <b>const</b> Module *M) <b>const</b>;
+<b>virtual void</b> print(std::ostream &amp;O, <b>const</b> Module *M) <b>const</b>;
 </pre></div>
 
 <p>The <tt>print</tt> method must be implemented by "analyses" in order to print
@@ -1134,7 +1154,7 @@ having any prerequisite passes, and invalidating <b>all</b> other passes.</p>
 <div>
 
 <div class="doc_code"><pre>
-  <b>virtual void</b> getAnalysisUsage(AnalysisUsage &amp;Info) <b>const</b>;
+<b>virtual void</b> getAnalysisUsage(AnalysisUsage &amp;Info) <b>const</b>;
 </pre></div>
 
 <p>By implementing the <tt>getAnalysisUsage</tt> method, the required and
@@ -1222,11 +1242,11 @@ the fact that it hacks on the CFG.
 <div>
 
 <div class="doc_code"><pre>
-  <i>// This example modifies the program, but does not modify the CFG</i>
-  <b>void</b> <a href="http://llvm.org/doxygen/structLICM.html">LICM</a>::getAnalysisUsage(AnalysisUsage &amp;AU) <b>const</b> {
-    AU.setPreservesCFG();
-    AU.addRequired&lt;<a href="http://llvm.org/doxygen/classllvm_1_1LoopInfo.html">LoopInfo</a>&gt;();
-  }
+<i>// This example modifies the program, but does not modify the CFG</i>
+<b>void</b> <a href="http://llvm.org/doxygen/structLICM.html">LICM</a>::getAnalysisUsage(AnalysisUsage &amp;AU) <b>const</b> {
+  AU.setPreservesCFG();
+  AU.addRequired&lt;<a href="http://llvm.org/doxygen/classllvm_1_1LoopInfo.html">LoopInfo</a>&gt;();
+}
 </pre></div>
 
 </div>
@@ -1248,10 +1268,10 @@ method.  It takes a single template argument that specifies which pass class you
 want, and returns a reference to that pass.  For example:</p>
 
 <div class="doc_code"><pre>
-   bool LICM::runOnFunction(Function &amp;F) {
-     LoopInfo &amp;LI = getAnalysis&lt;LoopInfo&gt;();
-     ...
-   }
+bool LICM::runOnFunction(Function &amp;F) {
+  LoopInfo &amp;LI = getAnalysis&lt;LoopInfo&gt;();
+  ...
+}
 </pre></div>
 
 <p>This method call returns a reference to the pass desired.  You may get a
@@ -1265,11 +1285,11 @@ A module level pass can use function level analysis info using this interface.
 For example:</p>
 
 <div class="doc_code"><pre>
-   bool ModuleLevelPass::runOnModule(Module &amp;M) {
-     ...
-     DominatorTree &amp;DT = getAnalysis&lt;DominatorTree&gt;(Func);
-     ...
-   }
+bool ModuleLevelPass::runOnModule(Module &amp;M) {
+  ...
+  DominatorTree &amp;DT = getAnalysis&lt;DominatorTree&gt;(Func);
+  ...
+}
 </pre></div>
 
 <p>In above example, runOnFunction for DominatorTree is called by pass manager
@@ -1282,11 +1302,11 @@ If your pass is capable of updating analyses if they exist (e.g.,
 if it is active.  For example:</p>
 
 <div class="doc_code"><pre>
-  ...
-  if (DominatorSet *DS = getAnalysisIfAvailable&lt;DominatorSet&gt;()) {
-    <i>// A DominatorSet is active.  This code will update it.</i>
-  }
-  ...
+...
+if (DominatorSet *DS = getAnalysisIfAvailable&lt;DominatorSet&gt;()) {
+  <i>// A DominatorSet is active.  This code will update it.</i>
+}
+...
 </pre></div>
 
 </div>
@@ -1385,7 +1405,7 @@ Unlike registration of passes, there is no command line argument to be specified
 for the Analysis Group Interface itself, because it is "abstract":</p>
 
 <div class="doc_code"><pre>
-  <b>static</b> RegisterAnalysisGroup&lt;<a href="http://llvm.org/doxygen/classllvm_1_1AliasAnalysis.html">AliasAnalysis</a>&gt; A("<i>Alias Analysis</i>");
+<b>static</b> RegisterAnalysisGroup&lt;<a href="http://llvm.org/doxygen/classllvm_1_1AliasAnalysis.html">AliasAnalysis</a>&gt; A("<i>Alias Analysis</i>");
 </pre></div>
 
 <p>Once the analysis is registered, passes can declare that they are valid
@@ -1396,10 +1416,9 @@ implementations of the interface by using the following code:</p>
   //<i> Declare that we implement the AliasAnalysis interface</i>
   INITIALIZE_AG_PASS(FancyAA, <a href="http://llvm.org/doxygen/classllvm_1_1AliasAnalysis.html">AliasAnalysis</a>, "<i>somefancyaa</i>",
                      "<i>A more complex alias analysis implementation</i>",
-                     false, // <i>Is CFG Only?</i>
-                     true,  // <i>Is Analysis?</i>
-                     false, // <i>Is default Analysis Group implementation?</i>
-                    );
+                     false,  // <i>Is CFG Only?</i>
+                     true,   // <i>Is Analysis?</i>
+                     false); // <i>Is default Analysis Group implementation?</i>
 }
 </pre></div>
 
@@ -1416,8 +1435,7 @@ this macro.</p>
                      "<i>Basic Alias Analysis (default AA impl)</i>",
                      false, // <i>Is CFG Only?</i>
                      true,  // <i>Is Analysis?</i>
-                     true, // <i>Is default Analysis Group implementation?</i>
-                    );
+                     true); // <i>Is default Analysis Group implementation?</i>
 }
 </pre></div>
 
@@ -1586,10 +1604,10 @@ we need to add the following <a
 href="#getAnalysisUsage"><tt>getAnalysisUsage</tt></a> method to our pass:</p>
 
 <div class="doc_code"><pre>
-    <i>// We don't modify the program, so we preserve all analyses</i>
-    <b>virtual void</b> getAnalysisUsage(AnalysisUsage &amp;AU) <b>const</b> {
-      AU.setPreservesAll();
-    }
+<i>// We don't modify the program, so we preserve all analyses</i>
+<b>virtual void</b> getAnalysisUsage(AnalysisUsage &amp;AU) <b>const</b> {
+  AU.setPreservesAll();
+}
 </pre></div>
 
 <p>Now when we run our pass, we get this output:</p>
@@ -1697,19 +1715,19 @@ machine passes.  Here we will describe how to <i>register</i> a register
 allocator machine pass.</p>
 
 <p>Implement your register allocator machine pass.  In your register allocator
-.cpp file add the following include;</p>
+<tt>.cpp</tt> file add the following include;</p>
 
 <div class="doc_code"><pre>
-  #include "llvm/CodeGen/RegAllocRegistry.h"
+#include "llvm/CodeGen/RegAllocRegistry.h"
 </pre></div>
 
 <p>Also in your register allocator .cpp file, define a creator function in the
 form; </p>
 
 <div class="doc_code"><pre>
-  FunctionPass *createMyRegisterAllocator() {
-    return new MyRegisterAllocator();
-  }
+FunctionPass *createMyRegisterAllocator() {
+  return new MyRegisterAllocator();
+}
 </pre></div>
 
 <p>Note that the signature of this function should match the type of
@@ -1717,9 +1735,9 @@ form; </p>
 "installing" declaration, in the form;</p>
 
 <div class="doc_code"><pre>
-  static RegisterRegAlloc myRegAlloc("myregalloc",
-    "  my register allocator help string",
-    createMyRegisterAllocator);
+static RegisterRegAlloc myRegAlloc("myregalloc",
+                                   "my register allocator help string",
+                                   createMyRegisterAllocator);
 </pre></div>
 
 <p>Note the two spaces prior to the help string produces a tidy result on the
@@ -1770,11 +1788,11 @@ MachinePassRegistry RegisterMyPasses::Registry;
 <p>And finally, declare the command line option for your passes.  Example:</p> 
 
 <div class="doc_code"><pre>
-  cl::opt&lt;RegisterMyPasses::FunctionPassCtor, false,
-          RegisterPassParser&lt;RegisterMyPasses&gt; &gt;
-  MyPassOpt("mypass",
-            cl::init(&amp;createDefaultMyPass),
-            cl::desc("my pass option help")); 
+cl::opt&lt;RegisterMyPasses::FunctionPassCtor, false,
+        RegisterPassParser&lt;RegisterMyPasses&gt; &gt;
+MyPassOpt("mypass",
+          cl::init(&amp;createDefaultMyPass),
+          cl::desc("my pass option help")); 
 </pre></div>
 
 <p>Here the command option is "mypass", with createDefaultMyPass as the default