// 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...
// 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
// 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...
// 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
// 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;
// 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
// 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...
// 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
#include "llvm/Value.h"
-namespace opt {
- class ConstRules;
-}
class DerivedType;
class MethodType;
class ArrayType;
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);
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...
//
// 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;
// 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
// 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;
// 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