#include <list>
#include "llvm/Annotation.h"
+#include "llvm/AbstractTypeUser.h"
class User;
class Type;
class BasicBlock;
class Method;
class Module;
+class SymbolTable;
template<class ValueSubclass, class ItemParentType, class SymTabType>
class ValueHolder;
// Value Class
//===----------------------------------------------------------------------===//
-class Value : public Annotable { // Value's are annotable
+class Value : public Annotable, // Values are annotable
+ public AbstractTypeUser { // Values use potentially abstract types
public:
enum ValueTy {
TypeVal, // This is an instance of Type
private:
list<User *> Uses;
string Name;
- const Type *Ty;
+ PATypeHandle<Type> Ty;
ValueTy VTy;
Value(const Value &); // Do not implement
// All values can potentially be named...
inline bool hasName() const { return Name != ""; }
inline const string &getName() const { return Name; }
- virtual void setName(const string &name) { Name = name; }
+ virtual void setName(const string &name, SymbolTable * = 0) { Name = name; }
// Methods for determining the subtype of this Value. The getValueType()
// method returns the type of the value directly. The cast*() methods are
//
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.
+ //
+ virtual void refineAbstractType(const DerivedType *OldTy, const Type *NewTy);
+
//----------------------------------------------------------------------
// Methods for handling the list of uses of this DEF.
//