1 | //===-- DumpRegisterValue.cpp ---------------------------------------------===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #include "lldb/Core/DumpRegisterValue.h" |
10 | #include "lldb/Core/DumpDataExtractor.h" |
11 | #include "lldb/Utility/DataExtractor.h" |
12 | #include "lldb/Utility/RegisterValue.h" |
13 | #include "lldb/Utility/StreamString.h" |
14 | #include "lldb/lldb-private-types.h" |
15 | |
16 | using namespace lldb; |
17 | |
18 | bool lldb_private::DumpRegisterValue(const RegisterValue ®_val, Stream *s, |
19 | const RegisterInfo *reg_info, |
20 | bool prefix_with_name, |
21 | bool prefix_with_alt_name, Format format, |
22 | uint32_t reg_name_right_align_at) { |
23 | DataExtractor data; |
24 | if (reg_val.GetData(data)) { |
25 | bool name_printed = false; |
26 | // For simplicity, alignment of the register name printing applies only in |
27 | // the most common case where: |
28 | // |
29 | // prefix_with_name^prefix_with_alt_name is true |
30 | // |
31 | StreamString format_string; |
32 | if (reg_name_right_align_at && (prefix_with_name ^ prefix_with_alt_name)) |
33 | format_string.Printf("%%%us" , reg_name_right_align_at); |
34 | else |
35 | format_string.Printf("%%s" ); |
36 | std::string fmt = std::string(format_string.GetString()); |
37 | if (prefix_with_name) { |
38 | if (reg_info->name) { |
39 | s->Printf(fmt.c_str(), reg_info->name); |
40 | name_printed = true; |
41 | } else if (reg_info->alt_name) { |
42 | s->Printf(fmt.c_str(), reg_info->alt_name); |
43 | prefix_with_alt_name = false; |
44 | name_printed = true; |
45 | } |
46 | } |
47 | if (prefix_with_alt_name) { |
48 | if (name_printed) |
49 | s->PutChar('/'); |
50 | if (reg_info->alt_name) { |
51 | s->Printf(fmt.c_str(), reg_info->alt_name); |
52 | name_printed = true; |
53 | } else if (!name_printed) { |
54 | // No alternate name but we were asked to display a name, so show the |
55 | // main name |
56 | s->Printf(fmt.c_str(), reg_info->name); |
57 | name_printed = true; |
58 | } |
59 | } |
60 | if (name_printed) |
61 | s->PutCString(" = " ); |
62 | |
63 | if (format == eFormatDefault) |
64 | format = reg_info->format; |
65 | |
66 | DumpDataExtractor(data, s, |
67 | 0, // Offset in "data" |
68 | format, // Format to use when dumping |
69 | reg_info->byte_size, // item_byte_size |
70 | 1, // item_count |
71 | UINT32_MAX, // num_per_line |
72 | LLDB_INVALID_ADDRESS, // base_addr |
73 | 0, // item_bit_size |
74 | 0); // item_bit_offset |
75 | return true; |
76 | } |
77 | return false; |
78 | } |
79 | |