Alexandru Ionut Diaconescu
2012-Dec-20 10:42 UTC
[LLVMdev] LLVM segmentation fault / need use Instruction instead of Instruction*
Hello John, I was following your procedures and I isolated the problem. The problem are represented by the basic blocks with only one element. for (Function::iterator II = F.begin(), EE = F.end(); II != EE; ++II, ++ii) { BasicBlock* BB=II; if (BB->getTerminator()) { Instruction* current = BB->getTerminator(); Instruction* previous; errs()<<"AAA\n"; if(*current->getPrevNode()*) { errs()<<"BBB\n"; previous = current->getPrevNode(); ok=1; } if (ok){ errs()<<"CCC\n"; ........ It does print AAA, but then I have the segfault. So when I am evaluating the *current->getPrevNode() *condition, I got the segfault. Do you know how can I solve this? Thank you Alex -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20121220/feea7b5a/attachment.html>
Stephen McGruer
2012-Dec-20 11:06 UTC
[LLVMdev] LLVM segmentation fault / need use Instruction instead of Instruction*
I may be mistaken as I just took a quick look, but in ilist_node the function "getPrevNode()" actually calls a method on the previous node: NodeTy *getPrevNode() { NodeTy *Prev = this->getPrev(); // Check for sentinel. if (!Prev->getNext()) return 0; return Prev; } http://llvm.org/docs/doxygen/html/ilist__node_8h_source.html#l00058 Try checking if current->getPrev() is null before calling current->getPrevNode(). Stephen On 20 December 2012 10:42, Alexandru Ionut Diaconescu < alexandruionutdiaconescu at gmail.com> wrote:> Hello John, > > I was following your procedures and I isolated the problem. The problem > are represented by the basic blocks with only one element. > > > for (Function::iterator II = F.begin(), EE = F.end(); II != EE; ++II, > ++ii) > { > BasicBlock* BB=II; > > > if (BB->getTerminator()) > { > Instruction* current = BB->getTerminator(); > > Instruction* previous; > > errs()<<"AAA\n"; > if(*current->getPrevNode()*) > { > errs()<<"BBB\n"; > previous = current->getPrevNode(); > ok=1; > } > > if (ok){ > errs()<<"CCC\n"; > ........ > > > It does print AAA, but then I have the segfault. So when I am evaluating > the *current->getPrevNode() *condition, I got the segfault. > Do you know how can I solve this? > > Thank you > Alex > > _______________________________________________ > 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/20121220/a2ce2291/attachment.html>
Óscar Fuentes
2012-Dec-20 11:10 UTC
[LLVMdev] LLVM segmentation fault / need use Instruction instead of Instruction*
Alexandru Ionut Diaconescu <alexandruionutdiaconescu at gmail.com> writes:> I was following your procedures and I isolated the problem. The problem are > represented by the basic blocks with only one element. > > > for (Function::iterator II = F.begin(), EE = F.end(); II != EE; ++II, ++ii) > { > BasicBlock* BB=II; > > > if (BB->getTerminator()) > { > Instruction* current = BB->getTerminator(); > > Instruction* previous; > > errs()<<"AAA\n"; > if(*current->getPrevNode()*) > { > errs()<<"BBB\n"; > previous = current->getPrevNode(); > ok=1; > } > > if (ok){ > errs()<<"CCC\n"; > ........ > > > It does print AAA, but then I have the segfault. So when I am evaluating > the *current->getPrevNode() *condition, I got the segfault. > Do you know how can I solve this?The documentation for BasickBlock::getTerminator says: /// getTerminator() - If this is a well formed basic block, then this returns /// a pointer to the terminator instruction. If it is not, then you get a /// null pointer back. Maybe BB is not well formed (it doesn't have proper terminator) and BB->getTerminator returns NULL ?
Alexandru Ionut Diaconescu
2012-Dec-20 11:42 UTC
[LLVMdev] LLVM segmentation fault / need use Instruction instead of Instruction*
Hello, Thank you for your answer. If I want to use then I have error: ‘NodeTy* llvm::ilist_half_node<NodeTy>::getPrev() [with NodeTy llvm::Instruction]’ is protected error: ‘llvm::ilist_half_node<llvm::Instruction>’ is not an accessible base of ‘llvm::Instruction’ Do you know any other method to access the previous instruction of a terminator instruction? PS: back() is not an option. On Thu, Dec 20, 2012 at 12:06 PM, Stephen McGruer <stephen.mcgruer at gmail.com> wrote:> current->getPrev()-- Best regards, Alexandru Ionut Diaconescu -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20121220/c610d364/attachment.html>
Possibly Parallel Threads
- [LLVMdev] LLVM segmentation fault / need use Instruction instead of Instruction*
- [LLVMdev] LLVM segmentation fault / need use Instruction instead of Instruction*
- [LLVMdev] LLVM segmentation fault / need use Instruction instead of Instruction*
- [LLVMdev] LLVM segmentation fault / need use Instruction instead of Instruction*
- [LLVMdev] ilist::getPrevNode asserts on list head