[LLVMdev] BasicBlock back()
Alexandru Ionut Diaconescu
alexandruionutdiaconescu at gmail.com
Tue Dec 18 00:44:41 PST 2012
Hi, thank you for your response ! Please find below my comments:
On Mon, Dec 17, 2012 at 6:20 PM, John Criswell <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).
>
> Here is the definition of back(): return *this->getPrev(getTail()), so
> basically it should get the previous function of the terminator. or maybe
> the tail is considered the head because it is a circular list...
>
>
>
>
>
> 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));
>
error: cannot convert ‘llvm::Instruction’ to ‘llvm::Instruction*’ in
initialization , and if I make dyn_cast<Instruction*> I have the previous
problem...do you know other method or a pass example from the LLVM site
that is passing through the instructions of a BB? And not using complicated
dependencies as http://llvm.org/doxygen/EdgeBundles_8cpp_source.html#l00078?
>
> That might work.
>
> -- John T.
>
>
> Thank you,
> Alex
>
> --
> Best regards,
> Alexandru Ionut Diaconescu
>
>
>
> _______________________________________________
> LLVM Developers mailing listLLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.eduhttp://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>
>
--
Best regards,
Alexandru Ionut Diaconescu
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20121218/3d910eff/attachment.html>
More information about the llvm-dev
mailing list