17#include "llvm-c/Core.h"
18#include "llvm/ADT/SmallVector.h"
19#include "llvm/ADT/SmallVectorExtras.h"
27 return wrap(LLVMPointerType::get(
unwrap(ctx), addressSpace));
31 return isa<LLVM::LLVMPointerType>(
unwrap(type));
35 return cast<LLVM::LLVMPointerType>(
unwrap(pointerType)).getAddressSpace();
43 return wrap(LLVMArrayType::get(
unwrap(elementType), numElements));
51 MlirType
const *argumentTypes,
bool isVarArg) {
53 return wrap(LLVMFunctionType::get(
55 unwrapList(nArgumentTypes, argumentTypes, argumentStorage), isVarArg));
59 return llvm::cast<LLVM::LLVMFunctionType>(
unwrap(type)).getNumParams();
63 assert(pos >= 0 &&
"pos in array must be positive");
64 return wrap(llvm::cast<LLVM::LLVMFunctionType>(
unwrap(type))
65 .getParamType(
static_cast<unsigned>(pos)));
69 return wrap(llvm::cast<LLVM::LLVMFunctionType>(
unwrap(type)).getReturnType());
73 return isa<LLVM::LLVMStructType>(
unwrap(type));
77 return !cast<LLVM::LLVMStructType>(
unwrap(type)).isIdentified();
81 return cast<LLVM::LLVMStructType>(
unwrap(type)).getBody().size();
85 return wrap(cast<LLVM::LLVMStructType>(
unwrap(type)).getBody()[position]);
89 return cast<LLVM::LLVMStructType>(
unwrap(type)).isPacked();
93 return wrap(cast<LLVM::LLVMStructType>(
unwrap(type)).getName());
97 return cast<LLVM::LLVMStructType>(
unwrap(type)).isOpaque();
101 MlirType
const *fieldTypes,
104 return wrap(LLVMStructType::getLiteral(
110 intptr_t nFieldTypes,
111 MlirType
const *fieldTypes,
114 return wrap(LLVMStructType::getLiteralChecked(
116 unwrapList(nFieldTypes, fieldTypes, fieldStorage), isPacked));
128 intptr_t nFieldTypes,
129 MlirType
const *fieldTypes,
132 return wrap(LLVMStructType::getNewIdentified(
138 intptr_t nFieldTypes,
139 MlirType
const *fieldTypes,
143 cast<LLVM::LLVMStructType>(
unwrap(structType))
144 .setBody(
unwrapList(nFieldTypes, fieldTypes, fields), isPacked));
150 uint64_t
const *arguments) {
152 return wrap(DIExpressionElemAttr::get(
unwrap(ctx), opcode, list));
156 MlirAttribute
const *operations) {
158 attrStorage.reserve(nOperations);
160 return wrap(DIExpressionAttr::get(
162 llvm::map_to_vector(
unwrapList(nOperations, operations, attrStorage),
163 llvm::CastTo<DIExpressionElemAttr>)));
167 return wrap(DINullTypeAttr::get(
unwrap(ctx)));
175 return wrap(DIBasicTypeAttr::get(
176 unwrap(ctx), tag, cast<StringAttr>(
unwrap(name)), sizeInBits, encoding));
181 DICompositeTypeAttr::getRecSelf(cast<DistinctAttr>(
unwrap(recId))));
185 MlirContext ctx, MlirAttribute recId,
bool isRecSelf,
unsigned int tag,
186 MlirAttribute name, MlirAttribute file, uint32_t line, MlirAttribute scope,
187 MlirAttribute baseType,
int64_t flags, uint64_t sizeInBits,
188 uint64_t alignInBits, intptr_t nElements, MlirAttribute
const *elements,
189 MlirAttribute dataLocation, MlirAttribute rank, MlirAttribute allocated,
190 MlirAttribute associated) {
192 elementsStorage.reserve(nElements);
194 return wrap(DICompositeTypeAttr::get(
195 unwrap(ctx), cast<DistinctAttr>(
unwrap(recId)), isRecSelf, tag,
196 cast<StringAttr>(
unwrap(name)), cast<DIFileAttr>(
unwrap(file)), line,
197 cast<DIScopeAttr>(
unwrap(scope)), cast<DITypeAttr>(
unwrap(baseType)),
198 DIFlags(flags), sizeInBits, alignInBits,
199 cast<DIExpressionAttr>(
unwrap(dataLocation)),
200 cast<DIExpressionAttr>(
unwrap(rank)),
201 cast<DIExpressionAttr>(
unwrap(allocated)),
202 cast<DIExpressionAttr>(
unwrap(associated)),
203 llvm::map_to_vector(
unwrapList(nElements, elements, elementsStorage),
204 llvm::CastTo<DINodeAttr>)));
208 MlirContext ctx,
unsigned int tag, MlirAttribute name,
209 MlirAttribute baseType, uint64_t sizeInBits, uint32_t alignInBits,
210 uint64_t offsetInBits,
int64_t dwarfAddressSpace, MlirAttribute extraData) {
211 std::optional<unsigned> addressSpace = std::nullopt;
212 if (dwarfAddressSpace >= 0)
213 addressSpace = (
unsigned)dwarfAddressSpace;
214 return wrap(DIDerivedTypeAttr::get(
216 cast<DITypeAttr>(
unwrap(baseType)), sizeInBits, alignInBits, offsetInBits,
217 addressSpace, cast<DINodeAttr>(
unwrap(extraData))));
221 MlirContext ctx,
unsigned int tag, MlirAttribute name, uint64_t sizeInBits,
222 uint32_t alignInBits, MlirAttribute stringLength,
223 MlirAttribute stringLengthExp, MlirAttribute stringLocationExp,
225 return wrap(DIStringTypeAttr::get(
226 unwrap(ctx), tag, cast<StringAttr>(
unwrap(name)), sizeInBits, alignInBits,
227 cast<DIVariableAttr>(
unwrap(stringLength)),
228 cast<DIExpressionAttr>(
unwrap(stringLengthExp)),
229 cast<DIExpressionAttr>(
unwrap(stringLocationExp)), encoding));
234 return wrap(cast<DIDerivedTypeAttr>(
unwrap(diDerivedType)).getBaseType());
238 return wrap(CConvAttr::get(
unwrap(ctx), CConv(cconv)));
242 return wrap(ComdatAttr::get(
unwrap(ctx), comdat::Comdat(comdat)));
246 return wrap(LinkageAttr::get(
unwrap(ctx), linkage::Linkage(linkage)));
250 MlirAttribute directory) {
252 cast<StringAttr>(
unwrap(directory))));
256 MlirContext ctx, MlirAttribute
id,
unsigned int sourceLanguage,
257 MlirAttribute file, MlirAttribute producer,
bool isOptimized,
259 MlirAttribute splitDebugFilename) {
260 return wrap(DICompileUnitAttr::get(
261 unwrap(ctx), cast<DistinctAttr>(
unwrap(
id)), sourceLanguage,
262 cast<DIFileAttr>(
unwrap(file)), cast<StringAttr>(
unwrap(producer)),
263 isOptimized, DIEmissionKind(emissionKind), DINameTableKind(nameTableKind),
264 cast<StringAttr>(
unwrap(splitDebugFilename))));
268 return wrap(DIFlagsAttr::get(
unwrap(ctx), DIFlags(value)));
275 unsigned int column) {
277 DILexicalBlockAttr::get(
unwrap(ctx), cast<DIScopeAttr>(
unwrap(scope)),
278 cast<DIFileAttr>(
unwrap(file)), line, column));
284 unsigned int discriminator) {
285 return wrap(DILexicalBlockFileAttr::get(
287 cast<DIFileAttr>(
unwrap(file)), discriminator));
291 MlirContext ctx, MlirAttribute scope, MlirAttribute name,
292 MlirAttribute diFile,
unsigned int line,
unsigned int arg,
293 unsigned int alignInBits, MlirAttribute diType,
int64_t flags) {
294 return wrap(DILocalVariableAttr::get(
296 cast<StringAttr>(
unwrap(name)), cast<DIFileAttr>(
unwrap(diFile)), line,
297 arg, alignInBits, cast<DITypeAttr>(
unwrap(diType)), DIFlags(flags)));
301 unsigned int callingConvention,
303 MlirAttribute
const *types) {
305 attrStorage.reserve(nTypes);
307 return wrap(DISubroutineTypeAttr::get(
308 unwrap(ctx), callingConvention,
309 llvm::map_to_vector(
unwrapList(nTypes, types, attrStorage),
310 llvm::CastTo<DITypeAttr>)));
314 return wrap(DISubprogramAttr::getRecSelf(cast<DistinctAttr>(
unwrap(recId))));
318 MlirContext ctx, MlirAttribute recId,
bool isRecSelf, MlirAttribute
id,
319 MlirAttribute compileUnit, MlirAttribute scope, MlirAttribute name,
320 MlirAttribute linkageName, MlirAttribute file,
unsigned int line,
321 unsigned int scopeLine, uint64_t subprogramFlags, MlirAttribute type,
322 intptr_t nRetainedNodes, MlirAttribute
const *retainedNodes,
323 intptr_t nAnnotations, MlirAttribute
const *annotations) {
325 nodesStorage.reserve(nRetainedNodes);
328 annotationsStorage.reserve(nAnnotations);
330 return wrap(DISubprogramAttr::get(
331 unwrap(ctx), cast<DistinctAttr>(
unwrap(recId)), isRecSelf,
332 cast<DistinctAttr>(
unwrap(
id)),
333 cast<DICompileUnitAttr>(
unwrap(compileUnit)),
334 cast<DIScopeAttr>(
unwrap(scope)), cast<StringAttr>(
unwrap(name)),
335 cast<StringAttr>(
unwrap(linkageName)), cast<DIFileAttr>(
unwrap(file)),
336 line, scopeLine, DISubprogramFlags(subprogramFlags),
337 cast<DISubroutineTypeAttr>(
unwrap(type)),
339 unwrapList(nRetainedNodes, retainedNodes, nodesStorage),
340 llvm::CastTo<DINodeAttr>),
342 unwrapList(nAnnotations, annotations, annotationsStorage),
343 llvm::CastTo<DINodeAttr>)));
347 return wrap(cast<DISubprogramAttr>(
unwrap(diSubprogram)).getScope());
351 return cast<DISubprogramAttr>(
unwrap(diSubprogram)).getLine();
355 return cast<DISubprogramAttr>(
unwrap(diSubprogram)).getScopeLine();
360 return wrap(cast<DISubprogramAttr>(
unwrap(diSubprogram)).getCompileUnit());
364 return wrap(cast<DISubprogramAttr>(
unwrap(diSubprogram)).getFile());
372 MlirAttribute scope, MlirAttribute name,
373 MlirAttribute configMacros,
374 MlirAttribute includePath,
375 MlirAttribute apinotes,
unsigned int line,
377 return wrap(DIModuleAttr::get(
379 cast<DIScopeAttr>(
unwrap(scope)), cast<StringAttr>(
unwrap(name)),
380 cast<StringAttr>(
unwrap(configMacros)),
381 cast<StringAttr>(
unwrap(includePath)), cast<StringAttr>(
unwrap(apinotes)),
386 return wrap(cast<DIModuleAttr>(
unwrap(diModule)).getScope());
390 MlirContext ctx,
unsigned int tag, MlirAttribute scope,
391 MlirAttribute entity, MlirAttribute file,
unsigned int line,
392 MlirAttribute name, intptr_t nElements, MlirAttribute
const *elements) {
394 elementsStorage.reserve(nElements);
395 return wrap(DIImportedEntityAttr::get(
397 cast<DINodeAttr>(
unwrap(entity)), cast<DIFileAttr>(
unwrap(file)), line,
398 cast<StringAttr>(
unwrap(name)),
399 llvm::map_to_vector(
unwrapList(nElements, elements, elementsStorage),
400 llvm::CastTo<DINodeAttr>)));
404 MlirAttribute value) {
405 return wrap(DIAnnotationAttr::get(
unwrap(ctx), cast<StringAttr>(
unwrap(name)),
406 cast<StringAttr>(
unwrap(value))));
static Type getElementType(Type type)
Determine the element type of type.
bool mlirLLVMStructTypeIsLiteral(MlirType type)
Returns true if the type is a literal (unnamed) LLVM struct type.
MlirAttribute mlirLLVMLinkageAttrGet(MlirContext ctx, MlirLLVMLinkage linkage)
Creates a LLVM Linkage attribute.
MlirAttribute mlirLLVMDISubprogramAttrGetFile(MlirAttribute diSubprogram)
Gets the file from this DISubprogramAttr.
MlirType mlirLLVMFunctionTypeGet(MlirType resultType, intptr_t nArgumentTypes, MlirType const *argumentTypes, bool isVarArg)
Creates an llvm.func type.
MlirAttribute mlirLLVMDIModuleAttrGetScope(MlirAttribute diModule)
Gets the scope of this DIModuleAttr.
MlirType mlirLLVMFunctionTypeGetInput(MlirType type, intptr_t pos)
Returns the pos-th input type.
intptr_t mlirLLVMStructTypeGetNumElementTypes(MlirType type)
Returns the number of fields in the struct.
intptr_t mlirLLVMFunctionTypeGetNumInputs(MlirType type)
Returns the number of input types.
MlirAttribute mlirLLVMDINullTypeAttrGet(MlirContext ctx)
Creates a LLVM DINullType attribute.
MlirType mlirLLVMArrayTypeGetElementType(MlirType type)
Returns the element type of the llvm.array type.
MlirLogicalResult mlirLLVMStructTypeSetBody(MlirType structType, intptr_t nFieldTypes, MlirType const *fieldTypes, bool isPacked)
Sets the body of the identified struct if it hasn't been set yet.
MlirAttribute mlirLLVMDIFileAttrGet(MlirContext ctx, MlirAttribute name, MlirAttribute directory)
Creates a LLVM DIFileAttr attribute.
bool mlirTypeIsALLVMStructType(MlirType type)
Returns true if the type is an LLVM dialect struct type.
MlirStringRef mlirLLVMStructTypeGetIdentifier(MlirType type)
Returns the identifier of the identified struct.
MlirAttribute mlirLLVMDIStringTypeAttrGet(MlirContext ctx, unsigned int tag, MlirAttribute name, uint64_t sizeInBits, uint32_t alignInBits, MlirAttribute stringLength, MlirAttribute stringLengthExp, MlirAttribute stringLocationExp, MlirLLVMTypeEncoding encoding)
MlirAttribute mlirLLVMDICompositeTypeAttrGet(MlirContext ctx, MlirAttribute recId, bool isRecSelf, unsigned int tag, MlirAttribute name, MlirAttribute file, uint32_t line, MlirAttribute scope, MlirAttribute baseType, int64_t flags, uint64_t sizeInBits, uint64_t alignInBits, intptr_t nElements, MlirAttribute const *elements, MlirAttribute dataLocation, MlirAttribute rank, MlirAttribute allocated, MlirAttribute associated)
Creates a LLVM DICompositeType attribute.
MlirAttribute mlirLLVMDISubprogramAttrGetScope(MlirAttribute diSubprogram)
Gets the scope from this DISubprogramAttr.
MlirAttribute mlirLLVMDILexicalBlockAttrGet(MlirContext ctx, MlirAttribute scope, MlirAttribute file, unsigned int line, unsigned int column)
Creates a LLVM DILexicalBlock attribute.
MlirAttribute mlirLLVMDIExpressionElemAttrGet(MlirContext ctx, unsigned int opcode, intptr_t nArguments, uint64_t const *arguments)
Creates a LLVM DIExpressionElem attribute.
MlirAttribute mlirLLVMDICompositeTypeAttrGetRecSelf(MlirAttribute recId)
Creates a self-referencing LLVM DICompositeType attribute.
MlirAttribute mlirLLVMDIBasicTypeAttrGet(MlirContext ctx, unsigned int tag, MlirAttribute name, uint64_t sizeInBits, MlirLLVMTypeEncoding encoding)
Creates a LLVM DIBasicType attribute.
MlirType mlirLLVMFunctionTypeGetReturnType(MlirType type)
Returns the return type of the function type.
MlirAttribute mlirLLVMComdatAttrGet(MlirContext ctx, MlirLLVMComdat comdat)
Creates a LLVM Comdat attribute.
MlirAttribute mlirLLVMDISubprogramAttrGetRecSelf(MlirAttribute recId)
Creates a self-referencing LLVM DISubprogramAttr attribute.
MlirType mlirLLVMVoidTypeGet(MlirContext ctx)
Creates an llmv.void type.
MlirAttribute mlirLLVMDIImportedEntityAttrGet(MlirContext ctx, unsigned int tag, MlirAttribute scope, MlirAttribute entity, MlirAttribute file, unsigned int line, MlirAttribute name, intptr_t nElements, MlirAttribute const *elements)
Creates a LLVM DIImportedEntityAttr attribute.
MlirType mlirLLVMStructTypeIdentifiedNewGet(MlirContext ctx, MlirStringRef name, intptr_t nFieldTypes, MlirType const *fieldTypes, bool isPacked)
Creates an LLVM identified struct type with no body and a name starting with the given prefix.
MlirType mlirLLVMStructTypeGetElementType(MlirType type, intptr_t position)
Returns the positions-th field of the struct.
MlirType mlirLLVMStructTypeOpaqueGet(MlirContext ctx, MlirStringRef name)
MlirType mlirLLVMArrayTypeGet(MlirType elementType, unsigned numElements)
Creates an llvm.array type.
MlirAttribute mlirLLVMDISubprogramAttrGetType(MlirAttribute diSubprogram)
Gets the type from this DISubprogramAttr.
MlirAttribute mlirLLVMDISubprogramAttrGetCompileUnit(MlirAttribute diSubprogram)
Gets the compile unit from this DISubprogram.
MlirAttribute mlirLLVMDIModuleAttrGet(MlirContext ctx, MlirAttribute file, MlirAttribute scope, MlirAttribute name, MlirAttribute configMacros, MlirAttribute includePath, MlirAttribute apinotes, unsigned int line, bool isDecl)
Creates a LLVM DIModuleAttr attribute.
MlirAttribute mlirLLVMCConvAttrGet(MlirContext ctx, MlirLLVMCConv cconv)
Creates a LLVM CConv attribute.
MlirAttribute mlirLLVMDIAnnotationAttrGet(MlirContext ctx, MlirAttribute name, MlirAttribute value)
Creates a LLVM DIAnnotation attribute.
MlirType mlirLLVMStructTypeLiteralGetChecked(MlirLocation loc, intptr_t nFieldTypes, MlirType const *fieldTypes, bool isPacked)
Creates an LLVM literal (unnamed) struct type if possible.
MlirAttribute mlirLLVMDILexicalBlockFileAttrGet(MlirContext ctx, MlirAttribute scope, MlirAttribute file, unsigned int discriminator)
Creates a LLVM DILexicalBlockFile attribute.
MlirAttribute mlirLLVMDICompileUnitAttrGet(MlirContext ctx, MlirAttribute id, unsigned int sourceLanguage, MlirAttribute file, MlirAttribute producer, bool isOptimized, MlirLLVMDIEmissionKind emissionKind, MlirLLVMDINameTableKind nameTableKind, MlirAttribute splitDebugFilename)
Creates a LLVM DICompileUnit attribute.
MlirAttribute mlirLLVMDIExpressionAttrGet(MlirContext ctx, intptr_t nOperations, MlirAttribute const *operations)
Creates a LLVM DIExpression attribute.
bool mlirLLVMStructTypeIsPacked(MlirType type)
Returns true if the struct is packed.
MlirAttribute mlirLLVMDISubprogramAttrGet(MlirContext ctx, MlirAttribute recId, bool isRecSelf, MlirAttribute id, MlirAttribute compileUnit, MlirAttribute scope, MlirAttribute name, MlirAttribute linkageName, MlirAttribute file, unsigned int line, unsigned int scopeLine, uint64_t subprogramFlags, MlirAttribute type, intptr_t nRetainedNodes, MlirAttribute const *retainedNodes, intptr_t nAnnotations, MlirAttribute const *annotations)
Creates a LLVM DISubprogramAttr attribute.
unsigned mlirLLVMPointerTypeGetAddressSpace(MlirType pointerType)
Returns address space of llvm.ptr.
MlirAttribute mlirLLVMDIFlagsAttrGet(MlirContext ctx, uint64_t value)
Creates a LLVM DIFlags attribute.
MlirType mlirLLVMStructTypeIdentifiedGet(MlirContext ctx, MlirStringRef name)
Creates an LLVM identified struct type with no body.
MlirAttribute mlirLLVMDISubroutineTypeAttrGet(MlirContext ctx, unsigned int callingConvention, intptr_t nTypes, MlirAttribute const *types)
Creates a LLVM DISubroutineTypeAttr attribute.
MlirAttribute mlirLLVMDIDerivedTypeAttrGetBaseType(MlirAttribute diDerivedType)
Gets the base type from a LLVM DIDerivedType attribute.
bool mlirLLVMStructTypeIsOpaque(MlirType type)
Returns true is the struct is explicitly opaque (will not have a body) or uninitialized (will eventua...
bool mlirTypeIsALLVMPointerType(MlirType type)
Returns true if the type is an LLVM dialect pointer type.
unsigned int mlirLLVMDISubprogramAttrGetLine(MlirAttribute diSubprogram)
Gets the line from this DISubprogramAttr.
MlirAttribute mlirLLVMDILocalVariableAttrGet(MlirContext ctx, MlirAttribute scope, MlirAttribute name, MlirAttribute diFile, unsigned int line, unsigned int arg, unsigned int alignInBits, MlirAttribute diType, int64_t flags)
Creates a LLVM DILocalVariableAttr attribute.
unsigned int mlirLLVMDISubprogramAttrGetScopeLine(MlirAttribute diSubprogram)
Gets the scope line from this DISubprogram.
MlirAttribute mlirLLVMDIDerivedTypeAttrGet(MlirContext ctx, unsigned int tag, MlirAttribute name, MlirAttribute baseType, uint64_t sizeInBits, uint32_t alignInBits, uint64_t offsetInBits, int64_t dwarfAddressSpace, MlirAttribute extraData)
Creates a LLVM DIDerivedType attribute.
MlirType mlirLLVMStructTypeLiteralGet(MlirContext ctx, intptr_t nFieldTypes, MlirType const *fieldTypes, bool isPacked)
Creates an LLVM literal (unnamed) struct type.
#define MLIR_DEFINE_CAPI_DIALECT_REGISTRATION(Name, Namespace, ClassName)
static llvm::ArrayRef< CppTy > unwrapList(size_t size, CTy *first, llvm::SmallVectorImpl< CppTy > &storage)
MlirDiagnostic wrap(mlir::Diagnostic &diagnostic)
mlir::Diagnostic & unwrap(MlirDiagnostic diagnostic)
MLIR_CAPI_EXPORTED MlirType mlirLLVMPointerTypeGet(MlirContext ctx, unsigned addressSpace)
Creates an llvm.ptr type.
The OpAsmOpInterface, see OpAsmInterface.td for more details.
Include the generated interface declarations.
Type getType(OpFoldResult ofr)
Returns the int type of the integer in ofr.
InFlightDiagnostic emitError(Location loc)
Utility method to emit an error message using this location.
A logical result value, essentially a boolean with named states.
A pointer to a sized fragment of a string, not necessarily null-terminated.