X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FUser.h;h=1ea5e189ba8263351d4e1ce99fd468b2855657ce;hb=1a957d563fe894c797e0eba00bf069fbe7ecba77;hp=e78d21bbca0a1221f13d809e3e49f1db62468ce4;hpb=dc58535b37790e0779cb59c74bbf8435c16c0bd7;p=oota-llvm.git diff --git a/include/llvm/User.h b/include/llvm/User.h index e78d21bbca0..1ea5e189ba8 100644 --- a/include/llvm/User.h +++ b/include/llvm/User.h @@ -1,4 +1,11 @@ -//===-- llvm/User.h - User class definition ----------------------*- C++ -*--=// +//===-- llvm/User.h - User class definition ---------------------*- 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 class defines the interface that one who 'use's a Value must implement. // Each instance of the Value class keeps track of what User's have handles @@ -14,63 +21,102 @@ #include "llvm/Value.h" +namespace llvm { + class User : public Value { User(const User &); // Do not implement protected: - std::vector Operands; + /// OperandList - This is a pointer to the array of Users for this operand. + /// For nodes of fixed arity (e.g. a binary operator) this array will live + /// embedded into the derived class. For nodes of variable arity + /// (e.g. ConstantArrays, CallInst, PHINodes, etc), this memory will be + /// dynamically allocated and should be destroyed by the classes virtual dtor. + Use *OperandList; + + /// NumOperands - The number of values used by this User. + /// + unsigned NumOperands; + public: - User(const Type *Ty, ValueTy vty, const std::string &name = ""); - virtual ~User() { dropAllReferences(); } + User(const Type *Ty, unsigned vty, Use *OpList, unsigned NumOps) + : Value(Ty, vty), OperandList(OpList), NumOperands(NumOps) {} - inline Value *getOperand(unsigned i) { - assert(i < Operands.size() && "getOperand() out of range!"); - return Operands[i]; - } - inline const Value *getOperand(unsigned i) const { - assert(i < Operands.size() && "getOperand() const out of range!"); - return Operands[i]; + Value *getOperand(unsigned i) const { + assert(i < NumOperands && "getOperand() out of range!"); + return OperandList[i]; } - inline void setOperand(unsigned i, Value *Val) { - assert(i < Operands.size() && "setOperand() out of range!"); - Operands[i] = Val; + void setOperand(unsigned i, Value *Val) { + assert(i < NumOperands && "setOperand() out of range!"); + OperandList[i] = Val; } - inline unsigned getNumOperands() const { return Operands.size(); } + unsigned getNumOperands() const { return NumOperands; } // --------------------------------------------------------------------------- // Operand Iterator interface... // - typedef std::vector::iterator op_iterator; - typedef std::vector::const_iterator const_op_iterator; + typedef Use* op_iterator; + typedef const Use* const_op_iterator; - inline op_iterator op_begin() { return Operands.begin(); } - inline const_op_iterator op_begin() const { return Operands.begin(); } - inline op_iterator op_end() { return Operands.end(); } - inline const_op_iterator op_end() const { return Operands.end(); } + inline op_iterator op_begin() { return OperandList; } + inline const_op_iterator op_begin() const { return OperandList; } + inline op_iterator op_end() { return OperandList+NumOperands; } + inline const_op_iterator op_end() const { return OperandList+NumOperands; } // dropAllReferences() - This function is in charge of "letting go" of all // objects that this User refers to. This allows one to // 'delete' a whole class at a time, even though there may be circular // references... first all references are dropped, and all use counts go to // zero. Then everything is delete'd for real. Note that no operations are - // valid on an object that has "dropped all references", except operator + // valid on an object that has "dropped all references", except operator // delete. // - inline void dropAllReferences() { - Operands.clear(); + void dropAllReferences() { + Use *OL = OperandList; + for (unsigned i = 0, e = NumOperands; i != e; ++i) + OL[i].set(0); } - // replaceUsesOfWith - Replaces all references to the "From" definition with - // references to the "To" definition. (defined in Value.cpp) - // + /// replaceUsesOfWith - Replaces all references to the "From" definition with + /// references to the "To" definition. + /// void replaceUsesOfWith(Value *From, Value *To); // Methods for support type inquiry through isa, cast, and dyn_cast: static inline bool classof(const User *) { return true; } static inline bool classof(const Value *V) { - return V->getValueType() == Value::GlobalVariableVal || - V->getValueType() == Value::ConstantVal || - V->getValueType() == Value::InstructionVal; + return isa(V) || isa(V); + } +}; + +template<> struct simplify_type { + typedef Value* SimpleType; + + static SimpleType getSimplifiedValue(const User::op_iterator &Val) { + return static_cast(Val->get()); } }; +template<> struct simplify_type + : public simplify_type {}; + +template<> struct simplify_type { + typedef Value* SimpleType; + + static SimpleType getSimplifiedValue(const User::const_op_iterator &Val) { + return static_cast(Val->get()); + } +}; + +template<> struct simplify_type + : public simplify_type {}; + + +// value_use_iterator::getOperandNo - Requires the definition of the User class. +template +unsigned value_use_iterator::getOperandNo() const { + return U - U->getUser()->op_begin(); +} + +} // End llvm namespace + #endif