class Function;
class GlobalVariable;
class InlineAsm;
-class SymbolTable;
+class ValueSymbolTable;
+class TypeSymbolTable;
+template<typename ValueTy> class StringMapEntry;
+typedef StringMapEntry<Value*> ValueName;
//===----------------------------------------------------------------------===//
// Value Class
/// using this Value.
/// @brief LLVM Value Representation
class Value {
- unsigned short SubclassID; // Subclass identifier (for isa/dyn_cast)
+ const unsigned short SubclassID; // Subclass identifier (for isa/dyn_cast)
protected:
/// SubclassData - This member is defined by this class, but is not used for
/// anything. Subclasses can use it to hold whatever state they find useful.
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()
/// print - Implement operator<< on Value...
///
- void print(llvm_ostream &O) const {
- if (O.stream()) print(*O.stream());
- }
virtual void print(std::ostream &O) const = 0;
+ void print(std::ostream *O) const { if (O) print(*O); }
/// All values are typed, get the type of this value.
///
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
UndefValueVal, // This is an instance of UndefValue
ConstantExprVal, // This is an instance of ConstantExpr
ConstantAggregateZeroVal, // This is an instance of ConstantAggregateNull
- ConstantBoolVal, // This is an instance of ConstantBool
ConstantIntVal, // This is an instance of ConstantInt
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
/// getValueType - 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).
- ///
+ /// 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 getValueType() const {
return SubclassID;
}
/// getRawType - This should only be used to implement the vmcore library.
///
const Type *getRawType() const { return Ty.getRawType(); }
-
-private:
- /// FIXME: this is a gross hack, needed by another gross hack. Eliminate!
- void setValueType(unsigned short VT) { SubclassID = VT; }
- friend class Instruction;
};
inline std::ostream &operator<<(std::ostream &OS, const Value &V) {