1 //===-- mlir-c/Dialect/LLVM.h - C API for LLVM --------------------*- C -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
8 //===----------------------------------------------------------------------===//
10 #ifndef MLIR_C_DIALECT_LLVM_H
11 #define MLIR_C_DIALECT_LLVM_H
13 #include "mlir-c/IR.h"
14 #include "mlir-c/Support.h"
20 MLIR_DECLARE_CAPI_DIALECT_REGISTRATION(LLVM
, llvm
);
22 /// Creates an llvm.ptr type.
23 MLIR_CAPI_EXPORTED MlirType
mlirLLVMPointerTypeGet(MlirContext ctx
,
24 unsigned addressSpace
);
26 /// Returns `true` if the type is an LLVM dialect pointer type.
27 MLIR_CAPI_EXPORTED
bool mlirTypeIsALLVMPointerType(MlirType type
);
29 /// Returns address space of llvm.ptr
30 MLIR_CAPI_EXPORTED
unsigned
31 mlirLLVMPointerTypeGetAddressSpace(MlirType pointerType
);
33 /// Creates an llmv.void type.
34 MLIR_CAPI_EXPORTED MlirType
mlirLLVMVoidTypeGet(MlirContext ctx
);
36 /// Creates an llvm.array type.
37 MLIR_CAPI_EXPORTED MlirType
mlirLLVMArrayTypeGet(MlirType elementType
,
38 unsigned numElements
);
40 /// Creates an llvm.func type.
41 MLIR_CAPI_EXPORTED MlirType
42 mlirLLVMFunctionTypeGet(MlirType resultType
, intptr_t nArgumentTypes
,
43 MlirType
const *argumentTypes
, bool isVarArg
);
45 /// Returns `true` if the type is an LLVM dialect struct type.
46 MLIR_CAPI_EXPORTED
bool mlirTypeIsALLVMStructType(MlirType type
);
48 /// Returns `true` if the type is a literal (unnamed) LLVM struct type.
49 MLIR_CAPI_EXPORTED
bool mlirLLVMStructTypeIsLiteral(MlirType type
);
51 /// Returns the number of fields in the struct. Asserts if the struct is opaque
52 /// or not yet initialized.
53 MLIR_CAPI_EXPORTED
intptr_t mlirLLVMStructTypeGetNumElementTypes(MlirType type
);
55 /// Returns the `positions`-th field of the struct. Asserts if the struct is
56 /// opaque, not yet initialized or if the position is out of range.
57 MLIR_CAPI_EXPORTED MlirType
mlirLLVMStructTypeGetElementType(MlirType type
,
60 /// Returns `true` if the struct is packed.
61 MLIR_CAPI_EXPORTED
bool mlirLLVMStructTypeIsPacked(MlirType type
);
63 /// Returns the identifier of the identified struct. Asserts that the struct is
64 /// identified, i.e., not literal.
65 MLIR_CAPI_EXPORTED MlirStringRef
mlirLLVMStructTypeGetIdentifier(MlirType type
);
67 /// Returns `true` is the struct is explicitly opaque (will not have a body) or
68 /// uninitialized (will eventually have a body).
69 MLIR_CAPI_EXPORTED
bool mlirLLVMStructTypeIsOpaque(MlirType type
);
71 /// Creates an LLVM literal (unnamed) struct type. This may assert if the fields
72 /// have types not compatible with the LLVM dialect. For a graceful failure, use
73 /// the checked version.
74 MLIR_CAPI_EXPORTED MlirType
75 mlirLLVMStructTypeLiteralGet(MlirContext ctx
, intptr_t nFieldTypes
,
76 MlirType
const *fieldTypes
, bool isPacked
);
78 /// Creates an LLVM literal (unnamed) struct type if possible. Emits a
79 /// diagnostic at the given location and returns null otherwise.
80 MLIR_CAPI_EXPORTED MlirType
81 mlirLLVMStructTypeLiteralGetChecked(MlirLocation loc
, intptr_t nFieldTypes
,
82 MlirType
const *fieldTypes
, bool isPacked
);
84 /// Creates an LLVM identified struct type with no body. If a struct type with
85 /// this name already exists in the context, returns that type. Use
86 /// mlirLLVMStructTypeIdentifiedNewGet to create a fresh struct type,
87 /// potentially renaming it. The body should be set separatelty by calling
88 /// mlirLLVMStructTypeSetBody, if it isn't set already.
89 MLIR_CAPI_EXPORTED MlirType
mlirLLVMStructTypeIdentifiedGet(MlirContext ctx
,
92 /// Creates an LLVM identified struct type with no body and a name starting with
93 /// the given prefix. If a struct with the exact name as the given prefix
94 /// already exists, appends an unspecified suffix to the name so that the name
95 /// is unique in context.
96 MLIR_CAPI_EXPORTED MlirType
mlirLLVMStructTypeIdentifiedNewGet(
97 MlirContext ctx
, MlirStringRef name
, intptr_t nFieldTypes
,
98 MlirType
const *fieldTypes
, bool isPacked
);
100 MLIR_CAPI_EXPORTED MlirType
mlirLLVMStructTypeOpaqueGet(MlirContext ctx
,
103 /// Sets the body of the identified struct if it hasn't been set yet. Returns
104 /// whether the operation was successful.
105 MLIR_CAPI_EXPORTED MlirLogicalResult
106 mlirLLVMStructTypeSetBody(MlirType structType
, intptr_t nFieldTypes
,
107 MlirType
const *fieldTypes
, bool isPacked
);
111 MlirLLVMCConvFast
= 8,
112 MlirLLVMCConvCold
= 9,
113 MlirLLVMCConvGHC
= 10,
114 MlirLLVMCConvHiPE
= 11,
115 MlirLLVMCConvAnyReg
= 13,
116 MlirLLVMCConvPreserveMost
= 14,
117 MlirLLVMCConvPreserveAll
= 15,
118 MlirLLVMCConvSwift
= 16,
119 MlirLLVMCConvCXX_FAST_TLS
= 17,
120 MlirLLVMCConvTail
= 18,
121 MlirLLVMCConvCFGuard_Check
= 19,
122 MlirLLVMCConvSwiftTail
= 20,
123 MlirLLVMCConvX86_StdCall
= 64,
124 MlirLLVMCConvX86_FastCall
= 65,
125 MlirLLVMCConvARM_APCS
= 66,
126 MlirLLVMCConvARM_AAPCS
= 67,
127 MlirLLVMCConvARM_AAPCS_VFP
= 68,
128 MlirLLVMCConvMSP430_INTR
= 69,
129 MlirLLVMCConvX86_ThisCall
= 70,
130 MlirLLVMCConvPTX_Kernel
= 71,
131 MlirLLVMCConvPTX_Device
= 72,
132 MlirLLVMCConvSPIR_FUNC
= 75,
133 MlirLLVMCConvSPIR_KERNEL
= 76,
134 MlirLLVMCConvIntel_OCL_BI
= 77,
135 MlirLLVMCConvX86_64_SysV
= 78,
136 MlirLLVMCConvWin64
= 79,
137 MlirLLVMCConvX86_VectorCall
= 80,
138 MlirLLVMCConvDUMMY_HHVM
= 81,
139 MlirLLVMCConvDUMMY_HHVM_C
= 82,
140 MlirLLVMCConvX86_INTR
= 83,
141 MlirLLVMCConvAVR_INTR
= 84,
142 MlirLLVMCConvAVR_BUILTIN
= 86,
143 MlirLLVMCConvAMDGPU_VS
= 87,
144 MlirLLVMCConvAMDGPU_GS
= 88,
145 MlirLLVMCConvAMDGPU_CS
= 90,
146 MlirLLVMCConvAMDGPU_KERNEL
= 91,
147 MlirLLVMCConvX86_RegCall
= 92,
148 MlirLLVMCConvAMDGPU_HS
= 93,
149 MlirLLVMCConvMSP430_BUILTIN
= 94,
150 MlirLLVMCConvAMDGPU_LS
= 95,
151 MlirLLVMCConvAMDGPU_ES
= 96,
152 MlirLLVMCConvAArch64_VectorCall
= 97,
153 MlirLLVMCConvAArch64_SVE_VectorCall
= 98,
154 MlirLLVMCConvWASM_EmscriptenInvoke
= 99,
155 MlirLLVMCConvAMDGPU_Gfx
= 100,
156 MlirLLVMCConvM68k_INTR
= 101,
158 typedef enum MlirLLVMCConv MlirLLVMCConv
;
160 /// Creates a LLVM CConv attribute.
161 MLIR_CAPI_EXPORTED MlirAttribute
mlirLLVMCConvAttrGet(MlirContext ctx
,
162 MlirLLVMCConv cconv
);
164 enum MlirLLVMComdat
{
165 MlirLLVMComdatAny
= 0,
166 MlirLLVMComdatExactMatch
= 1,
167 MlirLLVMComdatLargest
= 2,
168 MlirLLVMComdatNoDeduplicate
= 3,
169 MlirLLVMComdatSameSize
= 4,
171 typedef enum MlirLLVMComdat MlirLLVMComdat
;
173 /// Creates a LLVM Comdat attribute.
174 MLIR_CAPI_EXPORTED MlirAttribute
mlirLLVMComdatAttrGet(MlirContext ctx
,
175 MlirLLVMComdat comdat
);
177 enum MlirLLVMLinkage
{
178 MlirLLVMLinkagePrivate
= 0,
179 MlirLLVMLinkageInternal
= 1,
180 MlirLLVMLinkageAvailableExternally
= 2,
181 MlirLLVMLinkageLinkonce
= 3,
182 MlirLLVMLinkageWeak
= 4,
183 MlirLLVMLinkageCommon
= 5,
184 MlirLLVMLinkageAppending
= 6,
185 MlirLLVMLinkageExternWeak
= 7,
186 MlirLLVMLinkageLinkonceODR
= 8,
187 MlirLLVMLinkageWeakODR
= 9,
188 MlirLLVMLinkageExternal
= 10,
190 typedef enum MlirLLVMLinkage MlirLLVMLinkage
;
192 /// Creates a LLVM Linkage attribute.
193 MLIR_CAPI_EXPORTED MlirAttribute
194 mlirLLVMLinkageAttrGet(MlirContext ctx
, MlirLLVMLinkage linkage
);
196 /// Creates a LLVM DINullType attribute.
197 MLIR_CAPI_EXPORTED MlirAttribute
mlirLLVMDINullTypeAttrGet(MlirContext ctx
);
199 /// Creates a LLVM DIExpressionElem attribute.
200 MLIR_CAPI_EXPORTED MlirAttribute
201 mlirLLVMDIExpressionElemAttrGet(MlirContext ctx
, unsigned int opcode
,
202 intptr_t nArguments
, uint64_t const *arguments
);
204 /// Creates a LLVM DIExpression attribute.
205 MLIR_CAPI_EXPORTED MlirAttribute
mlirLLVMDIExpressionAttrGet(
206 MlirContext ctx
, intptr_t nOperations
, MlirAttribute
const *operations
);
208 enum MlirLLVMTypeEncoding
{
209 MlirLLVMTypeEncodingAddress
= 0x1,
210 MlirLLVMTypeEncodingBoolean
= 0x2,
211 MlirLLVMTypeEncodingComplexFloat
= 0x31,
212 MlirLLVMTypeEncodingFloatT
= 0x4,
213 MlirLLVMTypeEncodingSigned
= 0x5,
214 MlirLLVMTypeEncodingSignedChar
= 0x6,
215 MlirLLVMTypeEncodingUnsigned
= 0x7,
216 MlirLLVMTypeEncodingUnsignedChar
= 0x08,
217 MlirLLVMTypeEncodingImaginaryFloat
= 0x09,
218 MlirLLVMTypeEncodingPackedDecimal
= 0x0a,
219 MlirLLVMTypeEncodingNumericString
= 0x0b,
220 MlirLLVMTypeEncodingEdited
= 0x0c,
221 MlirLLVMTypeEncodingSignedFixed
= 0x0d,
222 MlirLLVMTypeEncodingUnsignedFixed
= 0x0e,
223 MlirLLVMTypeEncodingDecimalFloat
= 0x0f,
224 MlirLLVMTypeEncodingUTF
= 0x10,
225 MlirLLVMTypeEncodingUCS
= 0x11,
226 MlirLLVMTypeEncodingASCII
= 0x12,
227 MlirLLVMTypeEncodingLoUser
= 0x80,
228 MlirLLVMTypeEncodingHiUser
= 0xff,
230 typedef enum MlirLLVMTypeEncoding MlirLLVMTypeEncoding
;
232 /// Creates a LLVM DIBasicType attribute.
233 MLIR_CAPI_EXPORTED MlirAttribute
mlirLLVMDIBasicTypeAttrGet(
234 MlirContext ctx
, unsigned int tag
, MlirAttribute name
, uint64_t sizeInBits
,
235 MlirLLVMTypeEncoding encoding
);
237 /// Creates a LLVM DICompositeType attribute.
238 MLIR_CAPI_EXPORTED MlirAttribute
mlirLLVMDICompositeTypeAttrGet(
239 MlirContext ctx
, unsigned int tag
, MlirAttribute recId
, MlirAttribute name
,
240 MlirAttribute file
, uint32_t line
, MlirAttribute scope
,
241 MlirAttribute baseType
, int64_t flags
, uint64_t sizeInBits
,
242 uint64_t alignInBits
, intptr_t nElements
, MlirAttribute
const *elements
);
244 /// Creates a LLVM DIDerivedType attribute.
245 MLIR_CAPI_EXPORTED MlirAttribute
mlirLLVMDIDerivedTypeAttrGet(
246 MlirContext ctx
, unsigned int tag
, MlirAttribute name
,
247 MlirAttribute baseType
, uint64_t sizeInBits
, uint32_t alignInBits
,
248 uint64_t offsetInBits
, MlirAttribute extraData
);
250 /// Gets the base type from a LLVM DIDerivedType attribute.
251 MLIR_CAPI_EXPORTED MlirAttribute
252 mlirLLVMDIDerivedTypeAttrGetBaseType(MlirAttribute diDerivedType
);
254 /// Creates a LLVM DIFileAttr attribute.
255 MLIR_CAPI_EXPORTED MlirAttribute
mlirLLVMDIFileAttrGet(MlirContext ctx
,
257 MlirAttribute directory
);
259 enum MlirLLVMDIEmissionKind
{
260 MlirLLVMDIEmissionKindNone
= 0,
261 MlirLLVMDIEmissionKindFull
= 1,
262 MlirLLVMDIEmissionKindLineTablesOnly
= 2,
263 MlirLLVMDIEmissionKindDebugDirectivesOnly
= 3,
265 typedef enum MlirLLVMDIEmissionKind MlirLLVMDIEmissionKind
;
267 enum MlirLLVMDINameTableKind
{
268 MlirLLVMDINameTableKindDefault
= 0,
269 MlirLLVMDINameTableKindGNU
= 1,
270 MlirLLVMDINameTableKindNone
= 2,
271 MlirLLVMDINameTableKindApple
= 3,
273 typedef enum MlirLLVMDINameTableKind MlirLLVMDINameTableKind
;
275 /// Creates a LLVM DICompileUnit attribute.
276 MLIR_CAPI_EXPORTED MlirAttribute
mlirLLVMDICompileUnitAttrGet(
277 MlirContext ctx
, MlirAttribute id
, unsigned int sourceLanguage
,
278 MlirAttribute file
, MlirAttribute producer
, bool isOptimized
,
279 MlirLLVMDIEmissionKind emissionKind
, MlirLLVMDINameTableKind nameTableKind
);
281 /// Creates a LLVM DIFlags attribute.
282 MLIR_CAPI_EXPORTED MlirAttribute
mlirLLVMDIFlagsAttrGet(MlirContext ctx
,
285 /// Creates a LLVM DILexicalBlock attribute.
286 MLIR_CAPI_EXPORTED MlirAttribute
mlirLLVMDILexicalBlockAttrGet(
287 MlirContext ctx
, MlirAttribute scope
, MlirAttribute file
, unsigned int line
,
288 unsigned int column
);
290 /// Creates a LLVM DILexicalBlockFile attribute.
291 MLIR_CAPI_EXPORTED MlirAttribute
mlirLLVMDILexicalBlockFileAttrGet(
292 MlirContext ctx
, MlirAttribute scope
, MlirAttribute file
,
293 unsigned int discriminator
);
295 /// Creates a LLVM DILocalVariableAttr attribute.
296 MLIR_CAPI_EXPORTED MlirAttribute
mlirLLVMDILocalVariableAttrGet(
297 MlirContext ctx
, MlirAttribute scope
, MlirAttribute name
,
298 MlirAttribute diFile
, unsigned int line
, unsigned int arg
,
299 unsigned int alignInBits
, MlirAttribute diType
);
301 /// Creates a LLVM DISubprogramAttr attribute.
302 MLIR_CAPI_EXPORTED MlirAttribute
mlirLLVMDISubprogramAttrGet(
303 MlirContext ctx
, MlirAttribute id
, MlirAttribute compileUnit
,
304 MlirAttribute scope
, MlirAttribute name
, MlirAttribute linkageName
,
305 MlirAttribute file
, unsigned int line
, unsigned int scopeLine
,
306 uint64_t subprogramFlags
, MlirAttribute type
);
308 /// Gets the scope from this DISubprogramAttr.
309 MLIR_CAPI_EXPORTED MlirAttribute
310 mlirLLVMDISubprogramAttrGetScope(MlirAttribute diSubprogram
);
312 /// Gets the line from this DISubprogramAttr.
313 MLIR_CAPI_EXPORTED
unsigned int
314 mlirLLVMDISubprogramAttrGetLine(MlirAttribute diSubprogram
);
316 /// Gets the scope line from this DISubprogram.
317 MLIR_CAPI_EXPORTED
unsigned int
318 mlirLLVMDISubprogramAttrGetScopeLine(MlirAttribute diSubprogram
);
320 /// Gets the compile unit from this DISubprogram.
321 MLIR_CAPI_EXPORTED MlirAttribute
322 mlirLLVMDISubprogramAttrGetCompileUnit(MlirAttribute diSubprogram
);
324 /// Gets the file from this DISubprogramAttr.
325 MLIR_CAPI_EXPORTED MlirAttribute
326 mlirLLVMDISubprogramAttrGetFile(MlirAttribute diSubprogram
);
328 /// Gets the type from this DISubprogramAttr.
329 MLIR_CAPI_EXPORTED MlirAttribute
330 mlirLLVMDISubprogramAttrGetType(MlirAttribute diSubprogram
);
332 /// Creates a LLVM DISubroutineTypeAttr attribute.
333 MLIR_CAPI_EXPORTED MlirAttribute
334 mlirLLVMDISubroutineTypeAttrGet(MlirContext ctx
, unsigned int callingConvention
,
335 intptr_t nTypes
, MlirAttribute
const *types
);
337 /// Creates a LLVM DIModuleAttr attribute.
338 MLIR_CAPI_EXPORTED MlirAttribute
mlirLLVMDIModuleAttrGet(
339 MlirContext ctx
, MlirAttribute file
, MlirAttribute scope
,
340 MlirAttribute name
, MlirAttribute configMacros
, MlirAttribute includePath
,
341 MlirAttribute apinotes
, unsigned int line
, bool isDecl
);
343 /// Gets the scope of this DIModuleAttr.
344 MLIR_CAPI_EXPORTED MlirAttribute
345 mlirLLVMDIModuleAttrGetScope(MlirAttribute diModule
);
351 #endif // MLIR_C_DIALECT_LLVM_H