https://github.com/Rifet-c created https://github.com/llvm/llvm-project/pull/188049
Made alignment of 'register read' command's output to be dynamic to the register's name lengths, also made it left-aligned for readability reasons. >From a66a70a6012ad12cac610232b6be9f370317449a Mon Sep 17 00:00:00 2001 From: Aleksandr Levin <[email protected]> Date: Mon, 23 Mar 2026 16:10:26 +0100 Subject: [PATCH] [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()); _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
