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 29108 : 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 29108 : 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
|