[Mlir-commits] [mlir] [MLIR:LLVM] Add UWTableKind attribute (PR #135811)
Will Froom
llvmlistbot at llvm.org
Wed Apr 16 02:11:05 PDT 2025
https://github.com/WillFroom updated https://github.com/llvm/llvm-project/pull/135811
>From 0a2695d06d0e9dd643a0deb188c5feee3410ee28 Mon Sep 17 00:00:00 2001
From: Will Froom <willfroom at google.com>
Date: Tue, 15 Apr 2025 16:11:11 +0000
Subject: [PATCH] [MLIR:LLVM] Add UWTableKind attribute
---
.../mlir/Dialect/LLVMIR/LLVMAttrDefs.td | 10 +++++++++
mlir/include/mlir/Dialect/LLVMIR/LLVMEnums.td | 21 +++++++++++++++++++
mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td | 3 ++-
mlir/lib/Target/LLVMIR/ModuleImport.cpp | 7 +++++++
mlir/lib/Target/LLVMIR/ModuleTranslation.cpp | 3 +++
mlir/test/Target/LLVMIR/Import/uwtable.ll | 8 +++++++
mlir/test/Target/LLVMIR/uwtable.mlir | 8 +++++++
7 files changed, 59 insertions(+), 1 deletion(-)
create mode 100644 mlir/test/Target/LLVMIR/Import/uwtable.ll
create mode 100644 mlir/test/Target/LLVMIR/uwtable.mlir
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td
index 690243525ede4..e2bea7f8d3d23 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td
@@ -1365,4 +1365,14 @@ def LLVM_DependentLibrariesAttr
let assemblyFormat = "`<` $libs `>`";
}
+//===----------------------------------------------------------------------===//
+// UWTableKindAttr
+//===----------------------------------------------------------------------===//
+
+def UWTableKindAttr : LLVM_Attr<"UWTableKind", "uwtableKind"> {
+ let parameters = (ins "uwtable::UWTableKind":$uwtableKind);
+ let assemblyFormat = "`<` $uwtableKind `>`";
+}
+
+
#endif // LLVMIR_ATTRDEFS
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMEnums.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMEnums.td
index 34a30a00790ea..45ccf30644920 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMEnums.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMEnums.td
@@ -855,4 +855,25 @@ def ModFlagBehaviorAttr : LLVM_EnumAttr<
let cppNamespace = "::mlir::LLVM";
}
+//===----------------------------------------------------------------------===//
+// UWTableKind
+//===----------------------------------------------------------------------===//
+
+def UWTableKindNone
+ : LLVM_EnumAttrCase<"None", "none", "None", 0>;
+def UWTableKindSync
+ : LLVM_EnumAttrCase<"Sync", "sync", "Sync", 1>;
+def UWTableKindAsync
+ : LLVM_EnumAttrCase<"Async", "async", "Async", 2>;
+
+// UWTableKind::Default is unsupported as the llvm enum value is the same as async
+// which the generated enum converters can't deal with.
+def UWTableKindEnum : LLVM_EnumAttr<
+ "UWTableKind",
+ "::llvm::UWTableKind",
+ "LLVM Unwind Behavior",
+ [UWTableKindNone, UWTableKindSync, UWTableKindAsync]> {
+ let cppNamespace = "::mlir::LLVM::uwtable";
+}
+
#endif // LLVMIR_ENUMS
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
index e89e78aec7147..76a2ec47b3a22 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
@@ -1842,7 +1842,8 @@ def LLVM_LLVMFuncOp : LLVM_Op<"func", [
OptionalAttr<LLVM_VecTypeHintAttr>:$vec_type_hint,
OptionalAttr<DenseI32ArrayAttr>:$work_group_size_hint,
OptionalAttr<DenseI32ArrayAttr>:$reqd_work_group_size,
- OptionalAttr<I32Attr>:$intel_reqd_sub_group_size
+ OptionalAttr<I32Attr>:$intel_reqd_sub_group_size,
+ OptionalAttr<UWTableKindAttr>:$uwtable_kind
);
let regions = (region AnyRegion:$body);
diff --git a/mlir/lib/Target/LLVMIR/ModuleImport.cpp b/mlir/lib/Target/LLVMIR/ModuleImport.cpp
index 8e7a7ab95b6b6..ec64f5008b23d 100644
--- a/mlir/lib/Target/LLVMIR/ModuleImport.cpp
+++ b/mlir/lib/Target/LLVMIR/ModuleImport.cpp
@@ -2077,6 +2077,7 @@ static constexpr std::array kExplicitAttributes{
StringLiteral("unsafe-fp-math"),
StringLiteral("vscale_range"),
StringLiteral("willreturn"),
+ StringLiteral("uwtable"),
};
static void processPassthroughAttrs(llvm::Function *func, LLVMFuncOp funcOp) {
@@ -2237,6 +2238,12 @@ void ModuleImport::processFunctionAttributes(llvm::Function *func,
if (llvm::Attribute attr = func->getFnAttribute("fp-contract");
attr.isStringAttribute())
funcOp.setFpContractAttr(StringAttr::get(context, attr.getValueAsString()));
+
+ if (func->hasUWTable()) {
+ ::llvm::UWTableKind uwtableKind = func->getUWTableKind();
+ funcOp.setUwtableKindAttr(LLVM::UWTableKindAttr::get(
+ funcOp.getContext(), convertUWTableKindFromLLVM(uwtableKind)));
+ }
}
DictionaryAttr
diff --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
index ee7dc3a5231f4..d39ec0e801437 100644
--- a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
@@ -1602,6 +1602,9 @@ static void convertFunctionAttributes(LLVMFuncOp func,
if (FramePointerKindAttr fpAttr = func.getFramePointerAttr())
llvmFunc->addFnAttr("frame-pointer", stringifyFramePointerKind(
fpAttr.getFramePointerKind()));
+ if (UWTableKindAttr uwTableKindAttr = func.getUwtableKindAttr())
+ llvmFunc->setUWTableKind(
+ convertUWTableKindToLLVM(uwTableKindAttr.getUwtableKind()));
convertFunctionMemoryAttributes(func, llvmFunc);
}
diff --git a/mlir/test/Target/LLVMIR/Import/uwtable.ll b/mlir/test/Target/LLVMIR/Import/uwtable.ll
new file mode 100644
index 0000000000000..c4083c100263b
--- /dev/null
+++ b/mlir/test/Target/LLVMIR/Import/uwtable.ll
@@ -0,0 +1,8 @@
+; RUN: mlir-translate -import-llvm -split-input-file %s | FileCheck %s
+
+; CHECK-LABEL: llvm.func @uwtable_func
+; CHECK-SAME: attributes {uwtable_kind = #llvm.uwtableKind<sync>}
+
+define void @uwtable_func() uwtable(sync) {
+ ret void
+}
diff --git a/mlir/test/Target/LLVMIR/uwtable.mlir b/mlir/test/Target/LLVMIR/uwtable.mlir
new file mode 100644
index 0000000000000..3e1d5b566f01b
--- /dev/null
+++ b/mlir/test/Target/LLVMIR/uwtable.mlir
@@ -0,0 +1,8 @@
+// RUN: mlir-translate -mlir-to-llvmir %s | FileCheck %s
+
+// CHECK-LABEL: define void @uwtable_func()
+// CHECK-SAME: #[[ATTRS:[0-9]+]]
+llvm.func @uwtable_func() attributes {uwtable_kind = #llvm.uwtableKind<"sync">} {
+ llvm.return
+}
+// CHECK: attributes #[[ATTRS]] = { uwtable(sync) }
More information about the Mlir-commits
mailing list