[Mlir-commits] [mlir] [mlir][llvm] Add `LLVM_DependentLibrariesAttr` (PR #133385)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Fri Mar 28 19:42:41 PDT 2025
https://github.com/el-ev updated https://github.com/llvm/llvm-project/pull/133385
>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 1/5] [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
>From 7121a52bf62d586ced60676dec9ddcaeebbd7d9a Mon Sep 17 00:00:00 2001
From: Iris Shi <0.0 at owo.li>
Date: Fri, 28 Mar 2025 17:41:52 +0800
Subject: [PATCH 2/5] refactor
---
.../mlir/Dialect/LLVMIR/LLVMAttrDefs.td | 3 ++
.../mlir/Target/LLVMIR/ModuleTranslation.h | 3 ++
mlir/lib/Target/LLVMIR/ModuleTranslation.cpp | 30 +++++++++++--------
3 files changed, 24 insertions(+), 12 deletions(-)
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td
index 2beb15d1f074c..6a0408a643236 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td
@@ -1337,6 +1337,9 @@ def LLVM_DependentLibrariesAttr
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.
+
+ See the following links for more details:
+ https://llvm.org/docs/LangRef.html#dependent-libs-named-metadata
}];
let parameters = (ins OptionalArrayRefParameter<"StringAttr">:$libs);
let assemblyFormat = "`<` $libs `>`";
diff --git a/mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h b/mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h
index 01dda6238d8f3..99b1b65aeb6a5 100644
--- a/mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h
+++ b/mlir/include/mlir/Target/LLVMIR/ModuleTranslation.h
@@ -363,6 +363,9 @@ class ModuleTranslation {
/// Process the llvm.commandline LLVM Metadata, if it exists.
LogicalResult createCommandlineMetadata();
+ /// Process the llvm.dependent_libraries LLVM Metadata, if it exists.
+ LogicalResult createDependentLibrariesMetadata();
+
/// Translates dialect attributes attached to the given operation.
LogicalResult
convertDialectAttributes(Operation *op,
diff --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
index 9bc3ed1860795..f8a2a30bd27b8 100644
--- a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
@@ -2036,6 +2036,22 @@ LogicalResult ModuleTranslation::createCommandlineMetadata() {
return success();
}
+LogicalResult ModuleTranslation::createDependentLibrariesMetadata() {
+ if (auto dependentLibrariesAttr = mlirModule->getDiscardableAttr(
+ LLVM::LLVMDialect::getDependentLibrariesAttrName())) {
+ auto *nmd =
+ llvmModule->getOrInsertNamedMetadata("llvm.dependent-libraries");
+ llvm::LLVMContext &ctx = llvmModule->getContext();
+ for (auto lib : cast<ArrayAttr>(dependentLibrariesAttr)) {
+ auto *md = llvm::MDNode::get(
+ ctx,
+ llvm::MDString::get(ctx, mlir::cast<StringAttr>(lib).getValue()));
+ nmd->addOperand(md);
+ }
+ }
+ return success();
+}
+
void ModuleTranslation::setLoopMetadata(Operation *op,
llvm::Instruction *inst) {
LoopAnnotationAttr attr =
@@ -2157,18 +2173,6 @@ 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;
}
@@ -2213,6 +2217,8 @@ mlir::translateModuleToLLVMIR(Operation *module, llvm::LLVMContext &llvmContext,
return nullptr;
if (failed(translator.createCommandlineMetadata()))
return nullptr;
+ if (failed(translator.createDependentLibrariesMetadata()))
+ return nullptr;
// Convert other top-level operations if possible.
for (Operation &o : getModuleBody(module).getOperations()) {
>From af8b8e26002a9cdcfca4e78cada855ce4fc5dddc Mon Sep 17 00:00:00 2001
From: Iris <0.0 at owo.li>
Date: Sat, 29 Mar 2025 10:42:18 +0800
Subject: [PATCH 3/5] Update mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
Co-authored-by: Tobias Gysi <tobias.gysi at nextsilicon.com>
---
mlir/lib/Target/LLVMIR/ModuleTranslation.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
index f8a2a30bd27b8..3b75bd93c3a19 100644
--- a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
@@ -2042,7 +2042,7 @@ LogicalResult ModuleTranslation::createDependentLibrariesMetadata() {
auto *nmd =
llvmModule->getOrInsertNamedMetadata("llvm.dependent-libraries");
llvm::LLVMContext &ctx = llvmModule->getContext();
- for (auto lib : cast<ArrayAttr>(dependentLibrariesAttr)) {
+ for (auto libAttr : dependentLibrariesAttr.getAsRange<StringAttr>()) {
auto *md = llvm::MDNode::get(
ctx,
llvm::MDString::get(ctx, mlir::cast<StringAttr>(lib).getValue()));
>From 61780266c70b30d3915b8337f1abf60381cc6026 Mon Sep 17 00:00:00 2001
From: Iris <0.0 at owo.li>
Date: Sat, 29 Mar 2025 10:42:25 +0800
Subject: [PATCH 4/5] Update mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td
Co-authored-by: Tobias Gysi <tobias.gysi at nextsilicon.com>
---
mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td | 1 +
1 file changed, 1 insertion(+)
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td
index 6a0408a643236..549a37de2e412 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td
@@ -1330,6 +1330,7 @@ def ModuleFlagAttr
//===----------------------------------------------------------------------===//
// LLVM_DependentLibrariesAttr
//===----------------------------------------------------------------------===//
+
def LLVM_DependentLibrariesAttr
: LLVM_Attr<"DependentLibraries", "dependent_libraries"> {
let summary = "LLVM dependent libraries attribute";
>From 6728b3b45ecfd4c253a45f96aad476ea48b165d5 Mon Sep 17 00:00:00 2001
From: Iris <0.0 at owo.li>
Date: Sat, 29 Mar 2025 10:42:32 +0800
Subject: [PATCH 5/5] Update mlir/lib/Target/LLVMIR/ModuleImport.cpp
Co-authored-by: Tobias Gysi <tobias.gysi at nextsilicon.com>
---
mlir/lib/Target/LLVMIR/ModuleImport.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mlir/lib/Target/LLVMIR/ModuleImport.cpp b/mlir/lib/Target/LLVMIR/ModuleImport.cpp
index 4d7d537c7001c..59ae759bda7e1 100644
--- a/mlir/lib/Target/LLVMIR/ModuleImport.cpp
+++ b/mlir/lib/Target/LLVMIR/ModuleImport.cpp
@@ -571,7 +571,7 @@ LogicalResult ModuleImport::convertDependentLibrariesMetadata() {
for (const llvm::MDNode *node : named.operands()) {
if (node->getNumOperands() == 1)
if (auto *mdString =
- llvm::dyn_cast<llvm::MDString>(node->getOperand(0)))
+ dyn_cast<llvm::MDString>(node->getOperand(0)))
libraries.push_back(mdString->getString());
}
if (!libraries.empty())
More information about the Mlir-commits
mailing list