[Mlir-commits] [mlir] [mlir] Allow setting of Dwarf version information. (PR #158692)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Mon Sep 15 10:28:24 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-mlir

Author: Abid Qadeer (abidh)

<details>
<summary>Changes</summary>

The dwarf version to use can be set in the LLVM IR using the `Dwarf Version` flag. This PR allows setting this flag by using a new attribute on the module.

---
Full diff: https://github.com/llvm/llvm-project/pull/158692.diff


5 Files Affected:

- (modified) mlir/include/mlir/Dialect/LLVMIR/LLVMDialect.td (+2) 
- (modified) mlir/lib/Target/LLVMIR/DebugTranslation.cpp (+9-1) 
- (modified) mlir/lib/Target/LLVMIR/DebugTranslation.h (+1-1) 
- (modified) mlir/lib/Target/LLVMIR/ModuleTranslation.cpp (+1-1) 
- (modified) mlir/test/Target/LLVMIR/llvmir.mlir (+20) 


``````````diff
diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMDialect.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMDialect.td
index d2d71318a6118..542302131b31a 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMDialect.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMDialect.td
@@ -92,6 +92,8 @@ def LLVM_Dialect : Dialect {
     static StringRef getDependentLibrariesAttrName() {
       return "llvm.dependent_libraries";
     }
+    /// Name of the dwarf version attribute.
+    static StringRef getDwarfVersionAttrName() { return "llvm.dwarf_version"; }
 
     /// Names of known llvm module flag keys.
     static StringRef getModuleFlagKeyCGProfileName() {
diff --git a/mlir/lib/Target/LLVMIR/DebugTranslation.cpp b/mlir/lib/Target/LLVMIR/DebugTranslation.cpp
index a55445deddc2d..1e27d6192c1b9 100644
--- a/mlir/lib/Target/LLVMIR/DebugTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/DebugTranslation.cpp
@@ -36,8 +36,9 @@ DebugTranslation::DebugTranslation(Operation *module, llvm::Module &llvmModule)
 
 static constexpr StringRef kDebugVersionKey = "Debug Info Version";
 static constexpr StringRef kCodeViewKey = "CodeView";
+static constexpr StringRef kDwarfVersionKey = "Dwarf Version";
 
-void DebugTranslation::addModuleFlagsIfNotPresent() {
+void DebugTranslation::addModuleFlagsIfNotPresent(Operation *module) {
   // TODO: The version information should be encoded on the LLVM module itself,
   // not implicitly set here.
 
@@ -53,6 +54,13 @@ void DebugTranslation::addModuleFlagsIfNotPresent() {
     if (!llvmModule.getModuleFlag(kCodeViewKey))
       llvmModule.addModuleFlag(llvm::Module::Warning, kCodeViewKey, 1);
   }
+  if (auto attr = module->getAttrOfType<IntegerAttr>(
+          LLVM::LLVMDialect::getDwarfVersionAttrName())) {
+    int32_t attrValue = attr.getInt();
+    assert((attrValue >= 2 && attrValue <= 5) && "Unsupported DWARF version");
+    if (!llvmModule.getModuleFlag(kDwarfVersionKey))
+      llvmModule.addModuleFlag(llvm::Module::Max, kDwarfVersionKey, attrValue);
+  }
 }
 
 /// Translate the debug information for the given function.
diff --git a/mlir/lib/Target/LLVMIR/DebugTranslation.h b/mlir/lib/Target/LLVMIR/DebugTranslation.h
index b690d4820d7b0..9e89346ee9291 100644
--- a/mlir/lib/Target/LLVMIR/DebugTranslation.h
+++ b/mlir/lib/Target/LLVMIR/DebugTranslation.h
@@ -32,7 +32,7 @@ class DebugTranslation {
   DebugTranslation(Operation *module, llvm::Module &llvmModule);
 
   /// Adds the necessary module flags to the module, if not yet present.
-  void addModuleFlagsIfNotPresent();
+  void addModuleFlagsIfNotPresent(Operation *module);
 
   /// Translate the given location to an llvm debug location.
   llvm::DILocation *translateLoc(Location loc, llvm::DILocalScope *scope);
diff --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
index 9725359160a1a..4ff610379e53d 100644
--- a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
@@ -2418,7 +2418,7 @@ mlir::translateModuleToLLVMIR(Operation *module, llvm::LLVMContext &llvmContext,
 
   // Add the necessary debug info module flags, if they were not encoded in MLIR
   // beforehand.
-  translator.debugTranslation->addModuleFlagsIfNotPresent();
+  translator.debugTranslation->addModuleFlagsIfNotPresent(module);
 
   // Call the OpenMP IR Builder callbacks prior to verifying the module
   if (auto *ompBuilder = translator.getOpenMPBuilder())
diff --git a/mlir/test/Target/LLVMIR/llvmir.mlir b/mlir/test/Target/LLVMIR/llvmir.mlir
index 69814f2748e1d..860f1eb5b3502 100644
--- a/mlir/test/Target/LLVMIR/llvmir.mlir
+++ b/mlir/test/Target/LLVMIR/llvmir.mlir
@@ -3040,3 +3040,23 @@ llvm.mlir.global external @target_specific_attrs_only() {target_specific_attrs =
 // CHECK: @target_specific_attrs_combined = global i32 2, section "mysection", align 4 #[[ATTRS:[0-9]+]]
 // CHECK: attributes #[[ATTRS]] = { norecurse "bss-section"="my_bss.1" }
 llvm.mlir.global external @target_specific_attrs_combined(2 : i32) {alignment = 4 : i64, section = "mysection", target_specific_attrs = ["norecurse", ["bss-section", "my_bss.1"]]} : i32
+
+// -----
+
+module attributes {llvm.dwarf_version = 5 : i32} {}
+// CHECK: !{i32 7, !"Dwarf Version", i32 5}
+
+// -----
+
+module attributes {llvm.dwarf_version = 4 : i32} {}
+// CHECK: !{i32 7, !"Dwarf Version", i32 4}
+
+// -----
+
+module attributes {llvm.dwarf_version = 3 : i32} {}
+// CHECK: !{i32 7, !"Dwarf Version", i32 3}
+
+// -----
+
+module attributes {llvm.dwarf_version = 2 : i32} {}
+// CHECK: !{i32 7, !"Dwarf Version", i32 2}

``````````

</details>


https://github.com/llvm/llvm-project/pull/158692


More information about the Mlir-commits mailing list