diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMEnums.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMEnums.td index 4a43c16903394..ee6873e65d966 100644 --- a/mlir/include/mlir/Dialect/LLVMIR/LLVMEnums.td +++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMEnums.td @@ -10,61 +10,9 @@ #define LLVMIR_ENUMS include "mlir/Dialect/LLVMIR/LLVMDialect.td" +include "mlir/Dialect/LLVMIR/Utils.td" include "mlir/IR/EnumAttr.td" -//===----------------------------------------------------------------------===// -// Base classes for LLVM enum attributes. -//===----------------------------------------------------------------------===// - -// Case of the LLVM enum attribute backed by I64Attr with customized string -// representation that corresponds to what is visible in the textual IR form. -// The parameters are as follows: -// - `cppSym`: name of the C++ enumerant for this case in MLIR API; -// - `irSym`: keyword used in the custom form of MLIR operation; -// - `llvmSym`: name of the C++ enumerant for this case in LLVM API. -// For example, `LLVM_EnumAttrCase<"Weak", "weak", "WeakAnyLinkage">` is usable -// as `::Weak` in MLIR API, `WeakAnyLinkage` in LLVM API and -// is printed/parsed as `weak` in MLIR custom textual format. -class LLVM_EnumAttrCase : - I64EnumAttrCase { - // The name of the equivalent enumerant in LLVM. - string llvmEnumerant = llvmSym; -} - -// LLVM enum attribute backed by I64Attr with string representation -// corresponding to what is visible in the textual IR form. -// The parameters are as follows: -// - `name`: name of the C++ enum class in MLIR API; -// - `llvmName`: name of the C++ enum in LLVM API; -// - `description`: textual description for documentation purposes; -// - `cases`: list of enum cases; -// - `unsupportedCases`: optional list of unsupported enum cases. -// For example, `LLVM_EnumAttr cases, - list unsupportedCases = []> : - I64EnumAttr { - // List of unsupported cases that have no conversion to an MLIR value. - list unsupported = unsupportedCases; - - // The equivalent enum class name in LLVM. - string llvmClassName = llvmName; -} - -// LLVM_CEnumAttr is functionally identical to LLVM_EnumAttr, but to be used for -// non-class enums. -class LLVM_CEnumAttr cases> : - I64EnumAttr { - string llvmClassName = llvmNS; -} - //===----------------------------------------------------------------------===// // AsmDialect //===----------------------------------------------------------------------===// diff --git a/mlir/include/mlir/Dialect/LLVMIR/Utils.td b/mlir/include/mlir/Dialect/LLVMIR/Utils.td new file mode 100644 index 0000000000000..6444aa4c4269b --- /dev/null +++ b/mlir/include/mlir/Dialect/LLVMIR/Utils.td @@ -0,0 +1,71 @@ +//===-- Utils.td - MLIR LLVM IR utilities file -------------*- 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 +// +//===----------------------------------------------------------------------===// +// +// This file contains utilities to map from MLIR LLVM IR dialect to LLVM IR. +// +//===----------------------------------------------------------------------===// + +#ifndef MLIR_DIALECT_LLVMIR_UTILS_TD +#define MLIR_DIALECT_LLVMIR_UTILS_TD + +include "mlir/IR/EnumAttr.td" + +//===----------------------------------------------------------------------===// +// Base classes for LLVM enum attributes. +//===----------------------------------------------------------------------===// + +// Case of the LLVM enum attribute backed by I64Attr with customized string +// representation that corresponds to what is visible in the textual IR form. +// The parameters are as follows: +// - `cppSym`: name of the C++ enumerant for this case in MLIR API; +// - `irSym`: keyword used in the custom form of MLIR operation; +// - `llvmSym`: name of the C++ enumerant for this case in LLVM API. +// For example, `LLVM_EnumAttrCase<"Weak", "weak", "WeakAnyLinkage">` is usable +// as `::Weak` in MLIR API, `WeakAnyLinkage` in LLVM API and +// is printed/parsed as `weak` in MLIR custom textual format. +class LLVM_EnumAttrCase : + I64EnumAttrCase { + // The name of the equivalent enumerant in LLVM. + string llvmEnumerant = llvmSym; +} + +// LLVM enum attribute backed by I64Attr with string representation +// corresponding to what is visible in the textual IR form. +// The parameters are as follows: +// - `name`: name of the C++ enum class in MLIR API; +// - `llvmName`: name of the C++ enum in LLVM API; +// - `description`: textual description for documentation purposes; +// - `cases`: list of enum cases; +// - `unsupportedCases`: optional list of unsupported enum cases. +// For example, `LLVM_EnumAttr cases, + list unsupportedCases = []> : + I64EnumAttr { + // List of unsupported cases that have no conversion to an MLIR value. + list unsupported = unsupportedCases; + + // The equivalent enum class name in LLVM. + string llvmClassName = llvmName; +} + +// LLVM_CEnumAttr is functionally identical to LLVM_EnumAttr, but to be used for +// non-class enums. +class LLVM_CEnumAttr cases> : + I64EnumAttr { + string llvmClassName = llvmNS; +} + +#endif // MLIR_DIALECT_LLVMIR_UTILS_TD