[SampleProfileLoader] Fix integer overflow in generateMDProfMetadata (#90217)
[llvm-project.git] / mlir / include / mlir-c / Dialect / LLVM.h
blobb3e64bd68f7b1c18b0d19def0a49a915518460ca
1 //===-- mlir-c/Dialect/LLVM.h - C API for LLVM --------------------*- C -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM
4 // Exceptions.
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //
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"
16 #ifdef __cplusplus
17 extern "C" {
18 #endif
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,
58 intptr_t position);
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,
90 MlirStringRef name);
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,
101 MlirStringRef name);
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);
109 enum MlirLLVMCConv {
110 MlirLLVMCConvC = 0,
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,
256 MlirAttribute name,
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,
283 uint64_t value);
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);
347 #ifdef __cplusplus
349 #endif
351 #endif // MLIR_C_DIALECT_LLVM_H