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 class="Apple-tab-span" style="white-space:pre">     </span>for (Loop::block_iterator b = L->block_begin(), be = L->block_end();b != be; ++b)</div>
<div><span class="Apple-tab-span" style="white-space:pre">      </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">            </span>for (BasicBlock::iterator i = (*b)->begin(), ie = (*b)->end(); i != ie; ++i)</div>
<div><span class="Apple-tab-span" style="white-space:pre">              </span>{</div><div>      <span class="Apple-tab-span" style="white-space:pre">                      </span>++LoopInstNum;</div><div>      <span class="Apple-tab-span" style="white-space:pre">                 </span>errs() << "Hello: ";</div>
<div><span class="Apple-tab-span" style="white-space:pre">              </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">    </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>-- <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>