X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FAbstractTypeUser.h;h=c1216baabf8fac950ba59fcd29efd55897f0b6aa;hb=a3af370dc12f6d5100da5d614ab0a62da135569a;hp=fa1e8b15b89e29671ed9a4b10d4807076c7e3208;hpb=dc4cb35105b00dcde3ee7c7ce0128a13da0cc927;p=oota-llvm.git diff --git a/include/llvm/AbstractTypeUser.h b/include/llvm/AbstractTypeUser.h index fa1e8b15b89..c1216baabf8 100644 --- a/include/llvm/AbstractTypeUser.h +++ b/include/llvm/AbstractTypeUser.h @@ -2,8 +2,8 @@ // // The LLVM Compiler Infrastructure // -// This file was developed by the LLVM research group and is distributed under -// the University of Illinois Open Source License. See LICENSE.TXT for details. +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // @@ -16,7 +16,7 @@ #if !defined(LLVM_TYPE_H) && !defined(LLVM_VALUE_H) #error Do not include this file directly. Include Type.h instead. -#error Some versions of GCC (e.g. 3.4 and 4.1) can't handle the inlined method +#error Some versions of GCC (e.g. 3.4 and 4.1) can not handle the inlined method #error PATypeHolder::dropRef() correctly otherwise. #endif @@ -33,6 +33,7 @@ namespace llvm { class Type; class DerivedType; +template struct simplify_type; /// The AbstractTypeUser class is an interface to be implemented by classes who /// could possibly use an abstract type. Abstract types are denoted by the @@ -41,7 +42,7 @@ class DerivedType; /// /// Classes must implement this interface so that they may be notified when an /// abstract type is resolved. Abstract types may be resolved into more -/// concrete types through: linking, parsing, and bytecode reading. When this +/// concrete types through: linking, parsing, and bitcode reading. When this /// happens, all of the users of the type must be updated to reference the new, /// more concrete type. They are notified through the AbstractTypeUser /// interface. @@ -136,6 +137,7 @@ public: /// class PATypeHolder { mutable const Type *Ty; + void destroy(); public: PATypeHolder(const Type *ty) : Ty(ty) { addRef(); @@ -144,7 +146,7 @@ public: addRef(); } - ~PATypeHolder() { dropRef(); } + ~PATypeHolder() { if (Ty) dropRef(); } operator Type *() const { return get(); } Type *get() const; @@ -172,8 +174,24 @@ public: private: void addRef(); void dropRef(); + friend class TypeMapBase; }; +// simplify_type - Allow clients to treat uses just like values when using +// casting operators. +template<> struct simplify_type { + typedef const Type* SimpleType; + static SimpleType getSimplifiedValue(const PATypeHolder &Val) { + return static_cast(Val.get()); + } +}; +template<> struct simplify_type { + typedef const Type* SimpleType; + static SimpleType getSimplifiedValue(const PATypeHolder &Val) { + return static_cast(Val.get()); + } +}; + } // End llvm namespace #endif