This program contains a bug: (argv and argc are swapped) int main(char** argv, int argc) { return 0; } I compile it to bytecode like this: $ llvm-g++ --emit-llvm -o wrongmain.bc -c wrongmain.cc And then run it in the LLVM interpreter like this: $ lli wrongmain.bc Which triggers the following assertion: lli: Instructions.cpp:210: void llvm::CallInst::init(llvm::Value*, llvm::Value* const*, unsigned int): Assertion `(i >= FTy->getNumParams() || FTy->getParamType(i) == Params[i]->getType()) && "Calling a function with a bad signature!"' failed. lli((anonymous namespace)::PrintStackTrace()+0x19)[0x847fcb9] /lib/libc.so.6(abort+0x101)[0xb7ce7801] /lib/libc.so.6(__assert_fail+0xfb)[0xb7cdf7bb] lli(llvm::CallInst::init(llvm::Value*, llvm::Value* const*, unsigned int)+0x181)[0x841adb1] Aborted I'm using LLVM 2.0 and its g++ front-end, compiled from source with GCC 4.1.3.
This is not a bug. lli cannot know, whether arguments are swapped, dropped, etc. It supports all 3 types of main(): - int main(void) - int main(argc, argv) - int main(argc, argv, envp)
Of course the program is wrong, but I think lli should report that with an error message instead of an assert. If I had compiled the LLVM tools with asserts off (-DNDEBUG), something undefined could have happened.
I agree with Maarten. lli should check that the types are right and refuse to run the program if not.
Mine
Fixed in http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20070528/050179.html http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20070528/050180.html