[lld] [llvm] [llvm-readobj][ELF] Prints hex format addresses in lower-case mode (PR #156683)
Ádám Kallai via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 5 03:12:59 PDT 2025
https://github.com/kaadam updated https://github.com/llvm/llvm-project/pull/156683
>From 5d4ac87a186463f879881f4ad954694a9405fb59 Mon Sep 17 00:00:00 2001
From: Adam Kallai <kadam at inf.u-szeged.hu>
Date: Wed, 3 Sep 2025 16:16:26 +0200
Subject: [PATCH 1/4] [llvm-readobj][ELF] Print ELF e_entry in lowercase mode
Currently llvm-readobj prints e_entry address in uppercase mode,
however all other places such as symbols, relocs the addresses
are printed in lowercase mode. This PR aims to print the addresses
in uniform manner.
Other use-case:
FileCheck comparison is case-sensitive by default, so if you would
like to compare e_entry address with the same address in the symbol
table it won't match by default.
---
llvm/tools/llvm-readobj/ELFDumper.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp
index a440bad130f4c..79a6ce1fd88b8 100644
--- a/llvm/tools/llvm-readobj/ELFDumper.cpp
+++ b/llvm/tools/llvm-readobj/ELFDumper.cpp
@@ -3640,7 +3640,7 @@ template <class ELFT> void GNUELFDumper<ELFT>::printFileHeaders() {
printFields(OS, "Machine:", Str);
Str = "0x" + utohexstr(e.e_version);
printFields(OS, "Version:", Str);
- Str = "0x" + utohexstr(e.e_entry);
+ Str = "0x" + utohexstr(e.e_entry, /*LowerCase=*/true);
printFields(OS, "Entry point address:", Str);
Str = to_string(e.e_phoff) + " (bytes into file)";
printFields(OS, "Start of program headers:", Str);
>From 87b76e7796a7640b59becb410ce3d6b1512d1e5f Mon Sep 17 00:00:00 2001
From: Adam Kallai <kadam at inf.u-szeged.hu>
Date: Thu, 4 Sep 2025 09:46:11 +0200
Subject: [PATCH 2/4] Adjust hexagon test to the new lowercase format
---
lld/test/ELF/emulation-hexagon.s | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lld/test/ELF/emulation-hexagon.s b/lld/test/ELF/emulation-hexagon.s
index 5bdd88941c269..df692ef99ef5f 100644
--- a/lld/test/ELF/emulation-hexagon.s
+++ b/lld/test/ELF/emulation-hexagon.s
@@ -23,7 +23,7 @@
# CHECK-NEXT: Type: EXEC (Executable file)
# CHECK-NEXT: Machine: Qualcomm Hexagon
# CHECK-NEXT: Version: 0x1
-# CHECK-NEXT: Entry point address: 0x200B4
+# CHECK-NEXT: Entry point address: 0x200b4
# CHECK-NEXT: Start of program headers: 52 (bytes into file)
# CHECK-NEXT: Start of section headers:
# CHECK-NEXT: Flags: 0x73
>From 306fdec73ea5e6f277d612e9775ea621dd4dc82e Mon Sep 17 00:00:00 2001
From: Adam Kallai <kadam at inf.u-szeged.hu>
Date: Thu, 4 Sep 2025 16:08:37 +0200
Subject: [PATCH 3/4] Prints all addresses in lower-case format
Adjusted the related tests to the newer format.
---
.../llvm-readobj/ELF/AArch64/memtag.test | 14 +++++------
.../llvm-readobj/ELF/Sparc/elf-headers.test | 4 ++--
.../tools/llvm-readobj/ELF/file-types.test | 10 ++++----
.../tools/llvm-readobj/ELF/note-freebsd.test | 4 ++--
.../tools/llvm-readobj/ELF/section-types.test | 10 ++++----
llvm/tools/llvm-readobj/ELFDumper.cpp | 23 ++++++++++---------
6 files changed, 33 insertions(+), 32 deletions(-)
diff --git a/llvm/test/tools/llvm-readobj/ELF/AArch64/memtag.test b/llvm/test/tools/llvm-readobj/ELF/AArch64/memtag.test
index 213eeed9f3a0a..b5223ec0433fc 100644
--- a/llvm/test/tools/llvm-readobj/ELF/AArch64/memtag.test
+++ b/llvm/test/tools/llvm-readobj/ELF/AArch64/memtag.test
@@ -195,13 +195,13 @@
## - ULEB-encoded value: 0x01
# LLVM-OK: Memtag Global Descriptors: [
-# LLVM-OK-NEXT: 0xDEAD0000: 0x10
-# LLVM-OK-NEXT: 0xDEAD0010: 0x20
-# LLVM-OK-NEXT: 0xDEAD0100: 0x40
-# LLVM-OK-NEXT: 0xDEADF000: 0x1000
-# LLVM-OK-NEXT: 0xDEAE0000: 0x10
-# LLVM-OK-NEXT: 0xDEAE0010: 0x10
-# LLVM-OK-NEXT: 0xDEAE0020: 0x10
+# LLVM-OK-NEXT: 0xdead0000: 0x10
+# LLVM-OK-NEXT: 0xdead0010: 0x20
+# LLVM-OK-NEXT: 0xdead0100: 0x40
+# LLVM-OK-NEXT: 0xdeadf000: 0x1000
+# LLVM-OK-NEXT: 0xdeae0000: 0x10
+# LLVM-OK-NEXT: 0xdeae0010: 0x10
+# LLVM-OK-NEXT: 0xdeae0020: 0x10
# LLVM-OK-NEXT: ]
# GNU-OK: Memtag Global Descriptors:
# GNU-OK-NEXT: 0xdead0000: 0x10
diff --git a/llvm/test/tools/llvm-readobj/ELF/Sparc/elf-headers.test b/llvm/test/tools/llvm-readobj/ELF/Sparc/elf-headers.test
index c05cd76640ed3..68f5a66e54440 100644
--- a/llvm/test/tools/llvm-readobj/ELF/Sparc/elf-headers.test
+++ b/llvm/test/tools/llvm-readobj/ELF/Sparc/elf-headers.test
@@ -27,7 +27,7 @@
# RUN: -DFLAG0_NAME=EF_SPARC_32PLUS -DFLAG1_NAME=EF_SPARC_HAL_R1 \
# RUN: -DFLAG2_NAME=EF_SPARC_SUN_US1 -DFLAG3_NAME=EF_SPARC_SUN_US3
# RUN: llvm-readelf -h %t | FileCheck %s --match-full-lines --check-prefix=GNU \
-# RUN: -DFLAG_VALUE=0xF00 \
+# RUN: -DFLAG_VALUE=0xf00 \
# RUN: -DGNU_FLAG_NAME=", V8+ ABI, Sun UltraSPARC I extensions, HAL/Fujitsu R1 extensions, Sun UltraSPARC III extensions"
# RUN: yaml2obj %s -o %t -DCLASS_NAME="ELFCLASS64" -DMACHINE_NAME="EM_SPARCV9" -DFLAG_NAME=""
@@ -57,7 +57,7 @@
# RUN: -DFLAG0_NAME=EF_SPARCV9_PSO -DFLAG1_NAME=EF_SPARC_HAL_R1 \
# RUN: -DFLAG2_NAME=EF_SPARC_SUN_US1 -DFLAG3_NAME=EF_SPARC_SUN_US3
# RUN: llvm-readelf -h %t | FileCheck %s --match-full-lines --check-prefix=GNU \
-# RUN: -DFLAG_VALUE=0xE01\
+# RUN: -DFLAG_VALUE=0xe01\
# RUN: -DGNU_FLAG_NAME=", Sun UltraSPARC I extensions, HAL/Fujitsu R1 extensions, Sun UltraSPARC III extensions, Partial Store Ordering"
--- !ELF
diff --git a/llvm/test/tools/llvm-readobj/ELF/file-types.test b/llvm/test/tools/llvm-readobj/ELF/file-types.test
index f06f302b86423..42835d360ee16 100644
--- a/llvm/test/tools/llvm-readobj/ELF/file-types.test
+++ b/llvm/test/tools/llvm-readobj/ELF/file-types.test
@@ -62,7 +62,7 @@ FileHeader:
# RUN: llvm-readelf -h %t.unknown | FileCheck %s --match-full-lines --check-prefix GNU-UNNKNOWN
# LLVM-UNNKNOWN: ElfHeader {
-# LLVM-UNNKNOWN: Type: Unknown (0xFDFF)
+# LLVM-UNNKNOWN: Type: Unknown (0xfdff)
# GNU-UNNKNOWN: ELF Header:
# GNU-UNNKNOWN: Type: <unknown>: fdff
@@ -72,7 +72,7 @@ FileHeader:
# RUN: llvm-readelf -h %t6 | FileCheck %s --match-full-lines --check-prefix GNU-LOOS
# LLVM-LOOS: ElfHeader {
-# LLVM-LOOS: Type: OS Specific (0xFE00)
+# LLVM-LOOS: Type: OS Specific (0xfe00)
# GNU-LOOS: ELF Header:
# GNU-LOOS: Type: OS Specific: (fe00)
@@ -82,7 +82,7 @@ FileHeader:
# RUN: llvm-readelf -h %t7 | FileCheck %s --match-full-lines --check-prefix GNU-HIOS
# LLVM-HIOS: ElfHeader {
-# LLVM-HIOS: Type: OS Specific (0xFEFF)
+# LLVM-HIOS: Type: OS Specific (0xfeff)
# GNU-HIOS: ELF Header:
# GNU-HIOS: Type: OS Specific: (feff)
@@ -92,7 +92,7 @@ FileHeader:
# RUN: llvm-readelf -h %t8 | FileCheck %s --match-full-lines --check-prefix GNU-LOPROC
# LLVM-LOPROC: ElfHeader {
-# LLVM-LOPROC: Type: Processor Specific (0xFF00)
+# LLVM-LOPROC: Type: Processor Specific (0xff00)
# GNU-LOPROC: ELF Header:
# GNU-LOPROC: Type: Processor Specific: (ff00)
@@ -102,7 +102,7 @@ FileHeader:
# RUN: llvm-readelf -h %t9 | FileCheck %s --match-full-lines --check-prefix GNU-HIPROC
# LLVM-HIPROC: ElfHeader {
-# LLVM-HIPROC: Type: Processor Specific (0xFFFF)
+# LLVM-HIPROC: Type: Processor Specific (0xffff)
# GNU-HIPROC: ELF Header:
# GNU-HIPROC: Type: Processor Specific: (ffff)
diff --git a/llvm/test/tools/llvm-readobj/ELF/note-freebsd.test b/llvm/test/tools/llvm-readobj/ELF/note-freebsd.test
index f079ac8b4c387..a892034abd895 100644
--- a/llvm/test/tools/llvm-readobj/ELF/note-freebsd.test
+++ b/llvm/test/tools/llvm-readobj/ELF/note-freebsd.test
@@ -48,7 +48,7 @@ Sections:
# GNU-NEXT: FreeBSD 0x00000007 NT_FREEBSD_ARCH_TAG (architecture tag)
# GNU-NEXT: Arch tag: aarch64
# GNU-NEXT: FreeBSD 0x00000004 NT_FREEBSD_FEATURE_CTL (FreeBSD feature control)
-# GNU-NEXT: Feature flags: ASLR_DISABLE PROTMAX_DISABLE STKGAP_DISABLE WXNEEDED LA48 ASG_DISABLE (0xFFFFFFFF)
+# GNU-NEXT: Feature flags: ASLR_DISABLE PROTMAX_DISABLE STKGAP_DISABLE WXNEEDED LA48 ASG_DISABLE (0xffffffff)
# GNU-NEXT: FreeBSD 0x00000001 NT_FREEBSD_FEATURE_CTL (FreeBSD feature control)
# GNU-NEXT: description data: 00
# GNU-NEXT: FreeBSD 0x00000004 NT_FREEBSD_NOINIT_TAG (no .init tag)
@@ -91,7 +91,7 @@ Sections:
# LLVM-NEXT: Owner: FreeBSD
# LLVM-NEXT: Data size: 0x4
# LLVM-NEXT: Type: NT_FREEBSD_FEATURE_CTL (FreeBSD feature control)
-# LLVM-NEXT: Feature flags: ASLR_DISABLE PROTMAX_DISABLE STKGAP_DISABLE WXNEEDED LA48 ASG_DISABLE (0xFFFFFFFF)
+# LLVM-NEXT: Feature flags: ASLR_DISABLE PROTMAX_DISABLE STKGAP_DISABLE WXNEEDED LA48 ASG_DISABLE (0xffffffff)
# LLVM-NEXT: }
# LLVM-NEXT: {
# LLVM-NEXT: Owner: FreeBSD
diff --git a/llvm/test/tools/llvm-readobj/ELF/section-types.test b/llvm/test/tools/llvm-readobj/ELF/section-types.test
index e3a66832fa0d2..904892a1b4a0b 100644
--- a/llvm/test/tools/llvm-readobj/ELF/section-types.test
+++ b/llvm/test/tools/llvm-readobj/ELF/section-types.test
@@ -134,14 +134,14 @@
# GNU-NEXT: gnu_verneed VERNEED
# GNU-NEXT: unknown 0x1000: <unknown>
# GNU-NEXT: loos LOOS+0x0
-# GNU-NEXT: fooos LOOS+0xF00
+# GNU-NEXT: fooos LOOS+0xf00
# GNU-NEXT: hios VERSYM
# GNU-NEXT: loproc LOPROC+0x0
-# GNU-NEXT: fooproc LOPROC+0xF00
-# GNU-NEXT: hiproc LOPROC+0xFFFFFFF
+# GNU-NEXT: fooproc LOPROC+0xf00
+# GNU-NEXT: hiproc LOPROC+0xfffffff
# GNU-NEXT: louser LOUSER+0x0
-# GNU-NEXT: foouser LOUSER+0xF00
-# GNU-NEXT: hiuser LOUSER+0x7FFFFFFF
+# GNU-NEXT: foouser LOUSER+0xf00
+# GNU-NEXT: hiuser LOUSER+0x7fffffff
# GNU-NEXT: .symtab SYMTAB
# GNU-NEXT: .strtab STRTAB
diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp
index 79a6ce1fd88b8..7d75f29623ea9 100644
--- a/llvm/tools/llvm-readobj/ELFDumper.cpp
+++ b/llvm/tools/llvm-readobj/ELFDumper.cpp
@@ -3601,7 +3601,7 @@ template <class ELFT> void GNUELFDumper<ELFT>::printFileHeaders() {
OS.PadToColumn(2u);
OS << "Version:";
OS.PadToColumn(37u);
- OS << utohexstr(e.e_ident[ELF::EI_VERSION]);
+ OS << utohexstr(e.e_ident[ELF::EI_VERSION], /*LowerCase=*/true);
if (e.e_version == ELF::EV_CURRENT)
OS << " (current)";
OS << "\n";
@@ -3638,7 +3638,7 @@ template <class ELFT> void GNUELFDumper<ELFT>::printFileHeaders() {
Str = enumToString(e.e_machine, ArrayRef(ElfMachineType));
printFields(OS, "Machine:", Str);
- Str = "0x" + utohexstr(e.e_version);
+ Str = "0x" + utohexstr(e.e_version, /*LowerCase=*/true);
printFields(OS, "Version:", Str);
Str = "0x" + utohexstr(e.e_entry, /*LowerCase=*/true);
printFields(OS, "Entry point address:", Str);
@@ -3711,7 +3711,7 @@ template <class ELFT> void GNUELFDumper<ELFT>::printFileHeaders() {
} break;
}
}
- Str = "0x" + utohexstr(e.e_flags);
+ Str = "0x" + utohexstr(e.e_flags, /*LowerCase=*/true);
if (!ElfFlags.empty())
Str = Str + ", " + ElfFlags;
printFields(OS, "Flags:", Str);
@@ -4088,12 +4088,12 @@ template <class ELFT> void GNUELFDumper<ELFT>::printRelr(const Elf_Shdr &Sec) {
// returned as '<unknown>' followed by the type value.
static std::string getSectionTypeOffsetString(unsigned Type) {
if (Type >= SHT_LOOS && Type <= SHT_HIOS)
- return "LOOS+0x" + utohexstr(Type - SHT_LOOS);
+ return "LOOS+0x" + utohexstr(Type - SHT_LOOS, /*LowerCase=*/true);
else if (Type >= SHT_LOPROC && Type <= SHT_HIPROC)
- return "LOPROC+0x" + utohexstr(Type - SHT_LOPROC);
+ return "LOPROC+0x" + utohexstr(Type - SHT_LOPROC, /*LowerCase=*/true);
else if (Type >= SHT_LOUSER && Type <= SHT_HIUSER)
- return "LOUSER+0x" + utohexstr(Type - SHT_LOUSER);
- return "0x" + utohexstr(Type) + ": <unknown>";
+ return "LOUSER+0x" + utohexstr(Type - SHT_LOUSER, /*LowerCase=*/true);
+ return "0x" + utohexstr(Type, /*LowerCase=*/true) + ": <unknown>";
}
static std::string getSectionTypeString(unsigned Machine, unsigned Type) {
@@ -5722,9 +5722,9 @@ getFreeBSDNote(uint32_t NoteType, ArrayRef<uint8_t> Desc, bool IsCore) {
raw_string_ostream OS(FlagsStr);
printFlags(Value, ArrayRef(FreeBSDFeatureCtlFlags), OS);
if (FlagsStr.empty())
- OS << "0x" << utohexstr(Value);
+ OS << "0x" << utohexstr(Value, /*LowerCase=*/true);
else
- OS << "(0x" << utohexstr(Value) << ")";
+ OS << "(0x" << utohexstr(Value, /*LowerCase=*/true) << ")";
return FreeBSDNote{"Feature flags", FlagsStr};
}
default:
@@ -7349,7 +7349,8 @@ template <class ELFT> void LLVMELFDumper<ELFT>::printFileHeaders() {
else
TypeStr = "Unknown";
}
- W.printString("Type", TypeStr + " (0x" + utohexstr(E.e_type) + ")");
+ W.printString("Type", TypeStr + " (0x" +
+ utohexstr(E.e_type, /*LowerCase=*/true) + ")");
W.printEnum("Machine", E.e_machine, ArrayRef(ElfMachineType));
W.printNumber("Version", E.e_version);
@@ -8246,7 +8247,7 @@ void LLVMELFDumper<ELFT>::printMemtag(
{
ListScope L(W, "Memtag Global Descriptors:");
for (const auto &[Addr, BytesToTag] : Descriptors) {
- W.printHex("0x" + utohexstr(Addr), BytesToTag);
+ W.printHex("0x" + utohexstr(Addr, /*LowerCase=*/true), BytesToTag);
}
}
}
>From 2c5e5e143e2f472a4d12f6e6d85acbee1fd6f328 Mon Sep 17 00:00:00 2001
From: Adam Kallai <kadam at inf.u-szeged.hu>
Date: Fri, 5 Sep 2025 12:03:25 +0200
Subject: [PATCH 4/4] Add an entry to the release notes
---
llvm/docs/ReleaseNotes.md | 3 +++
1 file changed, 3 insertions(+)
diff --git a/llvm/docs/ReleaseNotes.md b/llvm/docs/ReleaseNotes.md
index ff92d7390ecfd..49065596de7ff 100644
--- a/llvm/docs/ReleaseNotes.md
+++ b/llvm/docs/ReleaseNotes.md
@@ -151,6 +151,9 @@ Changes to the Debug Info
Changes to the LLVM tools
---------------------------------
+* `llvm-readelf` now dumps all hex format addresses in lower-case mode generally.
+ Therefore the corresponding tests have been udpated as well.
+
Changes to LLDB
---------------------------------
More information about the llvm-commits
mailing list