aboutsummaryrefslogtreecommitdiffstats
path: root/include/llvm/Constants.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/llvm/Constants.h')
-rw-r--r--include/llvm/Constants.h382
1 files changed, 382 insertions, 0 deletions
diff --git a/include/llvm/Constants.h b/include/llvm/Constants.h
new file mode 100644
index 0000000000..08fc8b369b
--- /dev/null
+++ b/include/llvm/Constants.h
@@ -0,0 +1,382 @@
+//===-- llvm/ConstantVals.h - Constant Value nodes ---------------*- C++ -*--=//
+//
+// This file contains the declarations for the Constant class and all of
+// its subclasses, which represent the different type of constant pool values
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CONSTPOOLVALS_H
+#define LLVM_CONSTPOOLVALS_H
+
+#include "llvm/User.h"
+#include "Support/DataTypes.h"
+
+class ArrayType;
+class StructType;
+class PointerType;
+
+//===----------------------------------------------------------------------===//
+// Constant Class
+//===----------------------------------------------------------------------===//
+
+class Constant : public User {
+protected:
+ inline Constant(const Type *Ty) : User(Ty, Value::ConstantVal) {}
+ ~Constant() {}
+
+ // destroyConstant - Called if some element of this constant is no longer
+ // valid. At this point only other constants may be on the use_list for this
+ // constant. Any constants on our Use list must also be destroy'd. The
+ // implementation must be sure to remove the constant from the list of
+ // available cached constants. Implementations should call
+ // destroyConstantImpl as the last thing they do, to destroy all users and
+ // delete this.
+ //
+ virtual void destroyConstant() { assert(0 && "Not reached!"); }
+ void destroyConstantImpl();
+public:
+ // Specialize setName to handle symbol table majik...
+ virtual void setName(const string &name, SymbolTable *ST = 0);
+
+ virtual string getStrValue() const = 0;
+
+ // Static constructor to get a '0' constant of arbitrary type...
+ static Constant *getNullConstant(const Type *Ty);
+
+ // isNullValue - Return true if this is the value that would be returned by
+ // getNullConstant.
+ virtual bool isNullValue() const = 0;
+
+ // Methods for support type inquiry through isa, cast, and dyn_cast:
+ static inline bool classof(const Constant *) { return true; }
+ static inline bool classof(const Value *V) {
+ return V->getValueType() == Value::ConstantVal;
+ }
+};
+
+
+
+//===----------------------------------------------------------------------===//
+// Classes to represent constant pool variable defs
+//===----------------------------------------------------------------------===//
+
+//===---------------------------------------------------------------------------
+// ConstantBool - Boolean Values
+//
+class ConstantBool : public Constant {
+ bool Val;
+ ConstantBool(const ConstantBool &); // DO NOT IMPLEMENT
+ ConstantBool(bool V);
+ ~ConstantBool() {}
+public:
+ static ConstantBool *True, *False; // The True & False values
+
+ // Factory objects - Return objects of the specified value
+ static ConstantBool *get(bool Value) { return Value ? True : False; }
+ static ConstantBool *get(const Type *Ty, bool Value) { return get(Value); }
+
+ // inverted - Return the opposite value of the current value.
+ inline ConstantBool *inverted() const { return (this==True) ? False : True; }
+
+ virtual string getStrValue() const;
+ inline bool getValue() const { return Val; }
+
+ // isNullValue - Return true if this is the value that would be returned by
+ // getNullConstant.
+ virtual bool isNullValue() const { return this == False; }
+
+ // Methods for support type inquiry through isa, cast, and dyn_cast:
+ static inline bool classof(const ConstantBool *) { return true; }
+ static bool classof(const Constant *CPV) {
+ return (CPV == True) | (CPV == False);
+ }
+ static inline bool classof(const Value *V) {
+ return isa<Constant>(V) && classof(cast<Constant>(V));
+ }
+};
+
+
+//===---------------------------------------------------------------------------
+// ConstantInt - Superclass of ConstantSInt & ConstantUInt, to make dealing
+// with integral constants easier.
+//
+class ConstantInt : public Constant {
+protected:
+ union {
+ int64_t Signed;
+ uint64_t Unsigned;
+ } Val;
+ ConstantInt(const ConstantInt &); // DO NOT IMPLEMENT
+ ConstantInt(const Type *Ty, uint64_t V);
+ ~ConstantInt() {}
+public:
+ // equalsInt - Provide a helper method that can be used to determine if the
+ // constant contained within is equal to a constant. This only works for very
+ // small values, because this is all that can be represented with all types.
+ //
+ bool equalsInt(unsigned char V) const {
+ assert(V <= 127 &&
+ "equals: Can only be used with very small positive constants!");
+ return Val.Unsigned == V;
+ }
+
+ // ConstantInt::get static method: return a constant pool int with the
+ // specified value. as above, we work only with very small values here.
+ //
+ static ConstantInt *get(const Type *Ty, unsigned char V);
+
+ // isNullValue - Return true if this is the value that would be returned by
+ // getNullConstant.
+ virtual bool isNullValue() const { return Val.Unsigned == 0; }
+
+ // Methods for support type inquiry through isa, cast, and dyn_cast:
+ static inline bool classof(const ConstantInt *) { return true; }
+ static bool classof(const Constant *CPV); // defined in CPV.cpp
+ static inline bool classof(const Value *V) {
+ return isa<Constant>(V) && classof(cast<Constant>(V));
+ }
+};
+
+
+//===---------------------------------------------------------------------------
+// ConstantSInt - Signed Integer Values [sbyte, short, int, long]
+//
+class ConstantSInt : public ConstantInt {
+ ConstantSInt(const ConstantSInt &); // DO NOT IMPLEMENT
+protected:
+ ConstantSInt(const Type *Ty, int64_t V);
+ ~ConstantSInt() {}
+public:
+ static ConstantSInt *get(const Type *Ty, int64_t V);
+
+ virtual string getStrValue() const;
+
+ static bool isValueValidForType(const Type *Ty, int64_t V);
+ inline int64_t getValue() const { return Val.Signed; }
+
+ // Methods for support type inquiry through isa, cast, and dyn_cast:
+ static inline bool classof(const ConstantSInt *) { return true; }
+ static bool classof(const Constant *CPV); // defined in CPV.cpp
+ static inline bool classof(const Value *V) {
+ return isa<Constant>(V) && classof(cast<Constant>(V));
+ }
+};
+
+//===---------------------------------------------------------------------------
+// ConstantUInt - Unsigned Integer Values [ubyte, ushort, uint, ulong]
+//
+class ConstantUInt : public ConstantInt {
+ ConstantUInt(const ConstantUInt &); // DO NOT IMPLEMENT
+protected:
+ ConstantUInt(const Type *Ty, uint64_t V);
+ ~ConstantUInt() {}
+public:
+ static ConstantUInt *get(const Type *Ty, uint64_t V);
+
+ virtual string getStrValue() const;
+
+ static bool isValueValidForType(const Type *Ty, uint64_t V);
+ inline uint64_t getValue() const { return Val.Unsigned; }
+
+ // Methods for support type inquiry through isa, cast, and dyn_cast:
+ static inline bool classof(const ConstantUInt *) { return true; }
+ static bool classof(const Constant *CPV); // defined in CPV.cpp
+ static inline bool classof(const Value *V) {
+ return isa<Constant>(V) && classof(cast<Constant>(V));
+ }
+};
+
+
+//===---------------------------------------------------------------------------
+// ConstantFP - Floating Point Values [float, double]
+//
+class ConstantFP : public Constant {
+ double Val;
+ ConstantFP(const ConstantFP &); // DO NOT IMPLEMENT
+protected:
+ ConstantFP(const Type *Ty, double V);
+ ~ConstantFP() {}
+public:
+ static ConstantFP *get(const Type *Ty, double V);
+
+ virtual string getStrValue() const;
+
+ static bool isValueValidForType(const Type *Ty, double V);
+ inline double getValue() const { return Val; }
+
+ // isNullValue - Return true if this is the value that would be returned by
+ // getNullConstant.
+ virtual bool isNullValue() const { return Val == 0; }
+
+ // Methods for support type inquiry through isa, cast, and dyn_cast:
+ static inline bool classof(const ConstantFP *) { return true; }
+ static bool classof(const Constant *CPV); // defined in CPV.cpp
+ static inline bool classof(const Value *V) {
+ return isa<Constant>(V) && classof(cast<Constant>(V));
+ }
+};
+
+
+//===---------------------------------------------------------------------------
+// ConstantArray - Constant Array Declarations
+//
+class ConstantArray : public Constant {
+ ConstantArray(const ConstantArray &); // DO NOT IMPLEMENT
+protected:
+ ConstantArray(const ArrayType *T, const vector<Constant*> &Val);
+ ~ConstantArray() {}
+
+ virtual void destroyConstant();
+public:
+ static ConstantArray *get(const ArrayType *T, const vector<Constant*> &);
+ static ConstantArray *get(const string &Initializer);
+
+ virtual string getStrValue() const;
+
+ inline const vector<Use> &getValues() const { return Operands; }
+
+ // isNullValue - Return true if this is the value that would be returned by
+ // getNullConstant.
+ virtual bool isNullValue() const { return false; }
+
+ // Methods for support type inquiry through isa, cast, and dyn_cast:
+ static inline bool classof(const ConstantArray *) { return true; }
+ static bool classof(const Constant *CPV); // defined in CPV.cpp
+ static inline bool classof(const Value *V) {
+ return isa<Constant>(V) && classof(cast<Constant>(V));
+ }
+};
+
+
+//===---------------------------------------------------------------------------
+// ConstantStruct - Constant Struct Declarations
+//
+class ConstantStruct : public Constant {
+ ConstantStruct(const ConstantStruct &); // DO NOT IMPLEMENT
+protected:
+ ConstantStruct(const StructType *T, const vector<Constant*> &Val);
+ ~ConstantStruct() {}
+
+ virtual void destroyConstant();
+public:
+ static ConstantStruct *get(const StructType *T,
+ const vector<Constant*> &V);
+
+ virtual string getStrValue() const;
+
+ inline const vector<Use> &getValues() const { return Operands; }
+
+ // isNullValue - Return true if this is the value that would be returned by
+ // getNullConstant.
+ virtual bool isNullValue() const { return false; }
+
+ // Methods for support type inquiry through isa, cast, and dyn_cast:
+ static inline bool classof(const ConstantStruct *) { return true; }
+ static bool classof(const Constant *CPV); // defined in CPV.cpp
+ static inline bool classof(const Value *V) {
+ return isa<Constant>(V) && classof(cast<Constant>(V));
+ }
+};
+
+//===---------------------------------------------------------------------------
+// ConstantPointer - Constant Pointer Declarations
+//
+// The ConstantPointer class represents a null pointer of a specific type. For
+// a more specific/useful instance, a subclass of ConstantPointer should be
+// used.
+//
+class ConstantPointer : public Constant {
+ ConstantPointer(const ConstantPointer &); // DO NOT IMPLEMENT
+protected:
+ inline ConstantPointer(const PointerType *T) : Constant((const Type*)T){}
+ ~ConstantPointer() {}
+public:
+ virtual string getStrValue() const = 0;
+
+ // isNullValue - Return true if this is the value that would be returned by
+ // getNullConstant.
+ virtual bool isNullValue() const { return false; }
+
+ // Methods for support type inquiry through isa, cast, and dyn_cast:
+ static inline bool classof(const ConstantPointer *) { return true; }
+ static bool classof(const Constant *CPV); // defined in CPV.cpp
+ static inline bool classof(const Value *V) {
+ return isa<Constant>(V) && classof(cast<Constant>(V));
+ }
+};
+
+// ConstantPointerNull - a constant pointer value that points to null
+//
+class ConstantPointerNull : public ConstantPointer {
+ ConstantPointerNull(const ConstantPointerNull &); // DO NOT IMPLEMENT
+protected:
+ inline ConstantPointerNull(const PointerType *T) : ConstantPointer(T) {}
+ inline ~ConstantPointerNull() {}
+public:
+ virtual string getStrValue() const;
+
+ static ConstantPointerNull *get(const PointerType *T);
+
+ // isNullValue - Return true if this is the value that would be returned by
+ // getNullConstant.
+ virtual bool isNullValue() const { return true; }
+
+ // Methods for support type inquiry through isa, cast, and dyn_cast:
+ static inline bool classof(const ConstantPointerNull *) { return true; }
+ static inline bool classof(const ConstantPointer *P) {
+ return P->getNumOperands() == 0;
+ }
+ static inline bool classof(const Constant *CPV) {
+ return isa<ConstantPointer>(CPV) && classof(cast<ConstantPointer>(CPV));
+ }
+ static inline bool classof(const Value *V) {
+ return isa<ConstantPointer>(V) && classof(cast<ConstantPointer>(V));
+ }
+};
+
+
+// ConstantPointerRef - a constant pointer value that is initialized to
+// point to a global value, which lies at a constant, fixed address.
+//
+class ConstantPointerRef : public ConstantPointer {
+ friend class Module; // Modules maintain these references
+ ConstantPointerRef(const ConstantPointerRef &); // DNI!
+
+protected:
+ ConstantPointerRef(GlobalValue *GV);
+ ~ConstantPointerRef() {}
+
+ virtual void destroyConstant() { destroyConstantImpl(); }
+public:
+ static ConstantPointerRef *get(GlobalValue *GV);
+
+ virtual string getStrValue() const;
+
+ const GlobalValue *getValue() const {
+ return cast<GlobalValue>(Operands[0].get());
+ }
+ GlobalValue *getValue() {
+ return cast<GlobalValue>(Operands[0].get());
+ }
+
+ // Methods for support type inquiry through isa, cast, and dyn_cast:
+ static inline bool classof(const ConstantPointerRef *) { return true; }
+ static inline bool classof(const ConstantPointer *CPV) {
+ return CPV->getNumOperands() == 1;
+ }
+ static inline bool classof(const Constant *CPV) {
+ return isa<ConstantPointer>(CPV) && classof(cast<ConstantPointer>(CPV));
+ }
+ static inline bool classof(const Value *V) {
+ return isa<ConstantPointer>(V) && classof(cast<ConstantPointer>(V));
+ }
+
+ // WARNING: Only to be used by Bytecode & Assembly Parsers! USER CODE SHOULD
+ // NOT USE THIS!!
+ void mutateReference(GlobalValue *NewGV);
+ // END WARNING!!
+};
+
+
+
+#endif