[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