<div><span style="color:rgb(49,49,49);word-spacing:1px;background-color:rgb(255,255,255)">Hi John</span></div><div dir="auto"><font color="#313131"><span style="word-spacing:1px;background-color:rgb(255,255,255)"><br></span></font></div><div dir="auto"><font color="#313131"><span style="word-spacing:1px;background-color:rgb(255,255,255)">Thanks for your suggestions. I forget to send the last response to llvm community.<br></span></font><div style="color:rgb(49,49,49);word-spacing:1px" dir="auto"><br></div><div style="font-size:1rem;color:rgb(49,49,49);word-spacing:1px" dir="auto">I will try your idea and it would be great if you can give me some comments on the code below, many thanks</div><div style="color:rgb(49,49,49);word-spacing:1px" dir="auto"><br></div><div style="color:rgb(49,49,49);word-spacing:1px" dir="auto"><div style="color:rgb(212,212,212);background-color:rgb(30,30,30);font-family:"Droid Sans Mono",monospace,monospace,"Droid Sans Fallback","Noto Color Emoji";font-size:14px;line-height:19px;white-space:pre-wrap"><div><span style="color:rgb(86,156,214);font-size:0.875rem">namespace</span><span style="font-size:0.875rem"> {</span></div><div>    <span style="color:rgb(96,139,78);font-size:0.875rem">// Hello - The first implementation, without getAnalysisUsage.</span></div><div>    <span style="color:rgb(86,156,214);font-size:0.875rem">struct</span> <span style="color:rgb(78,201,176);font-size:0.875rem">Hello</span><span style="font-size:0.875rem"> : </span><span style="color:rgb(86,156,214);font-size:0.875rem">public</span> <span style="color:rgb(78,201,176);font-size:0.875rem">FunctionPass</span><span style="font-size:0.875rem"> {</span></div><div>        <span style="color:rgb(86,156,214);font-size:0.875rem">static</span> <span style="color:rgb(86,156,214);font-size:0.875rem">char</span><span style="font-size:0.875rem"> ID; </span><span style="color:rgb(96,139,78);font-size:0.875rem">// Pass identification, replacement for typeid</span></div><div>        <span style="color:rgb(220,220,170);font-size:0.875rem">Hello</span><span style="font-size:0.875rem">() : </span><span style="color:rgb(220,220,170);font-size:0.875rem">FunctionPass</span><span style="font-size:0.875rem">(ID) {}</span></div><div><span style="font-size:0.875rem">        std::error_code error;</span></div><div>        <span style="color:rgb(86,156,214);font-size:0.875rem">enum</span><span style="font-size:0.875rem"> sys::fs::OpenFlags of;</span></div><div>        <span style="color:rgb(86,156,214);font-size:0.875rem">bool</span> <span style="color:rgb(220,220,170);font-size:0.875rem">runOnFunction</span><span style="font-size:0.875rem">(Function </span><span style="font-size:0.875rem">&</span><span style="font-size:0.875rem">F) </span><span style="color:rgb(86,156,214);font-size:0.875rem">override</span><span style="font-size:0.875rem"> {</span></div><br><div><span style="font-size:0.875rem">            raw_fd_ostream </span><span style="color:rgb(156,220,254);font-size:0.875rem">file</span><span style="font-size:0.875rem">(</span><span style="color:rgb(220,220,170);font-size:0.875rem">StringRef</span><span style="font-size:0.875rem">(F.</span><span style="color:rgb(220,220,170);font-size:0.875rem">getName</span><span style="font-size:0.875rem">().</span><span style="color:rgb(220,220,170);font-size:0.875rem">str</span><span style="font-size:0.875rem">()</span><span style="font-size:0.875rem">+</span><span style="color:rgb(206,145,120);font-size:0.875rem">".info"</span><span style="font-size:0.875rem">), error, of);</span></div><div>            <span style="color:rgb(197,134,192);font-size:0.875rem">for</span><span style="font-size:0.875rem"> (BasicBlock </span><span style="font-size:0.875rem">&</span><span style="font-size:0.875rem">BB : F){</span></div><div><span style="font-size:0.875rem">                std::string bb_name </span><span style="font-size:0.875rem">=</span><span style="font-size:0.875rem"> BB.</span><span style="color:rgb(220,220,170);font-size:0.875rem">getName</span><span style="font-size:0.875rem">().</span><span style="color:rgb(220,220,170);font-size:0.875rem">str</span><span style="font-size:0.875rem">();</span></div><div><span style="font-size:0.875rem">                BlockAddress</span><span style="font-size:0.875rem">*</span><span style="font-size:0.875rem"> bb_addr </span><span style="font-size:0.875rem">=</span> <span style="color:rgb(220,220,170);font-size:0.875rem">BlockAddress::get</span><span style="font-size:0.875rem">(</span><span style="font-size:0.875rem">&</span><span style="font-size:0.875rem">BB);</span></div><div><span style="font-size:0.875rem">                file </span><span style="font-size:0.875rem"><<</span><span style="color:rgb(206,145,120);font-size:0.875rem">"This is the Block Node"</span><span style="font-size:0.875rem"><<</span><span style="font-size:0.875rem"> bb_addr</span><span style="font-size:0.875rem"><<</span><span style="color:rgb(206,145,120);font-size:0.875rem">"</span><span style="color:rgb(215,186,125);font-size:0.875rem">\n</span><span style="color:rgb(206,145,120);font-size:0.875rem">"</span><span style="font-size:0.875rem">;</span></div><div>                <span style="color:rgb(197,134,192);font-size:0.875rem">for</span><span style="font-size:0.875rem">(Instruction </span><span style="font-size:0.875rem">&</span><span style="font-size:0.875rem">I: BB){</span></div><div>                <span style="color:rgb(86,156,214);font-size:0.875rem">int</span><span style="font-size:0.875rem"> split </span><span style="font-size:0.875rem">=</span> <span style="color:rgb(181,206,168);font-size:0.875rem">0</span><span style="font-size:0.875rem">;</span></div><div>                <span style="color:rgb(86,156,214);font-size:0.875rem">int</span><span style="font-size:0.875rem"> indirect_call </span><span style="font-size:0.875rem">=</span> <span style="color:rgb(181,206,168);font-size:0.875rem">0</span><span style="font-size:0.875rem">;</span></div><div><span style="font-size:0.875rem">                std:: string split_func </span><span style="font-size:0.875rem">=</span> <span style="color:rgb(206,145,120);font-size:0.875rem">""</span><span style="font-size:0.875rem">;</span></div><div>                <span style="color:rgb(197,134,192);font-size:0.875rem">if</span><span style="font-size:0.875rem">(</span><span style="color:rgb(86,156,214);font-size:0.875rem">const</span><span style="font-size:0.875rem"> SwitchInst</span><span style="font-size:0.875rem">*</span><span style="font-size:0.875rem"> switchinst </span><span style="font-size:0.875rem">=</span><span style="font-size:0.875rem"> dyn_cast</span><span style="font-size:0.875rem"><</span><span style="font-size:0.875rem">SwitchInst</span><span style="font-size:0.875rem">></span><span style="font-size:0.875rem">(</span><span style="font-size:0.875rem">&</span><span style="font-size:0.875rem">I)){</span></div><div><span style="font-size:0.875rem">                 file</span><span style="font-size:0.875rem"><<</span><span style="color:rgb(206,145,120);font-size:0.875rem">"SwitchInst"</span><span style="font-size:0.875rem">;   </span></div><div><span style="font-size:0.875rem">                }</span></div><div><span style="font-size:0.875rem">                    DILocation</span><span style="font-size:0.875rem">*</span><span style="font-size:0.875rem"> Loc </span><span style="font-size:0.875rem">=</span><span style="font-size:0.875rem">  I.</span><span style="color:rgb(220,220,170);font-size:0.875rem">getDebugLoc</span><span style="font-size:0.875rem">().</span><span style="color:rgb(220,220,170);font-size:0.875rem">get</span><span style="font-size:0.875rem">();</span></div><div>                <span style="color:rgb(197,134,192);font-size:0.875rem">if</span><span style="font-size:0.875rem">(Loc){</span></div><div>                    <span style="color:rgb(86,156,214);font-size:0.875rem">unsigned</span><span style="font-size:0.875rem"> Line </span><span style="font-size:0.875rem">=</span><span style="font-size:0.875rem"> Loc-></span><span style="color:rgb(220,220,170);font-size:0.875rem">getLine</span><span style="font-size:0.875rem">();  </span></div><div>                    <span style="color:rgb(86,156,214);font-size:0.875rem">unsigned</span><span style="font-size:0.875rem"> Column </span><span style="font-size:0.875rem">=</span><span style="font-size:0.875rem"> Loc-></span><span style="color:rgb(220,220,170);font-size:0.875rem">getColumn</span><span style="font-size:0.875rem">();  </span></div><div><span style="font-size:0.875rem">                    StringRef File </span><span style="font-size:0.875rem">=</span><span style="font-size:0.875rem"> Loc-></span><span style="color:rgb(220,220,170);font-size:0.875rem">getFilename</span><span style="font-size:0.875rem">();  </span></div><div><span style="font-size:0.875rem">                    StringRef Dir </span><span style="font-size:0.875rem">=</span><span style="font-size:0.875rem"> Loc-></span><span style="color:rgb(220,220,170);font-size:0.875rem">getDirectory</span><span style="font-size:0.875rem">();  </span></div><div>                    <span style="color:rgb(197,134,192);font-size:0.875rem">if</span><span style="font-size:0.875rem"> (indirect_call){file</span><span style="font-size:0.875rem"><<</span><span style="color:rgb(206,145,120);font-size:0.875rem">"|IndirectCall"</span><span style="font-size:0.875rem">;}</span></div><div><span style="font-size:0.875rem">                    file </span><span style="font-size:0.875rem"><<</span><span style="color:rgb(206,145,120);font-size:0.875rem">"|Instruction:|Source Line:"</span><span style="font-size:0.875rem"><<</span><span style="font-size:0.875rem"> Line</span><span style="font-size:0.875rem"><<</span><span style="color:rgb(206,145,120);font-size:0.875rem">"|Column:"</span><span style="font-size:0.875rem"><<</span><span style="font-size:0.875rem">Column</span><span style="font-size:0.875rem"><<</span><span style="color:rgb(206,145,120);font-size:0.875rem">"|File:"</span><span style="font-size:0.875rem"><<</span><span style="font-size:0.875rem">File;</span></div><div><span style="font-size:0.875rem">                    file </span><span style="font-size:0.875rem"><<</span><span style="color:rgb(206,145,120);font-size:0.875rem">"|IR:"</span><span style="font-size:0.875rem"><<</span><span style="font-size:0.875rem">I</span><span style="font-size:0.875rem"><<</span><span style="color:rgb(206,145,120);font-size:0.875rem">"</span><span style="color:rgb(215,186,125);font-size:0.875rem">\n</span><span style="color:rgb(206,145,120);font-size:0.875rem">"</span><span style="font-size:0.875rem">;</span></div><div><span style="font-size:0.875rem">                }</span></div><div><span style="font-size:0.875rem">            }</span></div><div>            <span style="color:rgb(197,134,192);font-size:0.875rem">for</span><span style="font-size:0.875rem"> (BasicBlock </span><span style="font-size:0.875rem">*</span><span style="font-size:0.875rem"> SuccBB : </span><span style="color:rgb(220,220,170);font-size:0.875rem">successors</span><span style="font-size:0.875rem">(</span><span style="font-size:0.875rem">&</span><span style="font-size:0.875rem">BB)){</span></div><div><span style="font-size:0.875rem">                BlockAddress </span><span style="font-size:0.875rem">*</span><span style="font-size:0.875rem"> succBB_addr </span><span style="font-size:0.875rem">=</span> <span style="color:rgb(220,220,170);font-size:0.875rem">BlockAddress::get</span><span style="font-size:0.875rem">(SuccBB);</span></div><div><span style="font-size:0.875rem">                file </span><span style="font-size:0.875rem"><<</span><span style="font-size:0.875rem">bb_addr</span><span style="font-size:0.875rem"><<</span><span style="color:rgb(206,145,120);font-size:0.875rem">"-->"</span><span style="font-size:0.875rem"><<</span><span style="font-size:0.875rem">succBB_addr</span><span style="font-size:0.875rem"><<</span><span style="color:rgb(206,145,120);font-size:0.875rem">"</span><span style="color:rgb(215,186,125);font-size:0.875rem">\n</span><span style="color:rgb(206,145,120);font-size:0.875rem">"</span><span style="font-size:0.875rem">;</span></div><div><span style="font-size:0.875rem">            }</span></div><div><span style="font-size:0.875rem">            file</span><span style="font-size:0.875rem"><<</span><span style="color:rgb(206,145,120);font-size:0.875rem">"==============</span><span style="color:rgb(215,186,125);font-size:0.875rem">\n</span><span style="color:rgb(206,145,120);font-size:0.875rem">"</span><span style="font-size:0.875rem">;</span></div><div><span style="font-size:0.875rem">        }</span></div><div><span style="font-size:0.875rem">        file.</span><span style="color:rgb(220,220,170);font-size:0.875rem">close</span><span style="font-size:0.875rem">();</span></div><div>        <span style="color:rgb(197,134,192);font-size:0.875rem">return</span> <span style="color:rgb(86,156,214);font-size:0.875rem">false</span><span style="font-size:0.875rem">;</span></div><div><span style="font-size:0.875rem">    }</span></div><div><span style="font-size:0.875rem">};  </span></div><div><span style="font-size:0.875rem">    }</span></div><br><div><span style="color:rgb(86,156,214);font-size:0.875rem">char</span><span style="font-size:0.875rem"> Hello::ID </span><span style="font-size:0.875rem">=</span> <span style="color:rgb(181,206,168);font-size:0.875rem">0</span><span style="font-size:0.875rem">;</span></div><div><span style="color:rgb(86,156,214);font-size:0.875rem">static</span><span style="font-size:0.875rem"> RegisterPass</span><span style="font-size:0.875rem"><</span><span style="font-size:0.875rem">Hello</span><span style="font-size:0.875rem">></span> <span style="color:rgb(220,220,170);font-size:0.875rem">X</span><span style="font-size:0.875rem">(</span><span style="color:rgb(206,145,120);font-size:0.875rem">"hello"</span><span style="font-size:0.875rem">, </span><span style="color:rgb(206,145,120);font-size:0.875rem">"Hello World Pass"</span><span style="font-size:0.875rem">);</span></div></div><br></div><div style="color:rgb(49,49,49);word-spacing:1px" dir="auto"><br></div><div style="font-size:1rem;color:rgb(49,49,49);word-spacing:1px" dir="auto">I run it using the command "opt -load /path/to/LLVMHello.so -hello target.bc".</div><div style="color:rgb(49,49,49);word-spacing:1px" dir="auto"><br></div><div style="font-size:1rem;color:rgb(49,49,49);word-spacing:1px" dir="auto">If you need the bitcode file that takes me so much time, please tell me.</div><div style="color:rgb(49,49,49);word-spacing:1px" dir="auto"><br></div><div style="font-size:1rem;color:rgb(49,49,49);word-spacing:1px" dir="auto">Regards</div></div><div style="font-size:1rem;color:rgb(49,49,49);word-spacing:1px" dir="auto">Muhui</div><div><br><div class="gmail_quote"><div dir="ltr">John Criswell <<a href="mailto:jtcriswel@gmail.com">jtcriswel@gmail.com</a>>于2018年7月16日 周一下午11:30写道:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div text="#000000" bgcolor="#FFFFFF">
    <div class="m_-3354552917197764022moz-cite-prefix">On 7/14/18 9:21 PM, Muhui Jiang via
      llvm-dev wrote:<br>
    </div>
    <blockquote type="cite">
      
      <div dir="ltr">Hi
        <div><br>
        </div>
        <div>I write a LLVM function pass. The pass will loop the
          basicblock in the function, check the instruction's type with
          dyn_cast<switchinst>, print the instruction and the
          basicblock's successors. I think it is not very complex.</div>
        <div><br>
        </div>
        <div>My bitcode file is about 30M. My CPU is i7-7700(3.6GHz). It
          has been running for 60 hours but it is still running. I am
          not sure whether this is a normal behavior. If so, any options
          or suggestions to help me speed up the analysis. Many Thanks</div>
      </div>
    </blockquote>
    <br></div><div text="#000000" bgcolor="#FFFFFF">
    The first thing you should check is whether you've written the loop
    properly.  It's possible that you've somehow written an infinite
    loop.  If your pass is adding instructions, be careful that you're
    not invalidating the iterator that you're using to loop over the
    instructions.  That might cause a non-obvious error.<br>
    <br>
    The second thing to consider is to use the InstVisitor class instead
    of writing a loop.  Look at InstVisitor.h in the LLVM source code;
    it has comments that show you how to use it.  In a nutshell, your
    FunctionPass will be a subclass of InstVisitor.  You then implement
    the visitSwitchInst() method and call visit() on the function in
    runOnFunction, and you're done.<br>
    <br>
    <a class="m_-3354552917197764022moz-txt-link-freetext" href="http://llvm.org/doxygen/classllvm_1_1InstVisitor.html" target="_blank">http://llvm.org/doxygen/classllvm_1_1InstVisitor.html</a><br>
    <br>
    Regards,<br>
    <br>
    John Criswell</div><div text="#000000" bgcolor="#FFFFFF"><br>
    <br>
    <blockquote type="cite">
      <div dir="ltr">
        <div><br>
        </div>
        <div>Regards</div>
        <div>Muhui</div>
      </div>
      <br>
      <fieldset class="m_-3354552917197764022mimeAttachmentHeader"></fieldset>
      <br>
      <pre>_______________________________________________
LLVM Developers mailing list
<a class="m_-3354552917197764022moz-txt-link-abbreviated" href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>
<a class="m_-3354552917197764022moz-txt-link-freetext" href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a>
</pre>
    </blockquote>
    <p><br>
    </p>
    </div><div text="#000000" bgcolor="#FFFFFF"><pre class="m_-3354552917197764022moz-signature" cols="72">-- 
John Criswell
Assistant Professor
Department of Computer Science, University of Rochester
<a class="m_-3354552917197764022moz-txt-link-freetext" href="http://www.cs.rochester.edu/u/criswell" target="_blank">http://www.cs.rochester.edu/u/criswell</a></pre>
  </div></blockquote></div></div>