<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1252">
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; color: rgb(0, 0, 0); font-size: 15px; font-family: Calibri, sans-serif; ">
<div>Thanks John. I appreciate your help. </div>
<div><br>
</div>
<div>I have taken the libLTO approach and it worked like a charm :) For those who wanted to achieve the same thing, below are the steps I've taken. </div>
<div><br>
</div>
<div>John --  a small question: I thought I wouldn't need to touch Makefiles at all, but that wasn't the case. Could you take a look at Step 4) and tell me what you think? Thanks!  </div>
<div><br>
</div>
<div>1) Create your own libLTO and add your pass to it. Do a code diff between /safecode/tools/LTO/LTOCodeGenerator.cpp and /llvm/tools/lto/LTOCodeGenerator.cpp to figure out what changes are needed to do this.</div>
<div>2) Make a backup copy of the original linker  /usr/lib/libLTO.dylib.</div>
<div>3) Copy your libLTO.dylib to /usr/lib.</div>
<div>4) Open Makefiles in your target project and change CC and CFLAGS as follows: </div>
<div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>CC=llvm-gcc</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>CFLAGS=-emit-llvm …</div>
</div>
<div>5) Build the project with LLVM.</div>
<div><br>
</div>
<span id="OLK_SRC_BODY_SECTION">
<div style="font-family:Calibri; font-size:11pt; text-align:left; color:black; BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BORDER-TOP: #b5c4df 1pt solid; BORDER-RIGHT: medium none; PADDING-TOP: 3pt">
<span style="font-weight:bold">From: </span>John Criswell <<a href="mailto:criswell@illinois.edu">criswell@illinois.edu</a>><br>
<span style="font-weight:bold">Organization: </span>University of Illinois<br>
<span style="font-weight:bold">Date: </span>Fri, 19 Aug 2011 17:00:14 -0500<br>
<span style="font-weight:bold">To: </span>Jinwook Shin <<a href="mailto:Jinwook.Shin@microsoft.com">Jinwook.Shin@microsoft.com</a>><br>
<span style="font-weight:bold">Cc: </span>"<a href="mailto:llvmdev@cs.uiuc.edu">llvmdev@cs.uiuc.edu</a>" <<a href="mailto:llvmdev@cs.uiuc.edu">llvmdev@cs.uiuc.edu</a>><br>
<span style="font-weight:bold">Subject: </span>Re: [LLVMdev] running a module pass via opt on multiple bitcode files<br>
</div>
<div><br>
</div>
<div>
<div 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 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>
</div>
</div>
</span>
</body>
</html>