MLIR  20.0.0git
LLVMTypes.h
Go to the documentation of this file.
1 //===- LLVMTypes.h - MLIR LLVM dialect 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 defines the types for the LLVM dialect in MLIR. These MLIR types
10 // correspond to the LLVM IR type system.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef MLIR_DIALECT_LLVMIR_LLVMTYPES_H_
15 #define MLIR_DIALECT_LLVMIR_LLVMTYPES_H_
16 
17 #include "mlir/IR/Types.h"
20 #include <optional>
21 
22 namespace llvm {
23 class ElementCount;
24 class TypeSize;
25 } // namespace llvm
26 
27 namespace mlir {
28 
29 class AsmParser;
30 class AsmPrinter;
31 
32 namespace LLVM {
33 class LLVMDialect;
34 
35 namespace detail {
36 struct LLVMFunctionTypeStorage;
37 struct LLVMPointerTypeStorage;
38 struct LLVMStructTypeStorage;
39 struct LLVMTypeAndSizeStorage;
40 } // namespace detail
41 } // namespace LLVM
42 } // namespace mlir
43 
44 //===----------------------------------------------------------------------===//
45 // ODS-Generated Declarations
46 //===----------------------------------------------------------------------===//
47 
48 #include "mlir/Dialect/LLVMIR/LLVMTypeInterfaces.h.inc"
49 
50 #define GET_TYPEDEF_CLASSES
51 #include "mlir/Dialect/LLVMIR/LLVMTypes.h.inc"
52 
53 namespace mlir {
54 namespace LLVM {
55 
56 //===----------------------------------------------------------------------===//
57 // Trivial types.
58 //===----------------------------------------------------------------------===//
59 
60 // Batch-define trivial types.
61 #define DEFINE_TRIVIAL_LLVM_TYPE(ClassName, TypeName) \
62  class ClassName : public Type::TypeBase<ClassName, Type, TypeStorage> { \
63  public: \
64  using Base::Base; \
65  static constexpr StringLiteral name = TypeName; \
66  }
67 
68 DEFINE_TRIVIAL_LLVM_TYPE(LLVMVoidType, "llvm.void");
69 DEFINE_TRIVIAL_LLVM_TYPE(LLVMPPCFP128Type, "llvm.ppc_fp128");
70 DEFINE_TRIVIAL_LLVM_TYPE(LLVMTokenType, "llvm.token");
71 DEFINE_TRIVIAL_LLVM_TYPE(LLVMLabelType, "llvm.label");
72 DEFINE_TRIVIAL_LLVM_TYPE(LLVMMetadataType, "llvm.metadata");
73 
74 #undef DEFINE_TRIVIAL_LLVM_TYPE
75 
76 //===----------------------------------------------------------------------===//
77 // Printing and parsing.
78 //===----------------------------------------------------------------------===//
79 
80 namespace detail {
81 /// Parses an LLVM dialect type.
83 
84 /// Prints an LLVM Dialect type.
85 void printType(Type type, AsmPrinter &printer);
86 } // namespace detail
87 
88 /// Parse any MLIR type or a concise syntax for LLVM types.
89 ParseResult parsePrettyLLVMType(AsmParser &p, Type &type);
90 /// Print any MLIR type or a concise syntax for LLVM types.
91 void printPrettyLLVMType(AsmPrinter &p, Type type);
92 
93 //===----------------------------------------------------------------------===//
94 // Utility functions.
95 //===----------------------------------------------------------------------===//
96 
97 /// Returns `true` if the given type is compatible with the LLVM dialect. This
98 /// is an alias to `LLVMDialect::isCompatibleType`.
99 bool isCompatibleType(Type type);
100 
101 /// Returns `true` if the given outer type is compatible with the LLVM dialect
102 /// without checking its potential nested types such as struct elements.
103 bool isCompatibleOuterType(Type type);
104 
105 /// Returns `true` if the given type is a floating-point type compatible with
106 /// the LLVM dialect.
108 
109 /// Returns `true` if the given type is a vector type compatible with the LLVM
110 /// dialect. Compatible types include 1D built-in vector types of built-in
111 /// integers and floating-point values, LLVM dialect fixed vector types of LLVM
112 /// dialect pointers and LLVM dialect scalable vector types.
113 bool isCompatibleVectorType(Type type);
114 
115 /// Returns the element type of any vector type compatible with the LLVM
116 /// dialect.
118 
119 /// Returns the element count of any LLVM-compatible vector type.
120 llvm::ElementCount getVectorNumElements(Type type);
121 
122 /// Returns whether a vector type is scalable or not.
123 bool isScalableVectorType(Type vectorType);
124 
125 /// Creates an LLVM dialect-compatible vector type with the given element type
126 /// and length.
127 Type getVectorType(Type elementType, unsigned numElements,
128  bool isScalable = false);
129 
130 /// Creates an LLVM dialect-compatible vector type with the given element type
131 /// and length.
132 Type getVectorType(Type elementType, const llvm::ElementCount &numElements);
133 
134 /// Creates an LLVM dialect-compatible type with the given element type and
135 /// length.
136 Type getFixedVectorType(Type elementType, unsigned numElements);
137 
138 /// Creates an LLVM dialect-compatible type with the given element type and
139 /// length.
140 Type getScalableVectorType(Type elementType, unsigned numElements);
141 
142 /// Returns the size of the given primitive LLVM dialect-compatible type
143 /// (including vectors) in bits, for example, the size of i16 is 16 and
144 /// the size of vector<4xi16> is 64. Returns 0 for non-primitive
145 /// (aggregates such as struct) or types that don't have a size (such as void).
146 llvm::TypeSize getPrimitiveTypeSizeInBits(Type type);
147 
148 /// The positions of different values in the data layout entry for pointers.
149 enum class PtrDLEntryPos { Size = 0, Abi = 1, Preferred = 2, Index = 3 };
150 
151 /// Returns the value that corresponds to named position `pos` from the
152 /// data layout entry `attr` assuming it's a dense integer elements attribute.
153 /// Returns `std::nullopt` if `pos` is not present in the entry.
154 /// Currently only `PtrDLEntryPos::Index` is optional, and all other positions
155 /// may be assumed to be present.
156 std::optional<uint64_t> extractPointerSpecValue(Attribute attr,
157  PtrDLEntryPos pos);
158 
159 } // namespace LLVM
160 } // namespace mlir
161 
162 #endif // MLIR_DIALECT_LLVMIR_LLVMTYPES_H_
This base class exposes generic asm parser hooks, usable across the various derived parsers.
This base class exposes generic asm printer hooks, usable across the various derived printers.
Attributes are known-constant values of operations.
Definition: Attributes.h:25
The DialectAsmParser has methods for interacting with the asm parser when parsing attributes and type...
Instances of the Type class are uniqued, have an immutable identifier and an optional mutable compone...
Definition: Types.h:74
The OpAsmOpInterface, see OpAsmInterface.td for more details.
Definition: CallGraph.h:229
void printType(Type type, AsmPrinter &printer)
Prints an LLVM Dialect type.
Type parseType(DialectAsmParser &parser)
Parses an LLVM dialect type.
Type getVectorType(Type elementType, unsigned numElements, bool isScalable=false)
Creates an LLVM dialect-compatible vector type with the given element type and length.
Definition: LLVMTypes.cpp:930
llvm::TypeSize getPrimitiveTypeSizeInBits(Type type)
Returns the size of the given primitive LLVM dialect-compatible type (including vectors) in bits,...
Definition: LLVMTypes.cpp:983
void printPrettyLLVMType(AsmPrinter &p, Type type)
Print any MLIR type or a concise syntax for LLVM types.
bool isScalableVectorType(Type vectorType)
Returns whether a vector type is scalable or not.
Definition: LLVMTypes.cpp:921
DEFINE_TRIVIAL_LLVM_TYPE(LLVMVoidType, "llvm.void")
ParseResult parsePrettyLLVMType(AsmParser &p, Type &type)
Parse any MLIR type or a concise syntax for LLVM types.
bool isCompatibleVectorType(Type type)
Returns true if the given type is a vector type compatible with the LLVM dialect.
Definition: LLVMTypes.cpp:878
bool isCompatibleOuterType(Type type)
Returns true if the given outer type is compatible with the LLVM dialect without checking its potenti...
Definition: LLVMTypes.cpp:765
Type getFixedVectorType(Type elementType, unsigned numElements)
Creates an LLVM dialect-compatible type with the given element type and length.
Definition: LLVMTypes.cpp:957
PtrDLEntryPos
The positions of different values in the data layout entry for pointers.
Definition: LLVMTypes.h:149
std::optional< uint64_t > extractPointerSpecValue(Attribute attr, PtrDLEntryPos pos)
Returns the value that corresponds to named position pos from the data layout entry attr assuming it'...
Definition: LLVMTypes.cpp:262
bool isCompatibleType(Type type)
Returns true if the given type is compatible with the LLVM dialect.
Definition: LLVMTypes.cpp:860
Type getScalableVectorType(Type elementType, unsigned numElements)
Creates an LLVM dialect-compatible type with the given element type and length.
Definition: LLVMTypes.cpp:968
bool isCompatibleFloatingPointType(Type type)
Returns true if the given type is a floating-point type compatible with the LLVM dialect.
Definition: LLVMTypes.cpp:873
llvm::ElementCount getVectorNumElements(Type type)
Returns the element count of any LLVM-compatible vector type.
Definition: LLVMTypes.cpp:903
Type getVectorElementType(Type type)
Returns the element type of any vector type compatible with the LLVM dialect.
Definition: LLVMTypes.cpp:894
Include the generated interface declarations.