1 | //===- llvm/Type.h - Classes for handling data types ------------*- C++ -*-===// |
2 | // |
3 | // The LLVM Compiler Infrastructure |
4 | // |
5 | // This file is distributed under the University of Illinois Open Source |
6 | // License. See LICENSE.TXT for details. |
7 | // |
8 | //===----------------------------------------------------------------------===// |
9 | // |
10 | // This file contains the declaration of the Type class. For more "Type" |
11 | // stuff, look in DerivedTypes.h. |
12 | // |
13 | //===----------------------------------------------------------------------===// |
14 | |
15 | #ifndef LLVM_IR_TYPE_H |
16 | #define LLVM_IR_TYPE_H |
17 | |
18 | #include "llvm/ADT/APFloat.h" |
19 | #include "llvm/ADT/ArrayRef.h" |
20 | #include "llvm/ADT/SmallPtrSet.h" |
21 | #include "llvm/Support/CBindingWrapping.h" |
22 | #include "llvm/Support/Casting.h" |
23 | #include "llvm/Support/Compiler.h" |
24 | #include "llvm/Support/ErrorHandling.h" |
25 | #include <cassert> |
26 | #include <cstdint> |
27 | #include <iterator> |
28 | |
29 | namespace llvm { |
30 | |
31 | template<class GraphType> struct GraphTraits; |
32 | class IntegerType; |
33 | class LLVMContext; |
34 | class PointerType; |
35 | class raw_ostream; |
36 | class StringRef; |
37 | |
38 | /// The instances of the Type class are immutable: once they are created, |
39 | /// they are never changed. Also note that only one instance of a particular |
40 | /// type is ever created. Thus seeing if two types are equal is a matter of |
41 | /// doing a trivial pointer comparison. To enforce that no two equal instances |
42 | /// are created, Type instances can only be created via static factory methods |
43 | /// in class Type and in derived classes. Once allocated, Types are never |
44 | /// free'd. |
45 | /// |
46 | class Type { |
47 | public: |
48 | //===--------------------------------------------------------------------===// |
49 | /// Definitions of all of the base types for the Type system. Based on this |
50 | /// value, you can cast to a class defined in DerivedTypes.h. |
51 | /// Note: If you add an element to this, you need to add an element to the |
52 | /// Type::getPrimitiveType function, or else things will break! |
53 | /// Also update LLVMTypeKind and LLVMGetTypeKind () in the C binding. |
54 | /// |
55 | enum TypeID { |
56 | // PrimitiveTypes - make sure LastPrimitiveTyID stays up to date. |
57 | VoidTyID = 0, ///< 0: type with no size |
58 | HalfTyID, ///< 1: 16-bit floating point type |
59 | FloatTyID, ///< 2: 32-bit floating point type |
60 | DoubleTyID, ///< 3: 64-bit floating point type |
61 | X86_FP80TyID, ///< 4: 80-bit floating point type (X87) |
62 | FP128TyID, ///< 5: 128-bit floating point type (112-bit mantissa) |
63 | PPC_FP128TyID, ///< 6: 128-bit floating point type (two 64-bits, PowerPC) |
64 | LabelTyID, ///< 7: Labels |
65 | MetadataTyID, ///< 8: Metadata |
66 | X86_MMXTyID, ///< 9: MMX vectors (64 bits, X86 specific) |
67 | TokenTyID, ///< 10: Tokens |
68 | |
69 | // Derived types... see DerivedTypes.h file. |
70 | // Make sure FirstDerivedTyID stays up to date! |
71 | IntegerTyID, ///< 11: Arbitrary bit width integers |
72 | FunctionTyID, ///< 12: Functions |
73 | StructTyID, ///< 13: Structures |
74 | ArrayTyID, ///< 14: Arrays |
75 | PointerTyID, ///< 15: Pointers |
76 | VectorTyID ///< 16: SIMD 'packed' format, or other vector type |
77 | }; |
78 | |
79 | private: |
80 | /// This refers to the LLVMContext in which this type was uniqued. |
81 | LLVMContext &Context; |
82 | |
83 | TypeID ID : 8; // The current base type of this type. |
84 | unsigned SubclassData : 24; // Space for subclasses to store data. |
85 | // Note that this should be synchronized with |
86 | // MAX_INT_BITS value in IntegerType class. |
87 | |
88 | protected: |
89 | friend class LLVMContextImpl; |
90 | |
91 | explicit Type(LLVMContext &C, TypeID tid) |
92 | : Context(C), ID(tid), SubclassData(0) {} |
93 | ~Type() = default; |
94 | |
95 | unsigned getSubclassData() const { return SubclassData; } |
96 | |
97 | void setSubclassData(unsigned val) { |
98 | SubclassData = val; |
99 | // Ensure we don't have any accidental truncation. |
100 | assert(getSubclassData() == val && "Subclass data too large for field" ); |
101 | } |
102 | |
103 | /// Keeps track of how many Type*'s there are in the ContainedTys list. |
104 | unsigned NumContainedTys = 0; |
105 | |
106 | /// A pointer to the array of Types contained by this Type. For example, this |
107 | /// includes the arguments of a function type, the elements of a structure, |
108 | /// the pointee of a pointer, the element type of an array, etc. This pointer |
109 | /// may be 0 for types that don't contain other types (Integer, Double, |
110 | /// Float). |
111 | Type * const *ContainedTys = nullptr; |
112 | |
113 | static bool isSequentialType(TypeID TyID) { |
114 | return TyID == ArrayTyID || TyID == VectorTyID; |
115 | } |
116 | |
117 | public: |
118 | /// Print the current type. |
119 | /// Omit the type details if \p NoDetails == true. |
120 | /// E.g., let %st = type { i32, i16 } |
121 | /// When \p NoDetails is true, we only print %st. |
122 | /// Put differently, \p NoDetails prints the type as if |
123 | /// inlined with the operands when printing an instruction. |
124 | void print(raw_ostream &O, bool IsForDebug = false, |
125 | bool NoDetails = false) const; |
126 | |
127 | void dump() const; |
128 | |
129 | /// Return the LLVMContext in which this type was uniqued. |
130 | LLVMContext &getContext() const { return Context; } |
131 | |
132 | //===--------------------------------------------------------------------===// |
133 | // Accessors for working with types. |
134 | // |
135 | |
136 | /// Return the type id for the type. This will return one of the TypeID enum |
137 | /// elements defined above. |
138 | TypeID getTypeID() const { return ID; } |
139 | |
140 | /// Return true if this is 'void'. |
141 | bool isVoidTy() const { return getTypeID() == VoidTyID; } |
142 | |
143 | /// Return true if this is 'half', a 16-bit IEEE fp type. |
144 | bool isHalfTy() const { return getTypeID() == HalfTyID; } |
145 | |
146 | /// Return true if this is 'float', a 32-bit IEEE fp type. |
147 | bool isFloatTy() const { return getTypeID() == FloatTyID; } |
148 | |
149 | /// Return true if this is 'double', a 64-bit IEEE fp type. |
150 | bool isDoubleTy() const { return getTypeID() == DoubleTyID; } |
151 | |
152 | /// Return true if this is x86 long double. |
153 | bool isX86_FP80Ty() const { return getTypeID() == X86_FP80TyID; } |
154 | |
155 | /// Return true if this is 'fp128'. |
156 | bool isFP128Ty() const { return getTypeID() == FP128TyID; } |
157 | |
158 | /// Return true if this is powerpc long double. |
159 | bool isPPC_FP128Ty() const { return getTypeID() == PPC_FP128TyID; } |
160 | |
161 | /// Return true if this is one of the six floating-point types |
162 | bool isFloatingPointTy() const { |
163 | return getTypeID() == HalfTyID || getTypeID() == FloatTyID || |
164 | getTypeID() == DoubleTyID || |
165 | getTypeID() == X86_FP80TyID || getTypeID() == FP128TyID || |
166 | getTypeID() == PPC_FP128TyID; |
167 | } |
168 | |
169 | const fltSemantics &getFltSemantics() const { |
170 | switch (getTypeID()) { |
171 | case HalfTyID: return APFloat::IEEEhalf(); |
172 | case FloatTyID: return APFloat::IEEEsingle(); |
173 | case DoubleTyID: return APFloat::IEEEdouble(); |
174 | case X86_FP80TyID: return APFloat::x87DoubleExtended(); |
175 | case FP128TyID: return APFloat::IEEEquad(); |
176 | case PPC_FP128TyID: return APFloat::PPCDoubleDouble(); |
177 | default: llvm_unreachable("Invalid floating type" ); |
178 | } |
179 | } |
180 | |
181 | /// Return true if this is X86 MMX. |
182 | bool isX86_MMXTy() const { return getTypeID() == X86_MMXTyID; } |
183 | |
184 | /// Return true if this is a FP type or a vector of FP. |
185 | bool isFPOrFPVectorTy() const { return getScalarType()->isFloatingPointTy(); } |
186 | |
187 | /// Return true if this is 'label'. |
188 | bool isLabelTy() const { return getTypeID() == LabelTyID; } |
189 | |
190 | /// Return true if this is 'metadata'. |
191 | bool isMetadataTy() const { return getTypeID() == MetadataTyID; } |
192 | |
193 | /// Return true if this is 'token'. |
194 | bool isTokenTy() const { return getTypeID() == TokenTyID; } |
195 | |
196 | /// True if this is an instance of IntegerType. |
197 | bool isIntegerTy() const { return getTypeID() == IntegerTyID; } |
198 | |
199 | /// Return true if this is an IntegerType of the given width. |
200 | bool isIntegerTy(unsigned Bitwidth) const; |
201 | |
202 | /// Return true if this is an integer type or a vector of integer types. |
203 | bool isIntOrIntVectorTy() const { return getScalarType()->isIntegerTy(); } |
204 | |
205 | /// Return true if this is an integer type or a vector of integer types of |
206 | /// the given width. |
207 | bool isIntOrIntVectorTy(unsigned BitWidth) const { |
208 | return getScalarType()->isIntegerTy(BitWidth); |
209 | } |
210 | |
211 | /// Return true if this is an integer type or a pointer type. |
212 | bool isIntOrPtrTy() const { return isIntegerTy() || isPointerTy(); } |
213 | |
214 | /// True if this is an instance of FunctionType. |
215 | bool isFunctionTy() const { return getTypeID() == FunctionTyID; } |
216 | |
217 | /// True if this is an instance of StructType. |
218 | bool isStructTy() const { return getTypeID() == StructTyID; } |
219 | |
220 | /// True if this is an instance of ArrayType. |
221 | bool isArrayTy() const { return getTypeID() == ArrayTyID; } |
222 | |
223 | /// True if this is an instance of PointerType. |
224 | bool isPointerTy() const { return getTypeID() == PointerTyID; } |
225 | |
226 | /// Return true if this is a pointer type or a vector of pointer types. |
227 | bool isPtrOrPtrVectorTy() const { return getScalarType()->isPointerTy(); } |
228 | |
229 | /// True if this is an instance of VectorType. |
230 | bool isVectorTy() const { return getTypeID() == VectorTyID; } |
231 | |
232 | /// Return true if this type could be converted with a lossless BitCast to |
233 | /// type 'Ty'. For example, i8* to i32*. BitCasts are valid for types of the |
234 | /// same size only where no re-interpretation of the bits is done. |
235 | /// Determine if this type could be losslessly bitcast to Ty |
236 | bool canLosslesslyBitCastTo(Type *Ty) const; |
237 | |
238 | /// Return true if this type is empty, that is, it has no elements or all of |
239 | /// its elements are empty. |
240 | bool isEmptyTy() const; |
241 | |
242 | /// Return true if the type is "first class", meaning it is a valid type for a |
243 | /// Value. |
244 | bool isFirstClassType() const { |
245 | return getTypeID() != FunctionTyID && getTypeID() != VoidTyID; |
246 | } |
247 | |
248 | /// Return true if the type is a valid type for a register in codegen. This |
249 | /// includes all first-class types except struct and array types. |
250 | bool isSingleValueType() const { |
251 | return isFloatingPointTy() || isX86_MMXTy() || isIntegerTy() || |
252 | isPointerTy() || isVectorTy(); |
253 | } |
254 | |
255 | /// Return true if the type is an aggregate type. This means it is valid as |
256 | /// the first operand of an insertvalue or extractvalue instruction. This |
257 | /// includes struct and array types, but does not include vector types. |
258 | bool isAggregateType() const { |
259 | return getTypeID() == StructTyID || getTypeID() == ArrayTyID; |
260 | } |
261 | |
262 | /// Return true if it makes sense to take the size of this type. To get the |
263 | /// actual size for a particular target, it is reasonable to use the |
264 | /// DataLayout subsystem to do this. |
265 | bool isSized(SmallPtrSetImpl<Type*> *Visited = nullptr) const { |
266 | // If it's a primitive, it is always sized. |
267 | if (getTypeID() == IntegerTyID || isFloatingPointTy() || |
268 | getTypeID() == PointerTyID || |
269 | getTypeID() == X86_MMXTyID) |
270 | return true; |
271 | // If it is not something that can have a size (e.g. a function or label), |
272 | // it doesn't have a size. |
273 | if (getTypeID() != StructTyID && getTypeID() != ArrayTyID && |
274 | getTypeID() != VectorTyID) |
275 | return false; |
276 | // Otherwise we have to try harder to decide. |
277 | return isSizedDerivedType(Visited); |
278 | } |
279 | |
280 | /// Return the basic size of this type if it is a primitive type. These are |
281 | /// fixed by LLVM and are not target-dependent. |
282 | /// This will return zero if the type does not have a size or is not a |
283 | /// primitive type. |
284 | /// |
285 | /// Note that this may not reflect the size of memory allocated for an |
286 | /// instance of the type or the number of bytes that are written when an |
287 | /// instance of the type is stored to memory. The DataLayout class provides |
288 | /// additional query functions to provide this information. |
289 | /// |
290 | unsigned getPrimitiveSizeInBits() const LLVM_READONLY; |
291 | |
292 | /// If this is a vector type, return the getPrimitiveSizeInBits value for the |
293 | /// element type. Otherwise return the getPrimitiveSizeInBits value for this |
294 | /// type. |
295 | unsigned getScalarSizeInBits() const LLVM_READONLY; |
296 | |
297 | /// Return the width of the mantissa of this type. This is only valid on |
298 | /// floating-point types. If the FP type does not have a stable mantissa (e.g. |
299 | /// ppc long double), this method returns -1. |
300 | int getFPMantissaWidth() const; |
301 | |
302 | /// If this is a vector type, return the element type, otherwise return |
303 | /// 'this'. |
304 | Type *getScalarType() const { |
305 | if (isVectorTy()) |
306 | return getVectorElementType(); |
307 | return const_cast<Type*>(this); |
308 | } |
309 | |
310 | //===--------------------------------------------------------------------===// |
311 | // Type Iteration support. |
312 | // |
313 | using subtype_iterator = Type * const *; |
314 | |
315 | subtype_iterator subtype_begin() const { return ContainedTys; } |
316 | subtype_iterator subtype_end() const { return &ContainedTys[NumContainedTys];} |
317 | ArrayRef<Type*> subtypes() const { |
318 | return makeArrayRef(subtype_begin(), subtype_end()); |
319 | } |
320 | |
321 | using subtype_reverse_iterator = std::reverse_iterator<subtype_iterator>; |
322 | |
323 | subtype_reverse_iterator subtype_rbegin() const { |
324 | return subtype_reverse_iterator(subtype_end()); |
325 | } |
326 | subtype_reverse_iterator subtype_rend() const { |
327 | return subtype_reverse_iterator(subtype_begin()); |
328 | } |
329 | |
330 | /// This method is used to implement the type iterator (defined at the end of |
331 | /// the file). For derived types, this returns the types 'contained' in the |
332 | /// derived type. |
333 | Type *getContainedType(unsigned i) const { |
334 | assert(i < NumContainedTys && "Index out of range!" ); |
335 | return ContainedTys[i]; |
336 | } |
337 | |
338 | /// Return the number of types in the derived type. |
339 | unsigned getNumContainedTypes() const { return NumContainedTys; } |
340 | |
341 | //===--------------------------------------------------------------------===// |
342 | // Helper methods corresponding to subclass methods. This forces a cast to |
343 | // the specified subclass and calls its accessor. "getVectorNumElements" (for |
344 | // example) is shorthand for cast<VectorType>(Ty)->getNumElements(). This is |
345 | // only intended to cover the core methods that are frequently used, helper |
346 | // methods should not be added here. |
347 | |
348 | inline unsigned getIntegerBitWidth() const; |
349 | |
350 | inline Type *getFunctionParamType(unsigned i) const; |
351 | inline unsigned getFunctionNumParams() const; |
352 | inline bool isFunctionVarArg() const; |
353 | |
354 | inline StringRef getStructName() const; |
355 | inline unsigned getStructNumElements() const; |
356 | inline Type *getStructElementType(unsigned N) const; |
357 | |
358 | inline Type *getSequentialElementType() const { |
359 | assert(isSequentialType(getTypeID()) && "Not a sequential type!" ); |
360 | return ContainedTys[0]; |
361 | } |
362 | |
363 | inline uint64_t getArrayNumElements() const; |
364 | |
365 | Type *getArrayElementType() const { |
366 | assert(getTypeID() == ArrayTyID); |
367 | return ContainedTys[0]; |
368 | } |
369 | |
370 | inline unsigned getVectorNumElements() const; |
371 | Type *getVectorElementType() const { |
372 | assert(getTypeID() == VectorTyID); |
373 | return ContainedTys[0]; |
374 | } |
375 | |
376 | Type *getPointerElementType() const { |
377 | assert(getTypeID() == PointerTyID); |
378 | return ContainedTys[0]; |
379 | } |
380 | |
381 | /// Get the address space of this pointer or pointer vector type. |
382 | inline unsigned getPointerAddressSpace() const; |
383 | |
384 | //===--------------------------------------------------------------------===// |
385 | // Static members exported by the Type class itself. Useful for getting |
386 | // instances of Type. |
387 | // |
388 | |
389 | /// Return a type based on an identifier. |
390 | static Type *getPrimitiveType(LLVMContext &C, TypeID IDNumber); |
391 | |
392 | //===--------------------------------------------------------------------===// |
393 | // These are the builtin types that are always available. |
394 | // |
395 | static Type *getVoidTy(LLVMContext &C); |
396 | static Type *getLabelTy(LLVMContext &C); |
397 | static Type *getHalfTy(LLVMContext &C); |
398 | static Type *getFloatTy(LLVMContext &C); |
399 | static Type *getDoubleTy(LLVMContext &C); |
400 | static Type *getMetadataTy(LLVMContext &C); |
401 | static Type *getX86_FP80Ty(LLVMContext &C); |
402 | static Type *getFP128Ty(LLVMContext &C); |
403 | static Type *getPPC_FP128Ty(LLVMContext &C); |
404 | static Type *getX86_MMXTy(LLVMContext &C); |
405 | static Type *getTokenTy(LLVMContext &C); |
406 | static IntegerType *getIntNTy(LLVMContext &C, unsigned N); |
407 | static IntegerType *getInt1Ty(LLVMContext &C); |
408 | static IntegerType *getInt8Ty(LLVMContext &C); |
409 | static IntegerType *getInt16Ty(LLVMContext &C); |
410 | static IntegerType *getInt32Ty(LLVMContext &C); |
411 | static IntegerType *getInt64Ty(LLVMContext &C); |
412 | static IntegerType *getInt128Ty(LLVMContext &C); |
413 | template <typename ScalarTy> static Type *getScalarTy(LLVMContext &C) { |
414 | int noOfBits = sizeof(ScalarTy) * CHAR_BIT; |
415 | if (std::is_integral<ScalarTy>::value) { |
416 | return (Type*) Type::getIntNTy(C, noOfBits); |
417 | } else if (std::is_floating_point<ScalarTy>::value) { |
418 | switch (noOfBits) { |
419 | case 32: |
420 | return Type::getFloatTy(C); |
421 | case 64: |
422 | return Type::getDoubleTy(C); |
423 | } |
424 | } |
425 | llvm_unreachable("Unsupported type in Type::getScalarTy" ); |
426 | } |
427 | |
428 | //===--------------------------------------------------------------------===// |
429 | // Convenience methods for getting pointer types with one of the above builtin |
430 | // types as pointee. |
431 | // |
432 | static PointerType *getHalfPtrTy(LLVMContext &C, unsigned AS = 0); |
433 | static PointerType *getFloatPtrTy(LLVMContext &C, unsigned AS = 0); |
434 | static PointerType *getDoublePtrTy(LLVMContext &C, unsigned AS = 0); |
435 | static PointerType *getX86_FP80PtrTy(LLVMContext &C, unsigned AS = 0); |
436 | static PointerType *getFP128PtrTy(LLVMContext &C, unsigned AS = 0); |
437 | static PointerType *getPPC_FP128PtrTy(LLVMContext &C, unsigned AS = 0); |
438 | static PointerType *getX86_MMXPtrTy(LLVMContext &C, unsigned AS = 0); |
439 | static PointerType *getIntNPtrTy(LLVMContext &C, unsigned N, unsigned AS = 0); |
440 | static PointerType *getInt1PtrTy(LLVMContext &C, unsigned AS = 0); |
441 | static PointerType *getInt8PtrTy(LLVMContext &C, unsigned AS = 0); |
442 | static PointerType *getInt16PtrTy(LLVMContext &C, unsigned AS = 0); |
443 | static PointerType *getInt32PtrTy(LLVMContext &C, unsigned AS = 0); |
444 | static PointerType *getInt64PtrTy(LLVMContext &C, unsigned AS = 0); |
445 | |
446 | /// Return a pointer to the current type. This is equivalent to |
447 | /// PointerType::get(Foo, AddrSpace). |
448 | PointerType *getPointerTo(unsigned AddrSpace = 0) const; |
449 | |
450 | private: |
451 | /// Derived types like structures and arrays are sized iff all of the members |
452 | /// of the type are sized as well. Since asking for their size is relatively |
453 | /// uncommon, move this operation out-of-line. |
454 | bool isSizedDerivedType(SmallPtrSetImpl<Type*> *Visited = nullptr) const; |
455 | }; |
456 | |
457 | // Printing of types. |
458 | inline raw_ostream &operator<<(raw_ostream &OS, const Type &T) { |
459 | T.print(OS); |
460 | return OS; |
461 | } |
462 | |
463 | // allow isa<PointerType>(x) to work without DerivedTypes.h included. |
464 | template <> struct isa_impl<PointerType, Type> { |
465 | static inline bool doit(const Type &Ty) { |
466 | return Ty.getTypeID() == Type::PointerTyID; |
467 | } |
468 | }; |
469 | |
470 | //===----------------------------------------------------------------------===// |
471 | // Provide specializations of GraphTraits to be able to treat a type as a |
472 | // graph of sub types. |
473 | |
474 | template <> struct GraphTraits<Type *> { |
475 | using NodeRef = Type *; |
476 | using ChildIteratorType = Type::subtype_iterator; |
477 | |
478 | static NodeRef getEntryNode(Type *T) { return T; } |
479 | static ChildIteratorType child_begin(NodeRef N) { return N->subtype_begin(); } |
480 | static ChildIteratorType child_end(NodeRef N) { return N->subtype_end(); } |
481 | }; |
482 | |
483 | template <> struct GraphTraits<const Type*> { |
484 | using NodeRef = const Type *; |
485 | using ChildIteratorType = Type::subtype_iterator; |
486 | |
487 | static NodeRef getEntryNode(NodeRef T) { return T; } |
488 | static ChildIteratorType child_begin(NodeRef N) { return N->subtype_begin(); } |
489 | static ChildIteratorType child_end(NodeRef N) { return N->subtype_end(); } |
490 | }; |
491 | |
492 | // Create wrappers for C Binding types (see CBindingWrapping.h). |
493 | DEFINE_ISA_CONVERSION_FUNCTIONS(Type, LLVMTypeRef) |
494 | |
495 | /* Specialized opaque type conversions. |
496 | */ |
497 | inline Type **unwrap(LLVMTypeRef* Tys) { |
498 | return reinterpret_cast<Type**>(Tys); |
499 | } |
500 | |
501 | inline LLVMTypeRef *wrap(Type **Tys) { |
502 | return reinterpret_cast<LLVMTypeRef*>(const_cast<Type**>(Tys)); |
503 | } |
504 | |
505 | } // end namespace llvm |
506 | |
507 | #endif // LLVM_IR_TYPE_H |
508 | |