//===-- LLVMDialect.td - LLVM IR dialect definition --------*- tablegen -*-===// // // 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 LLVMIR_DIALECT #define LLVMIR_DIALECT include "mlir/IR/DialectBase.td" def LLVM_Dialect : Dialect { let name = "llvm"; let cppNamespace = "::mlir::LLVM"; let hasConstantMaterializer = 1; let useDefaultAttributePrinterParser = 1; let hasRegionArgAttrVerify = 1; let hasRegionResultAttrVerify = 1; let hasOperationAttrVerify = 1; let discardableAttrs = (ins /// Attribute encoding size and type of GPU workgroup attributions. "WorkgroupAttributionAttr":$workgroup_attribution ); let extraClassDeclaration = [{ static StringRef getTargetAttrName() { return "llvm.target"; } /// Name of the data layout attributes. static StringRef getDataLayoutAttrName() { return "llvm.data_layout"; } static StringRef getNoAliasScopesAttrName() { return "noalias_scopes"; } static StringRef getAliasScopesAttrName() { return "alias_scopes"; } static StringRef getAccessGroupsAttrName() { return "access_groups"; } static StringRef getIdentAttrName() { return "llvm.ident"; } static StringRef getModuleFlags() { return "llvm.module.flags"; } static StringRef getCommandlineAttrName() { return "llvm.commandline"; } static StringRef getMmraAttrName() { return "llvm.mmra"; } /// Names of llvm parameter attributes. static StringRef getAlignAttrName() { return "llvm.align"; } static StringRef getAllocAlignAttrName() { return "llvm.allocalign"; } static StringRef getAllocatedPointerAttrName() { return "llvm.allocptr"; } static StringRef getByValAttrName() { return "llvm.byval"; } static StringRef getByRefAttrName() { return "llvm.byref"; } static StringRef getNoUndefAttrName() { return "llvm.noundef"; } static StringRef getDereferenceableAttrName() { return "llvm.dereferenceable"; } static StringRef getDereferenceableOrNullAttrName() { return "llvm.dereferenceable_or_null"; } static StringRef getElementTypeAttrName() { return "llvm.elementtype"; } static StringRef getInAllocaAttrName() { return "llvm.inalloca"; } static StringRef getInRegAttrName() { return "llvm.inreg"; } static StringRef getNestAttrName() { return "llvm.nest"; } static StringRef getNoAliasAttrName() { return "llvm.noalias"; } static StringRef getNoCaptureAttrName() { return "llvm.nocapture"; } static StringRef getNoFreeAttrName() { return "llvm.nofree"; } static StringRef getNonNullAttrName() { return "llvm.nonnull"; } static StringRef getPreallocatedAttrName() { return "llvm.preallocated"; } static StringRef getRangeAttrName() { return "llvm.range"; } static StringRef getReadonlyAttrName() { return "llvm.readonly"; } static StringRef getReturnedAttrName() { return "llvm.returned"; } static StringRef getSExtAttrName() { return "llvm.signext"; } static StringRef getStackAlignmentAttrName() { return "llvm.alignstack"; } static StringRef getStructRetAttrName() { return "llvm.sret"; } static StringRef getWritableAttrName() { return "llvm.writable"; } static StringRef getWriteOnlyAttrName() { return "llvm.writeonly"; } static StringRef getDeadOnUnwindAttrName() { return "llvm.dead_on_unwind"; } static StringRef getDeadOnReturnAttrName() { return "llvm.dead_on_return"; } static StringRef getNoFPClassAttrName() { return "llvm.nofpclass"; } static StringRef getZExtAttrName() { return "llvm.zeroext"; } static StringRef getOpBundleSizesAttrName() { return "op_bundle_sizes"; } static StringRef getOpBundleTagsAttrName() { return "op_bundle_tags"; } // TODO Restrict the usage of this to parameter attributes once there is an // alternative way of modeling memory effects on FunctionOpInterface. /// Name of the attribute that will cause the creation of a readnone memory /// effect when lowering to the LLVMDialect. static StringRef getReadnoneAttrName() { return "llvm.readnone"; } /// Verifies if the given string is a well-formed data layout descriptor. /// Uses `reportError` to report errors. static LogicalResult verifyDataLayoutString( StringRef descr, llvm::function_ref reportError); /// Name of the target triple attribute. static StringRef getTargetTripleAttrName() { return "llvm.target_triple"; } /// Name of the C wrapper emission attribute. static StringRef getEmitCWrapperAttrName() { return "llvm.emit_c_interface"; } /// Name of the module level assembly attribute. static StringRef getModuleLevelAsmAttrName() { return "llvm.module_asm"; } /// Name of the dependent libraries attribute. static StringRef getDependentLibrariesAttrName() { return "llvm.dependent_libraries"; } /// Names of known llvm module flag keys. static StringRef getModuleFlagKeyCGProfileName() { return "CG Profile"; } static StringRef getModuleFlagKeyProfileSummaryName() { return "ProfileSummary"; } /// Returns `true` if the given type is compatible with the LLVM dialect. static bool isCompatibleType(Type); Type parseType(DialectAsmParser &p) const override; void printType(Type, DialectAsmPrinter &p) const override; private: /// Verifies a parameter attribute attached to a parameter of type /// paramType. LogicalResult verifyParameterAttribute(Operation *op, Type paramType, NamedAttribute paramAttr); /// Register all types. void registerTypes(); /// A cache storing compatible LLVM types that have been verified. This /// can save us lots of verification time if there are many occurrences /// of some deeply-nested aggregate types in the program. ThreadLocalCache> compatibleTypes; /// Register the attributes of this dialect. void registerAttributes(); }]; } #endif // LLVMIR_DIALECT