<html dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style id="owaParaStyle" type="text/css">P {margin-top:0;margin-bottom:0;}</style>
</head>
<body ocsi="0" fpstyle="1">
<div style="direction: ltr;font-family: Tahoma;color: #000000;font-size: 10pt;">hi,<br>
<br>
i have an instrumentation pass which uses an instrumentation library (like the MemorySanitizer).  And i want to call this pass through my own flag '-dp'.  In order to achive it, i performed the following main steps:<br>
<br>
1. llvm-3.3.src/include/llvm/Transforms/Instrumentation.h<br>
    added a new function declaration: <i> FunctionPass *createDiscoPoPPass();</i><br>
<br>
2. llvm-3.3.src/lib/Transforms/Instrumentation.cpp:<br>
   added <i>initializeDiscoPoPPass</i>  at the end of function <i>initializeInstrumentation(PassRegistry &Registry)<br>
</i><br>
3. copied my instrumentation library to llvm-3.3.src/projects/compiler-rt/lib and modified the Makefile.mk, CMakeLists.txt respectively (in the same way for MemorySanitizer)<br>
<br>
4. copied the source file of my pass 'DiscoPoP.cpp' to llvm-3.3.src/lib/Transforms/Instrumentation and added the following code<br>
<i>                  INITIALIZE_PASS(DiscoPoP, "discoPoP", "analyze dependences", false, false)<br>
<br>
                  FunctionPass *llvm::createDiscoPoPPass() {<br>
                     return new DiscoPoP();<br>
                  }<br>
<br>
</i>5. Added my new flag:<br>
     Options.td:  def discoPoP : Flag<["-"], "dp">, Group<d_clang_Group>, Flags<[CC1Option]>, HelpText....
<br>
     LangOptions.def: LANGOPT(UseDiscoPoP, 1, 0, ".........")<br>
<br>
6. llvm-3.3.src/tools/clang/lib/Frontend/CompilerInvocation.cpp:<br>
      modified the function <i>ParseLangArgs</i> to save my option just like other options.<br>
<br>
7. llvm-3.3.src/tools/clang/lib/Driver/Toolsc.pp: just forwared my option in function
<i>Clang::ConstructJob</i><br>
<br>
8. llvm-3.3.src/tools/clang/lib/CodeGen/BackendUtil.cpp:<br>
    added new function:  <i>static void addDiscoPopPass(const PassManagerBuilder &Builder, PassManagerBase &PM) {  // add a new instance of DiscoPoP to PM .....}</i><br>
    added the following code to function <i>EmitAssemblyHelper::CreatePasses(TargetMachine *TM)</i>:
<br>
          <i>if (LangOpts.UseDiscoPoP)<br>
          { <br>
               PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast, addDiscoPopPass);<br>
               PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0, addDiscoPopPass);<br>
          }<br>
<br>
</i>9. llvm-3.3.src/tools/clang/lib/Driver/Driver.cpp: added the following functions to tell clang how to locate the runtime library for my pass<br>
 <i>        static void addDiscoPoPRTLinkFlagsLinux( // do the same step as for runtime lib of MemorySanitizer .... }
<br>
         static void addDiscoPoPRTLinux(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs)
</i><br>
<br>
After performing all those steps, i'm able to call my pass with <i>opt</i> and it works fine<br>
            clang -S -g -emit-llvm test.cc -o test.ll<br>
            opt -S -discoPoP --debug-pass=Structure < test.ll > test_ins.ll<br>
<br>
However if i call my pass with -O0 from clang directly then i got the following error :<br>
   ./clang++ -g -dp -std=c++11 -O0 test.cc<br>
  <br>
   <b>Pass 'DiscoPoP' is not initialized.</b><br>
   Verify if there is a pass dependency cycle.<br>
   Required Passes:<br>
   clang: PassManager.cpp:646: void llvm::PMTopLevelManager::schedulePass(llvm::Pass*): Assertion `PI && "Expected required passes to be initialized"' failed.<br>
<br>
I tried to figure out what is the difference between my pass and memory sanitizer. But i was not successful. Actually i did the same steps as for MemorySanitizer . 
<br>
Besides, if i call mypass with<b> -O1 or -O2 then my pass is initialized</b> :-). But i got another error which i could not figure out.<br>
<br>
   .... other passes<br>
   Dominator Tree Construction 0<br>
   Natural Loop Information 1<br>
   DiscoPoP 2<br>
   Preliminary module verification 0<br>
   Dominator Tree Construction 1<br>
   Function Pass: Module Verifier 2<br>
clang: /home/maus/Desktop/Thesis/llvm-3.3.src/include/llvm/Support/Casting.h:237: typename llvm::enable_if<llvm::is_same<Y, typename llvm::simplify_type<From>::SimpleType>, typename llvm::cast_retty<X, Y*>::ret_type>::type llvm::cast(Y*) [with X = llvm::PointerType;
 Y = llvm::Type; typename llvm::enable_if<llvm::is_same<Y, typename llvm::simplify_type<From>::SimpleType>, typename llvm::cast_retty<X, Y*>::ret_type>::type = llvm::PointerType*]: Assertion `isa<X>(Val) && "cast<Ty>() argument of incompatible type!"' failed.<br>
<br>
I greatly appreciate any help.  <br>
Best regards<br>
<br>
Tuan<br>
</div>
</body>
</html>