def FMFreassoc : BitEnumAttrCase<"reassoc", 0x40>;
def FMFfast : BitEnumAttrCase<"fast", 0x80>;
-def FastmathFlags : BitEnumAttr<
+def FastmathFlags_DoNotUse : BitEnumAttr<
"FastmathFlags",
"LLVM fastmath flags",
[FMFnnan, FMFninf, FMFnsz, FMFarcp, FMFcontract, FMFafn, FMFreassoc, FMFfast
def LinkageExternal
: LLVM_EnumAttrCase<"External", "external", "ExternalLinkage", 10>;
-def Linkage : LLVM_EnumAttr<
+def LinkageEnum : LLVM_EnumAttr<
"Linkage",
"::llvm::GlobalValue::LinkageTypes",
"LLVM linkage types",
[LinkagePrivate, LinkageInternal, LinkageAvailableExternally,
LinkageLinkonce, LinkageWeak, LinkageCommon, LinkageAppending,
LinkageExternWeak, LinkageLinkonceODR, LinkageWeakODR, LinkageExternal]> {
- let cppNamespace = "::mlir::LLVM";
+ let cppNamespace = "::mlir::LLVM::linkage";
+}
+
+def Linkage : DialectAttr<
+ LLVM_Dialect,
+ CPred<"$_self.isa<::mlir::LLVM::LinkageAttr>()">,
+ "LLVM Linkage specification"> {
+ let storageType = "::mlir::LLVM::LinkageAttr";
+ let returnType = "::mlir::LLVM::Linkage";
+ let convertFromStorage = "$_self.getLinkage()";
+ let constBuilderCall =
+ "::mlir::LLVM::LinkageAttr::get($_builder.getContext(), $0)";
}
+
def UnnamedAddrNone : LLVM_EnumAttrCase<"None", "", "None", 0>;
def UnnamedAddrLocal : LLVM_EnumAttrCase<"Local", "local_unnamed_addr", "Local", 1>;
def UnnamedAddrGlobal : LLVM_EnumAttrCase<"Global", "unnamed_addr", "Global", 2>;
using namespace mlir;
using namespace mlir::LLVM;
+using mlir::LLVM::linkage::getMaxEnumValForLinkage;
#include "mlir/Dialect/LLVMIR/LLVMOpsDialect.cpp.inc"
result.addAttribute("alignment", builder.getI64IntegerAttr(alignment));
result.addAttribute(getLinkageAttrName(),
- builder.getI64IntegerAttr(static_cast<int64_t>(linkage)));
+ LinkageAttr::get(builder.getContext(), linkage));
if (addrSpace != 0)
result.addAttribute("addr_space", builder.getI32IntegerAttr(addrSpace));
result.attributes.append(attrs.begin(), attrs.end());
REGISTER_ENUM_TYPE(UnnamedAddr);
} // end namespace
-template <typename EnumTy>
-static ParseResult parseOptionalLLVMKeyword(OpAsmParser &parser,
- OperationState &result,
- StringRef name) {
+/// Parse an enum from the keyword, or default to the provided default value.
+/// The return type is the enum type by default, unless overriden with the
+/// second template argument.
+template <typename EnumTy, typename RetTy = EnumTy>
+static RetTy parseOptionalLLVMKeyword(OpAsmParser &parser,
+ OperationState &result,
+ EnumTy defaultValue) {
SmallVector<StringRef, 10> names;
- for (unsigned i = 0, e = getMaxEnumValForLinkage(); i <= e; ++i)
+ for (unsigned i = 0, e = EnumTraits<EnumTy>::getMaxEnumVal(); i <= e; ++i)
names.push_back(EnumTraits<EnumTy>::stringify(static_cast<EnumTy>(i)));
int index = parseOptionalKeywordAlternative(parser, names);
if (index == -1)
- return failure();
- result.addAttribute(name, parser.getBuilder().getI64IntegerAttr(index));
- return success();
+ return static_cast<RetTy>(defaultValue);
+ return static_cast<RetTy>(index);
}
// operation ::= `llvm.mlir.global` linkage? `constant`? `@` identifier
// The type can be omitted for string attributes, in which case it will be
// inferred from the value of the string as [strlen(value) x i8].
static ParseResult parseGlobalOp(OpAsmParser &parser, OperationState &result) {
- if (failed(parseOptionalLLVMKeyword<Linkage>(parser, result,
- getLinkageAttrName())))
- result.addAttribute(getLinkageAttrName(),
- parser.getBuilder().getI64IntegerAttr(
- static_cast<int64_t>(LLVM::Linkage::External)));
-
- if (failed(parseOptionalLLVMKeyword<UnnamedAddr>(parser, result,
- getUnnamedAddrAttrName())))
- result.addAttribute(getUnnamedAddrAttrName(),
- parser.getBuilder().getI64IntegerAttr(
- static_cast<int64_t>(LLVM::UnnamedAddr::None)));
+ MLIRContext *ctx = parser.getBuilder().getContext();
+ // Parse optional linkage, default to External.
+ result.addAttribute(getLinkageAttrName(),
+ LLVM::LinkageAttr::get(
+ ctx, parseOptionalLLVMKeyword<Linkage>(
+ parser, result, LLVM::Linkage::External)));
+ // Parse optional UnnamedAddr, default to None.
+ result.addAttribute(getUnnamedAddrAttrName(),
+ parser.getBuilder().getI64IntegerAttr(
+ parseOptionalLLVMKeyword<UnnamedAddr, int64_t>(
+ parser, result, LLVM::UnnamedAddr::None)));
if (succeeded(parser.parseOptionalKeyword("constant")))
result.addAttribute("constant", parser.getBuilder().getUnitAttr());
builder.getStringAttr(name));
result.addAttribute("type", TypeAttr::get(type));
result.addAttribute(getLinkageAttrName(),
- builder.getI64IntegerAttr(static_cast<int64_t>(linkage)));
+ LinkageAttr::get(builder.getContext(), linkage));
result.attributes.append(attrs.begin(), attrs.end());
if (dsoLocal)
result.addAttribute("dso_local", builder.getUnitAttr());
static ParseResult parseLLVMFuncOp(OpAsmParser &parser,
OperationState &result) {
// Default to external linkage if no keyword is provided.
- if (failed(parseOptionalLLVMKeyword<Linkage>(parser, result,
- getLinkageAttrName())))
- result.addAttribute(getLinkageAttrName(),
- parser.getBuilder().getI64IntegerAttr(
- static_cast<int64_t>(LLVM::Linkage::External)));
+ result.addAttribute(
+ getLinkageAttrName(),
+ LinkageAttr::get(parser.getBuilder().getContext(),
+ parseOptionalLLVMKeyword<Linkage>(
+ parser, result, LLVM::Linkage::External)));
StringAttr nameAttr;
SmallVector<OpAsmParser::OperandType, 8> entryArgs;
//===----------------------------------------------------------------------===//
void LLVMDialect::initialize() {
- addAttributes<FMFAttr, LoopOptionsAttr>();
+ addAttributes<FMFAttr, LinkageAttr, LoopOptionsAttr>();
// clang-format off
addTypes<LLVMVoidType,
return FMFAttr::get(parser.getBuilder().getContext(), flags);
}
+void LinkageAttr::print(DialectAsmPrinter &printer) const {
+ printer << "linkage<";
+ if (static_cast<uint64_t>(getLinkage()) <= getMaxEnumValForLinkage())
+ printer << stringifyEnum(getLinkage());
+ else
+ printer << static_cast<uint64_t>(getLinkage());
+ printer << ">";
+}
+
+Attribute LinkageAttr::parse(MLIRContext *context, DialectAsmParser &parser,
+ Type type) {
+ StringRef elemName;
+ if (parser.parseLess() || parser.parseKeyword(&elemName) ||
+ parser.parseGreater())
+ return {};
+ auto elem = linkage::symbolizeLinkage(elemName);
+ if (!elem) {
+ parser.emitError(parser.getNameLoc(), "Unknown linkage: ") << elemName;
+ return {};
+ }
+ Linkage linkage = *elem;
+ return LinkageAttr::get(context, linkage);
+}
+
LoopOptionsAttrBuilder::LoopOptionsAttrBuilder(LoopOptionsAttr attr)
: options(attr.getOptions().begin(), attr.getOptions().end()) {}