[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