X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FSupport%2FInstIterator.h;h=7d3f8835098e30888a52b1f791578b3cff737bb1;hb=5eb301740c4ee5d978535caa917cc004733a7fca;hp=517e6d26a489c31b2e06edab498ce5762e13e9be;hpb=428039a6e11efa85e82cc29675e1c9c54130f2d6;p=oota-llvm.git diff --git a/include/llvm/Support/InstIterator.h b/include/llvm/Support/InstIterator.h index 517e6d26a48..7d3f8835098 100644 --- a/include/llvm/Support/InstIterator.h +++ b/include/llvm/Support/InstIterator.h @@ -1,7 +1,14 @@ -//===-- llvm/Support/InstIterator.h - Classes for inst iteration -*- C++ -*--=// +//===- llvm/Support/InstIterator.h - Classes for inst iteration -*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// // // This file contains definitions of two iterators for iterating over the -// instructions in a method. This is effectively a wrapper around a two level +// instructions in a function. This is effectively a wrapper around a two level // iterator that can probably be genericized later. // // Note that this iterator gets invalidated any time that basic blocks or @@ -9,13 +16,15 @@ // //===----------------------------------------------------------------------===// -#ifndef LLVM_INST_ITERATOR_H -#define LLVM_INST_ITERATOR_H +#ifndef LLVM_SUPPORT_INSTITERATOR_H +#define LLVM_SUPPORT_INSTITERATOR_H #include "llvm/BasicBlock.h" -#include "llvm/Method.h" +#include "llvm/Function.h" -// This class is implements inst_begin() & inst_end() for +namespace llvm { + +// This class implements inst_begin() & inst_end() for // inst_iterator and const_inst_iterator's. // template @@ -24,92 +33,115 @@ class InstIterator { typedef _BB_i_t BBIty; typedef _BI_t BIty; typedef _II_t IIty; - _BB_t &BBs; // BasicBlocksType + _BB_t *BBs; // BasicBlocksType _BB_i_t BB; // BasicBlocksType::iterator _BI_t BI; // BasicBlock::iterator public: typedef std::bidirectional_iterator_tag iterator_category; typedef IIty value_type; - typedef unsigned difference_type; - typedef BIty pointer; - typedef IIty reference; - - template InstIterator(M &m) - : BBs(m.getBasicBlocks()), BB(BBs.begin()) { // begin ctor - if (BB != BBs.end()) { - BI = (*BB)->begin(); + typedef signed difference_type; + typedef IIty* pointer; + typedef IIty& reference; + + // Default constructor + InstIterator() {} + + // Copy constructor... + template + InstIterator(const InstIterator &II) + : BBs(II.BBs), BB(II.BB), BI(II.BI) {} + + template + InstIterator(InstIterator &II) + : BBs(II.BBs), BB(II.BB), BI(II.BI) {} + + template InstIterator(M &m) + : BBs(&m.getBasicBlockList()), BB(BBs->begin()) { // begin ctor + if (BB != BBs->end()) { + BI = BB->begin(); advanceToNextBB(); } } - template InstIterator(M &m, bool) - : BBs(m.getBasicBlocks()), BB(BBs.end()) { // end ctor + template InstIterator(M &m, bool) + : BBs(&m.getBasicBlockList()), BB(BBs->end()) { // end ctor } // Accessors to get at the underlying iterators... inline BBIty &getBasicBlockIterator() { return BB; } inline BIty &getInstructionIterator() { return BI; } - - inline IIty operator*() const { return *BI; } - inline IIty operator->() const { return operator*(); } - - inline bool operator==(const InstIterator &y) const { - return BB == y.BB && (BB == BBs.end() || BI == y.BI); + + inline reference operator*() const { return *BI; } + inline pointer operator->() const { return &operator*(); } + + inline bool operator==(const InstIterator &y) const { + return BB == y.BB && (BB == BBs->end() || BI == y.BI); } - inline bool operator!=(const InstIterator& y) const { + inline bool operator!=(const InstIterator& y) const { return !operator==(y); } - InstIterator& operator++() { + InstIterator& operator++() { ++BI; advanceToNextBB(); - return *this; + return *this; } - inline InstIterator operator++(int) { - InstIterator tmp = *this; ++*this; return tmp; + inline InstIterator operator++(int) { + InstIterator tmp = *this; ++*this; return tmp; } - - InstIterator& operator--() { - while (BB == BBs.end() || BI == (*BB)->begin()) { + + InstIterator& operator--() { + while (BB == BBs->end() || BI == BB->begin()) { --BB; - BI = (*BB)->end(); + BI = BB->end(); } --BI; - return *this; + return *this; } - inline InstIterator operator--(int) { - InstIterator tmp = *this; --*this; return tmp; + inline InstIterator operator--(int) { + InstIterator tmp = *this; --*this; return tmp; } - inline bool atEnd() const { return BB == BBs.end(); } + inline bool atEnd() const { return BB == BBs->end(); } private: inline void advanceToNextBB() { // The only way that the II could be broken is if it is now pointing to // the end() of the current BasicBlock and there are successor BBs. - while (BI == (*BB)->end()) { + while (BI == BB->end()) { ++BB; - if (BB == BBs.end()) break; - BI = (*BB)->begin(); + if (BB == BBs->end()) break; + BI = BB->begin(); } } }; -typedef InstIterator, Method::iterator, - BasicBlock::iterator, Instruction*> inst_iterator; -typedef InstIterator, - Method::const_iterator, +typedef InstIterator, + Function::iterator, BasicBlock::iterator, + Instruction> inst_iterator; +typedef InstIterator, + Function::const_iterator, BasicBlock::const_iterator, - const Instruction*> const_inst_iterator; + const Instruction> const_inst_iterator; -inline inst_iterator inst_begin(Method *M) { return inst_iterator(*M); } -inline inst_iterator inst_end(Method *M) { return inst_iterator(*M, true); } -inline const_inst_iterator inst_begin(const Method *M) { - return const_inst_iterator(*M); +inline inst_iterator inst_begin(Function *F) { return inst_iterator(*F); } +inline inst_iterator inst_end(Function *F) { return inst_iterator(*F, true); } +inline const_inst_iterator inst_begin(const Function *F) { + return const_inst_iterator(*F); } -inline const_inst_iterator inst_end(const Method *M) { - return const_inst_iterator(*M, true); +inline const_inst_iterator inst_end(const Function *F) { + return const_inst_iterator(*F, true); } +inline inst_iterator inst_begin(Function &F) { return inst_iterator(F); } +inline inst_iterator inst_end(Function &F) { return inst_iterator(F, true); } +inline const_inst_iterator inst_begin(const Function &F) { + return const_inst_iterator(F); +} +inline const_inst_iterator inst_end(const Function &F) { + return const_inst_iterator(F, true); +} + +} // End llvm namespace #endif