Do not let 'ftostr' return a string that starts with spaces. This allows
[oota-llvm.git] / include / llvm / Value.h
index 6c899a0cd5952622024c91f5952c000c61aebfc2..2e618a5e863fd127f7883f0e007db9d49510490a 100644 (file)
 
 #include "llvm/AbstractTypeUser.h"
 #include "llvm/Use.h"
-#include "Support/Casting.h"
-#include <iostream>
+#include "llvm/Support/Casting.h"
+#include <string>
 
 namespace llvm {
 
 class Constant;
 class Argument;
 class Instruction;
-struct BasicBlock;
+class BasicBlock;
 class GlobalValue;
 class Function;
 class GlobalVariable;
@@ -40,27 +40,18 @@ class SymbolTable;
 /// Value - The base class of all values computed by a program that may be used
 /// as operands to other values.
 ///
-struct Value {
-  enum ValueTy {
-    TypeVal,                // This is an instance of Type
-    ConstantVal,            // This is an instance of Constant
-    ArgumentVal,            // This is an instance of Argument
-    InstructionVal,         // This is an instance of Instruction
-    BasicBlockVal,          // This is an instance of BasicBlock
-    FunctionVal,            // This is an instance of Function
-    GlobalVariableVal,      // This is an instance of GlobalVariable
-  };
-
+class Value {
 private:
+  unsigned SubclassID;               // Subclass identifier (for isa/dyn_cast)
+  PATypeHolder Ty;
   iplist<Use> Uses;
   std::string Name;
-  PATypeHolder Ty;
-  ValueTy VTy;
 
   void operator=(const Value &);     // Do not implement
   Value(const Value &);              // Do not implement
+
 public:
-  Value(const Type *Ty, ValueTy vty, const std::string &name = "");
+  Value(const Type *Ty, unsigned scid, const std::string &name = "");
   virtual ~Value();
   
   /// dump - Support for debugging, callable in GDB: V->dump()
@@ -83,10 +74,6 @@ public:
     Name = name;
   }
   
-  /// 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 "V" instead of "this".  After this completes, 'this's 
   /// use list is guaranteed to be empty.
@@ -102,8 +89,9 @@ public:
   //
   typedef UseListIteratorWrapper      use_iterator;
   typedef UseListConstIteratorWrapper use_const_iterator;
+  typedef iplist<Use>::size_type      size_type;
 
-  unsigned           use_size()  const { return Uses.size();  }
+  size_type          use_size()  const { return Uses.size();  }
   bool               use_empty() const { return Uses.empty(); }
   use_iterator       use_begin()       { return Uses.begin(); }
   use_const_iterator use_begin() const { return Uses.begin(); }
@@ -126,15 +114,44 @@ public:
   ///
   void addUse(Use &U)  { Uses.push_back(&U); }
   void killUse(Use &U) { Uses.remove(&U); }
-};
 
-inline std::ostream &operator<<(std::ostream &OS, const Value *V) {
-  if (V == 0)
-    OS << "<null> value!\n";
-  else
-    V->print(OS);
-  return OS;
-}
+  /// 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).
+  ///
+  enum ValueTy {
+    ArgumentVal,              // This is an instance of Argument
+    BasicBlockVal,            // This is an instance of BasicBlock
+    FunctionVal,              // This is an instance of Function
+    GlobalVariableVal,        // This is an instance of GlobalVariable
+    UndefValueVal,            // This is an instance of UndefValue
+    ConstantExprVal,          // This is an instance of ConstantExpr
+    ConstantAggregateZeroVal, // This is an instance of ConstantAggregateNull
+    SimpleConstantVal,        // This is some other type of Constant
+    InstructionVal,           // This is an instance of Instruction
+    ValueListVal              // This is for bcreader, a special ValTy
+  };
+  unsigned getValueType() const {
+    return SubclassID;
+  }
+
+  // Methods for support type inquiry through isa, cast, and dyn_cast:
+  static inline bool classof(const Value *V) {
+    return true; // Values are always values.
+  }
+
+  /// 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 VT) { SubclassID = VT; }
+  friend class Instruction;
+};
 
 inline std::ostream &operator<<(std::ostream &OS, const Value &V) {
   V.print(OS);
@@ -173,17 +190,19 @@ void Use::set(Value *V) {
 // 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_impl<Type, Value>(const Value &Val) { 
-  return Val.getValueType() == Value::TypeVal;
-}
 template <> inline bool isa_impl<Constant, Value>(const Value &Val) { 
-  return Val.getValueType() == Value::ConstantVal; 
+  return Val.getValueType() == Value::SimpleConstantVal ||
+         Val.getValueType() == Value::FunctionVal ||
+        Val.getValueType() == Value::GlobalVariableVal ||
+         Val.getValueType() == Value::ConstantExprVal ||
+         Val.getValueType() == Value::ConstantAggregateZeroVal ||
+         Val.getValueType() == Value::UndefValueVal;
 }
 template <> inline bool isa_impl<Argument, Value>(const Value &Val) { 
   return Val.getValueType() == Value::ArgumentVal;
 }
 template <> inline bool isa_impl<Instruction, Value>(const Value &Val) { 
-  return Val.getValueType() == Value::InstructionVal;
+  return Val.getValueType() >= Value::InstructionVal;
 }
 template <> inline bool isa_impl<BasicBlock, Value>(const Value &Val) { 
   return Val.getValueType() == Value::BasicBlockVal;