blob: c4c011f30b3bcd97df97ac23f54efb683122f0ce [file] [log] [blame]
//===-- 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 extraClassDeclaration = [{
/// 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"; }
/// 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 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 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 getWriteOnlyAttrName() { return "llvm.writeonly"; }
static StringRef getZExtAttrName() { return "llvm.zeroext"; }
// 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<void (const Twine &)> 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";
}
/// 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<DenseSet<Type>> compatibleTypes;
/// Register the attributes of this dialect.
void registerAttributes();
}];
}
#endif // LLVMIR_DIALECT