[llvm] [llvm][dwarfdump] Pretty-print DW_AT_language_version in non-verbose dwarfdump (PR #164222)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 20 02:05:08 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-debuginfo
Author: Michael Buch (Michael137)
<details>
<summary>Changes</summary>
In non-verbose mode we will now use the `llvm::dwarf::LanguageDescription` to turn the version into a human readable string. In verbose mode we still display the raw version code.
Before:
```
0x0000000c: DW_TAG_compile_unit
DW_AT_language_name (DW_LNAME_C)
DW_AT_language_version (201112)
```
After:
```
0x0000000c: DW_TAG_compile_unit
DW_AT_language_name (DW_LNAME_C)
DW_AT_language_version (C11)
```
---
Full diff: https://github.com/llvm/llvm-project/pull/164222.diff
3 Files Affected:
- (modified) llvm/lib/DebugInfo/DWARF/DWARFDie.cpp (+24-1)
- (added) llvm/test/tools/llvm-dwarfdump/X86/DW_AT_language_version-pretty.s (+32)
- (modified) llvm/test/tools/llvm-dwarfdump/X86/DW_AT_language_version.s (+13-8)
``````````diff
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
index 212a0c039298b..5c4fbfad4e8d5 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
@@ -107,6 +107,27 @@ static DWARFDie resolveReferencedType(DWARFDie D, DWARFFormValue F) {
return D.getAttributeValueAsReferencedDie(F).resolveTypeUnitReference();
}
+static llvm::StringRef
+prettyLanguageVersionString(const DWARFAttribute &AttrValue,
+ const DWARFDie &Die) {
+ assert(AttrValue.Attr == DW_AT_language_version);
+
+ auto NameForm = Die.find(DW_AT_language_name);
+ if (!NameForm)
+ return {};
+
+ auto LName = NameForm->getAsUnsignedConstant();
+ if (!LName)
+ return {};
+
+ auto LVersion = AttrValue.Value.getAsUnsignedConstant();
+ if (!LVersion)
+ return {};
+
+ return llvm::dwarf::LanguageDescription(
+ static_cast<SourceLanguageName>(*LName), *LVersion);
+}
+
static void dumpAttribute(raw_ostream &OS, const DWARFDie &Die,
const DWARFAttribute &AttrValue, unsigned Indent,
DIDumpOptions DumpOpts) {
@@ -143,7 +164,9 @@ static void dumpAttribute(raw_ostream &OS, const DWARFDie &Die,
}
}
}
- } else if (std::optional<uint64_t> Val = FormValue.getAsUnsignedConstant())
+ } else if (Attr == llvm::dwarf::DW_AT_language_version && !DumpOpts.Verbose)
+ Name = prettyLanguageVersionString(AttrValue, Die);
+ else if (std::optional<uint64_t> Val = FormValue.getAsUnsignedConstant())
Name = AttributeValueString(Attr, *Val);
if (!Name.empty())
diff --git a/llvm/test/tools/llvm-dwarfdump/X86/DW_AT_language_version-pretty.s b/llvm/test/tools/llvm-dwarfdump/X86/DW_AT_language_version-pretty.s
new file mode 100644
index 0000000000000..f9986a9cf2fb0
--- /dev/null
+++ b/llvm/test/tools/llvm-dwarfdump/X86/DW_AT_language_version-pretty.s
@@ -0,0 +1,32 @@
+# Demonstrate dumping DW_AT_language_version in human-readable form.
+# RUN: llvm-mc -triple=x86_64--linux -filetype=obj < %s | \
+# RUN: llvm-dwarfdump - | FileCheck %s --implicit-check-not "DW_AT_language_version"
+
+# CHECK: .debug_info contents:
+# CHECK: DW_AT_language_name (DW_LNAME_C)
+# CHECK: DW_AT_language_version (C11)
+
+ .section .debug_abbrev,"", at progbits
+ .byte 1 # Abbreviation Code
+ .byte 17 # DW_TAG_compile_unit
+ .byte 1 # DW_CHILDREN_no
+ .ascii "\220\001" # DW_AT_language_name
+ .byte 5 # DW_FORM_data2
+ .ascii "\221\001" # DW_AT_language_version
+ .byte 6 # DW_FORM_data4
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 0 # EOM(3)
+
+ .section .debug_info,"", at progbits
+ .long .Ldebug_info_end0-.Ldebug_info_start0 # Length of Unit
+.Ldebug_info_start0:
+ .short 5 # DWARF version number
+ .byte 1 # Unit type
+ .byte 8 # Address Size (in bytes)
+ .long .debug_abbrev # Offset Into Abbrev. Section
+ .byte 1 # Abbrev [1] DW_TAG_compile_unit
+ .short 3 # DW_AT_language_name
+ .long 201112 # DW_AT_language_version
+ .byte 0
+.Ldebug_info_end0:
diff --git a/llvm/test/tools/llvm-dwarfdump/X86/DW_AT_language_version.s b/llvm/test/tools/llvm-dwarfdump/X86/DW_AT_language_version.s
index f1be8fdf6cd3e..e9bcfdedd346d 100644
--- a/llvm/test/tools/llvm-dwarfdump/X86/DW_AT_language_version.s
+++ b/llvm/test/tools/llvm-dwarfdump/X86/DW_AT_language_version.s
@@ -1,13 +1,18 @@
# Demonstrate dumping DW_AT_language_version.
-# RUN: llvm-mc -triple=x86_64--linux -filetype=obj < %s | \
-# RUN: llvm-dwarfdump -v - | FileCheck %s
+# RUN: llvm-mc -triple=x86_64--linux -filetype=obj -o %t.o < %s
+# RUN: llvm-dwarfdump -v %t.o | FileCheck %s --check-prefix=VERBOSE
+# RUN: llvm-dwarfdump %t.o | FileCheck %s --check-prefix=NO-VERBOSE
-# CHECK: .debug_abbrev contents:
-# CHECK: DW_AT_language_version DW_FORM_data4
-# CHECK: DW_AT_language_version DW_FORM_data2
-# CHECK: .debug_info contents:
-# CHECK: DW_AT_language_version [DW_FORM_data4] (201402)
-# CHECK: DW_AT_language_version [DW_FORM_data2] (0)
+# VERBOSE: .debug_abbrev contents:
+# VERBOSE: DW_AT_language_version DW_FORM_data4
+# VERBOSE: DW_AT_language_version DW_FORM_data2
+# VERBOSE: .debug_info contents:
+# VERBOSE: DW_AT_language_version [DW_FORM_data4] (201402)
+# VERBOSE: DW_AT_language_version [DW_FORM_data2] (0)
+
+# NO-VERBOSE: .debug_info contents:
+# NO-VERBOSE: DW_AT_language_version (201402)
+# NO-VERBOSE: DW_AT_language_version (0)
.section .debug_abbrev,"", at progbits
.byte 1 # Abbreviation Code
``````````
</details>
https://github.com/llvm/llvm-project/pull/164222
More information about the llvm-commits
mailing list