aboutsummaryrefslogtreecommitdiff
path: root/include/llvm/Type.h
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-02-17 02:58:36 +0000
committerChris Lattner <sabre@nondot.org>2004-02-17 02:58:36 +0000
commit3e3bcbd222dace4b725b39e47d326ca767c8c5d8 (patch)
treefcefa09cc7c917bc9b48b7b7911fe8ec8549e963 /include/llvm/Type.h
parent31bbb5190b59fea4610c56010ac23711f3e3bef6 (diff)
Rearrange code to eliminate warnings
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11512 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/Type.h')
-rw-r--r--include/llvm/Type.h90
1 files changed, 89 insertions, 1 deletions
diff --git a/include/llvm/Type.h b/include/llvm/Type.h
index e415d1a220..f156b2fd11 100644
--- a/include/llvm/Type.h
+++ b/include/llvm/Type.h
@@ -83,10 +83,17 @@ private:
unsigned UID; // The unique ID number for this class
bool Abstract; // True if type contains an OpaqueType
+ /// RefCount - This counts the number of PATypeHolders that are pointing to
+ /// this type. When this number falls to zero, if the type is abstract and
+ /// has no AbstractTypeUsers, the type is deleted. This is only sensical for
+ /// derived types.
+ ///
+ mutable unsigned RefCount;
+
const Type *getForwardedTypeInternal() const;
protected:
/// ctor is protected, so only subclasses can create Type objects...
- Type(const std::string &Name, PrimitiveID id);
+ Type(PrimitiveID id);
virtual ~Type() {}
/// setName - Associate the name with this type in the symbol table, but don't
@@ -259,8 +266,89 @@ public:
}
#include "llvm/Type.def"
+
+ // Virtual methods used by callbacks below. These should only be implemented
+ // in the DerivedType class.
+ virtual void addAbstractTypeUser(AbstractTypeUser *U) const {
+ abort(); // Only on derived types!
+ }
+ virtual void removeAbstractTypeUser(AbstractTypeUser *U) const {
+ abort(); // Only on derived types!
+ }
+
+ void addRef() const {
+ assert(isAbstract() && "Cannot add a reference to a non-abstract type!");
+ ++RefCount;
+ }
+
+ void dropRef() const {
+ assert(isAbstract() && "Cannot drop a refernce to a non-abstract type!");
+ assert(RefCount && "No objects are currently referencing this object!");
+
+ // If this is the last PATypeHolder using this object, and there are no
+ // PATypeHandles using it, the type is dead, delete it now.
+ if (--RefCount == 0)
+ RefCountIsZero();
+ }
+private:
+ virtual void RefCountIsZero() const {
+ abort(); // only on derived types!
+ }
+
};
+//===----------------------------------------------------------------------===//
+// Define some inline methods for the AbstractTypeUser.h:PATypeHandle class.
+// These are defined here because they MUST be inlined, yet are dependent on
+// the definition of the Type class. Of course Type derives from Value, which
+// contains an AbstractTypeUser instance, so there is no good way to factor out
+// the code. Hence this bit of uglyness.
+//
+// In the long term, Type should not derive from Value, allowing
+// AbstractTypeUser.h to #include Type.h, allowing us to eliminate this
+// nastyness entirely.
+//
+inline void PATypeHandle::addUser() {
+ assert(Ty && "Type Handle has a null type!");
+ if (Ty->isAbstract())
+ Ty->addAbstractTypeUser(User);
+}
+inline void PATypeHandle::removeUser() {
+ if (Ty->isAbstract())
+ Ty->removeAbstractTypeUser(User);
+}
+
+inline void PATypeHandle::removeUserFromConcrete() {
+ if (!Ty->isAbstract())
+ Ty->removeAbstractTypeUser(User);
+}
+
+// Define inline methods for PATypeHolder...
+
+inline void PATypeHolder::addRef() {
+ if (Ty->isAbstract())
+ Ty->addRef();
+}
+
+inline void PATypeHolder::dropRef() {
+ if (Ty->isAbstract())
+ Ty->dropRef();
+}
+
+/// get - This implements the forwarding part of the union-find algorithm for
+/// abstract types. Before every access to the Type*, we check to see if the
+/// type we are pointing to is forwarding to a new type. If so, we drop our
+/// reference to the type.
+///
+inline const Type* PATypeHolder::get() const {
+ const Type *NewTy = Ty->getForwardedType();
+ if (!NewTy) return Ty;
+ return *const_cast<PATypeHolder*>(this) = NewTy;
+}
+
+
+
+//===----------------------------------------------------------------------===//
// Provide specializations of GraphTraits to be able to treat a type as a
// graph of sub types...