Skip to content

Commit 046a1e6

Browse files
authored
[MLIR:LLVM] Add UWTableKind attribute (llvm#135811)
Add `UWTableKind` enum and corresponding attribute to `llvm.func` including translation to `llvm::Function` attribute.
1 parent 5c97397 commit 046a1e6

File tree

7 files changed

+57
-1
lines changed

7 files changed

+57
-1
lines changed

mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1365,4 +1365,13 @@ def LLVM_DependentLibrariesAttr
13651365
let assemblyFormat = "`<` $libs `>`";
13661366
}
13671367

1368+
//===----------------------------------------------------------------------===//
1369+
// UWTableKindAttr
1370+
//===----------------------------------------------------------------------===//
1371+
1372+
def UWTableKindAttr : LLVM_Attr<"UWTableKind", "uwtableKind"> {
1373+
let parameters = (ins "uwtable::UWTableKind":$uwtableKind);
1374+
let assemblyFormat = "`<` $uwtableKind `>`";
1375+
}
1376+
13681377
#endif // LLVMIR_ATTRDEFS

mlir/include/mlir/Dialect/LLVMIR/LLVMEnums.td

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -855,4 +855,25 @@ def ModFlagBehaviorAttr : LLVM_EnumAttr<
855855
let cppNamespace = "::mlir::LLVM";
856856
}
857857

858+
//===----------------------------------------------------------------------===//
859+
// UWTableKind
860+
//===----------------------------------------------------------------------===//
861+
862+
def UWTableKindNone
863+
: LLVM_EnumAttrCase<"None", "none", "None", 0>;
864+
def UWTableKindSync
865+
: LLVM_EnumAttrCase<"Sync", "sync", "Sync", 1>;
866+
def UWTableKindAsync
867+
: LLVM_EnumAttrCase<"Async", "async", "Async", 2>;
868+
869+
// UWTableKind::Default is unsupported as the llvm enum value is the same as async
870+
// which the generated enum converters can't deal with.
871+
def UWTableKindEnum : LLVM_EnumAttr<
872+
"UWTableKind",
873+
"::llvm::UWTableKind",
874+
"LLVM Unwind Behavior",
875+
[UWTableKindNone, UWTableKindSync, UWTableKindAsync]> {
876+
let cppNamespace = "::mlir::LLVM::uwtable";
877+
}
878+
858879
#endif // LLVMIR_ENUMS

mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1842,7 +1842,8 @@ def LLVM_LLVMFuncOp : LLVM_Op<"func", [
18421842
OptionalAttr<LLVM_VecTypeHintAttr>:$vec_type_hint,
18431843
OptionalAttr<DenseI32ArrayAttr>:$work_group_size_hint,
18441844
OptionalAttr<DenseI32ArrayAttr>:$reqd_work_group_size,
1845-
OptionalAttr<I32Attr>:$intel_reqd_sub_group_size
1845+
OptionalAttr<I32Attr>:$intel_reqd_sub_group_size,
1846+
OptionalAttr<UWTableKindAttr>:$uwtable_kind
18461847
);
18471848

18481849
let regions = (region AnyRegion:$body);

mlir/lib/Target/LLVMIR/ModuleImport.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2075,6 +2075,7 @@ static constexpr std::array kExplicitAttributes{
20752075
StringLiteral("target-features"),
20762076
StringLiteral("tune-cpu"),
20772077
StringLiteral("unsafe-fp-math"),
2078+
StringLiteral("uwtable"),
20782079
StringLiteral("vscale_range"),
20792080
StringLiteral("willreturn"),
20802081
};
@@ -2237,6 +2238,12 @@ void ModuleImport::processFunctionAttributes(llvm::Function *func,
22372238
if (llvm::Attribute attr = func->getFnAttribute("fp-contract");
22382239
attr.isStringAttribute())
22392240
funcOp.setFpContractAttr(StringAttr::get(context, attr.getValueAsString()));
2241+
2242+
if (func->hasUWTable()) {
2243+
::llvm::UWTableKind uwtableKind = func->getUWTableKind();
2244+
funcOp.setUwtableKindAttr(LLVM::UWTableKindAttr::get(
2245+
funcOp.getContext(), convertUWTableKindFromLLVM(uwtableKind)));
2246+
}
22402247
}
22412248

22422249
DictionaryAttr

mlir/lib/Target/LLVMIR/ModuleTranslation.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1602,6 +1602,9 @@ static void convertFunctionAttributes(LLVMFuncOp func,
16021602
if (FramePointerKindAttr fpAttr = func.getFramePointerAttr())
16031603
llvmFunc->addFnAttr("frame-pointer", stringifyFramePointerKind(
16041604
fpAttr.getFramePointerKind()));
1605+
if (UWTableKindAttr uwTableKindAttr = func.getUwtableKindAttr())
1606+
llvmFunc->setUWTableKind(
1607+
convertUWTableKindToLLVM(uwTableKindAttr.getUwtableKind()));
16051608
convertFunctionMemoryAttributes(func, llvmFunc);
16061609
}
16071610

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
; RUN: mlir-translate -import-llvm -split-input-file %s | FileCheck %s
2+
3+
; CHECK-LABEL: llvm.func @uwtable_func
4+
; CHECK-SAME: attributes {uwtable_kind = #llvm.uwtableKind<sync>}
5+
define void @uwtable_func() uwtable(sync) {
6+
ret void
7+
}

mlir/test/Target/LLVMIR/uwtable.mlir

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// RUN: mlir-translate -mlir-to-llvmir %s | FileCheck %s
2+
3+
// CHECK-LABEL: define void @uwtable_func()
4+
// CHECK-SAME: #[[ATTRS:[0-9]+]]
5+
llvm.func @uwtable_func() attributes {uwtable_kind = #llvm.uwtableKind<sync>} {
6+
llvm.return
7+
}
8+
// CHECK: attributes #[[ATTRS]] = { uwtable(sync) }

0 commit comments

Comments
 (0)