[LLVMdev] eraseFromParent and stack dump

John Criswell criswell at illinois.edu
Thu Jun 26 08:29:39 PDT 2014


On 6/26/14, 4:38 AM, Vasileios Koutsoumpos wrote:
> Hello,
>
> I am creating a new instruction and I want to replace the use of a 
> specified instruction.
> This is the code I have written
>
> Instruction *new_instr = BinaryOperator::Create(Instruction::Sub, op1, 
> op2, "");

As a matter of style, I'd use the version of BinaryOperator::Create() 
that takes an Instruction * as an insert point and use it to insert the 
new instruction *before* the old instruction.  It shouldn't matter 
whether it goes before or after, and it avoids having to do a separate 
operation to insert the BinaryOperator into the basic block.

> b->getInstList().insertAfter(old_instr, new_instr);  //b is the 
> BasicBlock
> old_instr->replaceAllUsesWith(new_instr);
> old_instr->eraseFromParent();
>
> When I print the basic block, I see that my instruction was inserted  
> and replaces the old instruction, however I get a stack dump, when I 
> run the instrumented IR file.
>
> 0  opt             0x00000000014680df 
> llvm::sys::PrintStackTrace(_IO_FILE*) + 38
> 1  opt             0x000000000146835c
> 2  opt             0x0000000001467dd8
> 3  libpthread.so.0 0x00007f8934eecbb0
> 4  llfi-passes.so  0x00007f89340a39b2 llvm::Value::getValueID() const 
> + 12
> 5  llfi-passes.so  0x00007f89340a3aa4 llvm::Instruction::getOpcode() 
> const + 24
> 6  llfi-passes.so  0x00007f89340a331c 
> llfi::FaultInjectionPass::locate_instruction(llvm::Module&, 
> llvm::Function*, llvm::LoopInfo&, int) + 282
> 7  llfi-passes.so  0x00007f89340a2e50 
> llfi::FaultInjectionPass::finalize(llvm::Module&, int) + 506
> 8  llfi-passes.so  0x00007f89340a3509 
> llfi::FaultInjectionPass::runOnModule(llvm::Module&) + 113
> 9  opt             0x0000000001362a1e 
> llvm::MPPassManager::runOnModule(llvm::Module&) + 502
> 10 opt             0x0000000001362fee 
> llvm::PassManagerImpl::run(llvm::Module&) + 244
> 11 opt             0x00000000013631f9 
> llvm::PassManager::run(llvm::Module&) + 39
> 12 opt             0x00000000008719e8 main + 5698
> 13 libc.so.6       0x00007f8934318de5 __libc_start_main + 245
> 14 opt             0x0000000000863779
> Stack dump:
>
> I replace the uses of the old instruction, before deleting it. I am 
> not sure why this is happening.
> any suggestions?
I'm assuming that FaultInjectionPass is your code, correct?

If so, if you look at your stack dump, you'll see that it crashes 
calling Instruction::getOpcode() in the method locate_instruction() in 
your passes finalize() method.

I recommend finding the line in locate_instruction that is causing the 
problem.  If it's one of the 4 lines you list at the top of this email, 
check that the old instruction pointer is non-NULL and points to an 
actual instruction.

You may also want to check and see if the old instruction is a 
phi-node.  That might cause issues.

Finally, if you're building a FaultInjector pass, we built a very simple 
one for SAFECode that tries to create memory safety errors. You may or 
may not find it helpful for what you're doing.

Regards,

John Criswell

>
> Vasileios
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev




More information about the llvm-dev mailing list