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 @@ -780,6 +780,17 @@ let cppNamespace = "::mlir::LLVM"; } +def UnnamedAddrNone : LLVM_EnumAttrCase<"None", "none", "None", 0>; +def UnnamedAddrLocal : LLVM_EnumAttrCase<"Local", "local", "Local", 1>; +def UnnamedAddrGlobal : LLVM_EnumAttrCase<"Global", "global", "Global", 2>; + +def UnnamedAddr : LLVM_EnumAttr< + "UnnamedAddr", + "::llvm::GlobalValue::UnnamedAddr", + "LLVM GlobalValue UnnamedAddr", + [UnnamedAddrNone, UnnamedAddrLocal, UnnamedAddrGlobal]> { + let cppNamespace = "::mlir::LLVM"; +} def LLVM_AddressOfOp : LLVM_Op<"mlir.addressof"> { let arguments = (ins FlatSymbolRefAttr:$global_name); @@ -896,7 +907,8 @@ StrAttr:$sym_name, Linkage:$linkage, OptionalAttr:$value, - DefaultValuedAttr, "0">:$addr_space + DefaultValuedAttr, "0">:$addr_space, + OptionalAttr:$unnamed_addr ); let summary = "LLVM dialect global."; let description = [{ diff --git a/mlir/lib/Target/LLVMIR/ConvertFromLLVMIR.cpp b/mlir/lib/Target/LLVMIR/ConvertFromLLVMIR.cpp --- a/mlir/lib/Target/LLVMIR/ConvertFromLLVMIR.cpp +++ b/mlir/lib/Target/LLVMIR/ConvertFromLLVMIR.cpp @@ -487,6 +487,9 @@ return nullptr; b.create(op.getLoc(), ArrayRef({v})); } + if (GV->hasAtLeastLocalUnnamedAddr()) + op.unnamed_addrAttr(UnnamedAddrAttr::get( + context, convertUnnamedAddrFromLLVM(GV->getUnnamedAddr()))); return globals[GV] = op; } 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 @@ -407,6 +407,10 @@ op.sym_name(), /*InsertBefore=*/nullptr, llvm::GlobalValue::NotThreadLocal, addrSpace); + if (op.unnamed_addr().hasValue()) { + var->setUnnamedAddr(convertUnnamedAddrToLLVM(*op.unnamed_addr())); + } + globalsMapping.try_emplace(op, var); } diff --git a/mlir/test/Dialect/LLVMIR/global.mlir b/mlir/test/Dialect/LLVMIR/global.mlir --- a/mlir/test/Dialect/LLVMIR/global.mlir +++ b/mlir/test/Dialect/LLVMIR/global.mlir @@ -63,6 +63,9 @@ llvm.return } +// CHECK: llvm.mlir.global private constant @foo(42 : i64) {unnamed_addr = 0 : i64} : i64 +llvm.mlir.global private constant @foo(42 : i64) {unnamed_addr = 0 : i64} : i64 + // ----- // expected-error @+1 {{requires string attribute 'sym_name'}}