blob: 65b14254e449254a757b4771c195e624827756e7 [file] [log] [blame] [edit]
//===-- mlir-c/Dialect/LLVM.h - C API for LLVM --------------------*- C -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM
// Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef MLIR_C_DIALECT_LLVM_H
#define MLIR_C_DIALECT_LLVM_H
#include "mlir-c/IR.h"
#include "mlir-c/Support.h"
#ifdef __cplusplus
extern "C" {
#endif
MLIR_DECLARE_CAPI_DIALECT_REGISTRATION(LLVM, llvm);
/// Creates an llvm.ptr type.
MLIR_CAPI_EXPORTED MlirType mlirLLVMPointerTypeGet(MlirContext ctx,
unsigned addressSpace);
/// Returns `true` if the type is an LLVM dialect pointer type.
MLIR_CAPI_EXPORTED bool mlirTypeIsALLVMPointerType(MlirType type);
/// Returns address space of llvm.ptr
MLIR_CAPI_EXPORTED unsigned
mlirLLVMPointerTypeGetAddressSpace(MlirType pointerType);
/// Creates an llmv.void type.
MLIR_CAPI_EXPORTED MlirType mlirLLVMVoidTypeGet(MlirContext ctx);
/// Creates an llvm.array type.
MLIR_CAPI_EXPORTED MlirType mlirLLVMArrayTypeGet(MlirType elementType,
unsigned numElements);
/// Returns the element type of the llvm.array type.
MLIR_CAPI_EXPORTED MlirType mlirLLVMArrayTypeGetElementType(MlirType type);
/// Creates an llvm.func type.
MLIR_CAPI_EXPORTED MlirType
mlirLLVMFunctionTypeGet(MlirType resultType, intptr_t nArgumentTypes,
MlirType const *argumentTypes, bool isVarArg);
/// Returns the number of input types.
MLIR_CAPI_EXPORTED intptr_t mlirLLVMFunctionTypeGetNumInputs(MlirType type);
/// Returns the pos-th input type.
MLIR_CAPI_EXPORTED MlirType mlirLLVMFunctionTypeGetInput(MlirType type,
intptr_t pos);
/// Returns the return type of the function type.
MLIR_CAPI_EXPORTED MlirType mlirLLVMFunctionTypeGetReturnType(MlirType type);
/// Returns `true` if the type is an LLVM dialect struct type.
MLIR_CAPI_EXPORTED bool mlirTypeIsALLVMStructType(MlirType type);
/// Returns `true` if the type is a literal (unnamed) LLVM struct type.
MLIR_CAPI_EXPORTED bool mlirLLVMStructTypeIsLiteral(MlirType type);
/// Returns the number of fields in the struct. Asserts if the struct is opaque
/// or not yet initialized.
MLIR_CAPI_EXPORTED intptr_t mlirLLVMStructTypeGetNumElementTypes(MlirType type);
/// Returns the `positions`-th field of the struct. Asserts if the struct is
/// opaque, not yet initialized or if the position is out of range.
MLIR_CAPI_EXPORTED MlirType mlirLLVMStructTypeGetElementType(MlirType type,
intptr_t position);
/// Returns `true` if the struct is packed.
MLIR_CAPI_EXPORTED bool mlirLLVMStructTypeIsPacked(MlirType type);
/// Returns the identifier of the identified struct. Asserts that the struct is
/// identified, i.e., not literal.
MLIR_CAPI_EXPORTED MlirStringRef mlirLLVMStructTypeGetIdentifier(MlirType type);
/// Returns `true` is the struct is explicitly opaque (will not have a body) or
/// uninitialized (will eventually have a body).
MLIR_CAPI_EXPORTED bool mlirLLVMStructTypeIsOpaque(MlirType type);
/// Creates an LLVM literal (unnamed) struct type. This may assert if the fields
/// have types not compatible with the LLVM dialect. For a graceful failure, use
/// the checked version.
MLIR_CAPI_EXPORTED MlirType
mlirLLVMStructTypeLiteralGet(MlirContext ctx, intptr_t nFieldTypes,
MlirType const *fieldTypes, bool isPacked);
/// Creates an LLVM literal (unnamed) struct type if possible. Emits a
/// diagnostic at the given location and returns null otherwise.
MLIR_CAPI_EXPORTED MlirType
mlirLLVMStructTypeLiteralGetChecked(MlirLocation loc, intptr_t nFieldTypes,
MlirType const *fieldTypes, bool isPacked);
/// Creates an LLVM identified struct type with no body. If a struct type with
/// this name already exists in the context, returns that type. Use
/// mlirLLVMStructTypeIdentifiedNewGet to create a fresh struct type,
/// potentially renaming it. The body should be set separatelty by calling
/// mlirLLVMStructTypeSetBody, if it isn't set already.
MLIR_CAPI_EXPORTED MlirType mlirLLVMStructTypeIdentifiedGet(MlirContext ctx,
MlirStringRef name);
/// Creates an LLVM identified struct type with no body and a name starting with
/// the given prefix. If a struct with the exact name as the given prefix
/// already exists, appends an unspecified suffix to the name so that the name
/// is unique in context.
MLIR_CAPI_EXPORTED MlirType mlirLLVMStructTypeIdentifiedNewGet(
MlirContext ctx, MlirStringRef name, intptr_t nFieldTypes,
MlirType const *fieldTypes, bool isPacked);
MLIR_CAPI_EXPORTED MlirType mlirLLVMStructTypeOpaqueGet(MlirContext ctx,
MlirStringRef name);
/// Sets the body of the identified struct if it hasn't been set yet. Returns
/// whether the operation was successful.
MLIR_CAPI_EXPORTED MlirLogicalResult
mlirLLVMStructTypeSetBody(MlirType structType, intptr_t nFieldTypes,
MlirType const *fieldTypes, bool isPacked);
enum MlirLLVMCConv {
MlirLLVMCConvC = 0,
MlirLLVMCConvFast = 8,
MlirLLVMCConvCold = 9,
MlirLLVMCConvGHC = 10,
MlirLLVMCConvHiPE = 11,
MlirLLVMCConvAnyReg = 13,
MlirLLVMCConvPreserveMost = 14,
MlirLLVMCConvPreserveAll = 15,
MlirLLVMCConvSwift = 16,
MlirLLVMCConvCXX_FAST_TLS = 17,
MlirLLVMCConvTail = 18,
MlirLLVMCConvCFGuard_Check = 19,
MlirLLVMCConvSwiftTail = 20,
MlirLLVMCConvX86_StdCall = 64,
MlirLLVMCConvX86_FastCall = 65,
MlirLLVMCConvARM_APCS = 66,
MlirLLVMCConvARM_AAPCS = 67,
MlirLLVMCConvARM_AAPCS_VFP = 68,
MlirLLVMCConvMSP430_INTR = 69,
MlirLLVMCConvX86_ThisCall = 70,
MlirLLVMCConvPTX_Kernel = 71,
MlirLLVMCConvPTX_Device = 72,
MlirLLVMCConvSPIR_FUNC = 75,
MlirLLVMCConvSPIR_KERNEL = 76,
MlirLLVMCConvIntel_OCL_BI = 77,
MlirLLVMCConvX86_64_SysV = 78,
MlirLLVMCConvWin64 = 79,
MlirLLVMCConvX86_VectorCall = 80,
MlirLLVMCConvDUMMY_HHVM = 81,
MlirLLVMCConvDUMMY_HHVM_C = 82,
MlirLLVMCConvX86_INTR = 83,
MlirLLVMCConvAVR_INTR = 84,
MlirLLVMCConvAVR_BUILTIN = 86,
MlirLLVMCConvAMDGPU_VS = 87,
MlirLLVMCConvAMDGPU_GS = 88,
MlirLLVMCConvAMDGPU_CS = 90,
MlirLLVMCConvAMDGPU_KERNEL = 91,
MlirLLVMCConvX86_RegCall = 92,
MlirLLVMCConvAMDGPU_HS = 93,
MlirLLVMCConvMSP430_BUILTIN = 94,
MlirLLVMCConvAMDGPU_LS = 95,
MlirLLVMCConvAMDGPU_ES = 96,
MlirLLVMCConvAArch64_VectorCall = 97,
MlirLLVMCConvAArch64_SVE_VectorCall = 98,
MlirLLVMCConvWASM_EmscriptenInvoke = 99,
MlirLLVMCConvAMDGPU_Gfx = 100,
MlirLLVMCConvM68k_INTR = 101,
};
typedef enum MlirLLVMCConv MlirLLVMCConv;
/// Creates a LLVM CConv attribute.
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMCConvAttrGet(MlirContext ctx,
MlirLLVMCConv cconv);
enum MlirLLVMComdat {
MlirLLVMComdatAny = 0,
MlirLLVMComdatExactMatch = 1,
MlirLLVMComdatLargest = 2,
MlirLLVMComdatNoDeduplicate = 3,
MlirLLVMComdatSameSize = 4,
};
typedef enum MlirLLVMComdat MlirLLVMComdat;
/// Creates a LLVM Comdat attribute.
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMComdatAttrGet(MlirContext ctx,
MlirLLVMComdat comdat);
enum MlirLLVMLinkage {
MlirLLVMLinkageExternal = 0,
MlirLLVMLinkageAvailableExternally = 1,
MlirLLVMLinkageLinkonce = 2,
MlirLLVMLinkageLinkonceODR = 3,
MlirLLVMLinkageWeak = 4,
MlirLLVMLinkageWeakODR = 5,
MlirLLVMLinkageAppending = 6,
MlirLLVMLinkageInternal = 7,
MlirLLVMLinkagePrivate = 8,
MlirLLVMLinkageExternWeak = 9,
MlirLLVMLinkageCommon = 10,
};
typedef enum MlirLLVMLinkage MlirLLVMLinkage;
/// Creates a LLVM Linkage attribute.
MLIR_CAPI_EXPORTED MlirAttribute
mlirLLVMLinkageAttrGet(MlirContext ctx, MlirLLVMLinkage linkage);
/// Creates a LLVM DINullType attribute.
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDINullTypeAttrGet(MlirContext ctx);
/// Creates a LLVM DIExpressionElem attribute.
MLIR_CAPI_EXPORTED MlirAttribute
mlirLLVMDIExpressionElemAttrGet(MlirContext ctx, unsigned int opcode,
intptr_t nArguments, uint64_t const *arguments);
/// Creates a LLVM DIExpression attribute.
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIExpressionAttrGet(
MlirContext ctx, intptr_t nOperations, MlirAttribute const *operations);
enum MlirLLVMTypeEncoding {
MlirLLVMTypeEncodingAddress = 0x1,
MlirLLVMTypeEncodingBoolean = 0x2,
MlirLLVMTypeEncodingComplexFloat = 0x31,
MlirLLVMTypeEncodingFloatT = 0x4,
MlirLLVMTypeEncodingSigned = 0x5,
MlirLLVMTypeEncodingSignedChar = 0x6,
MlirLLVMTypeEncodingUnsigned = 0x7,
MlirLLVMTypeEncodingUnsignedChar = 0x08,
MlirLLVMTypeEncodingImaginaryFloat = 0x09,
MlirLLVMTypeEncodingPackedDecimal = 0x0a,
MlirLLVMTypeEncodingNumericString = 0x0b,
MlirLLVMTypeEncodingEdited = 0x0c,
MlirLLVMTypeEncodingSignedFixed = 0x0d,
MlirLLVMTypeEncodingUnsignedFixed = 0x0e,
MlirLLVMTypeEncodingDecimalFloat = 0x0f,
MlirLLVMTypeEncodingUTF = 0x10,
MlirLLVMTypeEncodingUCS = 0x11,
MlirLLVMTypeEncodingASCII = 0x12,
MlirLLVMTypeEncodingLoUser = 0x80,
MlirLLVMTypeEncodingHiUser = 0xff,
};
typedef enum MlirLLVMTypeEncoding MlirLLVMTypeEncoding;
/// Creates a LLVM DIBasicType attribute.
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIBasicTypeAttrGet(
MlirContext ctx, unsigned int tag, MlirAttribute name, uint64_t sizeInBits,
MlirLLVMTypeEncoding encoding);
/// Creates a self-referencing LLVM DICompositeType attribute.
MLIR_CAPI_EXPORTED MlirAttribute
mlirLLVMDICompositeTypeAttrGetRecSelf(MlirAttribute recId);
/// Creates a LLVM DICompositeType attribute.
MLIR_CAPI_EXPORTED 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 DIDerivedType attribute. Note that `dwarfAddressSpace` is an
/// optional field, where `MLIR_CAPI_DWARF_ADDRESS_SPACE_NULL` indicates null
/// and non-negative values indicate a value present.
MLIR_CAPI_EXPORTED 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);
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIStringTypeAttrGet(
MlirContext ctx, unsigned int tag, MlirAttribute name, uint64_t sizeInBits,
uint32_t alignInBits, MlirAttribute stringLength,
MlirAttribute stringLengthExp, MlirAttribute stringLocationExp,
MlirLLVMTypeEncoding encoding);
/// Constant to represent std::nullopt for dwarfAddressSpace to omit the field.
#define MLIR_CAPI_DWARF_ADDRESS_SPACE_NULL -1
/// Gets the base type from a LLVM DIDerivedType attribute.
MLIR_CAPI_EXPORTED MlirAttribute
mlirLLVMDIDerivedTypeAttrGetBaseType(MlirAttribute diDerivedType);
/// Creates a LLVM DIFileAttr attribute.
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIFileAttrGet(MlirContext ctx,
MlirAttribute name,
MlirAttribute directory);
enum MlirLLVMDIEmissionKind {
MlirLLVMDIEmissionKindNone = 0,
MlirLLVMDIEmissionKindFull = 1,
MlirLLVMDIEmissionKindLineTablesOnly = 2,
MlirLLVMDIEmissionKindDebugDirectivesOnly = 3,
};
typedef enum MlirLLVMDIEmissionKind MlirLLVMDIEmissionKind;
enum MlirLLVMDINameTableKind {
MlirLLVMDINameTableKindDefault = 0,
MlirLLVMDINameTableKindGNU = 1,
MlirLLVMDINameTableKindNone = 2,
MlirLLVMDINameTableKindApple = 3,
};
typedef enum MlirLLVMDINameTableKind MlirLLVMDINameTableKind;
/// Creates a LLVM DICompileUnit attribute.
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDICompileUnitAttrGet(
MlirContext ctx, MlirAttribute id, unsigned int sourceLanguage,
MlirAttribute file, MlirAttribute producer, bool isOptimized,
MlirLLVMDIEmissionKind emissionKind, MlirLLVMDINameTableKind nameTableKind);
/// Creates a LLVM DIFlags attribute.
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIFlagsAttrGet(MlirContext ctx,
uint64_t value);
/// Creates a LLVM DILexicalBlock attribute.
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDILexicalBlockAttrGet(
MlirContext ctx, MlirAttribute scope, MlirAttribute file, unsigned int line,
unsigned int column);
/// Creates a LLVM DILexicalBlockFile attribute.
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDILexicalBlockFileAttrGet(
MlirContext ctx, MlirAttribute scope, MlirAttribute file,
unsigned int discriminator);
/// Creates a LLVM DILocalVariableAttr attribute.
MLIR_CAPI_EXPORTED 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 self-referencing LLVM DISubprogramAttr attribute.
MLIR_CAPI_EXPORTED MlirAttribute
mlirLLVMDISubprogramAttrGetRecSelf(MlirAttribute recId);
/// Creates a LLVM DISubprogramAttr attribute.
MLIR_CAPI_EXPORTED 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 DIAnnotation attribute.
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIAnnotationAttrGet(
MlirContext ctx, MlirAttribute name, MlirAttribute value);
/// Gets the scope from this DISubprogramAttr.
MLIR_CAPI_EXPORTED MlirAttribute
mlirLLVMDISubprogramAttrGetScope(MlirAttribute diSubprogram);
/// Gets the line from this DISubprogramAttr.
MLIR_CAPI_EXPORTED unsigned int
mlirLLVMDISubprogramAttrGetLine(MlirAttribute diSubprogram);
/// Gets the scope line from this DISubprogram.
MLIR_CAPI_EXPORTED unsigned int
mlirLLVMDISubprogramAttrGetScopeLine(MlirAttribute diSubprogram);
/// Gets the compile unit from this DISubprogram.
MLIR_CAPI_EXPORTED MlirAttribute
mlirLLVMDISubprogramAttrGetCompileUnit(MlirAttribute diSubprogram);
/// Gets the file from this DISubprogramAttr.
MLIR_CAPI_EXPORTED MlirAttribute
mlirLLVMDISubprogramAttrGetFile(MlirAttribute diSubprogram);
/// Gets the type from this DISubprogramAttr.
MLIR_CAPI_EXPORTED MlirAttribute
mlirLLVMDISubprogramAttrGetType(MlirAttribute diSubprogram);
/// Creates a LLVM DISubroutineTypeAttr attribute.
MLIR_CAPI_EXPORTED MlirAttribute
mlirLLVMDISubroutineTypeAttrGet(MlirContext ctx, unsigned int callingConvention,
intptr_t nTypes, MlirAttribute const *types);
/// Creates a LLVM DIModuleAttr attribute.
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIModuleAttrGet(
MlirContext ctx, MlirAttribute file, MlirAttribute scope,
MlirAttribute name, MlirAttribute configMacros, MlirAttribute includePath,
MlirAttribute apinotes, unsigned int line, bool isDecl);
/// Creates a LLVM DIImportedEntityAttr attribute.
MLIR_CAPI_EXPORTED MlirAttribute mlirLLVMDIImportedEntityAttrGet(
MlirContext ctx, unsigned int tag, MlirAttribute scope,
MlirAttribute entity, MlirAttribute file, unsigned int line,
MlirAttribute name, intptr_t nElements, MlirAttribute const *elements);
/// Gets the scope of this DIModuleAttr.
MLIR_CAPI_EXPORTED MlirAttribute
mlirLLVMDIModuleAttrGetScope(MlirAttribute diModule);
#ifdef __cplusplus
}
#endif
#endif // MLIR_C_DIALECT_LLVM_H