<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    On 8/19/11 4:36 PM, Jinwook Shin (HOTWING) wrote:
    <blockquote cite="mid:CA5C4EAA.11DFC%25jinshin@microsoft.com"
      type="cite">
      <meta http-equiv="Content-Type" content="text/html;
        charset=ISO-8859-1">
      <meta name="Generator" content="Microsoft Word 14 (filtered
        medium)">
      <style><!--
/* Font Definitions */
@font-face
        {font-family:"Malgun Gothic";
        panose-1:2 11 5 3 2 0 0 2 0 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:"\@Malgun Gothic";
        panose-1:2 11 5 3 2 0 0 2 0 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";
        color:#595959;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
        {mso-style-priority:99;
        mso-style-link:"Balloon Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:8.0pt;
        font-family:"Tahoma","sans-serif";
        color:#595959;}
p.Code, li.Code, div.Code
        {mso-style-name:Code;
        mso-style-link:"Code Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:Consolas;
        color:black;}
span.CodeChar
        {mso-style-name:"Code Char";
        mso-style-link:Code;
        font-family:Consolas;
        color:black;}
p.Red, li.Red, div.Red
        {mso-style-name:Red;
        mso-style-link:"Red Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";
        color:red;
        font-style:italic;}
span.RedChar
        {mso-style-name:"Red Char";
        mso-style-link:Red;
        font-family:"Calibri","sans-serif";
        color:red;
        font-style:italic;}
span.EmailStyle21
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:#404040;
        font-weight:normal;
        font-style:normal;
        text-decoration:none none;}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:Consolas;
        color:#595959;}
span.BalloonTextChar
        {mso-style-name:"Balloon Text Char";
        mso-style-priority:99;
        mso-style-link:"Balloon Text";
        font-family:"Tahoma","sans-serif";
        color:#595959;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
      <div class="WordSection1">
        <p class="MsoNormal"><span style="font-size: 11.5pt; color:
            rgb(85, 85, 85);">Thanks John. Your approach worked fine for
            my small toy program. Now, I would like to run my module
            pass on a huge project (still a single executable)
            consisting of a few thousand bit code files scattered in
            many different directories. And some of them are static
            libraries. Do you still think it's a good idea to manually
            gather and link them with llvm-ld? I've seen other module
            pass implementations where they directly patch a specific
            version of LLVM or clang, instead of running a shared object
            implementation with opt. Which would be the ideal approach
            to analyze a program with a module pass? Thanks.</span></p>
      </div>
    </blockquote>
    <br>
    The question is whether your pass requires having the whole program
    to work (or to be effective) or whether it can be done on each
    compilation unit separately.<br>
    <br>
    If you can do it on separate compilation units, integrate it into
    Clang.  We did this for some of the SAFECode passes in mainline
    SAFECode; you can use it as an example.<br>
    <br>
    If your pass must do whole program analysis (or simply works better
    if it does), then you want to add your pass to libLTO and enable the
    use of link-time optimization using the -emit-llvm option on the
    llmv-gcc/clang command line.<br>
    <br>
    Note that all libLTO passes are enabled when compiling using
    link-time optimization.  If you replace libLTO on your system, your
    pass is going to be run for every program compiled using link-time
    optimization (unless you can make your pass conditional on some
    optimization level like -O4 or -O5 that gets communicated from the
    compiler front-end to the linker to the plugin).  If you're doing
    instrumentation, you might want to do what we did in SAFECode:
    perform instrumentation in the front-end and then use whole-program
    analysis to change/optimize the instrumentation in libLTO.  That
    way, our libLTO transforms can always be turned on; for
    uninstrumented code, they become a no-op.<br>
    <br>
    -- John T.<br>
    <br>
    <br>
    <blockquote cite="mid:CA5C4EAA.11DFC%25jinshin@microsoft.com"
      type="cite">
      <div class="WordSection1">
        <p class="MsoNormal"><span
            style="font-size:11.5pt;color:#555555"><o:p></o:p></span></p>
        <div>
          <p class="MsoNormal"><span
              style="font-size:11.5pt;color:#555555"><o:p> </o:p></span></p>
        </div>
        <div style="border:none;border-top:solid #B5C4DF
          1.0pt;padding:3.0pt 0in 0in 0in">
          <p class="MsoNormal"><b><span style="color:black">From: </span></b><span
              style="color:black">John Criswell <<a
                moz-do-not-send="true"
                href="mailto:criswell@illinois.edu">criswell@illinois.edu</a>><br>
              <b>Organization: </b>University of Illinois<br>
              <b>Date: </b>Tue, 12 Jul 2011 16:19:06 -0500<br>
              <b>To: </b>Jinwook Shin <<a moz-do-not-send="true"
                href="mailto:Jinwook.Shin@microsoft.com">Jinwook.Shin@microsoft.com</a>><br>
              <b>Cc: </b>"<a moz-do-not-send="true"
                href="mailto:llvmdev@cs.uiuc.edu">llvmdev@cs.uiuc.edu</a>"
              <<a moz-do-not-send="true"
                href="mailto:llvmdev@cs.uiuc.edu">llvmdev@cs.uiuc.edu</a>><br>
              <b>Subject: </b>Re: [LLVMdev] running a module pass via
              opt on multiple bitcode files<o:p></o:p></span></p>
        </div>
        <div>
          <p class="MsoNormal"><span
              style="font-size:11.5pt;color:#555555"><o:p> </o:p></span></p>
        </div>
        <div>
          <div>
            <p class="MsoNormal"><span
                style="font-size:11.5pt;color:#555555">On 7/12/11 4:11
                PM, Jinwook Shin (HOTWING) wrote:
                <o:p></o:p></span></p>
            <p class="MsoNormal"><span style="color:#404040">Hi,</span><o:p></o:p></p>
            <p class="MsoNormal"><span style="color:#404040"> </span><o:p></o:p></p>
            <p class="MsoNormal"><span style="color:#404040">I'm trying
                to implement a module pass as a share object to process
                an entire program as a unit. The target program is built
                from multiple object files, hence multiple bitcode
                files. However, it seems that opt does not take the
                whole program, but just one bitcode file, "test.bc" in
                the example run shown below.
              </span><o:p></o:p></p>
            <p class="MsoNormal"><span style="color:#404040"> </span><o:p></o:p></p>
            <p class="MsoNormal"><span style="color:#404040">$ opt -load
                mypass.dylib -mymodulepass < test.bc > /dev/null</span><o:p></o:p></p>
            <p class="MsoNormal"><span style="color:#404040"> </span><o:p></o:p></p>
            <p class="MsoNormal"><span style="color:#404040">How do I
                run my module pass in a library on a whole program?
              </span><o:p></o:p></p>
            <p class="MsoNormal"><span
                style="font-size:11.5pt;color:#555555"><br>
                Link the bitcode files together into a single bitcode
                file with llvm-ld.  You can then run the single bitcode
                file through opt.<br>
                <br>
                -- John T.<br>
                <br>
                <br>
                <o:p></o:p></span></p>
            <p class="MsoNormal"><span style="color:#404040"> </span><o:p></o:p></p>
            <p class="MsoNormal"><span style="color:#404040">Thanks.</span><o:p></o:p></p>
            <p class="MsoNormal"><span style="color:#404040"> </span><o:p></o:p></p>
            <p class="MsoNormal"><span style="color:#404040"> </span><o:p></o:p></p>
            <p class="MsoNormal"><span style="color:#404040"> </span><o:p></o:p></p>
            <p class="MsoNormal"><span
                style="font-size:11.5pt;color:#555555"><br>
                <br>
                <br>
                <o:p></o:p></span></p>
            <pre><span style="color:#555555">_______________________________________________<o:p></o:p></span></pre>
            <pre><span style="color:#555555">LLVM Developers mailing list<o:p></o:p></span></pre>
            <pre><span style="color:#555555"><a moz-do-not-send="true" href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a moz-do-not-send="true" href="http://llvm.cs.uiuc.edu">http://llvm.cs.uiuc.edu</a><a moz-do-not-send="true" href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><o:p></o:p></span></pre>
            <p class="MsoNormal"><span
                style="font-size:11.5pt;color:#555555"><o:p> </o:p></span></p>
          </div>
        </div>
      </div>
    </blockquote>
    <br>
  </body>
</html>