<br>Problem solved.  I was building llvm in a separate llvm-build directory.  I built it within the llvm-src directory (which kept all the llvm .so and my pass' .so in the llvm-src/Release+Asserts/lib directory) to solve the problem.<div>
<br></div><div>Can anyone tell me what's the difference between writing a pass as a "struct" (as in the tutorial) and as a "class" (as most developers do)?</div><div><br></div><div>Thanks again;<br>
<div class="gmail_quote">---------- Forwarded message ----------<br>From: <b class="gmail_sendername">Arnamoy Bhattacharyya</b> <span dir="ltr"><<a href="mailto:arnamoy@ualberta.ca">arnamoy@ualberta.ca</a>></span><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;<div><br></div><div>I wrote this simple loop pass to collect the number of instructions in each loop of the program.  The code is as follows- </div>
<div><br></div><div><div>#define DEBUG_TYPE "loopinst"</div>
<div>#include "llvm/Pass.h"</div><div>#include "llvm/Analysis/LoopPass.h"</div><div>#include "llvm/Support/raw_ostream.h"</div><div>#include "llvm/ADT/Statistic.h"</div><div>#include "llvm/Instructions.h"</div>

<div>#include "llvm/Analysis/LoopInfo.h"</div><div><br></div><div>using namespace llvm;</div><div><br></div><div>STATISTIC(LoopInstNum, "Counts number of instructions in a loop");</div><div><br></div>
<div>
namespace {</div><div>  struct LoopInst : public LoopPass {</div><div>    static char ID; // Pass identification, replacement for typeid</div><div>    LoopInst() : LoopPass(ID) {}</div><div><br></div><div>    virtual bool runOnLoop(Loop *L, LPPassManager &LPM) {</div>

<div>        LoopInfo *LI = &getAnalysis<LoopInfo>();</div><div><span style="white-space:pre-wrap"> </span>for (Loop::block_iterator b = L->block_begin(), be = L->block_end();b != be; ++b)</div>
<div><span style="white-space:pre-wrap">  </span>{</div><div><span style="white-space:pre-wrap">                </span>for (BasicBlock::iterator i = (*b)->begin(), ie = (*b)->end(); i != ie; ++i)</div>
<div><span style="white-space:pre-wrap">          </span>{</div><div>      <span style="white-space:pre-wrap">                  </span>++LoopInstNum;</div><div>      <span style="white-space:pre-wrap">                     </span>errs() << "Hello: ";</div>

<div><span style="white-space:pre-wrap">          </span>}</div><div><span style="white-space:pre-wrap">        </span>}</div><div>      </div><div>      return false;</div><div>    }</div><div><br></div>
<div>    // We don't modify the program, so we preserve all analyses</div><div>    virtual void getAnalysisUsage(AnalysisUsage &AU) const {</div><div>      AU.addRequired<LoopInfo>();</div><div>      AU.addPreserved<LoopInfo>();</div>

<div>    }</div><div>  };</div><div>}</div><div><br></div><div>char LoopInst::ID = 0;</div><div>static RegisterPass<LoopInst> X("loop-inst", "loop instruction Pass");</div></div><div><br></div><div>

<div><br></div><div>I put it under llvm-src/lib/Transforms directory and ran a "make" from there to create the .so file.  But when I run opt with the library, I get the following error - </div><div><br></div><div>

opt -load=/home/arnie/llvm-development/llvm/Debug+Asserts/lib/LoopInst.so -loops -loop-inst a.s</div><div><br></div><div>opt: symbol lookup error: /home/arnie/llvm-development/llvm/Debug+Asserts/lib/LoopInst.so: undefined symbol: _ZNK4llvm8LoopBaseINS_10BasicBlockENS_4LoopEE11block_beginEv</div>

<div><br></div><div>Can anyone tell me what I am doing wrong?</div><div><br></div><div>Also what's the difference between declaring a pass as a struct vs declaring it as a class.  In the "writing a pass" tutorial the "Hello" pass has been declared as a struct but most (if not all) the LLVM passes are written as classes.</div>

<div><br></div><div>Thanks a lot;</div><span class="HOEnZb"><font color="#888888">-- <br>Arnamoy Bhattacharyya<br>Athabasca Hall 143<br>Department of Computing Science - University of Alberta<br>Edmonton, Alberta, Canada, T6G 2E8<br>
<a href="tel:587-710-7073" value="+15877107073" target="_blank">587-710-7073</a><br>
</font></span></div>
</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>
</div>