[LLVMdev] lli crashes when running cpp programs
Johannes Doerfert
doerfert at cs.uni-saarland.de
Mon Mar 24 08:40:34 PDT 2014
Hey,
you might want to take a look at this bug report:
Bug 12666 – Hitting recursive JIT assert w/ aliases
http://llvm.org/bugs/show_bug.cgi?id=12666
Best regards,
Johannes
On 03/21, Dongpeng Xu wrote:
> Hi all,
>
>
> I need to run c++ prgrams using lli.
> However, I find lli cannot handle the alias instruction correctly. Following is
> an example:
>
>
> ------------ example.cc
> -------------
>
>
> #include
> <iostream>
> using namespace std;
>
>
> class
> cls {
> public:
> cls();
>
> ~cls();
> };
>
>
> cls::cls() {
>
> cout << "constructor" <<
> endl;
> };
>
>
> cls::~cls() {
>
> cout << "destructor" <<
> endl;
> }
>
>
> int main(int argc, char
> *argv[])
> {
> cls *A = new
> cls();
> delete A;
> return
> 0;
> }
>
>
> ----------- end of file
> -----------
>
>
> I compile and run the program
> by:
>
>
> $ clang++ -emit-llvm -S example.cc -o
> example.S
> $ llvm-as example.S -o example.bc
> $ lli
> example.bc
>
>
> and get the "Recursive compilation" error
> output:
>
>
> lli:
> /home/dongpeng/Program/llvm/lib/ExecutionEngine/JIT/JIT.cpp:467: void
> llvm::JIT::runJITOnFunctionUnlocked(llvm::Function*, const
> llvm::MutexGuard&): Assertion `!isAlreadyCodeGenerating && "Error:
> Recursive compilation detected!"' failed.
> 0 lli
> 0x0000000001323d37
> llvm::sys::PrintStackTrace(_IO_FILE*) + 38
> 1 lli
> 0x0000000001323fbe
> 2 lli
> 0x0000000001323a02
> 3
> libpthread.so.0 0x00007fd4c168b210
> 4 libc.so.6
> 0x00007fd4c06de1d5 gsignal + 53
> 5 libc.so.6
> 0x00007fd4c06e1388 abort + 328
> 6 libc.so.6
> 0x00007fd4c06d7252
> 7 libc.so.6
> 0x00007fd4c06d7302
> 8 lli
> 0x0000000000cf1620
> llvm::JIT::runJITOnFunctionUnlocked(llvm::Function*, llvm::MutexGuard
> const&) + 66
> 9 lli
> 0x0000000000cf1a3a llvm::JIT::getPointerToFunction(llvm::Function*) +
> 694
> 10 lli
> 0x00000000010fb64c llvm::ExecutionEngine::getPointerToGlobal(llvm::GlobalValue
> const*) + 70
> 11 lli
> 0x0000000000cfa2f0
> 12 lli
> 0x0000000000cfaca3
> 13 lli
> 0x00000000008c9368
> 14 lli
> 0x0000000000d6a9e1
> llvm::MachineFunctionPass::runOnFunction(llvm::Function&) + 95
> 15
> lli 0x000000000129a53f
> llvm::FPPassManager::runOnFunction(llvm::Function&) + 385
> 16 lli
> 0x000000000129a286
> llvm::legacy::FunctionPassManagerImpl::run(llvm::Function&) +
> 84
> 17 lli
> 0x0000000001299e5e llvm::legacy::FunctionPassManager::run(llvm::Function&)
> + 180
> 18 lli
> 0x0000000000cf175c llvm::JIT::jitTheFunction(llvm::Function*, llvm::MutexGuard
> const&) + 72
> 19 lli
> 0x0000000000cf1637 llvm::JIT::runJITOnFunctionUnlocked(llvm::Function*,
> llvm::MutexGuard const&) + 89
> 20 lli
> 0x0000000000cf1a3a
> llvm::JIT::getPointerToFunction(llvm::Function*) + 694
> 21 lli
> 0x0000000000817815 main + 4732
> 22
> libc.so.6 0x00007fd4c06ca995 __libc_start_main +
> 245
> 23 lli
> 0x000000000080d479
> Stack dump:
> 0. Program
> arguments: lli example.bc
> 1. Running pass 'X86
> Machine Code Emitter' on function
> '@main'
> Aborted
>
>
>
>
> I look into
> the problem and find that it is caused by the alias
> instructions:
>
>
> @_ZN3clsC1Ev = alias void (%class.cls*)*
> @_ZN3clsC2Ev
> @_ZN3clsD1Ev = alias void (%class.cls*)*
> @_ZN3clsD2Ev
>
>
> The first alias is for the constructor
> and the other one is for the destructor. When finishing JIT the main function,
> JITEmitter needs to resolve all the names in main. When it is trying to resolve
> the alias name @_ZN3clsC1Ev, the following code in JITEmitter.cpp will go to
> resolve and JIT the original name of the alias name. In my case, they are
> @_ZN3clsC2Ev and @_ZN3clsD2Ev. This procedure will cause a recursive
> compilation error.
>
>
> ----------------
> lib/ExecutionEngine/JIT/JITEmitter.cpp
> ------------------------
>
>
> void
> *JITEmitter::getPointerToGlobal(GlobalValue *V, void
> *Reference,
>
>
> bool MayNeedFarStub) {
> if (GlobalVariable *GV =
> dyn_cast<GlobalVariable>(V))
> return
> TheJIT->getOrEmitGlobalVariable(GV);
>
>
> if
> (GlobalAlias *GA = dyn_cast<GlobalAlias>(V))
>
> return
> TheJIT->getPointerToGlobal(GA->resolveAliasedGlobal(false));
>
>
>
>
> One possible solution is to let JITEmitter emit a stub for the name like
> following:
>
>
> @@ -687,8 +687,19 @@
> if (GlobalVariable *GV = dyn_cast<GlobalVariable>(V))
> return TheJIT->getOrEmitGlobalVariable(GV);
>
> - if (GlobalAlias *GA = dyn_cast<GlobalAlias>(V))
> - return TheJIT->getPointerToGlobal(GA->resolveAliasedGlobal(false));
> + if (GlobalAlias *GA = dyn_cast<GlobalAlias>(V)) {
> + Function *F =
> const_cast<Function*>(dyn_cast<Function>(GA->resolveAliasedGlobal(false)));
> + if (F == NULL) {
> + return TheJIT->getPointerToGlobal(GA->resolveAliasedGlobal(false));
> + } else {
> + void *FnStub = Resolver.getLazyFunctionStubIfAvailable(F);
> + if (FnStub)
> + return FnStub;
> + else
> + return Resolver.getLazyFunctionStub(F);
> + }
> + }
> +
>
> // If we have already compiled the function, return a pointer to its body.
> Function *F = cast<Function>(V);
>
>
> Attached is the patch. I am not sure it is the correct way to solve the
> problem. Any comments are appreciated. Thanks for your help!
>
>
>
>
> Sincerely,
> Dongpeng
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
--
Johannes Doerfert
Researcher / PhD Student
Compiler Design Lab (Prof. Hack)
Saarland University, Computer Science
Building E1.3, Room 4.26
Tel. +49 (0)681 302-57521 : doerfert at cs.uni-saarland.de
Fax. +49 (0)681 302-3065 : http://www.cdl.uni-saarland.de/people/doerfert
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 230 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140324/4bc98c96/attachment.sig>
More information about the llvm-dev
mailing list