Home | History | Annotate | Download | only in IR
      1 //===-- llvm/Type.h - Classes for handling data types -----------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file contains the declaration of the Type class.  For more "Type"
     11 // stuff, look in DerivedTypes.h.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 #ifndef LLVM_IR_TYPE_H
     16 #define LLVM_IR_TYPE_H
     17 
     18 #include "llvm/ADT/APFloat.h"
     19 #include "llvm/ADT/ArrayRef.h"
     20 #include "llvm/ADT/SmallPtrSet.h"
     21 #include "llvm/Support/CBindingWrapping.h"
     22 #include "llvm/Support/Casting.h"
     23 #include "llvm/Support/DataTypes.h"
     24 #include "llvm/Support/ErrorHandling.h"
     25 
     26 namespace llvm {
     27 
     28 class PointerType;
     29 class IntegerType;
     30 class raw_ostream;
     31 class Module;
     32 class LLVMContext;
     33 class LLVMContextImpl;
     34 class StringRef;
     35 template<class GraphType> struct GraphTraits;
     36 
     37 /// The instances of the Type class are immutable: once they are created,
     38 /// they are never changed.  Also note that only one instance of a particular
     39 /// type is ever created.  Thus seeing if two types are equal is a matter of
     40 /// doing a trivial pointer comparison. To enforce that no two equal instances
     41 /// are created, Type instances can only be created via static factory methods
     42 /// in class Type and in derived classes.  Once allocated, Types are never
     43 /// free'd.
     44 ///
     45 class Type {
     46 public:
     47   //===--------------------------------------------------------------------===//
     48   /// Definitions of all of the base types for the Type system.  Based on this
     49   /// value, you can cast to a class defined in DerivedTypes.h.
     50   /// Note: If you add an element to this, you need to add an element to the
     51   /// Type::getPrimitiveType function, or else things will break!
     52   /// Also update LLVMTypeKind and LLVMGetTypeKind () in the C binding.
     53   ///
     54   enum TypeID {
     55     // PrimitiveTypes - make sure LastPrimitiveTyID stays up to date.
     56     VoidTyID = 0,    ///<  0: type with no size
     57     HalfTyID,        ///<  1: 16-bit floating point type
     58     FloatTyID,       ///<  2: 32-bit floating point type
     59     DoubleTyID,      ///<  3: 64-bit floating point type
     60     X86_FP80TyID,    ///<  4: 80-bit floating point type (X87)
     61     FP128TyID,       ///<  5: 128-bit floating point type (112-bit mantissa)
     62     PPC_FP128TyID,   ///<  6: 128-bit floating point type (two 64-bits, PowerPC)
     63     LabelTyID,       ///<  7: Labels
     64     MetadataTyID,    ///<  8: Metadata
     65     X86_MMXTyID,     ///<  9: MMX vectors (64 bits, X86 specific)
     66     TokenTyID,       ///< 10: Tokens
     67 
     68     // Derived types... see DerivedTypes.h file.
     69     // Make sure FirstDerivedTyID stays up to date!
     70     IntegerTyID,     ///< 11: Arbitrary bit width integers
     71     FunctionTyID,    ///< 12: Functions
     72     StructTyID,      ///< 13: Structures
     73     ArrayTyID,       ///< 14: Arrays
     74     PointerTyID,     ///< 15: Pointers
     75     VectorTyID       ///< 16: SIMD 'packed' format, or other vector type
     76   };
     77 
     78 private:
     79   /// This refers to the LLVMContext in which this type was uniqued.
     80   LLVMContext &Context;
     81 
     82   TypeID   ID : 8;            // The current base type of this type.
     83   unsigned SubclassData : 24; // Space for subclasses to store data.
     84                               // Note that this should be synchronized with
     85                               // MAX_INT_BITS value in IntegerType class.
     86 
     87 protected:
     88   friend class LLVMContextImpl;
     89   explicit Type(LLVMContext &C, TypeID tid)
     90     : Context(C), ID(tid), SubclassData(0),
     91       NumContainedTys(0), ContainedTys(nullptr) {}
     92   ~Type() = default;
     93 
     94   unsigned getSubclassData() const { return SubclassData; }
     95 
     96   void setSubclassData(unsigned val) {
     97     SubclassData = val;
     98     // Ensure we don't have any accidental truncation.
     99     assert(getSubclassData() == val && "Subclass data too large for field");
    100   }
    101 
    102   /// Keeps track of how many Type*'s there are in the ContainedTys list.
    103   unsigned NumContainedTys;
    104 
    105   /// A pointer to the array of Types contained by this Type. For example, this
    106   /// includes the arguments of a function type, the elements of a structure,
    107   /// the pointee of a pointer, the element type of an array, etc. This pointer
    108   /// may be 0 for types that don't contain other types (Integer, Double,
    109   /// Float).
    110   Type * const *ContainedTys;
    111 
    112   static bool isSequentialType(TypeID TyID) {
    113     return TyID == ArrayTyID || TyID == VectorTyID;
    114   }
    115 
    116 public:
    117   /// Print the current type.
    118   /// Omit the type details if \p NoDetails == true.
    119   /// E.g., let %st = type { i32, i16 }
    120   /// When \p NoDetails is true, we only print %st.
    121   /// Put differently, \p NoDetails prints the type as if
    122   /// inlined with the operands when printing an instruction.
    123   void print(raw_ostream &O, bool IsForDebug = false,
    124              bool NoDetails = false) const;
    125   void dump() const;
    126 
    127   /// Return the LLVMContext in which this type was uniqued.
    128   LLVMContext &getContext() const { return Context; }
    129 
    130   //===--------------------------------------------------------------------===//
    131   // Accessors for working with types.
    132   //
    133 
    134   /// Return the type id for the type. This will return one of the TypeID enum
    135   /// elements defined above.
    136   TypeID getTypeID() const { return ID; }
    137 
    138   /// Return true if this is 'void'.
    139   bool isVoidTy() const { return getTypeID() == VoidTyID; }
    140 
    141   /// Return true if this is 'half', a 16-bit IEEE fp type.
    142   bool isHalfTy() const { return getTypeID() == HalfTyID; }
    143 
    144   /// Return true if this is 'float', a 32-bit IEEE fp type.
    145   bool isFloatTy() const { return getTypeID() == FloatTyID; }
    146 
    147   /// Return true if this is 'double', a 64-bit IEEE fp type.
    148   bool isDoubleTy() const { return getTypeID() == DoubleTyID; }
    149 
    150   /// Return true if this is x86 long double.
    151   bool isX86_FP80Ty() const { return getTypeID() == X86_FP80TyID; }
    152 
    153   /// Return true if this is 'fp128'.
    154   bool isFP128Ty() const { return getTypeID() == FP128TyID; }
    155 
    156   /// Return true if this is powerpc long double.
    157   bool isPPC_FP128Ty() const { return getTypeID() == PPC_FP128TyID; }
    158 
    159   /// Return true if this is one of the six floating-point types
    160   bool isFloatingPointTy() const {
    161     return getTypeID() == HalfTyID || getTypeID() == FloatTyID ||
    162            getTypeID() == DoubleTyID ||
    163            getTypeID() == X86_FP80TyID || getTypeID() == FP128TyID ||
    164            getTypeID() == PPC_FP128TyID;
    165   }
    166 
    167   const fltSemantics &getFltSemantics() const {
    168     switch (getTypeID()) {
    169     case HalfTyID: return APFloat::IEEEhalf();
    170     case FloatTyID: return APFloat::IEEEsingle();
    171     case DoubleTyID: return APFloat::IEEEdouble();
    172     case X86_FP80TyID: return APFloat::x87DoubleExtended();
    173     case FP128TyID: return APFloat::IEEEquad();
    174     case PPC_FP128TyID: return APFloat::PPCDoubleDouble();
    175     default: llvm_unreachable("Invalid floating type");
    176     }
    177   }
    178 
    179   /// Return true if this is X86 MMX.
    180   bool isX86_MMXTy() const { return getTypeID() == X86_MMXTyID; }
    181 
    182   /// Return true if this is a FP type or a vector of FP.
    183   bool isFPOrFPVectorTy() const { return getScalarType()->isFloatingPointTy(); }
    184 
    185   /// Return true if this is 'label'.
    186   bool isLabelTy() const { return getTypeID() == LabelTyID; }
    187 
    188   /// Return true if this is 'metadata'.
    189   bool isMetadataTy() const { return getTypeID() == MetadataTyID; }
    190 
    191   /// Return true if this is 'token'.
    192   bool isTokenTy() const { return getTypeID() == TokenTyID; }
    193 
    194   /// True if this is an instance of IntegerType.
    195   bool isIntegerTy() const { return getTypeID() == IntegerTyID; }
    196 
    197   /// Return true if this is an IntegerType of the given width.
    198   bool isIntegerTy(unsigned Bitwidth) const;
    199 
    200   /// Return true if this is an integer type or a vector of integer types.
    201   bool isIntOrIntVectorTy() const { return getScalarType()->isIntegerTy(); }
    202 
    203   /// True if this is an instance of FunctionType.
    204   bool isFunctionTy() const { return getTypeID() == FunctionTyID; }
    205 
    206   /// True if this is an instance of StructType.
    207   bool isStructTy() const { return getTypeID() == StructTyID; }
    208 
    209   /// True if this is an instance of ArrayType.
    210   bool isArrayTy() const { return getTypeID() == ArrayTyID; }
    211 
    212   /// True if this is an instance of PointerType.
    213   bool isPointerTy() const { return getTypeID() == PointerTyID; }
    214 
    215   /// Return true if this is a pointer type or a vector of pointer types.
    216   bool isPtrOrPtrVectorTy() const { return getScalarType()->isPointerTy(); }
    217 
    218   /// True if this is an instance of VectorType.
    219   bool isVectorTy() const { return getTypeID() == VectorTyID; }
    220 
    221   /// Return true if this type could be converted with a lossless BitCast to
    222   /// type 'Ty'. For example, i8* to i32*. BitCasts are valid for types of the
    223   /// same size only where no re-interpretation of the bits is done.
    224   /// @brief Determine if this type could be losslessly bitcast to Ty
    225   bool canLosslesslyBitCastTo(Type *Ty) const;
    226 
    227   /// Return true if this type is empty, that is, it has no elements or all of
    228   /// its elements are empty.
    229   bool isEmptyTy() const;
    230 
    231   /// Return true if the type is "first class", meaning it is a valid type for a
    232   /// Value.
    233   bool isFirstClassType() const {
    234     return getTypeID() != FunctionTyID && getTypeID() != VoidTyID;
    235   }
    236 
    237   /// Return true if the type is a valid type for a register in codegen. This
    238   /// includes all first-class types except struct and array types.
    239   bool isSingleValueType() const {
    240     return isFloatingPointTy() || isX86_MMXTy() || isIntegerTy() ||
    241            isPointerTy() || isVectorTy();
    242   }
    243 
    244   /// Return true if the type is an aggregate type. This means it is valid as
    245   /// the first operand of an insertvalue or extractvalue instruction. This
    246   /// includes struct and array types, but does not include vector types.
    247   bool isAggregateType() const {
    248     return getTypeID() == StructTyID || getTypeID() == ArrayTyID;
    249   }
    250 
    251   /// Return true if it makes sense to take the size of this type. To get the
    252   /// actual size for a particular target, it is reasonable to use the
    253   /// DataLayout subsystem to do this.
    254   bool isSized(SmallPtrSetImpl<Type*> *Visited = nullptr) const {
    255     // If it's a primitive, it is always sized.
    256     if (getTypeID() == IntegerTyID || isFloatingPointTy() ||
    257         getTypeID() == PointerTyID ||
    258         getTypeID() == X86_MMXTyID)
    259       return true;
    260     // If it is not something that can have a size (e.g. a function or label),
    261     // it doesn't have a size.
    262     if (getTypeID() != StructTyID && getTypeID() != ArrayTyID &&
    263         getTypeID() != VectorTyID)
    264       return false;
    265     // Otherwise we have to try harder to decide.
    266     return isSizedDerivedType(Visited);
    267   }
    268 
    269   /// Return the basic size of this type if it is a primitive type. These are
    270   /// fixed by LLVM and are not target-dependent.
    271   /// This will return zero if the type does not have a size or is not a
    272   /// primitive type.
    273   ///
    274   /// Note that this may not reflect the size of memory allocated for an
    275   /// instance of the type or the number of bytes that are written when an
    276   /// instance of the type is stored to memory. The DataLayout class provides
    277   /// additional query functions to provide this information.
    278   ///
    279   unsigned getPrimitiveSizeInBits() const LLVM_READONLY;
    280 
    281   /// If this is a vector type, return the getPrimitiveSizeInBits value for the
    282   /// element type. Otherwise return the getPrimitiveSizeInBits value for this
    283   /// type.
    284   unsigned getScalarSizeInBits() const LLVM_READONLY;
    285 
    286   /// Return the width of the mantissa of this type. This is only valid on
    287   /// floating-point types. If the FP type does not have a stable mantissa (e.g.
    288   /// ppc long double), this method returns -1.
    289   int getFPMantissaWidth() const;
    290 
    291   /// If this is a vector type, return the element type, otherwise return
    292   /// 'this'.
    293   Type *getScalarType() const {
    294     if (isVectorTy())
    295       return getVectorElementType();
    296     return const_cast<Type*>(this);
    297   }
    298 
    299   //===--------------------------------------------------------------------===//
    300   // Type Iteration support.
    301   //
    302   typedef Type * const *subtype_iterator;
    303   subtype_iterator subtype_begin() const { return ContainedTys; }
    304   subtype_iterator subtype_end() const { return &ContainedTys[NumContainedTys];}
    305   ArrayRef<Type*> subtypes() const {
    306     return makeArrayRef(subtype_begin(), subtype_end());
    307   }
    308 
    309   typedef std::reverse_iterator<subtype_iterator> subtype_reverse_iterator;
    310   subtype_reverse_iterator subtype_rbegin() const {
    311     return subtype_reverse_iterator(subtype_end());
    312   }
    313   subtype_reverse_iterator subtype_rend() const {
    314     return subtype_reverse_iterator(subtype_begin());
    315   }
    316 
    317   /// This method is used to implement the type iterator (defined at the end of
    318   /// the file). For derived types, this returns the types 'contained' in the
    319   /// derived type.
    320   Type *getContainedType(unsigned i) const {
    321     assert(i < NumContainedTys && "Index out of range!");
    322     return ContainedTys[i];
    323   }
    324 
    325   /// Return the number of types in the derived type.
    326   unsigned getNumContainedTypes() const { return NumContainedTys; }
    327 
    328   //===--------------------------------------------------------------------===//
    329   // Helper methods corresponding to subclass methods.  This forces a cast to
    330   // the specified subclass and calls its accessor.  "getVectorNumElements" (for
    331   // example) is shorthand for cast<VectorType>(Ty)->getNumElements().  This is
    332   // only intended to cover the core methods that are frequently used, helper
    333   // methods should not be added here.
    334 
    335   inline unsigned getIntegerBitWidth() const;
    336 
    337   inline Type *getFunctionParamType(unsigned i) const;
    338   inline unsigned getFunctionNumParams() const;
    339   inline bool isFunctionVarArg() const;
    340 
    341   inline StringRef getStructName() const;
    342   inline unsigned getStructNumElements() const;
    343   inline Type *getStructElementType(unsigned N) const;
    344 
    345   inline Type *getSequentialElementType() const {
    346     assert(isSequentialType(getTypeID()) && "Not a sequential type!");
    347     return ContainedTys[0];
    348   }
    349 
    350   inline uint64_t getArrayNumElements() const;
    351   Type *getArrayElementType() const {
    352     assert(getTypeID() == ArrayTyID);
    353     return ContainedTys[0];
    354   }
    355 
    356   inline unsigned getVectorNumElements() const;
    357   Type *getVectorElementType() const {
    358     assert(getTypeID() == VectorTyID);
    359     return ContainedTys[0];
    360   }
    361 
    362   Type *getPointerElementType() const {
    363     assert(getTypeID() == PointerTyID);
    364     return ContainedTys[0];
    365   }
    366 
    367   /// Get the address space of this pointer or pointer vector type.
    368   inline unsigned getPointerAddressSpace() const;
    369 
    370   //===--------------------------------------------------------------------===//
    371   // Static members exported by the Type class itself.  Useful for getting
    372   // instances of Type.
    373   //
    374 
    375   /// Return a type based on an identifier.
    376   static Type *getPrimitiveType(LLVMContext &C, TypeID IDNumber);
    377 
    378   //===--------------------------------------------------------------------===//
    379   // These are the builtin types that are always available.
    380   //
    381   static Type *getVoidTy(LLVMContext &C);
    382   static Type *getLabelTy(LLVMContext &C);
    383   static Type *getHalfTy(LLVMContext &C);
    384   static Type *getFloatTy(LLVMContext &C);
    385   static Type *getDoubleTy(LLVMContext &C);
    386   static Type *getMetadataTy(LLVMContext &C);
    387   static Type *getX86_FP80Ty(LLVMContext &C);
    388   static Type *getFP128Ty(LLVMContext &C);
    389   static Type *getPPC_FP128Ty(LLVMContext &C);
    390   static Type *getX86_MMXTy(LLVMContext &C);
    391   static Type *getTokenTy(LLVMContext &C);
    392   static IntegerType *getIntNTy(LLVMContext &C, unsigned N);
    393   static IntegerType *getInt1Ty(LLVMContext &C);
    394   static IntegerType *getInt8Ty(LLVMContext &C);
    395   static IntegerType *getInt16Ty(LLVMContext &C);
    396   static IntegerType *getInt32Ty(LLVMContext &C);
    397   static IntegerType *getInt64Ty(LLVMContext &C);
    398   static IntegerType *getInt128Ty(LLVMContext &C);
    399 
    400   //===--------------------------------------------------------------------===//
    401   // Convenience methods for getting pointer types with one of the above builtin
    402   // types as pointee.
    403   //
    404   static PointerType *getHalfPtrTy(LLVMContext &C, unsigned AS = 0);
    405   static PointerType *getFloatPtrTy(LLVMContext &C, unsigned AS = 0);
    406   static PointerType *getDoublePtrTy(LLVMContext &C, unsigned AS = 0);
    407   static PointerType *getX86_FP80PtrTy(LLVMContext &C, unsigned AS = 0);
    408   static PointerType *getFP128PtrTy(LLVMContext &C, unsigned AS = 0);
    409   static PointerType *getPPC_FP128PtrTy(LLVMContext &C, unsigned AS = 0);
    410   static PointerType *getX86_MMXPtrTy(LLVMContext &C, unsigned AS = 0);
    411   static PointerType *getIntNPtrTy(LLVMContext &C, unsigned N, unsigned AS = 0);
    412   static PointerType *getInt1PtrTy(LLVMContext &C, unsigned AS = 0);
    413   static PointerType *getInt8PtrTy(LLVMContext &C, unsigned AS = 0);
    414   static PointerType *getInt16PtrTy(LLVMContext &C, unsigned AS = 0);
    415   static PointerType *getInt32PtrTy(LLVMContext &C, unsigned AS = 0);
    416   static PointerType *getInt64PtrTy(LLVMContext &C, unsigned AS = 0);
    417 
    418   /// Return a pointer to the current type. This is equivalent to
    419   /// PointerType::get(Foo, AddrSpace).
    420   PointerType *getPointerTo(unsigned AddrSpace = 0) const;
    421 
    422 private:
    423   /// Derived types like structures and arrays are sized iff all of the members
    424   /// of the type are sized as well. Since asking for their size is relatively
    425   /// uncommon, move this operation out-of-line.
    426   bool isSizedDerivedType(SmallPtrSetImpl<Type*> *Visited = nullptr) const;
    427 };
    428 
    429 // Printing of types.
    430 static inline raw_ostream &operator<<(raw_ostream &OS, const Type &T) {
    431   T.print(OS);
    432   return OS;
    433 }
    434 
    435 // allow isa<PointerType>(x) to work without DerivedTypes.h included.
    436 template <> struct isa_impl<PointerType, Type> {
    437   static inline bool doit(const Type &Ty) {
    438     return Ty.getTypeID() == Type::PointerTyID;
    439   }
    440 };
    441 
    442 //===----------------------------------------------------------------------===//
    443 // Provide specializations of GraphTraits to be able to treat a type as a
    444 // graph of sub types.
    445 
    446 template <> struct GraphTraits<Type *> {
    447   typedef Type *NodeRef;
    448   typedef Type::subtype_iterator ChildIteratorType;
    449 
    450   static NodeRef getEntryNode(Type *T) { return T; }
    451   static ChildIteratorType child_begin(NodeRef N) { return N->subtype_begin(); }
    452   static ChildIteratorType child_end(NodeRef N) { return N->subtype_end(); }
    453 };
    454 
    455 template <> struct GraphTraits<const Type*> {
    456   typedef const Type *NodeRef;
    457   typedef Type::subtype_iterator ChildIteratorType;
    458 
    459   static NodeRef getEntryNode(NodeRef T) { return T; }
    460   static ChildIteratorType child_begin(NodeRef N) { return N->subtype_begin(); }
    461   static ChildIteratorType child_end(NodeRef N) { return N->subtype_end(); }
    462 };
    463 
    464 // Create wrappers for C Binding types (see CBindingWrapping.h).
    465 DEFINE_ISA_CONVERSION_FUNCTIONS(Type, LLVMTypeRef)
    466 
    467 /* Specialized opaque type conversions.
    468  */
    469 inline Type **unwrap(LLVMTypeRef* Tys) {
    470   return reinterpret_cast<Type**>(Tys);
    471 }
    472 
    473 inline LLVMTypeRef *wrap(Type **Tys) {
    474   return reinterpret_cast<LLVMTypeRef*>(const_cast<Type**>(Tys));
    475 }
    476 
    477 } // End llvm namespace
    478 
    479 #endif
    480