| //===-- llvm/Use.h - Definition of the Use class ----------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file was developed by the LLVM research group and 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. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_USE_H |
| #define LLVM_USE_H |
| |
| #include "llvm/Support/Casting.h" |
| #include "llvm/ADT/iterator" |
| |
| namespace llvm { |
| |
| class Value; |
| class User; |
| |
| |
| //===----------------------------------------------------------------------===// |
| // Use Class |
| //===----------------------------------------------------------------------===// |
| |
| // Use is here to make keeping the "use" list of a Value up-to-date really easy. |
| // |
| class Use { |
| public: |
| inline void init(Value *V, User *U); |
| |
| Use(Value *V, User *U) { init(V, U); } |
| Use(const Use &U) { init(U.Val, U.U); } |
| inline ~Use(); |
| |
| /// Default ctor - This leaves the Use completely unitialized. The only thing |
| /// that is valid to do with this use is to call the "init" method. |
| inline Use() : Val(0) {} |
| |
| |
| operator Value*() const { return Val; } |
| Value *get() const { return Val; } |
| User *getUser() const { return U; } |
| |
| 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; } |
| private: |
| Use *Next, **Prev; |
| Value *Val; |
| User *U; |
| |
| void addToList(Use **List) { |
| Next = *List; |
| if (Next) Next->Prev = &Next; |
| Prev = List; |
| *List = this; |
| } |
| void removeFromList() { |
| *Prev = Next; |
| if (Next) Next->Prev = Prev; |
| } |
| |
| 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 forward_iterator<UserTy*, ptrdiff_t> { |
| typedef forward_iterator<UserTy*, ptrdiff_t> super; |
| typedef value_use_iterator<UserTy> _Self; |
| |
| Use *U; |
| 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); |
| } |
| |
| // 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 reference to the current SCC |
| UserTy *operator*() const { |
| assert(U && "Cannot increment 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; |
| }; |
| |
| |
| template<> struct simplify_type<value_use_iterator<User> > { |
| typedef User* SimpleType; |
| |
| static SimpleType getSimplifiedValue(const value_use_iterator<User> &Val) { |
| return *Val; |
| } |
| }; |
| |
| template<> struct simplify_type<const value_use_iterator<User> > |
| : public simplify_type<value_use_iterator<User> > {}; |
| |
| template<> struct simplify_type<value_use_iterator<const User> > { |
| typedef const User* SimpleType; |
| |
| static SimpleType getSimplifiedValue(const |
| value_use_iterator<const User> &Val) { |
| return *Val; |
| } |
| }; |
| |
| template<> struct simplify_type<const value_use_iterator<const User> > |
| : public simplify_type<value_use_iterator<const User> > {}; |
| |
| } // End llvm namespace |
| |
| #endif |