https://github.com/Rifet-c updated https://github.com/llvm/llvm-project/pull/188049
>From e2284bbb7a1d7169f75424b53253a9436dac0006 Mon Sep 17 00:00:00 2001 From: Aleksandr Levin <[email protected]> Date: Mon, 23 Mar 2026 16:10:26 +0100 Subject: [PATCH 1/2] [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 9160f6b2be73c542645c2395441ebef5531c4951 Mon Sep 17 00:00:00 2001 From: Aleksandr Levin <[email protected]> Date: Mon, 23 Mar 2026 16:33:09 +0100 Subject: [PATCH 2/2] 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]; _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
