Index: include/llvm/ADT/SmallPtrSet.h =================================================================== --- include/llvm/ADT/SmallPtrSet.h +++ include/llvm/ADT/SmallPtrSet.h @@ -25,6 +25,10 @@ #include #include +#ifndef NDEBUG +extern bool ReverseIterate; +#endif + namespace llvm { class SmallPtrSetIteratorImpl; @@ -204,7 +208,12 @@ public: explicit SmallPtrSetIteratorImpl(const void *const *BP, const void*const *E) : Bucket(BP), End(E) { - AdvanceIfNotValid(); +#ifndef NDEBUG + if (ReverseIterate) + RetreatIfNotValid(); + else +#endif + AdvanceIfNotValid(); } bool operator==(const SmallPtrSetIteratorImpl &RHS) const { @@ -225,6 +234,18 @@ *Bucket == SmallPtrSetImplBase::getTombstoneMarker())) ++Bucket; } + +#ifndef NDEBUG + void RetreatIfNotValid() { + --Bucket; + assert(Bucket <= End); + while (Bucket != End && + (*Bucket == SmallPtrSetImplBase::getEmptyMarker() || + *Bucket == SmallPtrSetImplBase::getTombstoneMarker())) { + --Bucket; + } + } +#endif }; /// SmallPtrSetIterator - This implements a const_iterator for SmallPtrSet. @@ -250,13 +271,29 @@ } inline SmallPtrSetIterator& operator++() { // Preincrement +#ifndef NDEBUG + if (ReverseIterate) + RetreatIfNotValid(); + else { + ++Bucket; + AdvanceIfNotValid(); + } +#else ++Bucket; AdvanceIfNotValid(); +#endif return *this; } SmallPtrSetIterator operator++(int) { // Postincrement - SmallPtrSetIterator tmp = *this; ++*this; return tmp; + SmallPtrSetIterator tmp = *this; +#ifndef NDEBUG + if (ReverseIterate) + --*this; + else +#endif + ++*this; + return tmp; } }; @@ -337,9 +374,23 @@ } inline iterator begin() const { +#ifndef NDEBUG + if (ReverseIterate) + return endPtr(); +#endif return iterator(CurArray, EndPointer()); } + inline iterator end() const { +#ifndef NDEBUG + if (ReverseIterate) + return iterator(CurArray, CurArray); +#endif + return endPtr(); + } + +private: + inline iterator endPtr() const { const void *const *End = EndPointer(); return iterator(End, End); } Index: lib/Support/CommandLine.cpp =================================================================== --- lib/Support/CommandLine.cpp +++ lib/Support/CommandLine.cpp @@ -44,6 +44,13 @@ #define DEBUG_TYPE "commandline" +#ifndef NDEBUG +bool ReverseIterate; +static cl::opt ReverseIteration("reverse-iterate", + cl::location(ReverseIterate), cl::init(false)); +#endif + + //===----------------------------------------------------------------------===// // Template instantiations and anchors. //