class GlobalValue;
class Function;
class GlobalVariable;
+class GlobalAlias;
class InlineAsm;
-class SymbolTable;
+class ValueSymbolTable;
+class TypeSymbolTable;
+template<typename ValueTy> class StringMapEntry;
+typedef StringMapEntry<Value*> ValueName;
//===----------------------------------------------------------------------===//
// Value Class
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()
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
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
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
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;
}
// the subtype header files to test to see if the value is a subclass...
//
template <> inline bool isa_impl<Constant, Value>(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<Argument, Value>(const Value &Val) {
- return Val.getValueType() == Value::ArgumentVal;
+ return Val.getValueID() == Value::ArgumentVal;
}
template <> inline bool isa_impl<InlineAsm, Value>(const Value &Val) {
- return Val.getValueType() == Value::InlineAsmVal;
+ return Val.getValueID() == Value::InlineAsmVal;
}
template <> inline bool isa_impl<Instruction, Value>(const Value &Val) {
- return Val.getValueType() >= Value::InstructionVal;
+ return Val.getValueID() >= Value::InstructionVal;
}
template <> inline bool isa_impl<BasicBlock, Value>(const Value &Val) {
- return Val.getValueType() == Value::BasicBlockVal;
+ return Val.getValueID() == Value::BasicBlockVal;
}
template <> inline bool isa_impl<Function, Value>(const Value &Val) {
- return Val.getValueType() == Value::FunctionVal;
+ return Val.getValueID() == Value::FunctionVal;
}
template <> inline bool isa_impl<GlobalVariable, Value>(const Value &Val) {
- return Val.getValueType() == Value::GlobalVariableVal;
+ return Val.getValueID() == Value::GlobalVariableVal;
+}
+template <> inline bool isa_impl<GlobalAlias, Value>(const Value &Val) {
+ return Val.getValueID() == Value::GlobalAliasVal;
}
template <> inline bool isa_impl<GlobalValue, Value>(const Value &Val) {
- return isa<GlobalVariable>(Val) || isa<Function>(Val);
+ return isa<GlobalVariable>(Val) || isa<Function>(Val) || isa<GlobalAlias>(Val);
}
} // End llvm namespace