| //===-- llvm/Use.h - Definition of the Use class ----------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This defines the Use class. The Use class represents the operand of an |
| // instruction or some other User instance which refers to a Value. The Use |
| // class keeps the "use list" of the referenced value up to date. |
| // |
| // Pointer tagging is used to efficiently find the User corresponding |
| // to a Use without having to store a User pointer in every Use. A |
| // User is preceded in memory by all the Uses corresponding to its |
| // operands, and the low bits of one of the fields (Prev) of the Use |
| // class are used to encode offsets to be able to find that User given |
| // a pointer to any Use. For details, see: |
| // |
| // http://www.llvm.org/docs/ProgrammersManual.html#UserLayout |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_USE_H |
| #define LLVM_USE_H |
| |
| #include "llvm/ADT/PointerIntPair.h" |
| #include <cstddef> |
| #include <iterator> |
| |
| namespace llvm { |
| |
| class Value; |
| class User; |
| class Use; |
| template<typename> |
| struct simplify_type; |
| |
| // Use** is only 4-byte aligned. |
| template<> |
| class PointerLikeTypeTraits<Use**> { |
| public: |
| static inline void *getAsVoidPointer(Use** P) { return P; } |
| static inline Use **getFromVoidPointer(void *P) { |
| return static_cast<Use**>(P); |
| } |
| enum { NumLowBitsAvailable = 2 }; |
| }; |
| |
| //===----------------------------------------------------------------------===// |
| // Use Class |
| //===----------------------------------------------------------------------===// |
| |
| /// Use is here to make keeping the "use" list of a Value up-to-date really |
| /// easy. |
| class Use { |
| public: |
| /// swap - provide a fast substitute to std::swap<Use> |
| /// that also works with less standard-compliant compilers |
| void swap(Use &RHS); |
| |
| // 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<User*, 1, unsigned> UserRef; |
| |
| private: |
| /// Copy ctor - do not implement |
| Use(const Use &U); |
| |
| /// Destructor - Only for zap() |
| ~Use() { |
| if (Val) removeFromList(); |
| } |
| |
| enum PrevPtrTag { zeroDigitTag |
| , oneDigitTag |
| , stopTag |
| , fullStopTag }; |
| |
| /// Constructor |
| Use(PrevPtrTag tag) : Val(0) { |
| Prev.setInt(tag); |
| } |
| |
| public: |
| /// Normally Use will just implicitly convert to a Value* that it holds. |
| operator Value*() const { return Val; } |
| |
| /// If implicit conversion to Value* doesn't work, the get() method returns |
| /// the Value*. |
| Value *get() const { return Val; } |
| |
| /// getUser - This returns the User that contains this Use. For an |
| /// instruction operand, for example, this will return the instruction. |
| User *getUser() const; |
| |
| inline void set(Value *Val); |
| |
| Value *operator=(Value *RHS) { |
| set(RHS); |
| return RHS; |
| } |
| const Use &operator=(const Use &RHS) { |
| set(RHS.Val); |
| return *this; |
| } |
| |
| Value *operator->() { return Val; } |
| const Value *operator->() const { return Val; } |
| |
| Use *getNext() const { return Next; } |
| |
| |
| /// initTags - initialize the waymarking tags on an array of Uses, so that |
| /// getUser() can find the User from any of those Uses. |
| static Use *initTags(Use *Start, Use *Stop); |
| |
| /// zap - This is used to destroy Use operands when the number of operands of |
| /// a User changes. |
| static void zap(Use *Start, const Use *Stop, bool del = false); |
| |
| private: |
| const Use* getImpliedUser() const; |
| |
| Value *Val; |
| Use *Next; |
| PointerIntPair<Use**, 2, PrevPtrTag> Prev; |
| |
| void setPrev(Use **NewPrev) { |
| Prev.setPointer(NewPrev); |
| } |
| void addToList(Use **List) { |
| Next = *List; |
| if (Next) Next->setPrev(&Next); |
| setPrev(List); |
| *List = this; |
| } |
| void removeFromList() { |
| Use **StrippedPrev = Prev.getPointer(); |
| *StrippedPrev = Next; |
| if (Next) Next->setPrev(StrippedPrev); |
| } |
| |
| friend class Value; |
| }; |
| |
| // simplify_type - Allow clients to treat uses just like values when using |
| // casting operators. |
| template<> struct simplify_type<Use> { |
| typedef Value* SimpleType; |
| static SimpleType getSimplifiedValue(const Use &Val) { |
| return static_cast<SimpleType>(Val.get()); |
| } |
| }; |
| template<> struct simplify_type<const Use> { |
| typedef Value* SimpleType; |
| static SimpleType getSimplifiedValue(const Use &Val) { |
| return static_cast<SimpleType>(Val.get()); |
| } |
| }; |
| |
| |
| |
| template<typename UserTy> // UserTy == 'User' or 'const User' |
| class value_use_iterator : public std::iterator<std::forward_iterator_tag, |
| UserTy*, ptrdiff_t> { |
| typedef std::iterator<std::forward_iterator_tag, UserTy*, ptrdiff_t> super; |
| typedef value_use_iterator<UserTy> _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(const _Self &I) : U(I.U) {} |
| value_use_iterator() {} |
| |
| bool operator==(const _Self &x) const { |
| return U == x.U; |
| } |
| bool operator!=(const _Self &x) const { |
| return !operator==(x); |
| } |
| |
| /// atEnd - return 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; } |
| |
| /// getOperandNo - Return the operand # of this use in its User. Defined in |
| /// User.h |
| /// |
| unsigned getOperandNo() const; |
| }; |
| |
| } // End llvm namespace |
| |
| #endif |