X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FValue.h;h=f8eceb7ec05aac2f43a6fcae08acd175107ede89;hb=87944916a4764dabc2f89cbec0a6c7e439c28530;hp=004a8ff89e16176d9f6e7e31a8394595778683ef;hpb=356b79320b053b77562b47c076c753ab4c4d60d7;p=oota-llvm.git diff --git a/include/llvm/Value.h b/include/llvm/Value.h index 004a8ff89e1..f8eceb7ec05 100644 --- a/include/llvm/Value.h +++ b/include/llvm/Value.h @@ -10,10 +10,11 @@ #ifndef LLVM_VALUE_H #define LLVM_VALUE_H -#include #include "llvm/Annotation.h" #include "llvm/AbstractTypeUser.h" #include "Support/Casting.h" +#include +#include class User; class Type; @@ -25,13 +26,14 @@ class GlobalValue; class Function; class GlobalVariable; class SymbolTable; -template - class ValueHolder; //===----------------------------------------------------------------------===// // Value Class //===----------------------------------------------------------------------===// +/// Value - The base class of all values computed by a program that may be used +/// as operands to other values. +/// class Value : public Annotable, // Values are annotable public AbstractTypeUser { // Values use potentially abstract types public: @@ -51,20 +53,22 @@ private: PATypeHandle Ty; ValueTy VTy; + void operator=(const Value &); // Do not implement Value(const Value &); // Do not implement -protected: - inline void setType(const Type *ty) { Ty = ty; } public: Value(const Type *Ty, ValueTy vty, const std::string &name = ""); virtual ~Value(); - // Support for debugging + /// dump - Support for debugging, callable in GDB: V->dump() + // void dump() const; - // Implement operator<< on Value... + /// print - Implement operator<< on Value... + /// virtual void print(std::ostream &O) const = 0; - // All values can potentially be typed + /// All values are typed, get the type of this value. + /// inline const Type *getType() const { return Ty; } // All values can potentially be named... @@ -75,27 +79,20 @@ public: Name = name; } - // Methods for determining the subtype of this Value. The getValueType() - // method returns the type of the value directly. The cast*() methods are - // equivalent to using dynamic_cast<>... if the cast is successful, this is - // returned, otherwise you get a null pointer. - // - // The family of functions Val->castAsserting() is used in the same - // way as the Val->cast() instructions, but they assert the expected - // type instead of checking it at runtime. - // + /// getValueType - Return the immediate subclass of this Value. + /// inline ValueTy getValueType() const { return VTy; } - // replaceAllUsesWith - Go through the uses list for this definition and make - // each use point to "D" instead of "this". After this completes, 'this's - // use list should be empty. - // - void replaceAllUsesWith(Value *D); - - // refineAbstractType - This function is implemented because we use - // potentially abstract types, and these types may be resolved to more - // concrete types after we are constructed. - // + /// replaceAllUsesWith - Go through the uses list for this definition and make + /// each use point to "V" instead of "this". After this completes, 'this's + /// use list is guaranteed to be empty. + /// + void replaceAllUsesWith(Value *V); + + /// refineAbstractType - This function is implemented because we use + /// potentially abstract types, and these types may be resolved to more + /// concrete types after we are constructed. + /// virtual void refineAbstractType(const DerivedType *OldTy, const Type *NewTy); //---------------------------------------------------------------------- @@ -128,6 +125,11 @@ inline std::ostream &operator<<(std::ostream &OS, const Value *V) { return OS; } +inline std::ostream &operator<<(std::ostream &OS, const Value &V) { + V.print(OS); + return OS; +} + //===----------------------------------------------------------------------===// // UseTy Class @@ -178,61 +180,46 @@ public: typedef UseTy Use; // Provide Use as a common UseTy type -// Provide a specialization of real_type to work with use's... to make them a -// bit more transparent. -// -template class real_type > { typedef X *Type; }; - +template struct simplify_type > { + typedef typename simplify_type::SimpleType SimpleType; + + static SimpleType getSimplifiedValue(const UseTy &Val) { + return (SimpleType)Val.get(); + } +}; +template struct simplify_type > { + typedef typename simplify_type::SimpleType SimpleType; + + static SimpleType getSimplifiedValue(const UseTy &Val) { + return (SimpleType)Val.get(); + } +}; // isa - Provide some specializations of isa so that we don't have to include // the subtype header files to test to see if the value is a subclass... // -template <> inline bool isa(const Value *Val) { - return Val->getValueType() == Value::TypeVal; -} -template <> inline bool isa(Value *Val) { - return Val->getValueType() == Value::TypeVal; -} -template <> inline bool isa(const Value *Val) { - return Val->getValueType() == Value::ConstantVal; +template <> inline bool isa_impl(const Value &Val) { + return Val.getValueType() == Value::TypeVal; } -template <> inline bool isa(Value *Val) { - return Val->getValueType() == Value::ConstantVal; +template <> inline bool isa_impl(const Value &Val) { + return Val.getValueType() == Value::ConstantVal; } -template <> inline bool isa(const Value *Val) { - return Val->getValueType() == Value::ArgumentVal; +template <> inline bool isa_impl(const Value &Val) { + return Val.getValueType() == Value::ArgumentVal; } -template <> inline bool isa(Value *Val) { - return Val->getValueType() == Value::ArgumentVal; +template <> inline bool isa_impl(const Value &Val) { + return Val.getValueType() == Value::InstructionVal; } -template <> inline bool isa(const Value *Val) { - return Val->getValueType() == Value::InstructionVal; +template <> inline bool isa_impl(const Value &Val) { + return Val.getValueType() == Value::BasicBlockVal; } -template <> inline bool isa(Value *Val) { - return Val->getValueType() == Value::InstructionVal; +template <> inline bool isa_impl(const Value &Val) { + return Val.getValueType() == Value::FunctionVal; } -template <> inline bool isa(const Value *Val) { - return Val->getValueType() == Value::BasicBlockVal; -} -template <> inline bool isa(Value *Val) { - return Val->getValueType() == Value::BasicBlockVal; -} -template <> inline bool isa(const Value *Val) { - return Val->getValueType() == Value::FunctionVal; -} -template <> inline bool isa(Value *Val) { - return Val->getValueType() == Value::FunctionVal; -} -template <> inline bool isa(const Value *Val) { - return Val->getValueType() == Value::GlobalVariableVal; -} -template <> inline bool isa(Value *Val) { - return Val->getValueType() == Value::GlobalVariableVal; -} -template <> inline bool isa(const Value *Val) { - return isa(Val) || isa(Val); +template <> inline bool isa_impl(const Value &Val) { + return Val.getValueType() == Value::GlobalVariableVal; } -template <> inline bool isa(Value *Val) { +template <> inline bool isa_impl(const Value &Val) { return isa(Val) || isa(Val); }