| //===-- DumpRegisterValue.cpp ---------------------------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "lldb/Core/DumpRegisterValue.h" |
| #include "lldb/Core/DumpDataExtractor.h" |
| #include "lldb/Utility/DataExtractor.h" |
| #include "lldb/Utility/RegisterValue.h" |
| #include "lldb/Utility/StreamString.h" |
| #include "lldb/lldb-private-types.h" |
| |
| using namespace lldb; |
| |
| bool lldb_private::DumpRegisterValue(const RegisterValue ®_val, Stream *s, |
| const RegisterInfo *reg_info, |
| bool prefix_with_name, |
| bool prefix_with_alt_name, Format format, |
| uint32_t reg_name_right_align_at) { |
| DataExtractor data; |
| if (reg_val.GetData(data)) { |
| bool name_printed = false; |
| // For simplicity, alignment of the register name printing applies only in |
| // the most common case where: |
| // |
| // 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); |
| else |
| format_string.Printf("%%s"); |
| std::string fmt = std::string(format_string.GetString()); |
| if (prefix_with_name) { |
| if (reg_info->name) { |
| s->Printf(fmt.c_str(), reg_info->name); |
| name_printed = true; |
| } else if (reg_info->alt_name) { |
| s->Printf(fmt.c_str(), reg_info->alt_name); |
| prefix_with_alt_name = false; |
| name_printed = true; |
| } |
| } |
| if (prefix_with_alt_name) { |
| if (name_printed) |
| s->PutChar('/'); |
| if (reg_info->alt_name) { |
| s->Printf(fmt.c_str(), reg_info->alt_name); |
| name_printed = true; |
| } else if (!name_printed) { |
| // No alternate name but we were asked to display a name, so show the |
| // main name |
| s->Printf(fmt.c_str(), reg_info->name); |
| name_printed = true; |
| } |
| } |
| if (name_printed) |
| s->PutCString(" = "); |
| |
| if (format == eFormatDefault) |
| format = reg_info->format; |
| |
| DumpDataExtractor(data, s, |
| 0, // Offset in "data" |
| format, // Format to use when dumping |
| reg_info->byte_size, // item_byte_size |
| 1, // item_count |
| UINT32_MAX, // num_per_line |
| LLDB_INVALID_ADDRESS, // base_addr |
| 0, // item_bit_size |
| 0); // item_bit_offset |
| return true; |
| } |
| return false; |
| } |