LLVM 22.0.0git
DerivedTypes.h
Go to the documentation of this file.
1//===- llvm/DerivedTypes.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 declarations of classes that represent "derived
10// types". These are things like "arrays of x" or "structure of x, y, z" or
11// "function returning x taking (y,z) as parameters", etc...
12//
13// The implementations of these classes live in the Type.cpp file.
14//
15//===----------------------------------------------------------------------===//
16
17#ifndef LLVM_IR_DERIVEDTYPES_H
18#define LLVM_IR_DERIVEDTYPES_H
19
20#include "llvm/ADT/ArrayRef.h"
21#include "llvm/ADT/STLExtras.h"
22#include "llvm/ADT/StringRef.h"
23#include "llvm/IR/Type.h"
27#include <cassert>
28#include <cstdint>
29
30namespace llvm {
31
32class Value;
33class APInt;
34class LLVMContext;
35template <typename T> class Expected;
36class Error;
37
38/// Class to represent integer types. Note that this class is also used to
39/// represent the built-in integer types: Int1Ty, Int8Ty, Int16Ty, Int32Ty and
40/// Int64Ty.
41/// Integer representation type
42class IntegerType : public Type {
43 friend class LLVMContextImpl;
44
45protected:
46 explicit IntegerType(LLVMContext &C, unsigned NumBits) : Type(C, IntegerTyID){
47 setSubclassData(NumBits);
48 }
49
50public:
51 /// This enum is just used to hold constants we need for IntegerType.
52 enum {
53 MIN_INT_BITS = 1, ///< Minimum number of bits that can be specified
54 MAX_INT_BITS = (1<<23) ///< Maximum number of bits that can be specified
55 ///< Note that bit width is stored in the Type classes SubclassData field
56 ///< which has 24 bits. SelectionDAG type legalization can require a
57 ///< power of 2 IntegerType, so limit to the largest representable power
58 ///< of 2, 8388608.
59 };
60
61 /// This static method is the primary way of constructing an IntegerType.
62 /// If an IntegerType with the same NumBits value was previously instantiated,
63 /// that instance will be returned. Otherwise a new one will be created. Only
64 /// one instance with a given NumBits value is ever created.
65 /// Get or create an IntegerType instance.
66 LLVM_ABI static IntegerType *get(LLVMContext &C, unsigned NumBits);
67
68 /// Returns type twice as wide the input type.
72
73 /// Get the number of bits in this IntegerType
74 unsigned getBitWidth() const { return getSubclassData(); }
75
76 /// Return a bitmask with ones set for all of the bits that can be set by an
77 /// unsigned version of this type. This is 0xFF for i8, 0xFFFF for i16, etc.
79 return ~uint64_t(0UL) >> (64-getBitWidth());
80 }
81
82 /// Return a uint64_t with just the most significant bit set (the sign bit, if
83 /// the value is treated as a signed number).
85 return 1ULL << (getBitWidth()-1);
86 }
87
88 /// For example, this is 0xFF for an 8 bit integer, 0xFFFF for i16, etc.
89 /// @returns a bit mask with ones set for all the bits of this type.
90 /// Get a bit mask for this type.
91 LLVM_ABI APInt getMask() const;
92
93 /// Methods for support type inquiry through isa, cast, and dyn_cast.
94 static bool classof(const Type *T) {
95 return T->getTypeID() == IntegerTyID;
96 }
97};
98
99unsigned Type::getIntegerBitWidth() const {
100 return cast<IntegerType>(this)->getBitWidth();
101}
102
103/// Class to represent function types
104///
105class FunctionType : public Type {
106 FunctionType(Type *Result, ArrayRef<Type*> Params, bool IsVarArgs);
107
108public:
109 FunctionType(const FunctionType &) = delete;
110 FunctionType &operator=(const FunctionType &) = delete;
111
112 /// This static method is the primary way of constructing a FunctionType.
113 LLVM_ABI static FunctionType *get(Type *Result, ArrayRef<Type *> Params,
114 bool isVarArg);
115
116 /// Create a FunctionType taking no parameters.
117 LLVM_ABI static FunctionType *get(Type *Result, bool isVarArg);
118
119 /// Return true if the specified type is valid as a return type.
120 LLVM_ABI static bool isValidReturnType(Type *RetTy);
121
122 /// Return true if the specified type is valid as an argument type.
123 LLVM_ABI static bool isValidArgumentType(Type *ArgTy);
124
125 bool isVarArg() const { return getSubclassData()!=0; }
126 Type *getReturnType() const { return ContainedTys[0]; }
127
129
133 return ArrayRef(param_begin(), param_end());
134 }
135
136 /// Parameter type accessors.
137 Type *getParamType(unsigned i) const {
138 assert(i < getNumParams() && "getParamType() out of range!");
139 return ContainedTys[i + 1];
140 }
141
142 /// Return the number of fixed parameters this function type requires.
143 /// This does not consider varargs.
144 unsigned getNumParams() const { return NumContainedTys - 1; }
145
146 /// Methods for support type inquiry through isa, cast, and dyn_cast.
147 static bool classof(const Type *T) {
148 return T->getTypeID() == FunctionTyID;
149 }
150};
151static_assert(alignof(FunctionType) >= alignof(Type *),
152 "Alignment sufficient for objects appended to FunctionType");
153
155 return cast<FunctionType>(this)->isVarArg();
156}
157
159 return cast<FunctionType>(this)->getParamType(i);
160}
161
163 return cast<FunctionType>(this)->getNumParams();
164}
165
166/// A handy container for a FunctionType+Callee-pointer pair, which can be
167/// passed around as a single entity. This assists in replacing the use of
168/// PointerType::getElementType() to access the function's type, since that's
169/// slated for removal as part of the [opaque pointer types] project.
171public:
172 // Allow implicit conversion from types which have a getFunctionType member
173 // (e.g. Function and InlineAsm).
174 template <typename T, typename U = decltype(&T::getFunctionType)>
176 : FnTy(Fn ? Fn->getFunctionType() : nullptr), Callee(Fn) {}
177
179 : FnTy(FnTy), Callee(Callee) {
180 assert((FnTy == nullptr) == (Callee == nullptr));
181 }
182
183 FunctionCallee(std::nullptr_t) {}
184
185 FunctionCallee() = default;
186
187 FunctionType *getFunctionType() { return FnTy; }
188
189 Value *getCallee() { return Callee; }
190
191 explicit operator bool() { return Callee; }
192
193private:
194 FunctionType *FnTy = nullptr;
195 Value *Callee = nullptr;
196};
197
198/// Class to represent struct types. There are two different kinds of struct
199/// types: Literal structs and Identified structs.
200///
201/// Literal struct types (e.g. { i32, i32 }) are uniqued structurally, and must
202/// always have a body when created. You can get one of these by using one of
203/// the StructType::get() forms.
204///
205/// Identified structs (e.g. %foo or %42) may optionally have a name and are not
206/// uniqued. The names for identified structs are managed at the LLVMContext
207/// level, so there can only be a single identified struct with a given name in
208/// a particular LLVMContext. Identified structs may also optionally be opaque
209/// (have no body specified). You get one of these by using one of the
210/// StructType::create() forms.
211///
212/// Independent of what kind of struct you have, the body of a struct type are
213/// laid out in memory consecutively with the elements directly one after the
214/// other (if the struct is packed) or (if not packed) with padding between the
215/// elements as defined by DataLayout (which is required to match what the code
216/// generator for a target expects).
217///
218class StructType : public Type {
219 StructType(LLVMContext &C) : Type(C, StructTyID) {}
220
221 enum {
222 /// This is the contents of the SubClassData field.
223 SCDB_HasBody = 1,
224 SCDB_Packed = 2,
225 SCDB_IsLiteral = 4,
226 SCDB_IsSized = 8,
227 SCDB_ContainsScalableVector = 16,
228 SCDB_NotContainsScalableVector = 32,
229 SCDB_ContainsNonGlobalTargetExtType = 64,
230 SCDB_NotContainsNonGlobalTargetExtType = 128,
231 SCDB_ContainsNonLocalTargetExtType = 64,
232 SCDB_NotContainsNonLocalTargetExtType = 128,
233 };
234
235 /// For a named struct that actually has a name, this is a pointer to the
236 /// symbol table entry (maintained by LLVMContext) for the struct.
237 /// This is null if the type is an literal struct or if it is a identified
238 /// type that has an empty name.
239 void *SymbolTableEntry = nullptr;
240
241public:
242 StructType(const StructType &) = delete;
243 StructType &operator=(const StructType &) = delete;
244
245 /// This creates an identified struct.
246 LLVM_ABI static StructType *create(LLVMContext &Context, StringRef Name);
247 LLVM_ABI static StructType *create(LLVMContext &Context);
248
249 LLVM_ABI static StructType *create(ArrayRef<Type *> Elements, StringRef Name,
250 bool isPacked = false);
251 LLVM_ABI static StructType *create(ArrayRef<Type *> Elements);
252 LLVM_ABI static StructType *create(LLVMContext &Context,
253 ArrayRef<Type *> Elements, StringRef Name,
254 bool isPacked = false);
255 LLVM_ABI static StructType *create(LLVMContext &Context,
256 ArrayRef<Type *> Elements);
257 template <class... Tys>
258 static std::enable_if_t<are_base_of<Type, Tys...>::value, StructType *>
259 create(StringRef Name, Type *elt1, Tys *... elts) {
260 assert(elt1 && "Cannot create a struct type with no elements with this");
261 return create(ArrayRef<Type *>({elt1, elts...}), Name);
262 }
263
264 /// This static method is the primary way to create a literal StructType.
265 LLVM_ABI static StructType *
266 get(LLVMContext &Context, ArrayRef<Type *> Elements, bool isPacked = false);
267
268 /// Create an empty structure type.
269 LLVM_ABI static StructType *get(LLVMContext &Context, bool isPacked = false);
270
271 /// This static method is a convenience method for creating structure types by
272 /// specifying the elements as arguments. Note that this method always returns
273 /// a non-packed struct, and requires at least one element type.
274 template <class... Tys>
275 static std::enable_if_t<are_base_of<Type, Tys...>::value, StructType *>
276 get(Type *elt1, Tys *... elts) {
277 assert(elt1 && "Cannot create a struct type with no elements with this");
278 LLVMContext &Ctx = elt1->getContext();
279 return StructType::get(Ctx, ArrayRef<Type *>({elt1, elts...}));
280 }
281
282 /// Return the type with the specified name, or null if there is none by that
283 /// name.
285
286 bool isPacked() const { return (getSubclassData() & SCDB_Packed) != 0; }
287
288 /// Return true if this type is uniqued by structural equivalence, false if it
289 /// is a struct definition.
290 bool isLiteral() const { return (getSubclassData() & SCDB_IsLiteral) != 0; }
291
292 /// Return true if this is a type with an identity that has no body specified
293 /// yet. These prints as 'opaque' in .ll files.
294 bool isOpaque() const { return (getSubclassData() & SCDB_HasBody) == 0; }
295
296 /// isSized - Return true if this is a sized type.
297 LLVM_ABI bool isSized(SmallPtrSetImpl<Type *> *Visited = nullptr) const;
298
299 /// Returns true if this struct contains a scalable vector.
301 using Type::isScalableTy;
302
303 /// Return true if this type is or contains a target extension type that
304 /// disallows being used as a global.
305 LLVM_ABI bool
308
309 /// Return true if this type is or contains a target extension type that
310 /// disallows being used as a local.
311 LLVM_ABI bool
314
315 /// Returns true if this struct contains homogeneous scalable vector types.
316 /// Note that the definition of homogeneous scalable vector type is not
317 /// recursive here. That means the following structure will return false
318 /// when calling this function.
319 /// {{<vscale x 2 x i32>, <vscale x 4 x i64>},
320 /// {<vscale x 2 x i32>, <vscale x 4 x i64>}}
322
323 /// Return true if this struct is non-empty and all element types are the
324 /// same.
326
327 /// Return true if this is a named struct that has a non-empty name.
328 bool hasName() const { return SymbolTableEntry != nullptr; }
329
330 /// Return the name for this struct type if it has an identity.
331 /// This may return an empty string for an unnamed struct type. Do not call
332 /// this on an literal type.
333 LLVM_ABI StringRef getName() const;
334
335 /// Change the name of this type to the specified name, or to a name with a
336 /// suffix if there is a collision. Do not call this on an literal type.
337 LLVM_ABI void setName(StringRef Name);
338
339 /// Specify a body for an opaque identified type, which must not make the type
340 /// recursive.
341 LLVM_ABI void setBody(ArrayRef<Type *> Elements, bool isPacked = false);
342
343 /// Specify a body for an opaque identified type or return an error if it
344 /// would make the type recursive.
346 bool isPacked = false);
347
348 /// Return an error if the body for an opaque identified type would make it
349 /// recursive.
351
352 /// Return true if the specified type is valid as a element type.
353 LLVM_ABI static bool isValidElementType(Type *ElemTy);
354
355 // Iterator access to the elements.
357
362 }
363
364 /// Return true if this is layout identical to the specified struct.
366
367 /// Random access to the elements
368 unsigned getNumElements() const { return NumContainedTys; }
369 Type *getElementType(unsigned N) const {
370 assert(N < NumContainedTys && "Element number out of range!");
371 return ContainedTys[N];
372 }
373 /// Given an index value into the type, return the type of the element.
374 LLVM_ABI Type *getTypeAtIndex(const Value *V) const;
375 Type *getTypeAtIndex(unsigned N) const { return getElementType(N); }
376 LLVM_ABI bool indexValid(const Value *V) const;
377 bool indexValid(unsigned Idx) const { return Idx < getNumElements(); }
378
379 /// Methods for support type inquiry through isa, cast, and dyn_cast.
380 static bool classof(const Type *T) {
381 return T->getTypeID() == StructTyID;
382 }
383};
384
386 return cast<StructType>(this)->getName();
387}
388
390 return cast<StructType>(this)->getNumElements();
391}
392
394 return cast<StructType>(this)->getElementType(N);
395}
396
397/// Class to represent array types.
398class ArrayType : public Type {
399 /// The element type of the array.
400 Type *ContainedType;
401 /// Number of elements in the array.
402 uint64_t NumElements;
403
404 ArrayType(Type *ElType, uint64_t NumEl);
405
406public:
407 ArrayType(const ArrayType &) = delete;
408 ArrayType &operator=(const ArrayType &) = delete;
409
410 uint64_t getNumElements() const { return NumElements; }
411 Type *getElementType() const { return ContainedType; }
412
413 /// This static method is the primary way to construct an ArrayType
414 LLVM_ABI static ArrayType *get(Type *ElementType, uint64_t NumElements);
415
416 /// Return true if the specified type is valid as a element type.
417 LLVM_ABI static bool isValidElementType(Type *ElemTy);
418
419 /// Methods for support type inquiry through isa, cast, and dyn_cast.
420 static bool classof(const Type *T) {
421 return T->getTypeID() == ArrayTyID;
422 }
423};
424
426 return cast<ArrayType>(this)->getNumElements();
427}
428
429/// Base class of all SIMD vector types
430class VectorType : public Type {
431 /// A fully specified VectorType is of the form <vscale x n x Ty>. 'n' is the
432 /// minimum number of elements of type Ty contained within the vector, and
433 /// 'vscale x' indicates that the total element count is an integer multiple
434 /// of 'n', where the multiple is either guaranteed to be one, or is
435 /// statically unknown at compile time.
436 ///
437 /// If the multiple is known to be 1, then the extra term is discarded in
438 /// textual IR:
439 ///
440 /// <4 x i32> - a vector containing 4 i32s
441 /// <vscale x 4 x i32> - a vector containing an unknown integer multiple
442 /// of 4 i32s
443
444 /// The element type of the vector.
445 Type *ContainedType;
446
447protected:
448 /// The element quantity of this vector. The meaning of this value depends
449 /// on the type of vector:
450 /// - For FixedVectorType = <ElementQuantity x ty>, there are
451 /// exactly ElementQuantity elements in this vector.
452 /// - For ScalableVectorType = <vscale x ElementQuantity x ty>,
453 /// there are vscale * ElementQuantity elements in this vector, where
454 /// vscale is a runtime-constant integer greater than 0.
455 const unsigned ElementQuantity;
456
457 LLVM_ABI VectorType(Type *ElType, unsigned EQ, Type::TypeID TID);
458
459public:
460 VectorType(const VectorType &) = delete;
461 VectorType &operator=(const VectorType &) = delete;
462
463 Type *getElementType() const { return ContainedType; }
464
465 /// This static method is the primary way to construct an VectorType.
466 LLVM_ABI static VectorType *get(Type *ElementType, ElementCount EC);
467
468 static VectorType *get(Type *ElementType, unsigned NumElements,
469 bool Scalable) {
470 return VectorType::get(ElementType,
471 ElementCount::get(NumElements, Scalable));
472 }
473
474 static VectorType *get(Type *ElementType, const VectorType *Other) {
475 return VectorType::get(ElementType, Other->getElementCount());
476 }
477
478 /// This static method gets a VectorType with the same number of elements as
479 /// the input type, and the element type is an integer type of the same width
480 /// as the input element type.
482 unsigned EltBits = VTy->getElementType()->getPrimitiveSizeInBits();
483 assert(EltBits && "Element size must be of a non-zero size");
484 Type *EltTy = IntegerType::get(VTy->getContext(), EltBits);
485 return VectorType::get(EltTy, VTy->getElementCount());
486 }
487
488 /// This static method is like getInteger except that the element types are
489 /// twice as wide as the elements in the input type.
491 assert(VTy->isIntOrIntVectorTy() && "VTy expected to be a vector of ints.");
492 auto *EltTy = cast<IntegerType>(VTy->getElementType());
493 return VectorType::get(EltTy->getExtendedType(), VTy->getElementCount());
494 }
495
496 // This static method gets a VectorType with the same number of elements as
497 // the input type, and the element type is an integer or float type which
498 // is half as wide as the elements in the input type.
500 Type *EltTy;
501 if (VTy->getElementType()->isFloatingPointTy()) {
502 switch(VTy->getElementType()->getTypeID()) {
503 case DoubleTyID:
504 EltTy = Type::getFloatTy(VTy->getContext());
505 break;
506 case FloatTyID:
507 EltTy = Type::getHalfTy(VTy->getContext());
508 break;
509 default:
510 llvm_unreachable("Cannot create narrower fp vector element type");
511 }
512 } else {
513 unsigned EltBits = VTy->getElementType()->getPrimitiveSizeInBits();
514 assert((EltBits & 1) == 0 &&
515 "Cannot truncate vector element with odd bit-width");
516 EltTy = IntegerType::get(VTy->getContext(), EltBits / 2);
517 }
518 return VectorType::get(EltTy, VTy->getElementCount());
519 }
520
521 // This static method returns a VectorType with a larger number of elements
522 // of a smaller type than the input element type. For example, a <4 x i64>
523 // subdivided twice would return <16 x i16>
524 static VectorType *getSubdividedVectorType(VectorType *VTy, int NumSubdivs) {
525 for (int i = 0; i < NumSubdivs; ++i) {
528 }
529 return VTy;
530 }
531
532 /// This static method returns a VectorType with half as many elements as the
533 /// input type and the same element type.
535 auto EltCnt = VTy->getElementCount();
536 assert(EltCnt.isKnownEven() &&
537 "Cannot halve vector with odd number of elements.");
538 return VectorType::get(VTy->getElementType(),
539 EltCnt.divideCoefficientBy(2));
540 }
541
543 unsigned Denominator) {
544 auto EltCnt = VTy->getElementCount();
545 assert(EltCnt.isKnownMultipleOf(Denominator) &&
546 "Cannot take one-nth of a vector");
547 return VectorType::get(VTy->getScalarType(),
548 EltCnt.divideCoefficientBy(Denominator));
549 }
550
551 /// This static method returns a VectorType with twice as many elements as the
552 /// input type and the same element type.
554 auto EltCnt = VTy->getElementCount();
555 assert((EltCnt.getKnownMinValue() * 2ull) <= UINT_MAX &&
556 "Too many elements in vector");
557 return VectorType::get(VTy->getElementType(), EltCnt * 2);
558 }
559
560 /// This static method attempts to construct a VectorType with the same
561 /// size-in-bits as SizeTy but with an element type that matches the scalar
562 /// type of EltTy. The VectorType is returned on success, nullptr otherwise.
564 if (SizeTy->getScalarType() == EltTy->getScalarType())
565 return SizeTy;
566
567 unsigned EltSize = EltTy->getScalarSizeInBits();
568 if (!SizeTy->getPrimitiveSizeInBits().isKnownMultipleOf(EltSize))
569 return nullptr;
570
571 ElementCount EC = SizeTy->getElementCount()
573 .divideCoefficientBy(EltSize);
574 return VectorType::get(EltTy->getScalarType(), EC);
575 }
576
577 /// Return true if the specified type is valid as a element type.
578 LLVM_ABI static bool isValidElementType(Type *ElemTy);
579
580 /// Return an ElementCount instance to represent the (possibly scalable)
581 /// number of elements in the vector.
582 inline ElementCount getElementCount() const;
583
584 /// Methods for support type inquiry through isa, cast, and dyn_cast.
585 static bool classof(const Type *T) {
586 return T->getTypeID() == FixedVectorTyID ||
587 T->getTypeID() == ScalableVectorTyID;
588 }
589};
590
591/// Class to represent fixed width SIMD vectors
593protected:
594 FixedVectorType(Type *ElTy, unsigned NumElts)
595 : VectorType(ElTy, NumElts, FixedVectorTyID) {}
596
597public:
598 LLVM_ABI static FixedVectorType *get(Type *ElementType, unsigned NumElts);
599
600 static FixedVectorType *get(Type *ElementType, const FixedVectorType *FVTy) {
601 return get(ElementType, FVTy->getNumElements());
602 }
603
607
611
616
618 int NumSubdivs) {
620 VectorType::getSubdividedVectorType(VTy, NumSubdivs));
621 }
622
626
630
631 static bool classof(const Type *T) {
632 return T->getTypeID() == FixedVectorTyID;
633 }
634
635 unsigned getNumElements() const { return ElementQuantity; }
636};
637
638/// Class to represent scalable SIMD vectors
640protected:
641 ScalableVectorType(Type *ElTy, unsigned MinNumElts)
642 : VectorType(ElTy, MinNumElts, ScalableVectorTyID) {}
643
644public:
645 LLVM_ABI static ScalableVectorType *get(Type *ElementType,
646 unsigned MinNumElts);
647
648 static ScalableVectorType *get(Type *ElementType,
649 const ScalableVectorType *SVTy) {
650 return get(ElementType, SVTy->getMinNumElements());
651 }
652
656
657 static ScalableVectorType *
662
663 static ScalableVectorType *
668
670 int NumSubdivs) {
672 VectorType::getSubdividedVectorType(VTy, NumSubdivs));
673 }
674
675 static ScalableVectorType *
679
680 static ScalableVectorType *
685
686 /// Get the minimum number of elements in this vector. The actual number of
687 /// elements in the vector is an integer multiple of this value.
688 unsigned getMinNumElements() const { return ElementQuantity; }
689
690 static bool classof(const Type *T) {
691 return T->getTypeID() == ScalableVectorTyID;
692 }
693};
694
698
699/// Class to represent pointers.
700class PointerType : public Type {
701 explicit PointerType(LLVMContext &C, unsigned AddrSpace);
702
703public:
704 PointerType(const PointerType &) = delete;
705 PointerType &operator=(const PointerType &) = delete;
706
707 /// This constructs a pointer to an object of the specified type in a numbered
708 /// address space.
709 [[deprecated("PointerType::get with pointee type is pending removal. Use "
710 "Context overload.")]]
711 LLVM_ABI static PointerType *get(Type *ElementType, unsigned AddressSpace);
712 /// This constructs an opaque pointer to an object in a numbered address
713 /// space.
714 LLVM_ABI static PointerType *get(LLVMContext &C, unsigned AddressSpace);
715
716 /// This constructs a pointer to an object of the specified type in the
717 /// default address space (address space zero).
718 [[deprecated("PointerType::getUnqual with pointee type is pending removal. "
719 "Use Context overload.")]]
720 static PointerType *getUnqual(Type *ElementType) {
721 assert(ElementType && "Can't get a pointer to <null> type!");
722 assert(isValidElementType(ElementType) &&
723 "Invalid type for pointer element!");
724 return PointerType::getUnqual(ElementType->getContext());
725 }
726
727 /// This constructs an opaque pointer to an object in the
728 /// default address space (address space zero).
729 static PointerType *getUnqual(LLVMContext &C) {
730 return PointerType::get(C, 0);
731 }
732
733 /// Return true if the specified type is valid as a element type.
734 LLVM_ABI static bool isValidElementType(Type *ElemTy);
735
736 /// Return true if we can load or store from a pointer to this type.
737 LLVM_ABI static bool isLoadableOrStorableType(Type *ElemTy);
738
739 /// Return the address space of the Pointer type.
740 inline unsigned getAddressSpace() const { return getSubclassData(); }
741
742 /// Implement support type inquiry through isa, cast, and dyn_cast.
743 static bool classof(const Type *T) {
744 return T->getTypeID() == PointerTyID;
745 }
746};
747
749 assert(
751 "Original type expected to be a vector of integers or a scalar integer.");
752 if (auto *VTy = dyn_cast<VectorType>(this))
754 const_cast<VectorType *>(VTy));
755 return cast<IntegerType>(this)->getExtendedType();
756}
757
759 if (auto *VTy = dyn_cast<VectorType>(this))
760 return VectorType::get(EltTy, VTy->getElementCount());
761 return EltTy;
762}
763
764Type *Type::getWithNewBitWidth(unsigned NewBitWidth) const {
765 assert(
767 "Original type expected to be a vector of integers or a scalar integer.");
768 return getWithNewType(getIntNTy(getContext(), NewBitWidth));
769}
770
772 return cast<PointerType>(getScalarType())->getAddressSpace();
773}
774
775/// Class to represent target extensions types, which are generally
776/// unintrospectable from target-independent optimizations.
777///
778/// Target extension types have a string name, and optionally have type and/or
779/// integer parameters. The exact meaning of any parameters is dependent on the
780/// target.
781class TargetExtType : public Type {
782 TargetExtType(LLVMContext &C, StringRef Name, ArrayRef<Type *> Types,
783 ArrayRef<unsigned> Ints);
784
785 // These strings are ultimately owned by the context.
786 StringRef Name;
787 unsigned *IntParams;
788
789public:
790 TargetExtType(const TargetExtType &) = delete;
791 TargetExtType &operator=(const TargetExtType &) = delete;
792
793 /// Return a target extension type having the specified name and optional
794 /// type and integer parameters.
795 LLVM_ABI static TargetExtType *get(LLVMContext &Context, StringRef Name,
796 ArrayRef<Type *> Types = {},
797 ArrayRef<unsigned> Ints = {});
798
799 /// Return a target extension type having the specified name and optional
800 /// type and integer parameters, or an appropriate Error if it fails the
801 /// parameters check.
802 LLVM_ABI static Expected<TargetExtType *>
803 getOrError(LLVMContext &Context, StringRef Name, ArrayRef<Type *> Types = {},
804 ArrayRef<unsigned> Ints = {});
805
806 /// Check that a newly created target extension type has the expected number
807 /// of type parameters and integer parameters, returning the type itself if OK
808 /// or an appropriate Error if not.
809 LLVM_ABI static Expected<TargetExtType *> checkParams(TargetExtType *TTy);
810
811 /// Return the name for this target extension type. Two distinct target
812 /// extension types may have the same name if their type or integer parameters
813 /// differ.
814 StringRef getName() const { return Name; }
815
816 /// Return the type parameters for this particular target extension type. If
817 /// there are no parameters, an empty array is returned.
821
827
828 Type *getTypeParameter(unsigned i) const { return getContainedType(i); }
829 unsigned getNumTypeParameters() const { return getNumContainedTypes(); }
830
831 /// Return the integer parameters for this particular target extension type.
832 /// If there are no parameters, an empty array is returned.
834 return ArrayRef(IntParams, getNumIntParameters());
835 }
836
837 unsigned getIntParameter(unsigned i) const { return IntParams[i]; }
838 unsigned getNumIntParameters() const { return getSubclassData(); }
839
840 enum Property {
841 /// zeroinitializer is valid for this target extension type.
842 HasZeroInit = 1U << 0,
843 /// This type may be used as the value type of a global variable.
844 CanBeGlobal = 1U << 1,
845 /// This type may be allocated on the stack, either as the allocated type
846 /// of an alloca instruction or as a byval function parameter.
847 CanBeLocal = 1U << 2,
848 /// This type may be used as an element in a vector.
850 // This type can only be used in intrinsic arguments and return values.
851 /// In particular, it cannot be used in select and phi instructions.
852 IsTokenLike = 1U << 4,
853 };
854
855 /// Returns true if the target extension type contains the given property.
856 LLVM_ABI bool hasProperty(Property Prop) const;
857
858 /// Returns an underlying layout type for the target extension type. This
859 /// type can be used to query size and alignment information, if it is
860 /// appropriate (although note that the layout type may also be void). It is
861 /// not legal to bitcast between this type and the layout type, however.
862 LLVM_ABI Type *getLayoutType() const;
863
864 /// Methods for support type inquiry through isa, cast, and dyn_cast.
865 static bool classof(const Type *T) { return T->getTypeID() == TargetExtTyID; }
866};
867
869 return cast<TargetExtType>(this)->getName();
870}
871
872} // end namespace llvm
873
874#endif // LLVM_IR_DERIVEDTYPES_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#define LLVM_ABI
Definition Compiler.h:213
#define T
This file contains some templates that are useful if you are working with the STL at all.
Class for arbitrary precision integers.
Definition APInt.h:78
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:41
static LLVM_ABI ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
uint64_t getNumElements() const
static LLVM_ABI bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
Definition Type.cpp:766
ArrayType & operator=(const ArrayType &)=delete
ArrayType(const ArrayType &)=delete
static bool classof(const Type *T)
Methods for support type inquiry through isa, cast, and dyn_cast.
Type * getElementType() const
static constexpr ElementCount get(ScalarTy MinVal, bool Scalable)
Definition TypeSize.h:315
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
Tagged union holding either a T or a Error.
Definition Error.h:485
Class to represent fixed width SIMD vectors.
unsigned getNumElements() const
static FixedVectorType * getDoubleElementsVectorType(FixedVectorType *VTy)
static FixedVectorType * getInteger(FixedVectorType *VTy)
static FixedVectorType * getSubdividedVectorType(FixedVectorType *VTy, int NumSubdivs)
static FixedVectorType * getExtendedElementVectorType(FixedVectorType *VTy)
FixedVectorType(Type *ElTy, unsigned NumElts)
static FixedVectorType * get(Type *ElementType, const FixedVectorType *FVTy)
static FixedVectorType * getTruncatedElementVectorType(FixedVectorType *VTy)
static bool classof(const Type *T)
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
Definition Type.cpp:803
static FixedVectorType * getHalfElementsVectorType(FixedVectorType *VTy)
FunctionCallee(std::nullptr_t)
FunctionType * getFunctionType()
FunctionCallee()=default
FunctionCallee(FunctionType *FnTy, Value *Callee)
Class to represent function types.
param_iterator param_begin() const
static LLVM_ABI bool isValidArgumentType(Type *ArgTy)
Return true if the specified type is valid as an argument type.
Definition Type.cpp:404
unsigned getNumParams() const
Return the number of fixed parameters this function type requires.
Type::subtype_iterator param_iterator
Type * getParamType(unsigned i) const
Parameter type accessors.
static LLVM_ABI bool isValidReturnType(Type *RetTy)
Return true if the specified type is valid as a return type.
Definition Type.cpp:399
FunctionType(const FunctionType &)=delete
ArrayRef< Type * > params() const
FunctionType & operator=(const FunctionType &)=delete
bool isVarArg() const
static bool classof(const Type *T)
Methods for support type inquiry through isa, cast, and dyn_cast.
Type * getReturnType() const
static LLVM_ABI FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
param_iterator param_end() const
Class to represent integer types.
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition Type.cpp:319
uint64_t getSignBit() const
Return a uint64_t with just the most significant bit set (the sign bit, if the value is treated as a ...
LLVM_ABI APInt getMask() const
For example, this is 0xFF for an 8 bit integer, 0xFFFF for i16, etc.
Definition Type.cpp:343
IntegerType * getExtendedType() const
Returns type twice as wide the input type.
@ MIN_INT_BITS
Minimum number of bits that can be specified.
@ MAX_INT_BITS
Maximum number of bits that can be specified.
unsigned getBitWidth() const
Get the number of bits in this IntegerType.
uint64_t getBitMask() const
Return a bitmask with ones set for all of the bits that can be set by an unsigned version of this typ...
friend class LLVMContextImpl
static bool classof(const Type *T)
Methods for support type inquiry through isa, cast, and dyn_cast.
IntegerType(LLVMContext &C, unsigned NumBits)
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
static LLVM_ABI bool isLoadableOrStorableType(Type *ElemTy)
Return true if we can load or store from a pointer to this type.
Definition Type.cpp:882
PointerType(const PointerType &)=delete
static PointerType * getUnqual(LLVMContext &C)
This constructs an opaque pointer to an object in the default address space (address space zero).
static bool classof(const Type *T)
Implement support type inquiry through isa, cast, and dyn_cast.
static LLVM_ABI bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
Definition Type.cpp:876
PointerType & operator=(const PointerType &)=delete
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
unsigned getAddressSpace() const
Return the address space of the Pointer type.
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
Class to represent scalable SIMD vectors.
static ScalableVectorType * get(Type *ElementType, const ScalableVectorType *SVTy)
static ScalableVectorType * getInteger(ScalableVectorType *VTy)
static LLVM_ABI ScalableVectorType * get(Type *ElementType, unsigned MinNumElts)
Definition Type.cpp:825
static bool classof(const Type *T)
static ScalableVectorType * getExtendedElementVectorType(ScalableVectorType *VTy)
static ScalableVectorType * getHalfElementsVectorType(ScalableVectorType *VTy)
static ScalableVectorType * getSubdividedVectorType(ScalableVectorType *VTy, int NumSubdivs)
static ScalableVectorType * getDoubleElementsVectorType(ScalableVectorType *VTy)
unsigned getMinNumElements() const
Get the minimum number of elements in this vector.
ScalableVectorType(Type *ElTy, unsigned MinNumElts)
static ScalableVectorType * getTruncatedElementVectorType(ScalableVectorType *VTy)
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.
Definition StringRef.h:55
Class to represent struct types.
static bool classof(const Type *T)
Methods for support type inquiry through isa, cast, and dyn_cast.
static std::enable_if_t< are_base_of< Type, Tys... >::value, StructType * > create(StringRef Name, Type *elt1, Tys *... elts)
LLVM_ABI bool indexValid(const Value *V) const
Definition Type.cpp:725
static LLVM_ABI StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
Definition Type.cpp:414
element_iterator element_end() const
StructType(const StructType &)=delete
ArrayRef< Type * > elements() const
LLVM_ABI void setBody(ArrayRef< Type * > Elements, bool isPacked=false)
Specify a body for an opaque identified type, which must not make the type recursive.
Definition Type.cpp:535
LLVM_ABI bool containsHomogeneousScalableVectorTypes() const
Returns true if this struct contains homogeneous scalable vector types.
Definition Type.cpp:524
LLVM_ABI Error checkBody(ArrayRef< Type * > Elements)
Return an error if the body for an opaque identified type would make it recursive.
Definition Type.cpp:557
LLVM_ABI bool containsHomogeneousTypes() const
Return true if this struct is non-empty and all element types are the same.
Definition Type.cpp:530
element_iterator element_begin() const
static LLVM_ABI StructType * getTypeByName(LLVMContext &C, StringRef Name)
Return the type with the specified name, or null if there is none by that name.
Definition Type.cpp:739
static LLVM_ABI StructType * create(LLVMContext &Context, StringRef Name)
This creates an identified struct.
Definition Type.cpp:620
bool isPacked() const
static LLVM_ABI bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
Definition Type.cpp:704
unsigned getNumElements() const
Random access to the elements.
LLVM_ABI bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
isSized - Return true if this is a sized type.
Definition Type.cpp:659
Type * getTypeAtIndex(unsigned N) const
StructType & operator=(const StructType &)=delete
LLVM_ABI 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...
Definition Type.cpp:569
LLVM_ABI bool isLayoutIdentical(StructType *Other) const
Return true if this is layout identical to the specified struct.
Definition Type.cpp:710
LLVM_ABI bool isScalableTy() const
Definition Type.cpp:70
LLVM_ABI Error setBodyOrError(ArrayRef< Type * > Elements, bool isPacked=false)
Specify a body for an opaque identified type or return an error if it would make the type recursive.
Definition Type.cpp:539
LLVM_ABI Type * getTypeAtIndex(const Value *V) const
Given an index value into the type, return the type of the element.
Definition Type.cpp:719
bool hasName() const
Return true if this is a named struct that has a non-empty name.
bool isLiteral() const
Return true if this type is uniqued by structural equivalence, false if it is a struct definition.
bool indexValid(unsigned Idx) const
LLVM_ABI bool containsNonLocalTargetExtType() const
Definition Type.cpp:102
LLVM_ABI bool containsNonGlobalTargetExtType() const
Definition Type.cpp:86
bool isOpaque() const
Return true if this is a type with an identity that has no body specified yet.
Type * getElementType(unsigned N) const
Type::subtype_iterator element_iterator
static std::enable_if_t< are_base_of< Type, Tys... >::value, StructType * > get(Type *elt1, Tys *... elts)
This static method is a convenience method for creating structure types by specifying the elements as...
LLVM_ABI StringRef getName() const
Return the name for this struct type if it has an identity.
Definition Type.cpp:697
ArrayRef< Type * > type_params() const
Return the type parameters for this particular target extension type.
unsigned getNumIntParameters() const
type_param_iterator type_param_end() const
Type::subtype_iterator type_param_iterator
static LLVM_ABI TargetExtType * get(LLVMContext &Context, StringRef Name, ArrayRef< Type * > Types={}, ArrayRef< unsigned > Ints={})
Return a target extension type having the specified name and optional type and integer parameters.
Definition Type.cpp:908
Type * getTypeParameter(unsigned i) const
unsigned getNumTypeParameters() const
ArrayRef< unsigned > int_params() const
Return the integer parameters for this particular target extension type.
type_param_iterator type_param_begin() const
static LLVM_ABI Expected< TargetExtType * > checkParams(TargetExtType *TTy)
Check that a newly created target extension type has the expected number of type parameters and integ...
Definition Type.cpp:942
unsigned getIntParameter(unsigned i) const
TargetExtType(const TargetExtType &)=delete
LLVM_ABI bool hasProperty(Property Prop) const
Returns true if the target extension type contains the given property.
Definition Type.cpp:1070
TargetExtType & operator=(const TargetExtType &)=delete
@ IsTokenLike
In particular, it cannot be used in select and phi instructions.
@ HasZeroInit
zeroinitializer is valid for this target extension type.
@ CanBeVectorElement
This type may be used as an element in a vector.
@ CanBeGlobal
This type may be used as the value type of a global variable.
@ CanBeLocal
This type may be allocated on the stack, either as the allocated type of an alloca instruction or as ...
StringRef getName() const
Return the name for this target extension type.
static LLVM_ABI Expected< TargetExtType * > getOrError(LLVMContext &Context, StringRef Name, ArrayRef< Type * > Types={}, ArrayRef< unsigned > Ints={})
Return a target extension type having the specified name and optional type and integer parameters,...
Definition Type.cpp:914
LLVM_ABI Type * getLayoutType() const
Returns an underlying layout type for the target extension type.
Definition Type.cpp:1066
static bool classof(const Type *T)
Methods for support type inquiry through isa, cast, and dyn_cast.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
LLVM_ABI unsigned getIntegerBitWidth() const
LLVM_ABI Type * getStructElementType(unsigned N) const
LLVM_ABI 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...
Definition Type.cpp:75
LLVM_ABI 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.
Definition Type.cpp:91
LLVM_ABI bool isScalableTy(SmallPtrSetImpl< const Type * > &Visited) const
Return true if this is a type whose size is a known multiple of vscale.
Definition Type.cpp:62
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
Definition Type.h:246
LLVM_ABI StringRef getStructName() const
Type *const * subtype_iterator
Definition Type.h:361
LLVM_ABI unsigned getStructNumElements() const
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
LLVM_ABI uint64_t getArrayNumElements() const
TypeID
Definitions of all of the base types for the Type system.
Definition Type.h:54
@ FunctionTyID
Functions.
Definition Type.h:71
@ ArrayTyID
Arrays.
Definition Type.h:74
@ TargetExtTyID
Target extension type.
Definition Type.h:78
@ ScalableVectorTyID
Scalable SIMD vector type.
Definition Type.h:76
@ FloatTyID
32-bit floating point type
Definition Type.h:58
@ StructTyID
Structures.
Definition Type.h:73
@ IntegerTyID
Arbitrary bit width integers.
Definition Type.h:70
@ FixedVectorTyID
Fixed width SIMD vector type.
Definition Type.h:75
@ DoubleTyID
64-bit floating point type
Definition Type.h:59
@ PointerTyID
Pointers.
Definition Type.h:72
unsigned getNumContainedTypes() const
Return the number of types in the derived type.
Definition Type.h:387
unsigned NumContainedTys
Keeps track of how many Type*'s there are in the ContainedTys list.
Definition Type.h:106
LLVM_ABI StringRef getTargetExtName() const
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition Type.h:352
Type(LLVMContext &C, TypeID tid)
Definition Type.h:93
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
Definition Type.cpp:198
LLVM_ABI Type * getWithNewBitWidth(unsigned NewBitWidth) const
Given an integer or vector type, change the lane bitwidth to NewBitwidth, whilst keeping the old numb...
LLVM_ABI 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.
Definition Type.h:128
Type *const * ContainedTys
A pointer to the array of Types contained by this Type.
Definition Type.h:113
unsigned getSubclassData() const
Definition Type.h:97
LLVM_ABI bool isFunctionVarArg() const
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:231
void setSubclassData(unsigned val)
Definition Type.h:99
bool isFloatingPointTy() const
Return true if this is one of the floating-point types.
Definition Type.h:184
LLVM_ABI Type * getExtendedType() const
Given scalar/vector integer type, returns a type with elements twice as wide as in the original type.
TypeID getTypeID() const
Return the type id for the type.
Definition Type.h:136
LLVM_ABI Type * getFunctionParamType(unsigned i) const
static LLVM_ABI IntegerType * getIntNTy(LLVMContext &C, unsigned N)
Definition Type.cpp:301
Type * getContainedType(unsigned i) const
This method is used to implement the type iterator (defined at the end of the file).
Definition Type.h:381
static LLVM_ABI Type * getFloatTy(LLVMContext &C)
Definition Type.cpp:285
static LLVM_ABI Type * getHalfTy(LLVMContext &C)
Definition Type.cpp:283
LLVM_ABI unsigned getFunctionNumParams() const
LLVM Value Representation.
Definition Value.h:75
Base class of all SIMD vector types.
static VectorType * getHalfElementsVectorType(VectorType *VTy)
This static method returns a VectorType with half as many elements as the input type and the same ele...
LLVM_ABI VectorType(Type *ElType, unsigned EQ, Type::TypeID TID)
Definition Type.cpp:776
static VectorType * getExtendedElementVectorType(VectorType *VTy)
This static method is like getInteger except that the element types are twice as wide as the elements...
static bool classof(const Type *T)
Methods for support type inquiry through isa, cast, and dyn_cast.
static VectorType * getOneNthElementsVectorType(VectorType *VTy, unsigned Denominator)
ElementCount getElementCount() const
Return an ElementCount instance to represent the (possibly scalable) number of elements in the vector...
static VectorType * getSubdividedVectorType(VectorType *VTy, int NumSubdivs)
static VectorType * getInteger(VectorType *VTy)
This static method gets a VectorType with the same number of elements as the input type,...
const unsigned ElementQuantity
The element quantity of this vector.
static VectorType * get(Type *ElementType, const VectorType *Other)
static VectorType * getTruncatedElementVectorType(VectorType *VTy)
VectorType & operator=(const VectorType &)=delete
static LLVM_ABI VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
static VectorType * getDoubleElementsVectorType(VectorType *VTy)
This static method returns a VectorType with twice as many elements as the input type and the same el...
static VectorType * getWithSizeAndScalar(VectorType *SizeTy, Type *EltTy)
This static method attempts to construct a VectorType with the same size-in-bits as SizeTy but with a...
static LLVM_ABI bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
static VectorType * get(Type *ElementType, unsigned NumElements, bool Scalable)
VectorType(const VectorType &)=delete
Type * getElementType() const
constexpr bool isKnownMultipleOf(ScalarTy RHS) const
This function tells the caller whether the element count is known at compile time to be a multiple of...
Definition TypeSize.h:181
constexpr LeafTy multiplyCoefficientBy(ScalarTy RHS) const
Definition TypeSize.h:256
constexpr LeafTy divideCoefficientBy(ScalarTy RHS) const
We do not provide the '/' operator here because division for polynomial types does not work in the sa...
Definition TypeSize.h:252
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
This is an optimization pass for GlobalISel generic memory operations.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:649
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:548
@ Other
Any other memory.
Definition ModRef.h:68
ArrayRef(const T &OneElt) -> ArrayRef< T >
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:565
std::conjunction< std::is_base_of< T, Ts >... > are_base_of
traits class for checking whether type T is a base class for all the given types in the variadic list...
Definition STLExtras.h:134
#define N
#define EQ(a, b)
Definition regexec.c:65