[LLVMdev] BasicBlock back()

Duncan Sands baldrick at free.fr
Tue Dec 18 01:14:13 PST 2012


On 18/12/12 10:01, Alexandru Ionut Diaconescu wrote:
> PS:
>
> I works when I use  Instruction* prev = current->getPrevNode();
>
> But then I have runtime error Stack dump that is very frequent...

This probably happens when current is the first node, so there is no previous
node.

Ciao, Duncan.

>
> On Mon, Dec 17, 2012 at 6:20 PM, John Criswell <criswell at illinois.edu
> <mailto:criswell at illinois.edu>> wrote:
>
>     On 12/17/12 10:34 AM, Alexandru Ionut Diaconescu wrote:
>>     Hello,
>>
>>     I am a beginner of LLVM. I am trying to move among the instructions of a
>>     BasicBlock and I cannot. In this particular example, I try to get the
>>     previous instruction of the end instruction. I am trying 2 methods:
>>
>>
>>
>>     1. I have the following sequence of code:
>>
>>     bool patternDC::runOnBasicBlock(BasicBlock &BB) {
>>     ...
>>     if (BB.getTerminator())
>>       {
>>                 Instruction* current = BB.getTerminator();
>>                 errs() << "\n LAST: "<<*current<<"\n";
>>
>>                 Instruction* prev = &BB.back();
>>                 errs() << "\n PENULTIMATE: "<<*prev<<"\n";
>>     ...
>>
>>     The terminal prints the SAME instruction. I don't know how back() works.
>>     (Definition at line 199
>>     <http://llvm.org/doxygen/BasicBlock_8h_source.html#l00199> of file
>>     BasicBlock.h <http://llvm.org/doxygen/BasicBlock_8h_source.html>.)
>
>     I believe BasicBlock::back() returns an iterator to the last instruction in
>     the BasicBlock which should be its terminator instruction (basic blocks are
>     required to have a TerminatorInst as their last instruction).
>
>
>
>>
>>
>>
>>     2. I also tried :
>>
>>     bool patternDC::runOnBasicBlock(BasicBlock &BB) {
>>     ...
>>     BasicBlock::const_iterator I = BB.begin();
>>     BasicBlock::const_iterator E = BB.end();
>>     BasicBlock::const_iterator prev_iter,last_iter;
>>     prev_iter = NULL; last_iter = NULL;
>>     for(;I!=E;I++){
>>         prev_iter = last_iter;
>>         last_iter = I;
>>     }
>>     if(prev_iter){
>>         errs() << "prev_iter: " << *(dyn_cast<Instruction>(prev_iter)) << "\n";
>>     }
>>     if(last_iter){
>>         errs() << "last_iter: " << *(dyn_cast<Instruction>(last_iter)) << "\n";
>>     }
>>     // not related to the main question: uncomment the next line for an
>>     unusual behavior: lastlast is DIFFERENT from last. lastlast is kind of
>>     parts of the BasicBlock
>>     // errs() << "lastlast: " << *(dyn_cast<Instruction>(I)) << "\n";
>>     ...
>>     Instruction* prev = *(dyn_cast<Instruction*>(prev_iter));
>>     errs() << "\n prev: "<<*prev<<"\n";
>>
>>     The terminal prints well prev and last, but I have compilation errors when
>>     trying to assign to Instruction* prev
>>     The Clang error is:
>>     ".....
>>     /home/alex/llvm/include/llvm/Support/Casting.h:51:28: error: ‘classof’ is
>>     not a member of ‘llvm::Instruction*’"
>>
>>
>>     If someone knows a better way to use any element from the basic block or
>>     knows why these are not working, please let me know :)
>
>     Sometimes you have to dereference an iterator to get the thing that it's
>     pointing at.  Try using:
>
>     Instruction* prev = (dyn_cast<Instruction>(*prev_iter));
>
>     That might work.
>
>     -- John T.
>
>>
>>     Thank you,
>>     Alex
>>
>>     --
>>     Best regards,
>>     Alexandru Ionut Diaconescu
>>
>>
>>
>>     _______________________________________________
>>     LLVM Developers mailing list
>>     LLVMdev at cs.uiuc.edu  <mailto:LLVMdev at cs.uiuc.edu>          http://llvm.cs.uiuc.edu
>>     http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>
>
>
> --
> Best regards,
> Alexandru Ionut Diaconescu
>
>
>
> _______________________________________________
> 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