aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2003-10-02 19:44:23 +0000
committerChris Lattner <sabre@nondot.org>2003-10-02 19:44:23 +0000
commit0dde36c4c70e2c16be7802e978fb7dd34a7125cb (patch)
treeca4ef9d76010ba44f93e0fe0971cb39c1e8ecbc8
parentdf0c1a2189c6a1864eca3aaa8031c5c91259e20a (diff)
There is no reason for Value to be an AbstractTypeUser. This just makes things
significantly more complete. Instead, just make DerivedType's AbstractTypeUser's, and make Value contain a PATypeHolder. This will also be more efficient in the future. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@8827 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/DerivedTypes.h15
-rw-r--r--include/llvm/Value.h14
2 files changed, 16 insertions, 13 deletions
diff --git a/include/llvm/DerivedTypes.h b/include/llvm/DerivedTypes.h
index f65a2ce1c5..73587b4824 100644
--- a/include/llvm/DerivedTypes.h
+++ b/include/llvm/DerivedTypes.h
@@ -19,7 +19,7 @@ class ArrayValType;
class StructValType;
class PointerValType;
-class DerivedType : public Type {
+class DerivedType : public Type, public AbstractTypeUser {
char isRefining; // Used for recursive types
// AbstractTypeUsers - Implement a list of the users that need to be notified
@@ -80,6 +80,8 @@ public:
refineAbstractTypeToInternal(NewType, true);
}
+ void dump() const { Value::dump(); }
+
// Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const DerivedType *T) { return true; }
static inline bool classof(const Type *T) {
@@ -149,7 +151,6 @@ public:
const std::vector<const Type*> &Params,
bool isVarArg);
-
// Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const FunctionType *T) { return true; }
static inline bool classof(const Type *T) {
@@ -410,6 +411,16 @@ public:
return new OpaqueType(); // All opaque types are distinct
}
+ // refineAbstractType - Called when a contained type is found to be more
+ // concrete - this could potentially change us from an abstract type to a
+ // concrete type.
+ //
+ virtual void refineAbstractType(const DerivedType *OldTy, const Type *NewTy) {
+ // This class never uses other types!
+ abort();
+ }
+
+
// Methods for support type inquiry through isa, cast, and dyn_cast:
static inline bool classof(const OpaqueType *T) { return true; }
static inline bool classof(const Type *T) {
diff --git a/include/llvm/Value.h b/include/llvm/Value.h
index 99bc8affa4..628e32cedb 100644
--- a/include/llvm/Value.h
+++ b/include/llvm/Value.h
@@ -34,9 +34,7 @@ class SymbolTable;
/// Value - The base class of all values computed by a program that may be used
/// as operands to other values.
///
-class Value : public Annotable, // Values are annotable
- public AbstractTypeUser { // Values use potentially abstract types
-public:
+struct Value : public Annotable { // Values are annotable
enum ValueTy {
TypeVal, // This is an instance of Type
ConstantVal, // This is an instance of Constant
@@ -50,7 +48,7 @@ public:
private:
std::vector<User *> Uses;
std::string Name;
- PATypeHandle Ty;
+ PATypeHolder Ty;
ValueTy VTy;
void operator=(const Value &); // Do not implement
@@ -61,7 +59,7 @@ public:
/// dump - Support for debugging, callable in GDB: V->dump()
//
- void dump() const;
+ virtual void dump() const;
/// print - Implement operator<< on Value...
///
@@ -93,12 +91,6 @@ public:
// Only use when in type resolution situations!
void uncheckedReplaceAllUsesWith(Value *V);
- /// 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 vector of uses of this Value.
//