1//===- llvm/Type.h - Classes for handling data types ------------*- C++ -*-===// 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 7//===----------------------------------------------------------------------===// 9// This file contains the declaration of the Type class. For more "Type" 10// stuff, look in DerivedTypes.h. 12//===----------------------------------------------------------------------===// 35template <
typename PtrType>
classSmallPtrSetImpl;
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 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. 57BFloatTyID,
///< 16-bit floating point type (7-bit significand) 61FP128TyID,
///< 128-bit floating point type (112-bit significand) 69// Derived types... see DerivedTypes.h file. 82 /// This refers to the LLVMContext in which this type was uniqued. 85TypeIDID : 8;
// The current base type of this type. 86unsigned SubclassData : 24;
// Space for subclasses to store data. 87// Note that this should be synchronized with 88// MAX_INT_BITS value in IntegerType class. 94 : Context(
C),
ID(tid), SubclassData(0) {}
101// Ensure we don't have any accidental truncation. 105 /// Keeps track of how many Type*'s there are in the ContainedTys list. 108 /// A pointer to the array of Types contained by this Type. For example, this 109 /// includes the arguments of a function type, the elements of a structure, 110 /// the pointee of a pointer, the element type of an array, etc. This pointer 111 /// may be 0 for types that don't contain other types (Integer, Double, 116 /// Print the current type. 117 /// Omit the type details if \p NoDetails == true. 118 /// E.g., let %st = type { i32, i16 } 119 /// When \p NoDetails is true, we only print %st. 120 /// Put differently, \p NoDetails prints the type as if 121 /// inlined with the operands when printing an instruction. 123bool NoDetails =
false)
const;
127 /// Return the LLVMContext in which this type was uniqued. 130//===--------------------------------------------------------------------===// 131// Accessors for working with types. 134 /// Return the type id for the type. This will return one of the TypeID enum 135 /// elements defined above. 138 /// Return true if this is 'void'. 141 /// Return true if this is 'half', a 16-bit IEEE fp type. 144 /// Return true if this is 'bfloat', a 16-bit bfloat type. 147 /// Return true if this is a 16-bit float type. 152 /// Return true if this is 'float', a 32-bit IEEE fp type. 155 /// Return true if this is 'double', a 64-bit IEEE fp type. 158 /// Return true if this is x86 long double. 161 /// Return true if this is 'fp128'. 164 /// Return true if this is powerpc long double. 167 /// Return true if this is a well-behaved IEEE-like type, which has a IEEE 168 /// compatible layout as defined by APFloat::isIEEE(), and does not have 169 /// non-IEEE values, such as x86_fp80's unnormal values. 183 /// Return true if this is one of the floating-point types 189 /// Returns true if this is a floating-point type that is an unevaluated sum 190 /// of multiple floating-point units. 191 /// An example of such a type is ppc_fp128, also known as double-double, which 192 /// consists of two IEEE 754 doubles. 199 /// Return true if this is X86 AMX. 202 /// Return true if this is a target extension type. 205 /// Return true if this is a target extension type with a scalable layout. 208 /// Return true if this is a type whose size is a known multiple of vscale. 212 /// Return true if this type is or contains a target extension type that 213 /// disallows being used as a global. 218 /// Return true if this type is or contains a target extension type that 219 /// disallows being used as a local. 224 /// Return true if this is a FP type or a vector of FP. 227 /// Return true if this is 'label'. 230 /// Return true if this is 'metadata'. 233 /// Return true if this is 'token'. 236 /// True if this is an instance of IntegerType. 239 /// Return true if this is an IntegerType of the given width. 242 /// Return true if this is an integer type or a vector of integer types. 245 /// Return true if this is an integer type or a vector of integer types of 251 /// Return true if this is an integer type or a pointer type. 254 /// True if this is an instance of FunctionType. 257 /// True if this is an instance of StructType. 260 /// True if this is an instance of ArrayType. 263 /// True if this is an instance of PointerType. 266 /// Return true if this is a pointer type or a vector of pointer types. 269 /// True if this is an instance of VectorType. 274// True if this is an instance of TargetExtType of RISC-V vector tuple. 277 /// Return true if this type could be converted with a lossless BitCast to 278 /// type 'Ty'. For example, i8* to i32*. BitCasts are valid for types of the 279 /// same size only where no re-interpretation of the bits is done. 280 /// Determine if this type could be losslessly bitcast to Ty 283 /// Return true if this type is empty, that is, it has no elements or all of 284 /// its elements are empty. 287 /// Return true if the type is "first class", meaning it is a valid type for a 293 /// Return true if the type is a valid type for a register in codegen. This 294 /// includes all first-class types except struct and array types. 300 /// Return true if the type is an aggregate type. This means it is valid as 301 /// the first operand of an insertvalue or extractvalue instruction. This 302 /// includes struct and array types, but does not include vector types. 307 /// Return true if it makes sense to take the size of this type. To get the 308 /// actual size for a particular target, it is reasonable to use the 309 /// DataLayout subsystem to do this. 311// If it's a primitive, it is always sized. 315// If it is not something that can have a size (e.g. a function or label), 316// it doesn't have a size. 320// Otherwise we have to try harder to decide. 321return isSizedDerivedType(Visited);
324 /// Return the basic size of this type if it is a primitive type. These are 325 /// fixed by LLVM and are not target-dependent. 326 /// This will return zero if the type does not have a size or is not a 329 /// If this is a scalable vector type, the scalable property will be set and 330 /// the runtime size will be a positive integer multiple of the base size. 332 /// Note that this may not reflect the size of memory allocated for an 333 /// instance of the type or the number of bytes that are written when an 334 /// instance of the type is stored to memory. The DataLayout class provides 335 /// additional query functions to provide this information. 339 /// If this is a vector type, return the getPrimitiveSizeInBits value for the 340 /// element type. Otherwise return the getPrimitiveSizeInBits value for this 344 /// Return the width of the mantissa of this type. This is only valid on 345 /// floating-point types. If the FP type does not have a stable mantissa (e.g. 346 /// ppc long double), this method returns -1. 349 /// Return whether the type is IEEE compatible, as defined by the eponymous 350 /// method in APFloat. 353 /// If this is a vector type, return the element type, otherwise return 358returnconst_cast<Type *
>(
this);
361//===--------------------------------------------------------------------===// 362// Type Iteration support. 381 /// This method is used to implement the type iterator (defined at the end of 382 /// the file). For derived types, this returns the types 'contained' in the 389 /// Return the number of types in the derived type. 392//===--------------------------------------------------------------------===// 393// Helper methods corresponding to subclass methods. This forces a cast to 394// the specified subclass and calls its accessor. "getArrayNumElements" (for 395// example) is shorthand for cast<ArrayType>(Ty)->getNumElements(). This is 396// only intended to cover the core methods that are frequently used, helper 397// methods should not be added here. 418 /// Given vector type, change the element type, 419 /// whilst keeping the old number of elements. 420 /// For non-vectors simply returns \p EltTy. 423 /// Given an integer or vector type, change the lane bitwidth to NewBitwidth, 424 /// whilst keeping the old number of lanes. 427 /// Given scalar/vector integer type, returns a type with elements twice as 428 /// wide as in the original type. For vectors, preserves element count. 431 /// Get the address space of this pointer or pointer vector type. 434//===--------------------------------------------------------------------===// 435// Static members exported by the Type class itself. Useful for getting 439 /// Return a type based on an identifier. 442//===--------------------------------------------------------------------===// 443// These are the builtin types that are always available. 465int noOfBits =
sizeof(ScalarTy) * CHAR_BIT;
466if (std::is_integral<ScalarTy>::value) {
468 }
elseif (std::is_floating_point<ScalarTy>::value) {
480//===--------------------------------------------------------------------===// 481// Convenience methods for getting pointer types. 486 /// Return a pointer to the current type. This is equivalent to 487 /// PointerType::get(Ctx, AddrSpace). 488 /// TODO: Remove this after opaque pointer transition is complete. 493 /// Derived types like structures and arrays are sized iff all of the members 494 /// of the type are sized as well. Since asking for their size is relatively 495 /// uncommon, move this operation out-of-line. 505// allow isa<PointerType>(x) to work without DerivedTypes.h included. 508return Ty.
getTypeID() == Type::PointerTyID;
512// Create wrappers for C Binding types (see CBindingWrapping.h). 515/* Specialized opaque type conversions. 518returnreinterpret_cast<Type**
>(Tys);
525}
// end namespace llvm 527#endif// LLVM_IR_TYPE_H #define DEFINE_ISA_CONVERSION_FUNCTIONS(ty, ref)
#define LLVM_DEPRECATED(MSG, FIX)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Class to represent integer types.
This is an important class for using LLVM in a threaded context.
Class to represent pointers.
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
StringRef - Represent a constant reference to a string, i.e.
The instances of the Type class are immutable: once they are created, they are never changed.
bool isIntOrIntVectorTy(unsigned BitWidth) const
Return true if this is an integer type or a vector of integer types of the given width.
static Type * getHalfTy(LLVMContext &C)
unsigned getIntegerBitWidth() const
Type * getStructElementType(unsigned N) const
static Type * getDoubleTy(LLVMContext &C)
const fltSemantics & getFltSemantics() const
bool isVectorTy() const
True if this is an instance of VectorType.
static Type * getFloatingPointTy(LLVMContext &C, const fltSemantics &S)
bool isX86_FP80Ty() const
Return true if this is x86 long double.
PointerType * getPointerTo(unsigned AddrSpace=0) const
Return a pointer to the current type.
bool containsNonLocalTargetExtType(SmallPtrSetImpl< const Type * > &Visited) const
Return true if this type is or contains a target extension type that disallows being used as a local.
bool isArrayTy() const
True if this is an instance of ArrayType.
static Type * getX86_FP80Ty(LLVMContext &C)
bool isLabelTy() const
Return true if this is 'label'.
static Type * getBFloatTy(LLVMContext &C)
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
bool isPointerTy() const
True if this is an instance of PointerType.
static IntegerType * getInt1Ty(LLVMContext &C)
Type * getArrayElementType() const
bool isFloatTy() const
Return true if this is 'float', a 32-bit IEEE fp type.
bool isEmptyTy() const
Return true if this type is empty, that is, it has no elements or all of its elements are empty.
bool isIntegerTy(unsigned Bitwidth) const
Return true if this is an IntegerType of the given width.
static Type * getX86_AMXTy(LLVMContext &C)
bool isBFloatTy() const
Return true if this is 'bfloat', a 16-bit bfloat type.
static Type * getMetadataTy(LLVMContext &C)
StringRef getStructName() const
Type *const * subtype_iterator
bool containsNonGlobalTargetExtType(SmallPtrSetImpl< const Type * > &Visited) const
Return true if this type is or contains a target extension type that disallows being used as a global...
unsigned getStructNumElements() const
unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
uint64_t getArrayNumElements() const
bool containsNonLocalTargetExtType() const
TypeID
Definitions of all of the base types for the Type system.
@ X86_AMXTyID
AMX vectors (8192 bits, X86 specific)
@ TypedPointerTyID
Typed pointer used by some GPU targets.
@ HalfTyID
16-bit floating point type
@ TargetExtTyID
Target extension type.
@ VoidTyID
type with no size
@ ScalableVectorTyID
Scalable SIMD vector type.
@ FloatTyID
32-bit floating point type
@ IntegerTyID
Arbitrary bit width integers.
@ FixedVectorTyID
Fixed width SIMD vector type.
@ BFloatTyID
16-bit floating point type (7-bit significand)
@ DoubleTyID
64-bit floating point type
@ X86_FP80TyID
80-bit floating point type (X87)
@ PPC_FP128TyID
128-bit floating point type (two 64-bits, PowerPC)
@ FP128TyID
128-bit floating point type (112-bit significand)
ArrayRef< Type * > subtypes() const
bool isSingleValueType() const
Return true if the type is a valid type for a register in codegen.
void print(raw_ostream &O, bool IsForDebug=false, bool NoDetails=false) const
Print the current type.
unsigned getNumContainedTypes() const
Return the number of types in the derived type.
bool isPPC_FP128Ty() const
Return true if this is powerpc long double.
unsigned NumContainedTys
Keeps track of how many Type*'s there are in the ContainedTys list.
static IntegerType * getIntNTy(LLVMContext &C, unsigned N)
bool isFP128Ty() const
Return true if this is 'fp128'.
bool is16bitFPTy() const
Return true if this is a 16-bit float type.
StringRef getTargetExtName() const
unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
static Type * getVoidTy(LLVMContext &C)
static Type * getLabelTy(LLVMContext &C)
bool isScalableTargetExtTy() const
Return true if this is a target extension type with a scalable layout.
bool isMultiUnitFPType() const
Returns true if this is a floating-point type that is an unevaluated sum of multiple floating-point u...
Type(LLVMContext &C, TypeID tid)
bool isStructTy() const
True if this is an instance of StructType.
bool isFirstClassType() const
Return true if the type is "first class", meaning it is a valid type for a Value.
static Type * getFP128Ty(LLVMContext &C)
Type * getWithNewBitWidth(unsigned NewBitWidth) const
Given an integer or vector type, change the lane bitwidth to NewBitwidth, whilst keeping the old numb...
bool isTargetExtTy() const
Return true if this is a target extension type.
bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
Return true if it makes sense to take the size of this type.
static IntegerType * getInt16Ty(LLVMContext &C)
bool isAggregateType() const
Return true if the type is an aggregate type.
bool isHalfTy() const
Return true if this is 'half', a 16-bit IEEE fp type.
bool isScalableTy(SmallPtrSetImpl< const Type * > &Visited) const
Return true if this is a type whose size is a known multiple of vscale.
Type * getWithNewType(Type *EltTy) const
Given vector type, change the element type, whilst keeping the old number of elements.
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
static Type * getPrimitiveType(LLVMContext &C, TypeID IDNumber)
Return a type based on an identifier.
int getFPMantissaWidth() const
Return the width of the mantissa of this type.
Type *const * ContainedTys
A pointer to the array of Types contained by this Type.
unsigned getSubclassData() const
static IntegerType * getInt8Ty(LLVMContext &C)
bool isIEEE() const
Return whether the type is IEEE compatible, as defined by the eponymous method in APFloat.
std::reverse_iterator< subtype_iterator > subtype_reverse_iterator
static IntegerType * getInt128Ty(LLVMContext &C)
bool isFunctionVarArg() const
bool isDoubleTy() const
Return true if this is 'double', a 64-bit IEEE fp type.
void setSubclassData(unsigned val)
static Type * getTokenTy(LLVMContext &C)
bool isFloatingPointTy() const
Return true if this is one of the floating-point types.
bool isPtrOrPtrVectorTy() const
Return true if this is a pointer type or a vector of pointer types.
subtype_iterator subtype_begin() const
bool isX86_AMXTy() const
Return true if this is X86 AMX.
static Type * getScalarTy(LLVMContext &C)
bool isRISCVVectorTupleTy() const
bool isFunctionTy() const
True if this is an instance of FunctionType.
bool isScalableTy() const
bool canLosslesslyBitCastTo(Type *Ty) const
Return true if this type could be converted with a lossless BitCast to type 'Ty'.
bool isIntOrPtrTy() const
Return true if this is an integer type or a pointer type.
static IntegerType * getInt32Ty(LLVMContext &C)
static IntegerType * getInt64Ty(LLVMContext &C)
Type * getExtendedType() const
Given scalar/vector integer type, returns a type with elements twice as wide as in the original type.
static Type * getFloatTy(LLVMContext &C)
bool isIntegerTy() const
True if this is an instance of IntegerType.
TypeID getTypeID() const
Return the type id for the type.
static Type * getWasm_FuncrefTy(LLVMContext &C)
bool isTokenTy() const
Return true if this is 'token'.
Type * getFunctionParamType(unsigned i) const
subtype_reverse_iterator subtype_rend() const
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
subtype_reverse_iterator subtype_rbegin() const
Type * getContainedType(unsigned i) const
This method is used to implement the type iterator (defined at the end of the file).
subtype_iterator subtype_end() const
bool isIEEELikeFPTy() const
Return true if this is a well-behaved IEEE-like type, which has a IEEE compatible layout as defined b...
bool containsNonGlobalTargetExtType() const
static Type * getPPC_FP128Ty(LLVMContext &C)
unsigned getFunctionNumParams() const
static Type * getWasm_ExternrefTy(LLVMContext &C)
bool isVoidTy() const
Return true if this is 'void'.
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
bool isMetadataTy() const
Return true if this is 'metadata'.
This class implements an extremely fast bulk output stream that can only output to a stream.
struct LLVMOpaqueType * LLVMTypeRef
Each value in the LLVM IR has a type, an LLVMTypeRef.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
This is an optimization pass for GlobalISel generic memory operations.
Attribute unwrap(LLVMAttributeRef Attr)
constexpr unsigned BitWidth
LLVMAttributeRef wrap(Attribute Attr)
static bool doit(const Type &Ty)