<br><br><div class="gmail_quote">On Thu, Jul 5, 2012 at 3:00 PM, Carlos Sánchez de La Lama <span dir="ltr"><<a href="mailto:csanchezdll@gmail.com" target="_blank">csanchezdll@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi,<br>
<div class="im"><br>
> Problem solved.  I was building llvm in a separate llvm-build directory.  I<br>
> built it within the llvm-src directory (which kept all the llvm .so and my<br>
> pass' .so in the llvm-src/Release+Asserts/lib directory) to solve the<br>
> problem.<br>
<br>
</div>I do not fully understand what you mean, there should be no difference<br>
on building out of source AFAIK.<br></blockquote><div>What I meant to say was previously I built llvm and installed it in different directories than the source directory, e.g if the source was downloaded into <llvm-src>, and I wanted to build it in <llvm-build> and install it into <llvm-install>, I would do the following - </div>
<div><br></div><div>1.  Run ../llvm-src/cofigure <options> from within the <llvm-build> directory [--prefix=<llvm-install>]</div><div>2.  Run make and make install from within the build directory.</div><div>
<br></div><div>In that manner, I would have all the llvm .so files in the <llvm-build>/Release+Asserts/lib directory.  So when I kept my pass inside the llvm-src/lib/Transforms directory and run a make from there (after running a configure from the source directory), my .so will be created in the <llvm-src>/Release+Asserts/lib directory.  When I tried to use this .so with the opt created inside <llvm-install> directory, I was getting errors.</div>
<div><br></div><div>Then I did the following - </div><div><br></div><div><div>1.  Run ./cofigure <options> from within the <llvm-src> directory [--prefix=<llvm-install>]</div><div>2.  Run make and make install from within the src directory.</div>
</div><div><br></div><div>In that manner, I would have all the llvm .so files and my pass' .so in the <llvm-src>/Release+Asserts/lib directory.  Then I was able to use the .so with opt from the <llvm-install>/bin directory.</div>
<div><br></div><div>May be your and mine reason for the error was different.  Sorry I was not clear in my last email.</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div class="im"><br>
> Can anyone tell me what's the difference between writing a pass as a<br>
> "struct" (as in the tutorial) and as a "class" (as most developers do)?<br>
<br>
</div>In C++, "class" is just an struct where members have private<br>
visibility by default. So defining a pass (or any class) with "struct"<br>
is 100% equivalent to defining it with "class" and then placing all<br>
members with "public:" visibility. From LLVM point of view,<br>
functionality of your pass is not going to change at all by using<br>
"class" or "struct" to define it.<br>
<br>
BR<br>
<span class="HOEnZb"><font color="#888888"><br>
Carlos<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
> ---------- Forwarded message ----------<br>
> From: Arnamoy Bhattacharyya <<a href="mailto:arnamoy@ualberta.ca">arnamoy@ualberta.ca</a>><br>
> Date: Thu, Jul 5, 2012 at 12:34 AM<br>
> Subject: "symbol lookup error" while running a Simple Loop Pass<br>
> To: <a href="mailto:llvmdev@cs.uiuc.edu">llvmdev@cs.uiuc.edu</a><br>
><br>
><br>
> Hello;<br>
><br>
> I wrote this simple loop pass to collect the number of instructions in each<br>
> loop of the program.  The code is as follows-<br>
><br>
> #define DEBUG_TYPE "loopinst"<br>
> #include "llvm/Pass.h"<br>
> #include "llvm/Analysis/LoopPass.h"<br>
> #include "llvm/Support/raw_ostream.h"<br>
> #include "llvm/ADT/Statistic.h"<br>
> #include "llvm/Instructions.h"<br>
> #include "llvm/Analysis/LoopInfo.h"<br>
><br>
> using namespace llvm;<br>
><br>
> STATISTIC(LoopInstNum, "Counts number of instructions in a loop");<br>
><br>
> namespace {<br>
>   struct LoopInst : public LoopPass {<br>
>     static char ID; // Pass identification, replacement for typeid<br>
>     LoopInst() : LoopPass(ID) {}<br>
><br>
>     virtual bool runOnLoop(Loop *L, LPPassManager &LPM) {<br>
>         LoopInfo *LI = &getAnalysis<LoopInfo>();<br>
> for (Loop::block_iterator b = L->block_begin(), be = L->block_end();b != be;<br>
> ++b)<br>
> {<br>
> for (BasicBlock::iterator i = (*b)->begin(), ie = (*b)->end(); i != ie; ++i)<br>
> {<br>
>       ++LoopInstNum;<br>
>       errs() << "Hello: ";<br>
> }<br>
> }<br>
><br>
>       return false;<br>
>     }<br>
><br>
>     // We don't modify the program, so we preserve all analyses<br>
>     virtual void getAnalysisUsage(AnalysisUsage &AU) const {<br>
>       AU.addRequired<LoopInfo>();<br>
>       AU.addPreserved<LoopInfo>();<br>
>     }<br>
>   };<br>
> }<br>
><br>
> char LoopInst::ID = 0;<br>
> static RegisterPass<LoopInst> X("loop-inst", "loop instruction Pass");<br>
><br>
><br>
> I put it under llvm-src/lib/Transforms directory and ran a "make" from there<br>
> to create the .so file.  But when I run opt with the library, I get the<br>
> following error -<br>
><br>
> opt -load=/home/arnie/llvm-development/llvm/Debug+Asserts/lib/LoopInst.so<br>
> -loops -loop-inst a.s<br>
><br>
> opt: symbol lookup error:<br>
> /home/arnie/llvm-development/llvm/Debug+Asserts/lib/LoopInst.so: undefined<br>
> symbol: _ZNK4llvm8LoopBaseINS_10BasicBlockENS_4LoopEE11block_beginEv<br>
><br>
> Can anyone tell me what I am doing wrong?<br>
><br>
> Also what's the difference between declaring a pass as a struct vs declaring<br>
> it as a class.  In the "writing a pass" tutorial the "Hello" pass has been<br>
> declared as a struct but most (if not all) the LLVM passes are written as<br>
> classes.<br>
><br>
> Thanks a lot;<br>
> --<br>
> Arnamoy Bhattacharyya<br>
> Athabasca Hall 143<br>
> Department of Computing Science - University of Alberta<br>
> Edmonton, Alberta, Canada, T6G 2E8<br>
> 587-710-7073<br>
><br>
><br>
><br>
> --<br>
> Arnamoy Bhattacharyya<br>
> Athabasca Hall 143<br>
> Department of Computing Science - University of Alberta<br>
> Edmonton, Alberta, Canada, T6G 2E8<br>
> 587-710-7073<br>
><br>
</div></div><div class="HOEnZb"><div class="h5">> _______________________________________________<br>
> LLVM Developers mailing list<br>
> <a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
><br>
<br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br>Arnamoy Bhattacharyya<br>Athabasca Hall 143<br>Department of Computing Science - University of Alberta<br>Edmonton, Alberta, Canada, T6G 2E8<br>587-710-7073<br>