[Mlir-commits] [mlir] [mlir][llvm] Add `LLVM_DependentLibrariesAttr` (PR #133385)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Fri Mar 28 00:00:09 PDT 2025
https://github.com/el-ev created https://github.com/llvm/llvm-project/pull/133385
https://llvm.org/docs/LangRef.html#dependent-libs-named-metadata
>From d8be3e5cf8fbf8f8c5ed8031f0a731ee4c57bf12 Mon Sep 17 00:00:00 2001
From: Iris Shi <0.0 at owo.li>
Date: Fri, 28 Mar 2025 14:58:06 +0800
Subject: [PATCH] [mlir][llvm] Add `LLVM_DependentLibrariesAttr`
---
.../mlir/Dialect/LLVMIR/LLVMAttrDefs.td | 15 ++++++++++++++
.../mlir/Dialect/LLVMIR/LLVMDialect.td | 5 +++++
.../include/mlir/Target/LLVMIR/ModuleImport.h | 4 ++++
mlir/lib/Target/LLVMIR/ModuleImport.cpp | 20 +++++++++++++++++++
mlir/lib/Target/LLVMIR/ModuleTranslation.cpp | 12 +++++++++++
.../Import/metadata-dependent-libraries.ll | 6 ++++++
mlir/test/Target/LLVMIR/llvmir.mlir | 8 ++++++++
7 files changed, 70 insertions(+)
create mode 100644 mlir/test/Target/LLVMIR/Import/metadata-dependent-libraries.ll
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td
index 41c30b81770bc..2beb15d1f074c 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td
@@ -1327,4 +1327,19 @@ def ModuleFlagAttr
let assemblyFormat = "`<` $behavior `,` $key `,` $value `>`";
}
+//===----------------------------------------------------------------------===//
+// LLVM_DependentLibrariesAttr
+//===----------------------------------------------------------------------===//
+def LLVM_DependentLibrariesAttr
+ : LLVM_Attr<"DependentLibraries", "dependent_libraries"> {
+ let summary = "LLVM dependent libraries attribute";
+ let description = [{
+ Represents the list of dependent libraries for the current module.
+ This attribute is used to specify the libraries that the module depends
+ on, and it can be used for linking purposes.
+ }];
+ let parameters = (ins OptionalArrayRefParameter<"StringAttr">:$libs);
+ let assemblyFormat = "`<` $libs `>`";
+}
+
#endif // LLVMIR_ATTRDEFS
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMDialect.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMDialect.td
index 46fae44f7b0fa..7f8b3aa833a37 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMDialect.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMDialect.td
@@ -83,6 +83,11 @@ def LLVM_Dialect : Dialect {
return "llvm.emit_c_interface";
}
+ /// Name of the dependent libraries attribute.
+ static StringRef getDependentLibrariesAttrName() {
+ return "llvm.dependent_libraries";
+ }
+
/// Returns `true` if the given type is compatible with the LLVM dialect.
static bool isCompatibleType(Type);
diff --git a/mlir/include/mlir/Target/LLVMIR/ModuleImport.h b/mlir/include/mlir/Target/LLVMIR/ModuleImport.h
index 3b164927d41fd..3dc848c413905 100644
--- a/mlir/include/mlir/Target/LLVMIR/ModuleImport.h
+++ b/mlir/include/mlir/Target/LLVMIR/ModuleImport.h
@@ -229,6 +229,10 @@ class ModuleImport {
/// attribute.
LogicalResult convertCommandlineMetadata();
+ /// Converts !llvm.dependent-libraries metadata to llvm.dependent_libraries
+ /// LLVM ModuleOp attribute.
+ LogicalResult convertDependentLibrariesMetadata();
+
/// Converts all LLVM metadata nodes that translate to attributes such as
/// alias analysis or access group metadata, and builds a map from the
/// metadata nodes to the converted attributes.
diff --git a/mlir/lib/Target/LLVMIR/ModuleImport.cpp b/mlir/lib/Target/LLVMIR/ModuleImport.cpp
index c0711f7dded71..4d7d537c7001c 100644
--- a/mlir/lib/Target/LLVMIR/ModuleImport.cpp
+++ b/mlir/lib/Target/LLVMIR/ModuleImport.cpp
@@ -563,6 +563,24 @@ LogicalResult ModuleImport::convertLinkerOptionsMetadata() {
return success();
}
+LogicalResult ModuleImport::convertDependentLibrariesMetadata() {
+ for (const llvm::NamedMDNode &named : llvmModule->named_metadata()) {
+ if (named.getName() != "llvm.dependent-libraries")
+ continue;
+ SmallVector<StringRef> libraries;
+ for (const llvm::MDNode *node : named.operands()) {
+ if (node->getNumOperands() == 1)
+ if (auto *mdString =
+ llvm::dyn_cast<llvm::MDString>(node->getOperand(0)))
+ libraries.push_back(mdString->getString());
+ }
+ if (!libraries.empty())
+ mlirModule->setAttr(LLVM::LLVMDialect::getDependentLibrariesAttrName(),
+ builder.getStrArrayAttr(libraries));
+ }
+ return success();
+}
+
LogicalResult ModuleImport::convertIdentMetadata() {
for (const llvm::NamedMDNode &named : llvmModule->named_metadata()) {
// llvm.ident should have a single operand. That operand is itself an
@@ -625,6 +643,8 @@ LogicalResult ModuleImport::convertMetadata() {
}
if (failed(convertLinkerOptionsMetadata()))
return failure();
+ if (failed(convertDependentLibrariesMetadata()))
+ return failure();
if (failed(convertModuleFlagsMetadata()))
return failure();
if (failed(convertIdentMetadata()))
diff --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
index 1e2f2c0468045..9bc3ed1860795 100644
--- a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
@@ -2157,6 +2157,18 @@ prepareLLVMModule(Operation *m, llvm::LLVMContext &llvmContext,
m->getDiscardableAttr(LLVM::LLVMDialect::getTargetTripleAttrName()))
llvmModule->setTargetTriple(
llvm::Triple(cast<StringAttr>(targetTripleAttr).getValue()));
+ if (auto dependentLibrariesAttr = m->getDiscardableAttr(
+ LLVM::LLVMDialect::getDependentLibrariesAttrName())) {
+ auto *NMD =
+ llvmModule->getOrInsertNamedMetadata("llvm.dependent-libraries");
+ for (auto lib : cast<ArrayAttr>(dependentLibrariesAttr)) {
+ auto *MD = llvm::MDNode::get(
+ llvmContext,
+ llvm::MDString::get(llvmContext,
+ mlir::cast<StringAttr>(lib).getValue()));
+ NMD->addOperand(MD);
+ }
+ }
return llvmModule;
}
diff --git a/mlir/test/Target/LLVMIR/Import/metadata-dependent-libraries.ll b/mlir/test/Target/LLVMIR/Import/metadata-dependent-libraries.ll
new file mode 100644
index 0000000000000..4a6d438046a36
--- /dev/null
+++ b/mlir/test/Target/LLVMIR/Import/metadata-dependent-libraries.ll
@@ -0,0 +1,6 @@
+; RUN: mlir-translate -import-llvm %s | FileCheck %s
+
+; CHECK: llvm.dependent_libraries = ["foo", "bar"]
+!llvm.dependent-libraries = !{!0, !1}
+!0 = !{!"foo"}
+!1 = !{!"bar"}
diff --git a/mlir/test/Target/LLVMIR/llvmir.mlir b/mlir/test/Target/LLVMIR/llvmir.mlir
index 0238c95835a0f..21d50531c5083 100644
--- a/mlir/test/Target/LLVMIR/llvmir.mlir
+++ b/mlir/test/Target/LLVMIR/llvmir.mlir
@@ -2796,6 +2796,14 @@ module {
// -----
+module attributes {llvm.dependent_libraries = ["foo", "bar"]} {}
+
+// CHECK: !llvm.dependent-libraries = !{![[#LIBFOO:]], ![[#LIBBAR:]]}
+// CHECK: ![[#LIBFOO]] = !{!"foo"}
+// CHECK: ![[#LIBBAR]] = !{!"bar"}
+
+// -----
+
llvm.mlir.global external constant @const() {addr_space = 0 : i32, dso_local} : i32 {
%0 = llvm.mlir.addressof @const : !llvm.ptr
%1 = llvm.ptrtoint %0 : !llvm.ptr to i64
More information about the Mlir-commits
mailing list