45 if (
auto *VTy = dyn_cast<VectorType>(
this))
46 return VTy->getElementType();
47 return const_cast<Type*
>(
this);
66 if (
auto *thisPTy = dyn_cast<VectorType>(
this)) {
67 if (
auto *thatPTy = dyn_cast<VectorType>(Ty))
68 return thisPTy->getBitWidth() == thatPTy->getBitWidth();
70 thisPTy->getBitWidth() == 64)
75 if (
auto *thatPTy = dyn_cast<VectorType>(Ty))
76 if (thatPTy->getBitWidth() == 64)
83 if (
auto *PTy = dyn_cast<PointerType>(
this)) {
84 if (
auto *OtherPTy = dyn_cast<PointerType>(Ty))
85 return PTy->getAddressSpace() == OtherPTy->getAddressSpace();
92 if (
auto *ATy = dyn_cast<ArrayType>(
this)) {
93 unsigned NumElements = ATy->getNumElements();
94 return NumElements == 0 || ATy->getElementType()->isEmptyTy();
97 if (
auto *STy = dyn_cast<StructType>(
this)) {
98 unsigned NumElements = STy->getNumElements();
99 for (
unsigned i = 0;
i < NumElements; ++
i)
100 if (!STy->getElementType(
i)->isEmptyTy())
128 if (
auto *VTy = dyn_cast<VectorType>(
this))
129 return VTy->getElementType()->getFPMantissaWidth();
141 if (
auto *ATy = dyn_cast<ArrayType>(
this))
142 return ATy->getElementType()->isSized(Visited);
144 if (
auto *VTy = dyn_cast<VectorType>(
this))
145 return VTy->getElementType()->isSized(Visited);
147 return cast<StructType>(
this)->
isSized(Visited);
273 :
Type(Result->getContext(), FunctionTyID) {
274 Type **SubTys =
reinterpret_cast<Type**
>(
this+1);
275 assert(isValidReturnType(Result) &&
"invalid return type for function");
280 for (
unsigned i = 0, e = Params.
size();
i != e; ++
i) {
281 assert(isValidArgumentType(Params[
i]) &&
282 "Not a valid type for function argument!");
283 SubTys[
i+1] = Params[
i];
359 if (Elements.
empty()) {
383 SymbolTableEntry =
nullptr;
393 if (!IterBool.second) {
400 TempStr.
resize(NameSize + 1);
404 std::make_pair(TmpStream.
str(),
this));
405 }
while (!IterBool.second);
411 SymbolTableEntry = &*IterBool.first;
429 assert(type &&
"Cannot create a struct type with no elements with this");
446 ST->
setBody(Elements, isPacked);
461 "This method may not be invoked with an empty list");
467 "This method may not be invoked with an empty list");
472 assert(type &&
"Cannot create a struct type with no elements with this");
492 if (Visited && !Visited->
insert(const_cast<StructType*>(
this)).second)
499 if (!(*I)->isSized(Visited))
518 assert(type &&
"Cannot create a struct type with no elements with this");
537 if (
this == Other)
return true;
555 if (
auto *STy = dyn_cast<StructType>(
this)) {
557 (
unsigned)cast<Constant>(V)->getUniqueInteger().getZExtValue();
559 return STy->getElementType(Idx);
562 return cast<SequentialType>(
this)->getElementType();
566 if (
auto *STy = dyn_cast<StructType>(
this)) {
568 return STy->getElementType(Idx);
571 return cast<SequentialType>(
this)->getElementType();
575 if (
auto *STy = dyn_cast<StructType>(
this)) {
583 const ConstantInt *CU = dyn_cast_or_null<ConstantInt>(
C);
584 return CU && CU->
getZExtValue() < STy->getNumElements();
592 if (
auto *STy = dyn_cast<StructType>(
this))
593 return Idx < STy->getNumElements();
603 ArrayType::ArrayType(
Type *ElType, uint64_t NumEl)
611 pImpl->
ArrayTypes[std::make_pair(ElementType, NumElements)];
628 VectorType::VectorType(
Type *ElType,
unsigned NumEl)
632 assert(NumElements > 0 &&
"#Elements of a VectorType must be greater than 0");
634 "be an integer, floating point, or "
639 ->
VectorTypes[std::make_pair(ElementType, NumElements)];
656 assert(EltTy &&
"Can't get a pointer to <null> type!");
671 PointerType::PointerType(
Type *
E,
unsigned AddrSpace)
672 :
Type(E->getContext(), PointerTyID), PointeeTy(E) {
static unsigned getBitWidth(Type *Ty, const DataLayout &DL)
Returns the bitwidth of the given scalar or pointer type (if unknown returns 0).
Maximum number of bits that can be specified.
DenseMap< unsigned, IntegerType * > IntegerTypes
void push_back(const T &Elt)
static Type * getDoubleTy(LLVMContext &C)
static IntegerType * getInt1Ty(LLVMContext &C)
static APInt getAllOnesValue(unsigned numBits)
Get the all-ones value.
Minimum number of bits that can be specified.
bool isOpaque() const
Return true if this is a type with an identity that has no body specified yet.
StringMapEntry - This is used to represent one value that is inserted into a StringMap.
APInt getMask() const
For example, this is 0xFF for an 8 bit integer, 0xFFFF for i16, etc.
void remove(MapEntryTy *KeyValue)
remove - Remove the specified key/value pair from the map, but do not erase it.
2: 32-bit floating point type
Constant * getSplatValue() const
If this is a splat vector constant, meaning that all of the elements have the same value...
static PointerType * getInt32PtrTy(LLVMContext &C, unsigned AS=0)
bool indexValid(const Value *V) const
static PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space...
A raw_ostream that writes to an SmallVector or SmallString.
bool isTokenTy() const
Return true if this is 'token'.
int getFPMantissaWidth() const
Return the width of the mantissa of this type.
4: 80-bit floating point type (X87)
static bool isValidReturnType(Type *RetTy)
Return true if the specified type is valid as a return type.
static bool isLoadableOrStorableType(Type *ElemTy)
Return true if we can load or store from a pointer to this type.
1: 16-bit floating point type
unsigned getBitWidth() const
Get the number of bits in this IntegerType.
static IntegerType * getInt64Ty(LLVMContext &C)
DenseMap< std::pair< Type *, unsigned >, PointerType * > ASPointerTypes
static Type * getMetadataTy(LLVMContext &C)
static bool isValidArgumentType(Type *ArgTy)
Return true if the specified type is valid as an argument type.
static IntegerType * getInt16Ty(LLVMContext &C)
static Type * getX86_MMXTy(LLVMContext &C)
static PointerType * getX86_MMXPtrTy(LLVMContext &C, unsigned AS=0)
StructType * getTypeByName(StringRef Name) const
Return the type with the specified name, or null if there is none by that name.
static PointerType * getInt64PtrTy(LLVMContext &C, unsigned AS=0)
static Type * getX86_FP80Ty(LLVMContext &C)
Type *const * ContainedTys
A pointer to the array of Types contained by this Type.
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
element_iterator element_end() const
static Type * getTokenTy(LLVMContext &C)
Type::subtype_iterator element_iterator
static Type * getFloatTy(LLVMContext &C)
Class to represent struct types.
bool canLosslesslyBitCastTo(Type *Ty) const
Return true if this type could be converted with a lossless BitCast to type 'Ty'. ...
DenseMap< std::pair< Type *, uint64_t >, ArrayType * > ArrayTypes
bool isLiteral() const
Return true if this type is uniqued by structural equivalence, false if it is a struct definition...
TypeID
Definitions of all of the base types for the Type system.
element_iterator element_begin() const
static PointerType * getInt16PtrTy(LLVMContext &C, unsigned AS=0)
ArrayRef< T > copy(Allocator &A)
static Type * getPPC_FP128Ty(LLVMContext &C)
BumpPtrAllocator TypeAllocator
TypeAllocator - All dynamically allocated types are allocated from this.
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
Class to represent function types.
static Type * getLabelTy(LLVMContext &C)
unsigned NamedStructTypesUniqueID
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
ArrayRef< Type * > const elements() const
Class to represent array types.
static bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
static PointerType * getDoublePtrTy(LLVMContext &C, unsigned AS=0)
bool isFirstClassType() const
Return true if the type is "first class", meaning it is a valid type for a Value. ...
static FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory)...
TypeID getTypeID() const
Return the type id for the type.
bool isFloatingPointTy() const
Return true if this is one of the six floating-point types.
unsigned getSubclassData() const
LLVM_NODISCARD LLVM_ATTRIBUTE_ALWAYS_INLINE size_t size() const
size - Get the string size.
DenseMap< std::pair< Type *, unsigned >, VectorType * > VectorTypes
Type * getScalarType() const LLVM_READONLY
If this is a vector type, return the element type, otherwise return 'this'.
size_t size() const
size - Get the array size.
Class to represent pointers.
static GCRegistry::Add< CoreCLRGC > E("coreclr","CoreCLR-compatible GC")
11: Arbitrary bit width integers
bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
Return true if it makes sense to take the size of this type.
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
static IntegerType * getInt128Ty(LLVMContext &C)
constexpr bool isPowerOf2_32(uint32_t Value)
isPowerOf2_32 - This function returns true if the argument is a power of two > 0. ...
The instances of the Type class are immutable: once they are created, they are never changed...
This is an important class for using LLVM in a threaded context.
bool isVectorTy() const
True if this is an instance of VectorType.
This is an important base class in LLVM.
LLVM_ATTRIBUTE_RETURNS_NONNULL LLVM_ATTRIBUTE_RETURNS_NOALIAS void * Allocate(size_t Size, size_t Alignment)
Allocate space at the specified alignment.
std::pair< iterator, bool > insert(const ValueT &V)
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
bool isLayoutIdentical(StructType *Other) const
Return true if this is layout identical to the specified struct.
iterator find_as(const LookupKeyT &Val)
Alternative version of find() which allows a different, and possibly less expensive, key type.
static Type * getVoidTy(LLVMContext &C)
6: 128-bit floating point type (two 64-bits, PowerPC)
Class to represent integer types.
bool empty() const
empty - Check if the array is empty.
static PointerType * getPPC_FP128PtrTy(LLVMContext &C, unsigned AS=0)
static bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
bool isPointerTy() const
True if this is an instance of PointerType.
static PointerType * getFloatPtrTy(LLVMContext &C, unsigned AS=0)
static PointerType * getInt8PtrTy(LLVMContext &C, unsigned AS=0)
void setBody(ArrayRef< Type * > Elements, bool isPacked=false)
Specify a body for an opaque identified type.
LLVMContextImpl *const pImpl
static Type * getFP128Ty(LLVMContext &C)
static PointerType * getX86_FP80PtrTy(LLVMContext &C, unsigned AS=0)
This is the superclass of the array and vector type classes.
static Type * getHalfTy(LLVMContext &C)
static IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
static PointerType * getInt1PtrTy(LLVMContext &C, unsigned AS=0)
static bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
This is the shared class of boolean and integer constants.
bool isFunctionTy() const
True if this is an instance of FunctionType.
16: SIMD 'packed' format, or other vector type
static StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small...
Module.h This file contains the declarations for the Module class.
Type * getType() const
All values are typed, get the type of this value.
AllocatorTy & getAllocator()
FunctionTypeSet FunctionTypes
static IntegerType * getIntNTy(LLVMContext &C, unsigned N)
static PointerType * getHalfPtrTy(LLVMContext &C, unsigned AS=0)
StringRef str()
Return a StringRef for the vector contents.
static Type * getPrimitiveType(LLVMContext &C, TypeID IDNumber)
Return a type based on an identifier.
static PointerType * getFP128PtrTy(LLVMContext &C, unsigned AS=0)
bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
isSized - Return true if this is a sized type.
static GCRegistry::Add< ShadowStackGC > C("shadow-stack","Very portable GC for uncooperative code generators")
Symbol info for RuntimeDyld.
StringMap - This is an unconventional map that is specialized for handling keys that are "strings"...
Class to represent vector types.
Class for arbitrary precision integers.
bool isIntegerTy() const
True if this is an instance of IntegerType.
StringRef getName() const
Return the name for this struct type if it has an identity.
LLVM_NODISCARD LLVM_ATTRIBUTE_ALWAYS_INLINE bool empty() const
empty - Check if the string is empty.
StructTypeSet AnonStructTypes
void setName(StringRef Name)
Change the name of this type to the specified name, or to a name with a suffix if there is a collisio...
static IntegerType * getInt32Ty(LLVMContext &C)
StringMap< StructType * > NamedStructTypes
static bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
static ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
LLVM_NODISCARD std::enable_if<!is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type >::type dyn_cast(const Y &Val)
bool isPowerOf2ByteWidth() const
This method determines if the width of this IntegerType is a power-of-2 in terms of 8 bit bytes...
IntegerType(LLVMContext &C, unsigned NumBits)
static PointerType * getIntNPtrTy(LLVMContext &C, unsigned N, unsigned AS=0)
3: 64-bit floating point type
void setSubclassData(unsigned val)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
bool isEmptyTy() const
Return true if this type is empty, that is, it has no elements or all of its elements are empty...
unsigned getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
bool isLabelTy() const
Return true if this is 'label'.
LLVM Value Representation.
static VectorType * get(Type *ElementType, unsigned NumElements)
This static method is the primary way to construct an VectorType.
static StructType * create(LLVMContext &Context, StringRef Name)
This creates an identified struct.
PointerType * getPointerTo(unsigned AddrSpace=0) const
Return a pointer to the current type.
StringRef - Represent a constant reference to a string, i.e.
DenseMap< Type *, PointerType * > PointerTypes
9: MMX vectors (64 bits, X86 specific)
static IntegerType * getInt8Ty(LLVMContext &C)
unsigned NumContainedTys
Keeps track of how many Type*'s there are in the ContainedTys list.
Type * getTypeAtIndex(const Value *V) const
Given an index value into the type, return the type of the element.
LLVMContext & getContext() const
Get the global data context.
bool isVoidTy() const
Return true if this is 'void'.
5: 128-bit floating point type (112-bit mantissa)
bool isMetadataTy() const
Return true if this is 'metadata'.