From 3728d62a0676fe7bcf93be9a25a153612c72dd1f Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 9 Sep 2001 21:00:23 +0000 Subject: [PATCH] Convert ConstRules to use annotations to clean it up. llvm-svn: 514 --- include/Support/Annotation.h | 8 ++++++-- include/llvm/Annotation.h | 8 ++++++-- include/llvm/ConstantHandling.h | 13 +++++++------ include/llvm/Type.h | 12 ------------ 4 files changed, 19 insertions(+), 22 deletions(-) diff --git a/include/Support/Annotation.h b/include/Support/Annotation.h index 43a379eee1d..99197326928 100644 --- a/include/Support/Annotation.h +++ b/include/Support/Annotation.h @@ -161,12 +161,17 @@ public: // register an annotation handler // struct AnnotationManager { + typedef Annotation *(*Factory)(AnnotationID, const Annotable *, void*); + //===--------------------------------------------------------------------===// // Basic ID <-> Name map functionality static AnnotationID getID (const string &Name); // Name -> ID static const string &getName(AnnotationID ID); // ID -> Name + // getID - Name -> ID + registration of a factory function for demand driven + // annotation support. + static AnnotationID getID (const string &Name, Factory Fact, void *Data=0); //===--------------------------------------------------------------------===// // Annotation creation on demand support... @@ -175,8 +180,7 @@ struct AnnotationManager { // function used to create an annotation on demand if it is needed by the // Annotable::getOrCreateAnnotation method. // - static void registerAnnotationFactory(AnnotationID ID, - Annotation *(*Func)(AnnotationID, const Annotable *, void *), + static void registerAnnotationFactory(AnnotationID ID, Factory Func, void *ExtraData = 0); // createAnnotation - Create an annotation of the specified ID for the diff --git a/include/llvm/Annotation.h b/include/llvm/Annotation.h index 43a379eee1d..99197326928 100644 --- a/include/llvm/Annotation.h +++ b/include/llvm/Annotation.h @@ -161,12 +161,17 @@ public: // register an annotation handler // struct AnnotationManager { + typedef Annotation *(*Factory)(AnnotationID, const Annotable *, void*); + //===--------------------------------------------------------------------===// // Basic ID <-> Name map functionality static AnnotationID getID (const string &Name); // Name -> ID static const string &getName(AnnotationID ID); // ID -> Name + // getID - Name -> ID + registration of a factory function for demand driven + // annotation support. + static AnnotationID getID (const string &Name, Factory Fact, void *Data=0); //===--------------------------------------------------------------------===// // Annotation creation on demand support... @@ -175,8 +180,7 @@ struct AnnotationManager { // function used to create an annotation on demand if it is needed by the // Annotable::getOrCreateAnnotation method. // - static void registerAnnotationFactory(AnnotationID ID, - Annotation *(*Func)(AnnotationID, const Annotable *, void *), + static void registerAnnotationFactory(AnnotationID ID, Factory Func, void *ExtraData = 0); // createAnnotation - Create an annotation of the specified ID for the diff --git a/include/llvm/ConstantHandling.h b/include/llvm/ConstantHandling.h index 453c3e88b18..cbb9789fb0e 100644 --- a/include/llvm/ConstantHandling.h +++ b/include/llvm/ConstantHandling.h @@ -58,10 +58,12 @@ inline ConstPoolBool *operator!=(const ConstPoolVal &V1, // Implement all other operators indirectly through TypeRules system //===----------------------------------------------------------------------===// -class ConstRules { +class ConstRules : public Annotation { protected: - inline ConstRules() {} // Can only be subclassed... + inline ConstRules() : Annotation(AID) {} // Can only be subclassed... public: + static AnnotationID AID; // AnnotationID for this class + // Unary Operators... virtual ConstPoolVal *not(const ConstPoolVal *V) const = 0; @@ -110,12 +112,11 @@ public: // we just want to make sure to hit the cache instead of doing it indirectly, // if possible... // - static inline const ConstRules *get(const ConstPoolVal &V) { - const ConstRules *Result = V.getType()->getConstRules(); - return Result ? Result : find(V.getType()); + static inline ConstRules *get(const ConstPoolVal &V) { + return (ConstRules*)V.getType()->getOrCreateAnnotation(AID); } private : - static const ConstRules *find(const Type *Ty); + static Annotation *find(AnnotationID AID, const Annotable *Ty, void *); ConstRules(const ConstRules &); // Do not implement ConstRules &operator=(const ConstRules &); // Do not implement diff --git a/include/llvm/Type.h b/include/llvm/Type.h index 0f8e6a115e7..d5f57cba04b 100644 --- a/include/llvm/Type.h +++ b/include/llvm/Type.h @@ -28,9 +28,6 @@ #include "llvm/Value.h" -namespace opt { - class ConstRules; -} class DerivedType; class MethodType; class ArrayType; @@ -78,9 +75,6 @@ private: bool Abstract; // True if type contains an OpaqueType bool Recursive; // True if the type is recursive - // ConstRulesImpl - See Opt/ConstantHandling.h for more info - mutable const opt::ConstRules *ConstRulesImpl; - protected: // ctor is protected, so only subclasses can create Type objects... Type(const string &Name, PrimitiveID id); @@ -175,12 +169,6 @@ public: static const Type *getPrimitiveType(PrimitiveID IDNumber); static const Type *getUniqueIDType(unsigned UID); - // Methods for dealing with constants uniformly. See Opt/ConstantHandling.h - // for more info on this... - // - inline const opt::ConstRules *getConstRules() const { return ConstRulesImpl; } - inline void setConstRules(const opt::ConstRules *R) const { ConstRulesImpl=R;} - //===--------------------------------------------------------------------===// // These are the builtin types that are always available... //