[LLVMdev] "symbol lookup error" while running a Simple Loop Pass

Carlos Sánchez de La Lama csanchezdll at gmail.com
Thu Jul 5 14:00:41 PDT 2012


Hi,

> 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.

I do not fully understand what you mean, there should be no difference
on building out of source AFAIK.

> 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)?

In C++, "class" is just an struct where members have private
visibility by default. So defining a pass (or any class) with "struct"
is 100% equivalent to defining it with "class" and then placing all
members with "public:" visibility. From LLVM point of view,
functionality of your pass is not going to change at all by using
"class" or "struct" to define it.

BR

Carlos

> ---------- Forwarded message ----------
> From: Arnamoy Bhattacharyya <arnamoy at ualberta.ca>
> Date: Thu, Jul 5, 2012 at 12:34 AM
> Subject: "symbol lookup error" while running a Simple Loop Pass
> To: llvmdev at cs.uiuc.edu
>
>
> Hello;
>
> I wrote this simple loop pass to collect the number of instructions in each
> loop of the program.  The code is as follows-
>
> #define DEBUG_TYPE "loopinst"
> #include "llvm/Pass.h"
> #include "llvm/Analysis/LoopPass.h"
> #include "llvm/Support/raw_ostream.h"
> #include "llvm/ADT/Statistic.h"
> #include "llvm/Instructions.h"
> #include "llvm/Analysis/LoopInfo.h"
>
> using namespace llvm;
>
> STATISTIC(LoopInstNum, "Counts number of instructions in a loop");
>
> namespace {
>   struct LoopInst : public LoopPass {
>     static char ID; // Pass identification, replacement for typeid
>     LoopInst() : LoopPass(ID) {}
>
>     virtual bool runOnLoop(Loop *L, LPPassManager &LPM) {
>         LoopInfo *LI = &getAnalysis<LoopInfo>();
> for (Loop::block_iterator b = L->block_begin(), be = L->block_end();b != be;
> ++b)
> {
> for (BasicBlock::iterator i = (*b)->begin(), ie = (*b)->end(); i != ie; ++i)
> {
>       ++LoopInstNum;
>       errs() << "Hello: ";
> }
> }
>
>       return false;
>     }
>
>     // We don't modify the program, so we preserve all analyses
>     virtual void getAnalysisUsage(AnalysisUsage &AU) const {
>       AU.addRequired<LoopInfo>();
>       AU.addPreserved<LoopInfo>();
>     }
>   };
> }
>
> char LoopInst::ID = 0;
> static RegisterPass<LoopInst> X("loop-inst", "loop instruction Pass");
>
>
> 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 -
>
> opt -load=/home/arnie/llvm-development/llvm/Debug+Asserts/lib/LoopInst.so
> -loops -loop-inst a.s
>
> opt: symbol lookup error:
> /home/arnie/llvm-development/llvm/Debug+Asserts/lib/LoopInst.so: undefined
> symbol: _ZNK4llvm8LoopBaseINS_10BasicBlockENS_4LoopEE11block_beginEv
>
> Can anyone tell me what I am doing wrong?
>
> 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.
>
> Thanks a lot;
> --
> Arnamoy Bhattacharyya
> Athabasca Hall 143
> Department of Computing Science - University of Alberta
> Edmonton, Alberta, Canada, T6G 2E8
> 587-710-7073
>
>
>
> --
> Arnamoy Bhattacharyya
> Athabasca Hall 143
> Department of Computing Science - University of Alberta
> Edmonton, Alberta, Canada, T6G 2E8
> 587-710-7073
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>



More information about the llvm-dev mailing list