LCOV - code coverage report
Current view: top level - /usr/lib/llvm-19/include/llvm/IR - Type.h (source / functions) Coverage Total Hit
Test: PostgreSQL 20devel Lines: 0.0 % 21 0
Test Date: 2026-07-03 19:57:34 Functions: 0.0 % 8 0
Legend: Lines:     hit not hit
Branches: + taken - not taken # not executed
Branches: 0.0 % 16 0

             Branch data     Line data    Source code
       1                 :             : //===- llvm/Type.h - Classes for handling data types ------------*- C++ -*-===//
       2                 :             : //
       3                 :             : // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
       4                 :             : // See https://llvm.org/LICENSE.txt for license information.
       5                 :             : // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
       6                 :             : //
       7                 :             : //===----------------------------------------------------------------------===//
       8                 :             : //
       9                 :             : // This file contains the declaration of the Type class.  For more "Type"
      10                 :             : // stuff, look in DerivedTypes.h.
      11                 :             : //
      12                 :             : //===----------------------------------------------------------------------===//
      13                 :             : 
      14                 :             : #ifndef LLVM_IR_TYPE_H
      15                 :             : #define LLVM_IR_TYPE_H
      16                 :             : 
      17                 :             : #include "llvm/ADT/ArrayRef.h"
      18                 :             : #include "llvm/Support/CBindingWrapping.h"
      19                 :             : #include "llvm/Support/Casting.h"
      20                 :             : #include "llvm/Support/Compiler.h"
      21                 :             : #include "llvm/Support/ErrorHandling.h"
      22                 :             : #include "llvm/Support/TypeSize.h"
      23                 :             : #include <cassert>
      24                 :             : #include <cstdint>
      25                 :             : #include <iterator>
      26                 :             : 
      27                 :             : namespace llvm {
      28                 :             : 
      29                 :             : class IntegerType;
      30                 :             : struct fltSemantics;
      31                 :             : class LLVMContext;
      32                 :             : class PointerType;
      33                 :             : class raw_ostream;
      34                 :             : class StringRef;
      35                 :             : template <typename PtrType> class SmallPtrSetImpl;
      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
      56                 :             :     HalfTyID = 0,  ///< 16-bit floating point type
      57                 :             :     BFloatTyID,    ///< 16-bit floating point type (7-bit significand)
      58                 :             :     FloatTyID,     ///< 32-bit floating point type
      59                 :             :     DoubleTyID,    ///< 64-bit floating point type
      60                 :             :     X86_FP80TyID,  ///< 80-bit floating point type (X87)
      61                 :             :     FP128TyID,     ///< 128-bit floating point type (112-bit significand)
      62                 :             :     PPC_FP128TyID, ///< 128-bit floating point type (two 64-bits, PowerPC)
      63                 :             :     VoidTyID,      ///< type with no size
      64                 :             :     LabelTyID,     ///< Labels
      65                 :             :     MetadataTyID,  ///< Metadata
      66                 :             :     X86_MMXTyID,   ///< MMX vectors (64 bits, X86 specific)
      67                 :             :     X86_AMXTyID,   ///< AMX vectors (8192 bits, X86 specific)
      68                 :             :     TokenTyID,     ///< Tokens
      69                 :             : 
      70                 :             :     // Derived types... see DerivedTypes.h file.
      71                 :             :     IntegerTyID,        ///< Arbitrary bit width integers
      72                 :             :     FunctionTyID,       ///< Functions
      73                 :             :     PointerTyID,        ///< Pointers
      74                 :             :     StructTyID,         ///< Structures
      75                 :             :     ArrayTyID,          ///< Arrays
      76                 :             :     FixedVectorTyID,    ///< Fixed width SIMD vector type
      77                 :             :     ScalableVectorTyID, ///< Scalable SIMD vector type
      78                 :             :     TypedPointerTyID,   ///< Typed pointer used by some GPU targets
      79                 :             :     TargetExtTyID,      ///< Target extension type
      80                 :             :   };
      81                 :             : 
      82                 :             : private:
      83                 :             :   /// This refers to the LLVMContext in which this type was uniqued.
      84                 :             :   LLVMContext &Context;
      85                 :             : 
      86                 :             :   TypeID   ID : 8;            // The current base type of this type.
      87                 :             :   unsigned SubclassData : 24; // Space for subclasses to store data.
      88                 :             :                               // Note that this should be synchronized with
      89                 :             :                               // MAX_INT_BITS value in IntegerType class.
      90                 :             : 
      91                 :             : protected:
      92                 :             :   friend class LLVMContextImpl;
      93                 :             : 
      94                 :             :   explicit Type(LLVMContext &C, TypeID tid)
      95                 :             :     : Context(C), ID(tid), SubclassData(0) {}
      96                 :             :   ~Type() = default;
      97                 :             : 
      98                 :             :   unsigned getSubclassData() const { return SubclassData; }
      99                 :             : 
     100                 :             :   void setSubclassData(unsigned val) {
     101                 :             :     SubclassData = val;
     102                 :             :     // Ensure we don't have any accidental truncation.
     103                 :             :     assert(getSubclassData() == val && "Subclass data too large for field");
     104                 :             :   }
     105                 :             : 
     106                 :             :   /// Keeps track of how many Type*'s there are in the ContainedTys list.
     107                 :             :   unsigned NumContainedTys = 0;
     108                 :             : 
     109                 :             :   /// A pointer to the array of Types contained by this Type. For example, this
     110                 :             :   /// includes the arguments of a function type, the elements of a structure,
     111                 :             :   /// the pointee of a pointer, the element type of an array, etc. This pointer
     112                 :             :   /// may be 0 for types that don't contain other types (Integer, Double,
     113                 :             :   /// Float).
     114                 :             :   Type * const *ContainedTys = nullptr;
     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                 :             : 
     126                 :             :   void dump() const;
     127                 :             : 
     128                 :             :   /// Return the LLVMContext in which this type was uniqued.
     129                 :             :   LLVMContext &getContext() const { return Context; }
     130                 :             : 
     131                 :             :   //===--------------------------------------------------------------------===//
     132                 :             :   // Accessors for working with types.
     133                 :             :   //
     134                 :             : 
     135                 :             :   /// Return the type id for the type. This will return one of the TypeID enum
     136                 :             :   /// elements defined above.
     137                 :           0 :   TypeID getTypeID() const { return ID; }
     138                 :             : 
     139                 :             :   /// Return true if this is 'void'.
     140                 :             :   bool isVoidTy() const { return getTypeID() == VoidTyID; }
     141                 :             : 
     142                 :             :   /// Return true if this is 'half', a 16-bit IEEE fp type.
     143                 :             :   bool isHalfTy() const { return getTypeID() == HalfTyID; }
     144                 :             : 
     145                 :             :   /// Return true if this is 'bfloat', a 16-bit bfloat type.
     146                 :             :   bool isBFloatTy() const { return getTypeID() == BFloatTyID; }
     147                 :             : 
     148                 :             :   /// Return true if this is a 16-bit float type.
     149                 :             :   bool is16bitFPTy() const {
     150                 :             :     return getTypeID() == BFloatTyID || getTypeID() == HalfTyID;
     151                 :             :   }
     152                 :             : 
     153                 :             :   /// Return true if this is 'float', a 32-bit IEEE fp type.
     154                 :             :   bool isFloatTy() const { return getTypeID() == FloatTyID; }
     155                 :             : 
     156                 :             :   /// Return true if this is 'double', a 64-bit IEEE fp type.
     157                 :             :   bool isDoubleTy() const { return getTypeID() == DoubleTyID; }
     158                 :             : 
     159                 :             :   /// Return true if this is x86 long double.
     160                 :             :   bool isX86_FP80Ty() const { return getTypeID() == X86_FP80TyID; }
     161                 :             : 
     162                 :             :   /// Return true if this is 'fp128'.
     163                 :             :   bool isFP128Ty() const { return getTypeID() == FP128TyID; }
     164                 :             : 
     165                 :             :   /// Return true if this is powerpc long double.
     166                 :             :   bool isPPC_FP128Ty() const { return getTypeID() == PPC_FP128TyID; }
     167                 :             : 
     168                 :             :   /// Return true if this is a well-behaved IEEE-like type, which has a IEEE
     169                 :             :   /// compatible layout as defined by APFloat::isIEEE(), and does not have
     170                 :             :   /// non-IEEE values, such as x86_fp80's unnormal values.
     171                 :           0 :   bool isIEEELikeFPTy() const {
     172         [ #  # ]:           0 :     switch (getTypeID()) {
     173                 :           0 :     case DoubleTyID:
     174                 :             :     case FloatTyID:
     175                 :             :     case HalfTyID:
     176                 :             :     case BFloatTyID:
     177                 :             :     case FP128TyID:
     178                 :           0 :       return true;
     179                 :           0 :     default:
     180                 :           0 :       return false;
     181                 :             :     }
     182                 :             :   }
     183                 :             : 
     184                 :             :   /// Return true if this is one of the floating-point types
     185                 :           0 :   bool isFloatingPointTy() const {
     186   [ #  #  #  #  :           0 :     return isIEEELikeFPTy() || getTypeID() == X86_FP80TyID ||
                   #  # ]
     187                 :           0 :            getTypeID() == PPC_FP128TyID;
     188                 :             :   }
     189                 :             : 
     190                 :             :   /// Returns true if this is a floating-point type that is an unevaluated sum
     191                 :             :   /// of multiple floating-point units.
     192                 :             :   /// An example of such a type is ppc_fp128, also known as double-double, which
     193                 :             :   /// consists of two IEEE 754 doubles.
     194                 :             :   bool isMultiUnitFPType() const {
     195                 :             :     return getTypeID() == PPC_FP128TyID;
     196                 :             :   }
     197                 :             : 
     198                 :             :   const fltSemantics &getFltSemantics() const;
     199                 :             : 
     200                 :             :   /// Return true if this is X86 MMX.
     201                 :             :   bool isX86_MMXTy() const { return getTypeID() == X86_MMXTyID; }
     202                 :             : 
     203                 :             :   /// Return true if this is X86 AMX.
     204                 :             :   bool isX86_AMXTy() const { return getTypeID() == X86_AMXTyID; }
     205                 :             : 
     206                 :             :   /// Return true if this is a target extension type.
     207                 :             :   bool isTargetExtTy() const { return getTypeID() == TargetExtTyID; }
     208                 :             : 
     209                 :             :   /// Return true if this is a target extension type with a scalable layout.
     210                 :             :   bool isScalableTargetExtTy() const;
     211                 :             : 
     212                 :             :   /// Return true if this is a type whose size is a known multiple of vscale.
     213                 :             :   bool isScalableTy() const;
     214                 :             : 
     215                 :             :   /// Return true if this is a FP type or a vector of FP.
     216                 :           0 :   bool isFPOrFPVectorTy() const { return getScalarType()->isFloatingPointTy(); }
     217                 :             : 
     218                 :             :   /// Return true if this is 'label'.
     219                 :             :   bool isLabelTy() const { return getTypeID() == LabelTyID; }
     220                 :             : 
     221                 :             :   /// Return true if this is 'metadata'.
     222                 :             :   bool isMetadataTy() const { return getTypeID() == MetadataTyID; }
     223                 :             : 
     224                 :             :   /// Return true if this is 'token'.
     225                 :             :   bool isTokenTy() const { return getTypeID() == TokenTyID; }
     226                 :             : 
     227                 :             :   /// True if this is an instance of IntegerType.
     228                 :             :   bool isIntegerTy() const { return getTypeID() == IntegerTyID; }
     229                 :             : 
     230                 :             :   /// Return true if this is an IntegerType of the given width.
     231                 :             :   bool isIntegerTy(unsigned Bitwidth) const;
     232                 :             : 
     233                 :             :   /// Return true if this is an integer type or a vector of integer types.
     234                 :             :   bool isIntOrIntVectorTy() const { return getScalarType()->isIntegerTy(); }
     235                 :             : 
     236                 :             :   /// Return true if this is an integer type or a vector of integer types of
     237                 :             :   /// the given width.
     238                 :             :   bool isIntOrIntVectorTy(unsigned BitWidth) const {
     239                 :             :     return getScalarType()->isIntegerTy(BitWidth);
     240                 :             :   }
     241                 :             : 
     242                 :             :   /// Return true if this is an integer type or a pointer type.
     243                 :             :   bool isIntOrPtrTy() const { return isIntegerTy() || isPointerTy(); }
     244                 :             : 
     245                 :             :   /// True if this is an instance of FunctionType.
     246                 :             :   bool isFunctionTy() const { return getTypeID() == FunctionTyID; }
     247                 :             : 
     248                 :             :   /// True if this is an instance of StructType.
     249                 :             :   bool isStructTy() const { return getTypeID() == StructTyID; }
     250                 :             : 
     251                 :             :   /// True if this is an instance of ArrayType.
     252                 :             :   bool isArrayTy() const { return getTypeID() == ArrayTyID; }
     253                 :             : 
     254                 :             :   /// True if this is an instance of PointerType.
     255                 :             :   bool isPointerTy() const { return getTypeID() == PointerTyID; }
     256                 :             : 
     257                 :             :   /// True if this is an instance of an opaque PointerType.
     258                 :             :   LLVM_DEPRECATED("Use isPointerTy() instead", "isPointerTy")
     259                 :             :   bool isOpaquePointerTy() const { return isPointerTy(); };
     260                 :             : 
     261                 :             :   /// Return true if this is a pointer type or a vector of pointer types.
     262                 :             :   bool isPtrOrPtrVectorTy() const { return getScalarType()->isPointerTy(); }
     263                 :             : 
     264                 :             :   /// True if this is an instance of VectorType.
     265                 :           0 :   inline bool isVectorTy() const {
     266   [ #  #  #  # ]:           0 :     return getTypeID() == ScalableVectorTyID || getTypeID() == FixedVectorTyID;
     267                 :             :   }
     268                 :             : 
     269                 :             :   /// Return true if this type could be converted with a lossless BitCast to
     270                 :             :   /// type 'Ty'. For example, i8* to i32*. BitCasts are valid for types of the
     271                 :             :   /// same size only where no re-interpretation of the bits is done.
     272                 :             :   /// Determine if this type could be losslessly bitcast to Ty
     273                 :             :   bool canLosslesslyBitCastTo(Type *Ty) const;
     274                 :             : 
     275                 :             :   /// Return true if this type is empty, that is, it has no elements or all of
     276                 :             :   /// its elements are empty.
     277                 :             :   bool isEmptyTy() const;
     278                 :             : 
     279                 :             :   /// Return true if the type is "first class", meaning it is a valid type for a
     280                 :             :   /// Value.
     281                 :             :   bool isFirstClassType() const {
     282                 :             :     return getTypeID() != FunctionTyID && getTypeID() != VoidTyID;
     283                 :             :   }
     284                 :             : 
     285                 :             :   /// Return true if the type is a valid type for a register in codegen. This
     286                 :             :   /// includes all first-class types except struct and array types.
     287                 :             :   bool isSingleValueType() const {
     288                 :             :     return isFloatingPointTy() || isX86_MMXTy() || isIntegerTy() ||
     289                 :             :            isPointerTy() || isVectorTy() || isX86_AMXTy() || isTargetExtTy();
     290                 :             :   }
     291                 :             : 
     292                 :             :   /// Return true if the type is an aggregate type. This means it is valid as
     293                 :             :   /// the first operand of an insertvalue or extractvalue instruction. This
     294                 :             :   /// includes struct and array types, but does not include vector types.
     295                 :             :   bool isAggregateType() const {
     296                 :             :     return getTypeID() == StructTyID || getTypeID() == ArrayTyID;
     297                 :             :   }
     298                 :             : 
     299                 :             :   /// Return true if it makes sense to take the size of this type. To get the
     300                 :             :   /// actual size for a particular target, it is reasonable to use the
     301                 :             :   /// DataLayout subsystem to do this.
     302                 :             :   bool isSized(SmallPtrSetImpl<Type*> *Visited = nullptr) const {
     303                 :             :     // If it's a primitive, it is always sized.
     304                 :             :     if (getTypeID() == IntegerTyID || isFloatingPointTy() ||
     305                 :             :         getTypeID() == PointerTyID || getTypeID() == X86_MMXTyID ||
     306                 :             :         getTypeID() == X86_AMXTyID)
     307                 :             :       return true;
     308                 :             :     // If it is not something that can have a size (e.g. a function or label),
     309                 :             :     // it doesn't have a size.
     310                 :             :     if (getTypeID() != StructTyID && getTypeID() != ArrayTyID &&
     311                 :             :         !isVectorTy() && getTypeID() != TargetExtTyID)
     312                 :             :       return false;
     313                 :             :     // Otherwise we have to try harder to decide.
     314                 :             :     return isSizedDerivedType(Visited);
     315                 :             :   }
     316                 :             : 
     317                 :             :   /// Return the basic size of this type if it is a primitive type. These are
     318                 :             :   /// fixed by LLVM and are not target-dependent.
     319                 :             :   /// This will return zero if the type does not have a size or is not a
     320                 :             :   /// primitive type.
     321                 :             :   ///
     322                 :             :   /// If this is a scalable vector type, the scalable property will be set and
     323                 :             :   /// the runtime size will be a positive integer multiple of the base size.
     324                 :             :   ///
     325                 :             :   /// Note that this may not reflect the size of memory allocated for an
     326                 :             :   /// instance of the type or the number of bytes that are written when an
     327                 :             :   /// instance of the type is stored to memory. The DataLayout class provides
     328                 :             :   /// additional query functions to provide this information.
     329                 :             :   ///
     330                 :             :   TypeSize getPrimitiveSizeInBits() const LLVM_READONLY;
     331                 :             : 
     332                 :             :   /// If this is a vector type, return the getPrimitiveSizeInBits value for the
     333                 :             :   /// element type. Otherwise return the getPrimitiveSizeInBits value for this
     334                 :             :   /// type.
     335                 :             :   unsigned getScalarSizeInBits() const LLVM_READONLY;
     336                 :             : 
     337                 :             :   /// Return the width of the mantissa of this type. This is only valid on
     338                 :             :   /// floating-point types. If the FP type does not have a stable mantissa (e.g.
     339                 :             :   /// ppc long double), this method returns -1.
     340                 :             :   int getFPMantissaWidth() const;
     341                 :             : 
     342                 :             :   /// Return whether the type is IEEE compatible, as defined by the eponymous
     343                 :             :   /// method in APFloat.
     344                 :             :   bool isIEEE() const;
     345                 :             : 
     346                 :             :   /// If this is a vector type, return the element type, otherwise return
     347                 :             :   /// 'this'.
     348                 :           0 :   inline Type *getScalarType() const {
     349         [ #  # ]:           0 :     if (isVectorTy())
     350                 :           0 :       return getContainedType(0);
     351                 :           0 :     return const_cast<Type *>(this);
     352                 :             :   }
     353                 :             : 
     354                 :             :   //===--------------------------------------------------------------------===//
     355                 :             :   // Type Iteration support.
     356                 :             :   //
     357                 :             :   using subtype_iterator = Type * const *;
     358                 :             : 
     359                 :             :   subtype_iterator subtype_begin() const { return ContainedTys; }
     360                 :             :   subtype_iterator subtype_end() const { return &ContainedTys[NumContainedTys];}
     361                 :             :   ArrayRef<Type*> subtypes() const {
     362                 :             :     return ArrayRef(subtype_begin(), subtype_end());
     363                 :             :   }
     364                 :             : 
     365                 :             :   using subtype_reverse_iterator = std::reverse_iterator<subtype_iterator>;
     366                 :             : 
     367                 :             :   subtype_reverse_iterator subtype_rbegin() const {
     368                 :             :     return subtype_reverse_iterator(subtype_end());
     369                 :             :   }
     370                 :             :   subtype_reverse_iterator subtype_rend() const {
     371                 :             :     return subtype_reverse_iterator(subtype_begin());
     372                 :             :   }
     373                 :             : 
     374                 :             :   /// This method is used to implement the type iterator (defined at the end of
     375                 :             :   /// the file). For derived types, this returns the types 'contained' in the
     376                 :             :   /// derived type.
     377                 :           0 :   Type *getContainedType(unsigned i) const {
     378         [ #  # ]:           0 :     assert(i < NumContainedTys && "Index out of range!");
     379                 :           0 :     return ContainedTys[i];
     380                 :             :   }
     381                 :             : 
     382                 :             :   /// Return the number of types in the derived type.
     383                 :             :   unsigned getNumContainedTypes() const { return NumContainedTys; }
     384                 :             : 
     385                 :             :   //===--------------------------------------------------------------------===//
     386                 :             :   // Helper methods corresponding to subclass methods.  This forces a cast to
     387                 :             :   // the specified subclass and calls its accessor.  "getArrayNumElements" (for
     388                 :             :   // example) is shorthand for cast<ArrayType>(Ty)->getNumElements().  This is
     389                 :             :   // only intended to cover the core methods that are frequently used, helper
     390                 :             :   // methods should not be added here.
     391                 :             : 
     392                 :             :   inline unsigned getIntegerBitWidth() const;
     393                 :             : 
     394                 :             :   inline Type *getFunctionParamType(unsigned i) const;
     395                 :             :   inline unsigned getFunctionNumParams() const;
     396                 :             :   inline bool isFunctionVarArg() const;
     397                 :             : 
     398                 :             :   inline StringRef getStructName() const;
     399                 :             :   inline unsigned getStructNumElements() const;
     400                 :             :   inline Type *getStructElementType(unsigned N) const;
     401                 :             : 
     402                 :             :   inline uint64_t getArrayNumElements() const;
     403                 :             : 
     404                 :             :   Type *getArrayElementType() const {
     405                 :             :     assert(getTypeID() == ArrayTyID);
     406                 :             :     return ContainedTys[0];
     407                 :             :   }
     408                 :             : 
     409                 :             :   inline StringRef getTargetExtName() const;
     410                 :             : 
     411                 :             :   /// Only use this method in code that is not reachable with opaque pointers,
     412                 :             :   /// or part of deprecated methods that will be removed as part of the opaque
     413                 :             :   /// pointers transition.
     414                 :             :   [[deprecated("Pointers no longer have element types")]]
     415                 :             :   Type *getNonOpaquePointerElementType() const {
     416                 :             :     llvm_unreachable("Pointers no longer have element types");
     417                 :             :   }
     418                 :             : 
     419                 :             :   /// Given vector type, change the element type,
     420                 :             :   /// whilst keeping the old number of elements.
     421                 :             :   /// For non-vectors simply returns \p EltTy.
     422                 :             :   inline Type *getWithNewType(Type *EltTy) const;
     423                 :             : 
     424                 :             :   /// Given an integer or vector type, change the lane bitwidth to NewBitwidth,
     425                 :             :   /// whilst keeping the old number of lanes.
     426                 :             :   inline Type *getWithNewBitWidth(unsigned NewBitWidth) const;
     427                 :             : 
     428                 :             :   /// Given scalar/vector integer type, returns a type with elements twice as
     429                 :             :   /// wide as in the original type. For vectors, preserves element count.
     430                 :             :   inline Type *getExtendedType() const;
     431                 :             : 
     432                 :             :   /// Get the address space of this pointer or pointer vector type.
     433                 :             :   inline unsigned getPointerAddressSpace() const;
     434                 :             : 
     435                 :             :   //===--------------------------------------------------------------------===//
     436                 :             :   // Static members exported by the Type class itself.  Useful for getting
     437                 :             :   // instances of Type.
     438                 :             :   //
     439                 :             : 
     440                 :             :   /// Return a type based on an identifier.
     441                 :             :   static Type *getPrimitiveType(LLVMContext &C, TypeID IDNumber);
     442                 :             : 
     443                 :             :   //===--------------------------------------------------------------------===//
     444                 :             :   // These are the builtin types that are always available.
     445                 :             :   //
     446                 :             :   static Type *getVoidTy(LLVMContext &C);
     447                 :             :   static Type *getLabelTy(LLVMContext &C);
     448                 :             :   static Type *getHalfTy(LLVMContext &C);
     449                 :             :   static Type *getBFloatTy(LLVMContext &C);
     450                 :             :   static Type *getFloatTy(LLVMContext &C);
     451                 :             :   static Type *getDoubleTy(LLVMContext &C);
     452                 :             :   static Type *getMetadataTy(LLVMContext &C);
     453                 :             :   static Type *getX86_FP80Ty(LLVMContext &C);
     454                 :             :   static Type *getFP128Ty(LLVMContext &C);
     455                 :             :   static Type *getPPC_FP128Ty(LLVMContext &C);
     456                 :             :   static Type *getX86_MMXTy(LLVMContext &C);
     457                 :             :   static Type *getX86_AMXTy(LLVMContext &C);
     458                 :             :   static Type *getTokenTy(LLVMContext &C);
     459                 :             :   static IntegerType *getIntNTy(LLVMContext &C, unsigned N);
     460                 :             :   static IntegerType *getInt1Ty(LLVMContext &C);
     461                 :             :   static IntegerType *getInt8Ty(LLVMContext &C);
     462                 :             :   static IntegerType *getInt16Ty(LLVMContext &C);
     463                 :             :   static IntegerType *getInt32Ty(LLVMContext &C);
     464                 :             :   static IntegerType *getInt64Ty(LLVMContext &C);
     465                 :             :   static IntegerType *getInt128Ty(LLVMContext &C);
     466                 :             :   template <typename ScalarTy> static Type *getScalarTy(LLVMContext &C) {
     467                 :             :     int noOfBits = sizeof(ScalarTy) * CHAR_BIT;
     468                 :             :     if (std::is_integral<ScalarTy>::value) {
     469                 :             :       return (Type*) Type::getIntNTy(C, noOfBits);
     470                 :             :     } else if (std::is_floating_point<ScalarTy>::value) {
     471                 :             :       switch (noOfBits) {
     472                 :             :       case 32:
     473                 :             :         return Type::getFloatTy(C);
     474                 :             :       case 64:
     475                 :             :         return Type::getDoubleTy(C);
     476                 :             :       }
     477                 :             :     }
     478                 :             :     llvm_unreachable("Unsupported type in Type::getScalarTy");
     479                 :             :   }
     480                 :             :   static Type *getFloatingPointTy(LLVMContext &C, const fltSemantics &S);
     481                 :             : 
     482                 :             :   //===--------------------------------------------------------------------===//
     483                 :             :   // Convenience methods for getting pointer types.
     484                 :             :   //
     485                 :             :   static Type *getWasm_ExternrefTy(LLVMContext &C);
     486                 :             :   static Type *getWasm_FuncrefTy(LLVMContext &C);
     487                 :             : 
     488                 :             :   /// Return a pointer to the current type. This is equivalent to
     489                 :             :   /// PointerType::get(Foo, AddrSpace).
     490                 :             :   /// TODO: Remove this after opaque pointer transition is complete.
     491                 :             :   PointerType *getPointerTo(unsigned AddrSpace = 0) const;
     492                 :             : 
     493                 :             : private:
     494                 :             :   /// Derived types like structures and arrays are sized iff all of the members
     495                 :             :   /// of the type are sized as well. Since asking for their size is relatively
     496                 :             :   /// uncommon, move this operation out-of-line.
     497                 :             :   bool isSizedDerivedType(SmallPtrSetImpl<Type*> *Visited = nullptr) const;
     498                 :             : };
     499                 :             : 
     500                 :             : // Printing of types.
     501                 :             : inline raw_ostream &operator<<(raw_ostream &OS, const Type &T) {
     502                 :             :   T.print(OS);
     503                 :             :   return OS;
     504                 :             : }
     505                 :             : 
     506                 :             : // allow isa<PointerType>(x) to work without DerivedTypes.h included.
     507                 :             : template <> struct isa_impl<PointerType, Type> {
     508                 :             :   static inline bool doit(const Type &Ty) {
     509                 :             :     return Ty.getTypeID() == Type::PointerTyID;
     510                 :             :   }
     511                 :             : };
     512                 :             : 
     513                 :             : // Create wrappers for C Binding types (see CBindingWrapping.h).
     514                 :           0 : DEFINE_ISA_CONVERSION_FUNCTIONS(Type, LLVMTypeRef)
     515                 :             : 
     516                 :             : /* Specialized opaque type conversions.
     517                 :             :  */
     518                 :             : inline Type **unwrap(LLVMTypeRef* Tys) {
     519                 :             :   return reinterpret_cast<Type**>(Tys);
     520                 :             : }
     521                 :             : 
     522                 :             : inline LLVMTypeRef *wrap(Type **Tys) {
     523                 :             :   return reinterpret_cast<LLVMTypeRef*>(const_cast<Type**>(Tys));
     524                 :             : }
     525                 :             : 
     526                 :             : } // end namespace llvm
     527                 :             : 
     528                 :             : #endif // LLVM_IR_TYPE_H
        

Generated by: LCOV version 2.0-1