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

Arnamoy Bhattacharyya arnamoy at ualberta.ca
Thu Jul 5 16:51:46 PDT 2012


On Thu, Jul 5, 2012 at 3:00 PM, Carlos Sánchez de La Lama <
csanchezdll at gmail.com> wrote:

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

1.  Run ../llvm-src/cofigure <options> from within the <llvm-build>
directory [--prefix=<llvm-install>]
2.  Run make and make install from within the build directory.

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.

Then I did the following -

1.  Run ./cofigure <options> from within the <llvm-src> directory
[--prefix=<llvm-install>]
2.  Run make and make install from within the src directory.

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.

May be your and mine reason for the error was different.  Sorry I was not
clear in my last email.

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


-- 
Arnamoy Bhattacharyya
Athabasca Hall 143
Department of Computing Science - University of Alberta
Edmonton, Alberta, Canada, T6G 2E8
587-710-7073
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20120705/12a2c44a/attachment.html>


More information about the llvm-dev mailing list