[Lldb-commits] [lldb] [lldb] Improved formatting of 'register read' command. (PR #188049)
via lldb-commits
lldb-commits at lists.llvm.org
Tue Mar 24 02:42:47 PDT 2026
https://github.com/Rifet-c updated https://github.com/llvm/llvm-project/pull/188049
>From 0858e242868db78a47f34c4d0440f603f2f9016d Mon Sep 17 00:00:00 2001
From: Aleksandr Levin <aleksandr.levin at codasip.com>
Date: Mon, 23 Mar 2026 16:10:26 +0100
Subject: [PATCH 1/3] [lldb] Improved formatting of 'register read' command of
lldb. Now it is dynamic in register name lengths and left-aligned.
---
.../source/Commands/CommandObjectRegister.cpp | 37 +++++++++++++++++--
lldb/source/Core/DumpRegisterValue.cpp | 6 +--
2 files changed, 37 insertions(+), 6 deletions(-)
diff --git a/lldb/source/Commands/CommandObjectRegister.cpp b/lldb/source/Commands/CommandObjectRegister.cpp
index fbb92e5c63877..404c800047d49 100644
--- a/lldb/source/Commands/CommandObjectRegister.cpp
+++ b/lldb/source/Commands/CommandObjectRegister.cpp
@@ -75,7 +75,7 @@ class CommandObjectRegisterRead : public CommandObjectParsed {
bool DumpRegister(const ExecutionContext &exe_ctx, Stream &strm,
RegisterContext ®_ctx, const RegisterInfo ®_info,
- bool print_flags) {
+ bool print_flags, uint32_t reg_name_align_at = 0) {
RegisterValue reg_value;
if (!reg_ctx.ReadRegister(®_info, reg_value))
return false;
@@ -85,7 +85,7 @@ class CommandObjectRegisterRead : public CommandObjectParsed {
bool prefix_with_altname = (bool)m_command_options.alternate_name;
bool prefix_with_name = !prefix_with_altname;
DumpRegisterValue(reg_value, strm, reg_info, prefix_with_name,
- prefix_with_altname, m_format_options.GetFormat(), 8,
+ prefix_with_altname, m_format_options.GetFormat(), reg_name_align_at,
exe_ctx.GetBestExecutionContextScope(), print_flags,
exe_ctx.GetTargetSP());
if ((reg_info.encoding == eEncodingUint) ||
@@ -123,6 +123,7 @@ class CommandObjectRegisterRead : public CommandObjectParsed {
strm.Printf("%s:\n", (reg_set->name ? reg_set->name : "unknown"));
strm.IndentMore();
const size_t num_registers = reg_set->num_registers;
+ uint32_t reg_name_align_at = ComputeMatchingAlignment(reg_ctx, reg_set, primitive_only);
for (size_t reg_idx = 0; reg_idx < num_registers; ++reg_idx) {
const uint32_t reg = reg_set->registers[reg_idx];
const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex(reg);
@@ -131,7 +132,7 @@ class CommandObjectRegisterRead : public CommandObjectParsed {
continue;
if (reg_info && DumpRegister(exe_ctx, strm, *reg_ctx, *reg_info,
- /*print_flags=*/false))
+ /*print_flags=*/false, reg_name_align_at))
++available_count;
else
++unavailable_count;
@@ -147,6 +148,36 @@ class CommandObjectRegisterRead : public CommandObjectParsed {
}
protected:
+ uint32_t ComputeMatchingAlignment(RegisterContext *reg_ctx, const RegisterSet *const reg_set, bool primitive_only) {
+ bool use_primary_name = !static_cast<bool>(m_command_options.alternate_name);
+ const size_t num_registers = reg_set->num_registers;
+ uint32_t reg_name_align_at = 0;
+
+ auto getNameSize = [&](auto reg_info){
+ auto raw = use_primary_name ? reg_info->name : reg_info->alt_name;
+ auto str = raw ? std::string(raw) : std::string();
+ return static_cast<uint32_t>(str.size());
+ };
+
+ // Loop through all the registers to find the longest register name for the
+ // matching alignment
+ for (size_t reg_idx = 0; reg_idx < num_registers; ++reg_idx) {
+ const uint32_t reg = reg_set->registers[reg_idx];
+ const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex(reg);
+
+ // Derived registers are skipped if primitive_only is true.
+ if (primitive_only && reg_info && reg_info->value_regs)
+ continue;
+
+ if (!reg_info)
+ continue;
+
+ reg_name_align_at = std::max(reg_name_align_at, getNameSize(reg_info));
+ }
+
+ return reg_name_align_at;
+ }
+
void DoExecute(Args &command, CommandReturnObject &result) override {
Stream &strm = result.GetOutputStream();
RegisterContext *reg_ctx = m_exe_ctx.GetRegisterContext();
diff --git a/lldb/source/Core/DumpRegisterValue.cpp b/lldb/source/Core/DumpRegisterValue.cpp
index aff4d2c621d7e..29b95ba41b085 100644
--- a/lldb/source/Core/DumpRegisterValue.cpp
+++ b/lldb/source/Core/DumpRegisterValue.cpp
@@ -62,7 +62,7 @@ void lldb_private::DumpRegisterValue(const RegisterValue ®_val, Stream &s,
const RegisterInfo ®_info,
bool prefix_with_name,
bool prefix_with_alt_name, Format format,
- uint32_t reg_name_right_align_at,
+ uint32_t reg_name_left_align_at,
ExecutionContextScope *exe_scope,
bool print_flags, TargetSP target_sp) {
DataExtractor data;
@@ -76,8 +76,8 @@ void lldb_private::DumpRegisterValue(const RegisterValue ®_val, Stream &s,
// prefix_with_name^prefix_with_alt_name is true
//
StreamString format_string;
- if (reg_name_right_align_at && (prefix_with_name ^ prefix_with_alt_name))
- format_string.Printf("%%%us", reg_name_right_align_at);
+ if (reg_name_left_align_at && (prefix_with_name ^ prefix_with_alt_name))
+ format_string.Printf("%%-%us", reg_name_left_align_at);
else
format_string.Printf("%%s");
std::string fmt = std::string(format_string.GetString());
>From 1b953123a1d1c862b45a7aeeccb303f8d231bdff Mon Sep 17 00:00:00 2001
From: Aleksandr Levin <aleksandr.levin at codasip.com>
Date: Mon, 23 Mar 2026 16:33:09 +0100
Subject: [PATCH 2/3] Fixed formatting
---
.../source/Commands/CommandObjectRegister.cpp | 20 +++++++++++--------
1 file changed, 12 insertions(+), 8 deletions(-)
diff --git a/lldb/source/Commands/CommandObjectRegister.cpp b/lldb/source/Commands/CommandObjectRegister.cpp
index 404c800047d49..7f1f473795617 100644
--- a/lldb/source/Commands/CommandObjectRegister.cpp
+++ b/lldb/source/Commands/CommandObjectRegister.cpp
@@ -85,9 +85,9 @@ class CommandObjectRegisterRead : public CommandObjectParsed {
bool prefix_with_altname = (bool)m_command_options.alternate_name;
bool prefix_with_name = !prefix_with_altname;
DumpRegisterValue(reg_value, strm, reg_info, prefix_with_name,
- prefix_with_altname, m_format_options.GetFormat(), reg_name_align_at,
- exe_ctx.GetBestExecutionContextScope(), print_flags,
- exe_ctx.GetTargetSP());
+ prefix_with_altname, m_format_options.GetFormat(),
+ reg_name_align_at, exe_ctx.GetBestExecutionContextScope(),
+ print_flags, exe_ctx.GetTargetSP());
if ((reg_info.encoding == eEncodingUint) ||
(reg_info.encoding == eEncodingSint)) {
Process *process = exe_ctx.GetProcessPtr();
@@ -123,7 +123,8 @@ class CommandObjectRegisterRead : public CommandObjectParsed {
strm.Printf("%s:\n", (reg_set->name ? reg_set->name : "unknown"));
strm.IndentMore();
const size_t num_registers = reg_set->num_registers;
- uint32_t reg_name_align_at = ComputeMatchingAlignment(reg_ctx, reg_set, primitive_only);
+ uint32_t reg_name_align_at =
+ ComputeMatchingAlignment(reg_ctx, reg_set, primitive_only);
for (size_t reg_idx = 0; reg_idx < num_registers; ++reg_idx) {
const uint32_t reg = reg_set->registers[reg_idx];
const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex(reg);
@@ -148,18 +149,21 @@ class CommandObjectRegisterRead : public CommandObjectParsed {
}
protected:
- uint32_t ComputeMatchingAlignment(RegisterContext *reg_ctx, const RegisterSet *const reg_set, bool primitive_only) {
- bool use_primary_name = !static_cast<bool>(m_command_options.alternate_name);
+ uint32_t ComputeMatchingAlignment(RegisterContext *reg_ctx,
+ const RegisterSet *const reg_set,
+ bool primitive_only) {
+ bool use_primary_name =
+ !static_cast<bool>(m_command_options.alternate_name);
const size_t num_registers = reg_set->num_registers;
uint32_t reg_name_align_at = 0;
- auto getNameSize = [&](auto reg_info){
+ auto getNameSize = [&](auto reg_info) {
auto raw = use_primary_name ? reg_info->name : reg_info->alt_name;
auto str = raw ? std::string(raw) : std::string();
return static_cast<uint32_t>(str.size());
};
- // Loop through all the registers to find the longest register name for the
+ // Loop through all the registers to find the longest register name for the
// matching alignment
for (size_t reg_idx = 0; reg_idx < num_registers; ++reg_idx) {
const uint32_t reg = reg_set->registers[reg_idx];
>From b69f0ba5371a796abd319197f3c6340bc347c2f6 Mon Sep 17 00:00:00 2001
From: Aleksandr Levin <aleksandr.levin at codasip.com>
Date: Tue, 24 Mar 2026 10:40:44 +0100
Subject: [PATCH 3/3] Returned right alignment
---
lldb/source/Core/DumpRegisterValue.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lldb/source/Core/DumpRegisterValue.cpp b/lldb/source/Core/DumpRegisterValue.cpp
index 29b95ba41b085..f5650f44d3fb3 100644
--- a/lldb/source/Core/DumpRegisterValue.cpp
+++ b/lldb/source/Core/DumpRegisterValue.cpp
@@ -77,7 +77,7 @@ void lldb_private::DumpRegisterValue(const RegisterValue ®_val, Stream &s,
//
StreamString format_string;
if (reg_name_left_align_at && (prefix_with_name ^ prefix_with_alt_name))
- format_string.Printf("%%-%us", reg_name_left_align_at);
+ format_string.Printf("%%%us", reg_name_left_align_at);
else
format_string.Printf("%%s");
std::string fmt = std::string(format_string.GetString());
More information about the lldb-commits
mailing list