X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FValue.h;h=44c4453b04a045577ec5181f8f692023c406f4d0;hb=b7dd88fa7dcb7e6855d9fb089425385310de8eaa;hp=63af0f747d6b64a1a78cf21afa1324394b00e259;hpb=ef9b9a793949469cdaa4ab6d0173136229dcab7b;p=oota-llvm.git diff --git a/include/llvm/Value.h b/include/llvm/Value.h index 63af0f747d6..44c4453b04a 100644 --- a/include/llvm/Value.h +++ b/include/llvm/Value.h @@ -30,9 +30,12 @@ class BasicBlock; class GlobalValue; class Function; class GlobalVariable; +class GlobalAlias; class InlineAsm; class ValueSymbolTable; class TypeSymbolTable; +template class StringMapEntry; +typedef StringMapEntry ValueName; //===----------------------------------------------------------------------===// // Value Class @@ -61,13 +64,13 @@ private: friend class ValueSymbolTable; // Allow ValueSymbolTable to directly mod Name. friend class SymbolTable; // Allow SymbolTable to directly poke Name. - std::string Name; + ValueName *Name; void operator=(const Value &); // Do not implement Value(const Value &); // Do not implement public: - Value(const Type *Ty, unsigned scid, const std::string &name = ""); + Value(const Type *Ty, unsigned scid); virtual ~Value(); /// dump - Support for debugging, callable in GDB: V->dump() @@ -84,10 +87,19 @@ public: inline const Type *getType() const { return Ty; } // All values can potentially be named... - inline bool hasName() const { return !Name.empty(); } - inline const std::string &getName() const { return Name; } + inline bool hasName() const { return Name != 0; } + std::string getName() const { return getNameStr(); } + std::string getNameStr() const; + ValueName *getValueName() const { return Name; } void setName(const std::string &name); + void setName(const char *Name, unsigned NameLen); + void setName(const char *Name); // Takes a null-terminated string. + + + /// takeName - transfer the name from V to this value, setting V's name to + /// empty. It is an error to call V->takeName(V). + void takeName(Value *V); /// replaceAllUsesWith - Go through the uses list for this definition and make /// each use point to "V" instead of "this". After this completes, 'this's @@ -149,6 +161,7 @@ public: ArgumentVal, // This is an instance of Argument BasicBlockVal, // This is an instance of BasicBlock FunctionVal, // This is an instance of Function + GlobalAliasVal, // This is an instance of GlobalAlias GlobalVariableVal, // This is an instance of GlobalVariable UndefValueVal, // This is an instance of UndefValue ConstantExprVal, // This is an instance of ConstantExpr @@ -157,7 +170,7 @@ public: ConstantFPVal, // This is an instance of ConstantFP ConstantArrayVal, // This is an instance of ConstantArray ConstantStructVal, // This is an instance of ConstantStruct - ConstantPackedVal, // This is an instance of ConstantPacked + ConstantVectorVal, // This is an instance of ConstantVector ConstantPointerNullVal, // This is an instance of ConstantPointerNull InlineAsmVal, // This is an instance of InlineAsm InstructionVal, // This is an instance of Instruction @@ -167,14 +180,16 @@ public: ConstantLastVal = ConstantPointerNullVal }; - /// getValueType - Return an ID for the concrete type of this object. This is + /// getValueID - Return an ID for the concrete type of this object. This is /// used to implement the classof checks. This should not be used for any /// other purpose, as the values may change as LLVM evolves. Also, note that - /// starting with the InstructionVal value, the value stored is actually the - /// Instruction opcode, so there are more than just these values possible here - /// (and Instruction must be last). - /// - unsigned getValueType() const { + /// for instructions, the Instruction's opcode is added to InstructionVal. So + /// this means three things: + /// # there is no value with code InstructionVal (no opcode==0). + /// # there are more possible values for the value type than in ValueTy enum. + /// # the InstructionVal enumerator must be the highest valued enumerator in + /// the ValueTy enum. + unsigned getValueID() const { return SubclassID; } @@ -214,29 +229,32 @@ void Use::set(Value *V) { // the subtype header files to test to see if the value is a subclass... // template <> inline bool isa_impl(const Value &Val) { - return Val.getValueType() >= Value::ConstantFirstVal && - Val.getValueType() <= Value::ConstantLastVal; + return Val.getValueID() >= Value::ConstantFirstVal && + Val.getValueID() <= Value::ConstantLastVal; } template <> inline bool isa_impl(const Value &Val) { - return Val.getValueType() == Value::ArgumentVal; + return Val.getValueID() == Value::ArgumentVal; } template <> inline bool isa_impl(const Value &Val) { - return Val.getValueType() == Value::InlineAsmVal; + return Val.getValueID() == Value::InlineAsmVal; } template <> inline bool isa_impl(const Value &Val) { - return Val.getValueType() >= Value::InstructionVal; + return Val.getValueID() >= Value::InstructionVal; } template <> inline bool isa_impl(const Value &Val) { - return Val.getValueType() == Value::BasicBlockVal; + return Val.getValueID() == Value::BasicBlockVal; } template <> inline bool isa_impl(const Value &Val) { - return Val.getValueType() == Value::FunctionVal; + return Val.getValueID() == Value::FunctionVal; } template <> inline bool isa_impl(const Value &Val) { - return Val.getValueType() == Value::GlobalVariableVal; + return Val.getValueID() == Value::GlobalVariableVal; +} +template <> inline bool isa_impl(const Value &Val) { + return Val.getValueID() == Value::GlobalAliasVal; } template <> inline bool isa_impl(const Value &Val) { - return isa(Val) || isa(Val); + return isa(Val) || isa(Val) || isa(Val); } } // End llvm namespace