X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FIR%2FUse.h;h=a738677f8e5b6bc4a7aaf19c56f8ded002296dd9;hb=da92e119096b6e2e93efbf44ed07ea0a715cef9c;hp=846952aa6b40de83a5686181ce5cf6be8d681dcd;hpb=0a6057117e6f0b15c334e1a701d7c29f97c60b88;p=oota-llvm.git diff --git a/include/llvm/IR/Use.h b/include/llvm/IR/Use.h index 846952aa6b4..a738677f8e5 100644 --- a/include/llvm/IR/Use.h +++ b/include/llvm/IR/Use.h @@ -25,7 +25,6 @@ #ifndef LLVM_IR_USE_H #define LLVM_IR_USE_H -#include "llvm-c/Core.h" #include "llvm/ADT/PointerIntPair.h" #include "llvm/Support/CBindingWrapping.h" #include "llvm/Support/Compiler.h" @@ -37,16 +36,14 @@ namespace llvm { class Value; class User; class Use; -template -struct simplify_type; +template struct simplify_type; // Use** is only 4-byte aligned. -template<> -class PointerLikeTypeTraits { +template <> class PointerLikeTypeTraits { public: - static inline void *getAsVoidPointer(Use** P) { return P; } + static inline void *getAsVoidPointer(Use **P) { return P; } static inline Use **getFromVoidPointer(void *P) { - return static_cast(P); + return static_cast(P); } enum { NumLowBitsAvailable = 2 }; }; @@ -62,7 +59,7 @@ public: /// implicit. The implicit pointer is found via a waymarking algorithm /// described in the programmer's manual: /// -/// http://www.llvm.org/docs/ProgrammersManual.html#UserLayout +/// http://www.llvm.org/docs/ProgrammersManual.html#the-waymarking-algorithm /// /// This is essentially the single most memory intensive object in LLVM because /// of the number of uses in the system. At the same time, the constant time @@ -76,28 +73,24 @@ public: // A type for the word following an array of hung-off Uses in memory, which is // a pointer back to their User with the bottom bit set. - typedef PointerIntPair UserRef; + typedef PointerIntPair UserRef; private: - Use(const Use &U) LLVM_DELETED_FUNCTION; + Use(const Use &U) = delete; /// Destructor - Only for zap() ~Use() { - if (Val) removeFromList(); + if (Val) + removeFromList(); } - enum PrevPtrTag { zeroDigitTag - , oneDigitTag - , stopTag - , fullStopTag }; + enum PrevPtrTag { zeroDigitTag, oneDigitTag, stopTag, fullStopTag }; /// Constructor - Use(PrevPtrTag tag) : Val(0) { - Prev.setInt(tag); - } + Use(PrevPtrTag tag) : Val(nullptr) { Prev.setInt(tag); } public: - operator Value*() const { return Val; } + operator Value *() const { return Val; } Value *get() const { return Val; } /// \brief Returns the User that contains this Use. @@ -117,11 +110,14 @@ public: return *this; } - Value *operator->() { return Val; } + Value *operator->() { return Val; } const Value *operator->() const { return Val; } Use *getNext() const { return Next; } + /// \brief Return the operand # of this use in its User. + unsigned getOperandNo() const; + /// \brief Initializes the waymarking tags on an array of Uses. /// /// This sets up the array of Uses such that getUser() can find the User from @@ -133,25 +129,25 @@ public: static void zap(Use *Start, const Use *Stop, bool del = false); private: - const Use* getImpliedUser() const; + const Use *getImpliedUser() const; Value *Val; Use *Next; - PointerIntPair Prev; + PointerIntPair Prev; - void setPrev(Use **NewPrev) { - Prev.setPointer(NewPrev); - } + void setPrev(Use **NewPrev) { Prev.setPointer(NewPrev); } void addToList(Use **List) { Next = *List; - if (Next) Next->setPrev(&Next); + if (Next) + Next->setPrev(&Next); setPrev(List); *List = this; } void removeFromList() { Use **StrippedPrev = Prev.getPointer(); *StrippedPrev = Next; - if (Next) Next->setPrev(StrippedPrev); + if (Next) + Next->setPrev(StrippedPrev); } friend class Value; @@ -159,70 +155,13 @@ private: /// \brief Allow clients to treat uses just like values when using /// casting operators. -template<> struct simplify_type { - typedef Value* SimpleType; - static SimpleType getSimplifiedValue(Use &Val) { - return Val.get(); - } -}; -template<> struct simplify_type { - typedef /*const*/ Value* SimpleType; - static SimpleType getSimplifiedValue(const Use &Val) { - return Val.get(); - } +template <> struct simplify_type { + typedef Value *SimpleType; + static SimpleType getSimplifiedValue(Use &Val) { return Val.get(); } }; - - - -template // UserTy == 'User' or 'const User' -class value_use_iterator : public std::iterator { - typedef std::iterator super; - typedef value_use_iterator _Self; - - Use *U; - explicit value_use_iterator(Use *u) : U(u) {} - friend class Value; -public: - typedef typename super::reference reference; - typedef typename super::pointer pointer; - - value_use_iterator() {} - - bool operator==(const _Self &x) const { - return U == x.U; - } - bool operator!=(const _Self &x) const { - return !operator==(x); - } - - /// \brief Returns true if this iterator is equal to use_end() on the value. - bool atEnd() const { return U == 0; } - - // Iterator traversal: forward iteration only - _Self &operator++() { // Preincrement - assert(U && "Cannot increment end iterator!"); - U = U->getNext(); - return *this; - } - _Self operator++(int) { // Postincrement - _Self tmp = *this; ++*this; return tmp; - } - - // Retrieve a pointer to the current User. - UserTy *operator*() const { - assert(U && "Cannot dereference end iterator!"); - return U->getUser(); - } - - UserTy *operator->() const { return operator*(); } - - Use &getUse() const { return *U; } - - /// \brief Return the operand # of this use in its User. - /// - /// Defined in User.h - unsigned getOperandNo() const; +template <> struct simplify_type { + typedef /*const*/ Value *SimpleType; + static SimpleType getSimplifiedValue(const Use &Val) { return Val.get(); } }; // Create wrappers for C Binding types (see CBindingWrapping.h).