1dda28197Spatrick //===-- DumpRegisterValue.cpp ---------------------------------------------===//
2061da546Spatrick //
3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6061da546Spatrick //
7061da546Spatrick //===----------------------------------------------------------------------===//
8061da546Spatrick
9061da546Spatrick #include "lldb/Core/DumpRegisterValue.h"
10061da546Spatrick #include "lldb/Core/DumpDataExtractor.h"
11061da546Spatrick #include "lldb/Utility/DataExtractor.h"
12061da546Spatrick #include "lldb/Utility/RegisterValue.h"
13061da546Spatrick #include "lldb/Utility/StreamString.h"
14061da546Spatrick #include "lldb/lldb-private-types.h"
15061da546Spatrick
16061da546Spatrick using namespace lldb;
17061da546Spatrick
DumpRegisterValue(const RegisterValue & reg_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,ExecutionContextScope * exe_scope)18*f6aab3d8Srobert void lldb_private::DumpRegisterValue(const RegisterValue ®_val, Stream *s,
19061da546Spatrick const RegisterInfo *reg_info,
20061da546Spatrick bool prefix_with_name,
21061da546Spatrick bool prefix_with_alt_name, Format format,
22*f6aab3d8Srobert uint32_t reg_name_right_align_at,
23*f6aab3d8Srobert ExecutionContextScope *exe_scope) {
24061da546Spatrick DataExtractor data;
25*f6aab3d8Srobert if (!reg_val.GetData(data))
26*f6aab3d8Srobert return;
27*f6aab3d8Srobert
28061da546Spatrick bool name_printed = false;
29061da546Spatrick // For simplicity, alignment of the register name printing applies only in
30061da546Spatrick // the most common case where:
31061da546Spatrick //
32061da546Spatrick // prefix_with_name^prefix_with_alt_name is true
33061da546Spatrick //
34061da546Spatrick StreamString format_string;
35061da546Spatrick if (reg_name_right_align_at && (prefix_with_name ^ prefix_with_alt_name))
36061da546Spatrick format_string.Printf("%%%us", reg_name_right_align_at);
37061da546Spatrick else
38061da546Spatrick format_string.Printf("%%s");
39dda28197Spatrick std::string fmt = std::string(format_string.GetString());
40061da546Spatrick if (prefix_with_name) {
41061da546Spatrick if (reg_info->name) {
42061da546Spatrick s->Printf(fmt.c_str(), reg_info->name);
43061da546Spatrick name_printed = true;
44061da546Spatrick } else if (reg_info->alt_name) {
45061da546Spatrick s->Printf(fmt.c_str(), reg_info->alt_name);
46061da546Spatrick prefix_with_alt_name = false;
47061da546Spatrick name_printed = true;
48061da546Spatrick }
49061da546Spatrick }
50061da546Spatrick if (prefix_with_alt_name) {
51061da546Spatrick if (name_printed)
52061da546Spatrick s->PutChar('/');
53061da546Spatrick if (reg_info->alt_name) {
54061da546Spatrick s->Printf(fmt.c_str(), reg_info->alt_name);
55061da546Spatrick name_printed = true;
56061da546Spatrick } else if (!name_printed) {
57061da546Spatrick // No alternate name but we were asked to display a name, so show the
58061da546Spatrick // main name
59061da546Spatrick s->Printf(fmt.c_str(), reg_info->name);
60061da546Spatrick name_printed = true;
61061da546Spatrick }
62061da546Spatrick }
63061da546Spatrick if (name_printed)
64061da546Spatrick s->PutCString(" = ");
65061da546Spatrick
66061da546Spatrick if (format == eFormatDefault)
67061da546Spatrick format = reg_info->format;
68061da546Spatrick
69061da546Spatrick DumpDataExtractor(data, s,
70061da546Spatrick 0, // Offset in "data"
71061da546Spatrick format, // Format to use when dumping
72061da546Spatrick reg_info->byte_size, // item_byte_size
73061da546Spatrick 1, // item_count
74061da546Spatrick UINT32_MAX, // num_per_line
75061da546Spatrick LLDB_INVALID_ADDRESS, // base_addr
76061da546Spatrick 0, // item_bit_size
77*f6aab3d8Srobert 0, // item_bit_offset
78*f6aab3d8Srobert exe_scope);
79061da546Spatrick }
80