Hi, I am learning to write LLVM modules. I am using IRBuilder to insert calls to an existing function. The call is to be inserted at a random location in every function in the code. The call does get inserted, however, the module crashes later (after doFinalization()). The crash happens only sometimes, not always. These are the kind of instructions that I see in the generated code. %callins = call void @myfunc(), !dbg !285 %callins = call void @myfunc() The stack trace shows the crash has something to do with debug information. Do I need to add metadata or debug info to the newly added call instruction? Any pointers on how I can do that? Here is the code snippet and the stack trace: IRBuilder<> Builder(ins); // to be inserted before ins CallInst *call = Builder.CreateCall(func, "callins"); // call to func 0 clang 0x0000000001492ec2 llvm::sys::PrintStackTrace(_IO_FILE*) + 34 1 clang 0x0000000001490f61 2 libpthread.so.0 0x00002b33bd0ee340 3 clang 0x00000000016a43a6 llvm::DwarfUnit::addString(llvm::DIE&, llvm::dwarf::Attribute, llvm::StringRef) + 22 4 clang 0x00000000016c2003 llvm::DwarfCompileUnit::applyVariableAttributes(llvm::DbgVariable const&, llvm::DIE&) + 915 5 clang 0x000000000168bdfe llvm::DwarfDebug::finishVariableDefinitions() + 270 6 clang 0x0000000001690424 llvm::DwarfDebug::finalizeModuleInfo() + 52 7 clang 0x000000000169c4a8 llvm::DwarfDebug::endModule() + 40 8 clang 0x00000000016850f7 llvm::AsmPrinter::doFinalization(llvm::Module&) + 551 9 clang 0x00000000011befe5 llvm::FPPassManager::doFinalization(llvm::Module&) + 69 10 clang 0x00000000011ca40d llvm::legacy::PassManagerImpl::run(llvm::Module&) + 813 11 clang 0x0000000001837fad clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::CodeGenOptions const&, clang::TargetOptions const&, clang::LangOptions const&, llvm::StringRef, llvm::Module*, clang::BackendAction, llvm::raw_ostream*) + 1629 12 clang 0x000000000182a47f 13 clang 0x0000000001bdf043 clang::ParseAST(clang::Sema&, bool, bool) + 483 14 clang 0x0000000001603ba6 clang::FrontendAction::Execute() + 118 15 clang 0x00000000015e47b8 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) + 280 16 clang 0x0000000001673b41 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) + 1921 17 clang 0x0000000000820358 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) + 1320 18 clang 0x00000000007fceaa main + 8298 19 libc.so.6 0x00002b33bdd56ec5 __libc_start_main + 245 20 clang 0x000000000081e5d9 Any help is appreciated. Thanks, Pankaj -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150519/669df929/attachment.html>
Have you tried an asserts build of clang/llvm? If you're doing LLVM development you should probably be using an asserts build. I would guess you're hitting the issue where, if you have debug info for a function, any call instructions inside that function must themselves have a debug location (that !dbg thing). Otherwise bad debug info (and assertions to ensure that badness doesn't happen) happens. - David On Tue, May 19, 2015 at 1:15 AM, Pankaj Kohli <pankaj208 at gmail.com> wrote:> Hi, > > I am learning to write LLVM modules. I am using IRBuilder to insert calls > to an existing function. The call is to be inserted at a random location in > every function in the code. The call does get inserted, however, the module > crashes later (after doFinalization()). The crash happens only sometimes, > not always. > > These are the kind of instructions that I see in the generated code. > %callins = call void @myfunc(), !dbg !285 > %callins = call void @myfunc() > > The stack trace shows the crash has something to do with debug > information. Do I need to add metadata or debug info to the newly added > call instruction? Any pointers on how I can do that? > > Here is the code snippet and the stack trace: > > IRBuilder<> Builder(ins); // to be inserted before ins > CallInst *call = Builder.CreateCall(func, "callins"); // call to func > > > 0 clang 0x0000000001492ec2 > llvm::sys::PrintStackTrace(_IO_FILE*) + 34 > 1 clang 0x0000000001490f61 > 2 libpthread.so.0 0x00002b33bd0ee340 > 3 clang 0x00000000016a43a6 > llvm::DwarfUnit::addString(llvm::DIE&, llvm::dwarf::Attribute, > llvm::StringRef) + 22 > 4 clang 0x00000000016c2003 > llvm::DwarfCompileUnit::applyVariableAttributes(llvm::DbgVariable const&, > llvm::DIE&) + 915 > 5 clang 0x000000000168bdfe > llvm::DwarfDebug::finishVariableDefinitions() + 270 > 6 clang 0x0000000001690424 > llvm::DwarfDebug::finalizeModuleInfo() + 52 > 7 clang 0x000000000169c4a8 llvm::DwarfDebug::endModule() + 40 > 8 clang 0x00000000016850f7 > llvm::AsmPrinter::doFinalization(llvm::Module&) + 551 > 9 clang 0x00000000011befe5 > llvm::FPPassManager::doFinalization(llvm::Module&) + 69 > 10 clang 0x00000000011ca40d > llvm::legacy::PassManagerImpl::run(llvm::Module&) + 813 > 11 clang 0x0000000001837fad > clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::CodeGenOptions > const&, clang::TargetOptions const&, clang::LangOptions const&, > llvm::StringRef, llvm::Module*, clang::BackendAction, llvm::raw_ostream*) + > 1629 > 12 clang 0x000000000182a47f > 13 clang 0x0000000001bdf043 clang::ParseAST(clang::Sema&, bool, > bool) + 483 > 14 clang 0x0000000001603ba6 clang::FrontendAction::Execute() + > 118 > 15 clang 0x00000000015e47b8 > clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) + 280 > 16 clang 0x0000000001673b41 > clang::ExecuteCompilerInvocation(clang::CompilerInstance*) + 1921 > 17 clang 0x0000000000820358 cc1_main(llvm::ArrayRef<char > const*>, char const*, void*) + 1320 > 18 clang 0x00000000007fceaa main + 8298 > 19 libc.so.6 0x00002b33bdd56ec5 __libc_start_main + 245 > 20 clang 0x000000000081e5d9 > > Any help is appreciated. > > Thanks, > Pankaj > > > > _______________________________________________ > 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/20150519/f6854d2d/attachment.html>
Thanks David. I will try using an asserts build. I injected the call instruction before an instruction which has metadata. This fixes the issue. - Pankaj On Wed, May 20, 2015 at 2:43 AM David Blaikie <dblaikie at gmail.com> wrote:> Have you tried an asserts build of clang/llvm? If you're doing LLVM > development you should probably be using an asserts build. > > I would guess you're hitting the issue where, if you have debug info for a > function, any call instructions inside that function must themselves have a > debug location (that !dbg thing). Otherwise bad debug info (and assertions > to ensure that badness doesn't happen) happens. > > - David > > On Tue, May 19, 2015 at 1:15 AM, Pankaj Kohli <pankaj208 at gmail.com> wrote: > >> Hi, >> >> I am learning to write LLVM modules. I am using IRBuilder to insert calls >> to an existing function. The call is to be inserted at a random location in >> every function in the code. The call does get inserted, however, the module >> crashes later (after doFinalization()). The crash happens only sometimes, >> not always. >> >> These are the kind of instructions that I see in the generated code. >> %callins = call void @myfunc(), !dbg !285 >> %callins = call void @myfunc() >> >> The stack trace shows the crash has something to do with debug >> information. Do I need to add metadata or debug info to the newly added >> call instruction? Any pointers on how I can do that? >> >> Here is the code snippet and the stack trace: >> >> IRBuilder<> Builder(ins); // to be inserted before ins >> CallInst *call = Builder.CreateCall(func, "callins"); // call to func >> >> >> 0 clang 0x0000000001492ec2 >> llvm::sys::PrintStackTrace(_IO_FILE*) + 34 >> 1 clang 0x0000000001490f61 >> 2 libpthread.so.0 0x00002b33bd0ee340 >> 3 clang 0x00000000016a43a6 >> llvm::DwarfUnit::addString(llvm::DIE&, llvm::dwarf::Attribute, >> llvm::StringRef) + 22 >> 4 clang 0x00000000016c2003 >> llvm::DwarfCompileUnit::applyVariableAttributes(llvm::DbgVariable const&, >> llvm::DIE&) + 915 >> 5 clang 0x000000000168bdfe >> llvm::DwarfDebug::finishVariableDefinitions() + 270 >> 6 clang 0x0000000001690424 >> llvm::DwarfDebug::finalizeModuleInfo() + 52 >> 7 clang 0x000000000169c4a8 llvm::DwarfDebug::endModule() + 40 >> 8 clang 0x00000000016850f7 >> llvm::AsmPrinter::doFinalization(llvm::Module&) + 551 >> 9 clang 0x00000000011befe5 >> llvm::FPPassManager::doFinalization(llvm::Module&) + 69 >> 10 clang 0x00000000011ca40d >> llvm::legacy::PassManagerImpl::run(llvm::Module&) + 813 >> 11 clang 0x0000000001837fad >> clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::CodeGenOptions >> const&, clang::TargetOptions const&, clang::LangOptions const&, >> llvm::StringRef, llvm::Module*, clang::BackendAction, llvm::raw_ostream*) + >> 1629 >> 12 clang 0x000000000182a47f >> 13 clang 0x0000000001bdf043 clang::ParseAST(clang::Sema&, bool, >> bool) + 483 >> 14 clang 0x0000000001603ba6 clang::FrontendAction::Execute() + >> 118 >> 15 clang 0x00000000015e47b8 >> clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) + 280 >> 16 clang 0x0000000001673b41 >> clang::ExecuteCompilerInvocation(clang::CompilerInstance*) + 1921 >> 17 clang 0x0000000000820358 cc1_main(llvm::ArrayRef<char >> const*>, char const*, void*) + 1320 >> 18 clang 0x00000000007fceaa main + 8298 >> 19 libc.so.6 0x00002b33bdd56ec5 __libc_start_main + 245 >> 20 clang 0x000000000081e5d9 >> >> Any help is appreciated. >> >> Thanks, >> Pankaj >> >> >> >> _______________________________________________ >> 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/20150520/ea19c075/attachment.html>