Chuck Zhao
2009-Jul-17 15:48 UTC
[LLVMdev] LLVM Hello Pass load error when using opt -load Hello.so
While learning to write LLVM passes and following the precise
instructions under http://llvm.org/docs/WritingAnLLVMPass.html,
<http://llvm.org/docs/WritingAnLLVMPass.html>
I got this error when loading the hello pass to run the test program:
opt -load ./Release/lib/Hello.so -hello < test/test.bc > /dev/null
Error opening './Release/lib/Hello.so': ./Release/lib/Hello.so:
undefined symbol:
_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_i
-load request ignored.
opt: Unknown command line argument '-hello'. Try: 'opt
--help'
make: *** [run_lib] Error 1
I think I might have missed a LLVM lib file, but can't figure out which.
I double checked the Makefile, it does have the libLLVMCore.a,
libLLVMSystem.a and libLLVMSupport.a specified.
Could people suggest?
All are based on the LLVM 2.5 release, running on Debian4-i386.
Thank you very much
Chuck
Hello.cpp file:
#include "llvm/Pass.h"
#include "llvm/Function.h"
using namespace llvm;
namespace {
struct Hello : public FunctionPass {
static char ID;
Hello() : FunctionPass(&ID) {}
virtual bool runOnFunction(Function &F) {
llvm::cerr << "Hello: " << F.getName() <<
"\n";
return false;
}
};
char Hello::ID = 0;
RegisterPass<Hello> X("hello", "Hello World Pass");
}
Makefile:
# Makefile for hello pass
# Path to top level of LLVM heirarchy
LEVEL = .
# Name of the library to build
LIBRARYNAME = Hello
# Make the shared library become a loadable module so the tools can
# dlopen/dlsym on the resulting library.
LOADABLE_MODULE = 1
# Tell the build system which LLVM libraries your pass needs. You'll
probably
# need at least LLVMSystem.a, LLVMSupport.a, LLVMCore.a but possibly several
# others too.
LLVMLIBS = LLVMCore.a LLVMSupport.a LLVMSystem.a
# Include the makefile implementation stuff
include $(LEVEL)/Makefile.common
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20090717/28c1bd3c/attachment.html>
Shuguang Feng
2009-Jul-19 21:42 UTC
[LLVMdev] LLVM Hello Pass load error when using opt -load Hello.so
Hey Chuck, I'm afraid I can't reproduce your error but...a problem you may run into later is that opt will complain with opt: llvm/lib/VMCore/Pass.cpp:149: void<unnamed>::PassRegistrar::RegisterPass(const llvm::PassInfo&): Assertion `Inserted && "Pass registered multiple times!"' failed. Aborted I "fixed" this by replacing the LLVMLIBS line in the Makefile with LINK_COMPONENTS according to this tutorial http://llvm.org/docs/MakefileGuide.html#LoadableModules and was able to build/run my pass properly. -shu On Jul 17, 11:48 am, Chuck Zhao <cz... at eecg.toronto.edu> wrote:> While learning to write LLVM passes and following the precise > instructions underhttp://llvm.org/docs/WritingAnLLVMPass.html, > <http://llvm.org/docs/WritingAnLLVMPass.html> > I got this error when loading the hello pass to run the test program: > > opt -load ./Release/lib/Hello.so -hello < test/test.bc > /dev/null > Error opening './Release/lib/Hello.so': ./Release/lib/Hello.so: > undefined symbol: > _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_i > -load request ignored. > opt: Unknown command line argument '-hello'. Try: 'opt --help' > make: *** [run_lib] Error 1 > > I think I might have missed a LLVM lib file, but can't figure out which. > > I double checked the Makefile, it does have the libLLVMCore.a, > libLLVMSystem.a and libLLVMSupport.a specified. > > Could people suggest? > > All are based on the LLVM 2.5 release, running on Debian4-i386. > > Thank you very much > > Chuck > > Hello.cpp file: > #include "llvm/Pass.h" > #include "llvm/Function.h" > > using namespace llvm; > > namespace { > struct Hello : public FunctionPass { > > static char ID; > Hello() : FunctionPass(&ID) {} > > virtual bool runOnFunction(Function &F) { > llvm::cerr << "Hello: " << F.getName() << "\n"; > return false; > } > }; > > char Hello::ID = 0; > RegisterPass<Hello> X("hello", "Hello World Pass"); > > } > > Makefile: > # Makefile for hello pass > > # Path to top level of LLVM heirarchy > LEVEL = . > > # Name of the library to build > LIBRARYNAME = Hello > > # Make the shared library become a loadable module so the tools can > # dlopen/dlsym on the resulting library. > LOADABLE_MODULE = 1 > > # Tell the build system which LLVM libraries your pass needs. You'll > probably > # need at least LLVMSystem.a, LLVMSupport.a, LLVMCore.a but possibly several > # others too. > LLVMLIBS = LLVMCore.a LLVMSupport.a LLVMSystem.a > > # Include the makefile implementation stuff > include $(LEVEL)/Makefile.common > > _______________________________________________ > LLVM Developers mailing list > LLVM... at cs.uiuc.edu http://llvm.cs.uiuc.eduhttp://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
Chuck Zhao
2009-Jul-19 22:08 UTC
[LLVMdev] LLVM Hello Pass load error when using opt -load Hello.so
Thanks, Shu, I guess I haven't updated since my post went out. There are actually 2 problems: 1. mis-compilation: My LLVM-2.5 turned out to be mis-compiled using gcc-4.4.0 (surprise to me) on Debian4-32b. I tried a few different compilers, and gcc-4.0.4 (a relatively old one, again surprised me) seems to work out fine. Question: is there a good/quick/reliable way to figure out whether a certain gcc compiler will mis-compile? 2. I ran into exactly the problem you pointed out. (Thank you) The Makefile needs some update (after careful comparison between the tutorial Makefile and the makefile used for lib/Transformation/Hello), by commenting out the following line: #LLVMLIBS = LLVMCore.a LLVMSystem.a LLVMSupport.a I guess the tutorial needs some update, as with release 2.5 things might have changed a bit. Thanks for the reply Chuck Shuguang Feng wrote:> Hey Chuck, > > I'm afraid I can't reproduce your error but...a problem you may run > into later is that opt will complain with > > opt: llvm/lib/VMCore/Pass.cpp:149: > void<unnamed>::PassRegistrar::RegisterPass(const llvm::PassInfo&): > Assertion `Inserted && "Pass registered multiple times!"' failed. > Aborted > > I "fixed" this by replacing the LLVMLIBS line in the Makefile with > LINK_COMPONENTS according to this tutorial http://llvm.org/docs/MakefileGuide.html#LoadableModules > and was able to build/run my pass properly. > > -shu > > On Jul 17, 11:48am, Chuck Zhao <cz... at eecg.toronto.edu> wrote: > >> While learning to write LLVM passes and following the precise >> instructions underhttp://llvm.org/docs/WritingAnLLVMPass.html, >> <http://llvm.org/docs/WritingAnLLVMPass.html> >> I got this error when loading the hello pass to run the test program: >> >> opt -load ./Release/lib/Hello.so -hello < test/test.bc > /dev/null >> Error opening './Release/lib/Hello.so': ./Release/lib/Hello.so: >> undefined symbol: >> _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_i >> -load request ignored. >> opt: Unknown command line argument '-hello'. Try: 'opt --help' >> make: *** [run_lib] Error 1 >> >> I think I might have missed a LLVM lib file, but can't figure out which. >> >> I double checked the Makefile, it does have the libLLVMCore.a, >> libLLVMSystem.a and libLLVMSupport.a specified. >> >> Could people suggest? >> >> All are based on the LLVM release, running on Debian4-i386. >> >> Thank you very much >> >> Chuck >> >> Hello.cpp file: >> #include "llvm/Pass.h" >> #include "llvm/Function.h" >> >> using namespace llvm; >> >> namespace { >> struct Hello : public FunctionPass { >> >> static char ID; >> Hello() : FunctionPass(&ID) {} >> >> virtual bool runOnFunction(Function &F) { >> llvm::cerr << "Hello: " << F.getName() << "\n"; >> return false; >> } >> }; >> >> char Hello::ID = 0; >> RegisterPass<Hello> X("hello", "Hello World Pass"); >> >> } >> >> Makefile: >> # Makefile for hello pass >> >> # Path to top level of LLVM heirarchy >> LEVEL = . >> >> # Name of the library to build >> LIBRARYNAME = Hello >> >> # Make the shared library become a loadable module so the tools can >> # dlopen/dlsym on the resulting library. >> LOADABLE_MODULE = 1 >> >> # Tell the build system which LLVM libraries your pass needs. You'll >> probably >> # need at least LLVMSystem.a, LLVMSupport.a, LLVMCore.a but possibly several >> # others too. >> LLVMLIBS = LLVMCore.a LLVMSupport.a LLVMSystem.a >> >> # Include the makefile implementation stuff >> include $(LEVEL)/Makefile.common >> >> _______________________________________________ >> LLVM Developers mailing list >> LLVM... at cs.uiuc.edu http://llvm.cs.uiuc.eduhttp://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >> > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20090719/afb890e8/attachment.html>