diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td --- a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td +++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td @@ -1644,7 +1644,8 @@ OptionalAttr:$memory, DefaultValuedAttr:$visibility_, OptionalAttr:$arm_streaming, - OptionalAttr:$arm_locally_streaming + OptionalAttr:$arm_locally_streaming, + OptionalAttr:$section ); let regions = (region AnyRegion:$body); diff --git a/mlir/lib/Target/LLVMIR/ModuleImport.cpp b/mlir/lib/Target/LLVMIR/ModuleImport.cpp --- a/mlir/lib/Target/LLVMIR/ModuleImport.cpp +++ b/mlir/lib/Target/LLVMIR/ModuleImport.cpp @@ -1738,6 +1738,9 @@ if (func->hasGC()) funcOp.setGarbageCollector(StringRef(func->getGC())); + if (func->hasSection()) + funcOp.setSection(StringRef(func->getSection())); + funcOp.setVisibility_(convertVisibilityFromLLVM(func->getVisibility())); if (func->hasComdat()) diff --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp --- a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp @@ -904,6 +904,9 @@ if (auto gc = func.getGarbageCollector()) llvmFunc->setGC(gc->str()); + if (std::optional section = func.getSection()) + llvmFunc->setSection(*section); + if (auto armStreaming = func.getArmStreaming()) llvmFunc->addFnAttr("aarch64_pstate_sm_enabled"); else if (auto armLocallyStreaming = func.getArmLocallyStreaming()) diff --git a/mlir/test/Target/LLVMIR/Import/function-attributes.ll b/mlir/test/Target/LLVMIR/Import/function-attributes.ll --- a/mlir/test/Target/LLVMIR/Import/function-attributes.ll +++ b/mlir/test/Target/LLVMIR/Import/function-attributes.ll @@ -209,3 +209,11 @@ define void @locally_streaming_func() "aarch64_pstate_sm_body" { ret void } + +// ----- + +; CHECK-LABEL: @section_func +; CHECK-SAME: attributes {section = ".section.name"} +define void @section_func() section ".section.name" { + ret void +} diff --git a/mlir/test/Target/LLVMIR/llvmir.mlir b/mlir/test/Target/LLVMIR/llvmir.mlir --- a/mlir/test/Target/LLVMIR/llvmir.mlir +++ b/mlir/test/Target/LLVMIR/llvmir.mlir @@ -1626,6 +1626,16 @@ llvm.return } +// ----- + +// CHECK-LABEL: @section_func +// CHECK-SAME: section ".section.name" +llvm.func @section_func() attributes { section = ".section.name" } { + llvm.return +} + +// ----- + // CHECK-LABEL: @callFreezeOp llvm.func @callFreezeOp(%x : i32) { // CHECK: freeze i32 %{{[0-9]+}}