<div dir="ltr">Dear John,<div>Thank you so much for your help. I looked at those documents. Could you kindly answer the following questions:</div><div><br></div><div>Does it mean that I have to make my own backend target in order to write a machine pass even if I want to run a simple machinefunction pass?  for example,if I want my pass to get MIPS instructions as an input, I have to copy all the files from mips target and add a file to it which implements my pass. and there should be a way to connect the pass to other MIPS backend files? </div><div><br></div><div>As a result, is the way that I described in my first post completely wrong because I cannot run a stand alone machine function pass like a frontend function pass?</div><div><br></div><div>Also another question, I'm a PhD student and I'm completely new to the llvm backend process. I want to estimate my project time. How long approximately do you think it will take to be get familiar with backend and be able to write machinefunction pass? for further steps I have to implement a register allocation algorithm.</div><div><br></div><div>Regards,</div><div>Fami</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Nov 3, 2015 at 3:52 PM, John Criswell <span dir="ltr"><<a href="mailto:jtcriswel@gmail.com" target="_blank">jtcriswel@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  
    
  
  <div bgcolor="#FFFFFF" text="#000000">
    <div>Dear Fami,<br>
      <br>
      A MachineFunctionPass is run by the code generator, so you can
      only use it in tools like llc, clang, and libLTO.  The opt program
      only manipulates LLVM IR and therefore does not run
      MachineFunctionPass'es.<br>
      <br>
      Regarding documentation, have you looked at the following?<br>
      <br>
      <a href="http://llvm.org/docs/WritingAnLLVMBackend.html" target="_blank">http://llvm.org/docs/WritingAnLLVMBackend.html</a><br>
      <a href="http://llvm.org/docs/CodeGenerator.html" target="_blank">http://llvm.org/docs/CodeGenerator.html</a><br>
      <a href="http://llvm.org/docs/MIRLangRef.html" target="_blank">http://llvm.org/docs/MIRLangRef.html</a><br>
      <br>
      Regards,<br>
      <br>
      John Criswell<div><div class="h5"><br>
      <br>
      On 11/3/15 3:47 PM, fateme Hoseini via llvm-dev wrote:<br>
    </div></div></div>
    <blockquote type="cite"><div><div class="h5">
      
      <div dir="ltr">
        <div>Hi everyone,</div>
        <div>I am a LLVM newbie. I need to write a machinefunction pass
          for my project. This should be an analyzer of the machine code
          to do some profiling. I have written a couple of function
          passes for front end, but it seems they are completely
          different. I searched through forum and llvm documents, but
          couldn't find anything useful or questions were unanswered.
          Can anyone reference me to any material on how to do that or
          help me with my roblem.</div>
        <div><br>
        </div>
        <div>I have created a folder in: lib/Transform and put my pass
          in it.</div>
        <div>I am writing a simple pass like this:</div>
        <div><br>
        </div>
        <div>using namespace llvm;</div>
        <div><br>
        </div>
        <div>namespace {</div>
        <div><span> </span></div>
        <div>    struct analyzer : public MachineFunctionPass {</div>
        <div><span> </span>static char ID; </div>
        <div><span> </span>analyzer() :
          MachineFunctionPass(ID) {}<span> </span>   <span> </span></div>
        <div><span> </span></div>
        <div><span> </span>virtual bool
          runOnMachineFunction(MachineFunction &MF) {<span>
          </span></div>
        <div><span> </span>errs() << "hello " ;</div>
        <div><span> </span></div>
        <div><span> </span>return false;<span> </span></div>
        <div><span> </span>}</div>
        <div>  };</div>
        <div>}</div>
        <div>char analyzer::ID = 0;</div>
        <div>static RegisterPass<analyzer> X("analyzer", "WAW
          analyzer");</div>
        <div><br>
        </div>
        <div>I make it successfully. But when I load it for my test code
          I get this error:</div>
        <div><br>
        </div>
        <div>
          <div>Pass 'WAW analyzer' is not initialized.</div>
          <div>Verify if there is a pass dependency cycle.</div>
          <div>Required Passes:</div>
          <div>opt: /llvm/llvm-3.7/lib/IR/LegacyPassManager.cpp:635:
            void llvm::PMTopLevelManager::schedulePass(llvm::Pass*):
            Assertion `PI && "Expected required passes to be
            initialized"' failed.</div>
          <div>.....</div>
        </div>
        <div><br>
        </div>
        <div>I don't know how to solve it? Do we have to run
          machinefunction passes with OPT command? Is this correct to
          put machinefunction pass in an external folder or do we have
          to change some llvm built-in files? </div>
        <div><br>
        </div>
        <div>Regards,<br>
        </div>
        <div>Fami</div>
        <div><br>
        </div>
      </div>
      <br>
      <fieldset></fieldset>
      <br>
      </div></div><pre>_______________________________________________
LLVM Developers mailing list
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><span class="HOEnZb"><font color="#888888">
</font></span></pre><span class="HOEnZb"><font color="#888888">
    </font></span></blockquote><span class="HOEnZb"><font color="#888888">
    <br>
    <br>
    <pre cols="72">-- 
John Criswell
Assistant Professor
Department of Computer Science, University of Rochester
<a href="http://www.cs.rochester.edu/u/criswell" target="_blank">http://www.cs.rochester.edu/u/criswell</a></pre>
  </font></span></div>

</blockquote></div><br></div>