<div dir="ltr">Hi<div>So I m trying to write my first backend pass. I created a file in target\x86\wawanalyzer.cpp based on hexagonHardwareLoops.cpp file. Now it's just a simple file that prints hello to the output. I have attached the file to this post.</div><div><br></div><div>Then I did the following:</div><div><br></div><div>1. add "FunctionPass *createwawAnalyzer();" line to x86.h</div><div>2. add file name to CMakelist.txt.</div><div>3. This is going to run after postRAscheduler and before code emission so I changed the x86TrgetMachine.cpp as follow:</div><div><div>void X86PassConfig::addPreEmitPass() {</div><div>/////////////add mypass here///////</div><div>  addPass(createwawAnalyzer());</div><div>//////////////////////////////////</div><div><span class="" style="white-space:pre">            </span></div><div>  if (getOptLevel() != CodeGenOpt::None)</div><div>    addPass(createExecutionDependencyFixPass(&X86::VR128RegClass));</div><div><br></div><div>  if (UseVZeroUpper)</div><div>    addPass(createX86IssueVZeroUpperPass());</div><div><br></div><div>  if (getOptLevel() != CodeGenOpt::None) {</div><div>    addPass(createX86PadShortFunctions());</div><div>    addPass(createX86FixupLEAs());</div><div>  }</div></div><div>then I run make on mypass and remake  llvm3.7\lib and llvm3.7\tool\llc.</div><div>but when I run llc -help it doesn't show my pass. Did I miss some steps or did something wrong? What's the correct way to run the pass with llc command?</div><div><br></div><div>I appreciate any help,</div><div>Regards</div><div>Fami</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Nov 4, 2015 at 1:02 PM, fateme Hoseini <span dir="ltr"><<a href="mailto:hoseini.f@gmail.com" target="_blank">hoseini.f@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 dir="ltr">Thank you so much. <div>That helped alot.</div><div><br></div><div>Fami</div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Nov 4, 2015 at 9:40 AM, 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"><span>
    <div>On 11/3/15 7:54 PM, fateme Hoseini
      wrote:<br>
    </div>
    <blockquote type="cite">
      
      <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? <br>
        </div>
      </div>
    </blockquote>
    <br></span>
    No, you do not need to create a new backend.  All you need to do is
    to add your pass to the list of passes that are run when the MIPS
    code generator is used.<br>
    <br>
    In LLVM 3.3, there was a file in the X86 backend that had code to
    schedule all the MachineFunctionPass'es  when the X86 code generator
    was used.  That was in lib/Target/X86/X86TargetMachine.cpp.  You can
    probably find a similar file for LLVM 3.7 for the MIPS backend.<br>
    <br>
    So, to summarize, you'll add your source file to the MIPS backend,
    add a line somewhere to run your pass when the MIPS code generator
    is used, and then recompile llvm/lib and llvm/tools/llc.<span><br>
    <br>
    <br>
    <blockquote type="cite">
      <div dir="ltr">
        <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>
    </blockquote>
    <br></span>
    As far as I know, there is no way to load a MachineFunctionPass and
    run it using llc, opt, or clang.  I believe you need to compile it
    into the MIPS backend code.<span><br>
    <br>
    <blockquote type="cite">
      <div dir="ltr">
        <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>
    </blockquote>
    <br></span>
    It's difficult to estimate (especially since I haven't implemented
    anything as complicated as a register allocator).  Your profiling
    pass may take anywhere from 1 week to 1 month depending on how
    complicated it is.  I think a register allocator would take anywhere
    from 1 month up to 6 months depending on how robust you need it to
    be, but since I've never built one, I can't say for certain.<br>
    <br>
    Regards,<br>
    <br>
    John Criswell<div><div><br>
    <br>
    <blockquote type="cite">
      <div dir="ltr">
        <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">
            <div>
              <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><br>
                    <br>
                    On 11/3/15 3:47 PM, fateme Hoseini via llvm-dev
                    wrote:<br>
                  </div>
                </div>
              </div>
              <blockquote type="cite">
                <div>
                  <div>
                    <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>
</span></pre>
                <span> </span></blockquote>
              <span> <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>
              </span></div>
          </blockquote>
        </div>
        <br>
      </div>
    </blockquote>
    <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>
  </div></div></div>

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