xref: /openbsd-src/gnu/llvm/lldb/source/Core/DumpRegisterValue.cpp (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
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 &reg_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