28#include "llvm/Support/Errno.h"
34#define LLDB_OPTIONS_register_read
35#include "CommandOptions.inc"
41 interpreter,
"register read",
42 "Dump the contents of one or more register values from the current "
43 "frame. If no register is specified, dumps them all.",
45 eCommandRequiresFrame | eCommandRequiresRegContext |
46 eCommandProcessMustBeLaunched | eCommandProcessMustBePaused),
57 arg.push_back(register_arg);
95 bool prefix_with_name = !prefix_with_altname;
125 bool primitive_only =
false) {
133 const RegisterSet *
const reg_set = reg_ctx->
GetRegisterSet(set_idx);
135 strm.
Printf(
"%s:\n", (reg_set->name ? reg_set->name :
"unknown"));
137 const size_t num_registers = reg_set->num_registers;
138 for (
size_t reg_idx = 0; reg_idx < num_registers; ++reg_idx) {
139 const uint32_t reg = reg_set->registers[reg_idx];
142 if (primitive_only && reg_info && reg_info->value_regs)
151 if (unavailable_count) {
153 strm.
Printf(
"%u registers were unavailable.\n", unavailable_count);
157 return available_count > 0;
165 const RegisterInfo *reg_info =
nullptr;
169 size_t num_register_sets = 1;
171 if (set_array_size > 0) {
172 for (
size_t i = 0; i < set_array_size; ++i) {
175 if (set_idx < reg_ctx->GetRegisterSetCount()) {
179 llvm::sys::StrError());
181 result.
AppendError(
"unknown error while reading registers.\n");
186 "invalid register set index: %" PRIu64
"\n", (uint64_t)set_idx);
194 for (set_idx = 0; set_idx < num_register_sets; ++set_idx) {
203 result.
AppendError(
"the --all option can't be used when registers "
204 "names are supplied as arguments\n");
206 result.
AppendError(
"the --set <set> option can't be used when "
207 "registers names are supplied as arguments\n");
209 for (
auto &entry : command) {
215 auto arg_str = entry.ref();
216 arg_str.consume_front(
"$");
222 strm.
Printf(
"%-12s = error: unavailable\n", reg_info->name);
225 arg_str.str().c_str());
243 return llvm::ArrayRef(g_register_read_options);
255 const int short_option =
GetDefinitions()[option_idx].short_option;
256 switch (short_option) {
280 llvm_unreachable(
"Unimplemented option");
301 "Modify a single register value.", nullptr,
302 eCommandRequiresFrame | eCommandRequiresRegContext |
303 eCommandProcessMustBeLaunched |
304 eCommandProcessMustBePaused) {
316 arg1.push_back(register_arg);
324 arg2.push_back(value_arg);
351 "register write takes exactly 2 arguments: <reg-name> <value>");
353 auto reg_name = command[0].ref();
354 auto value_str = command[1].ref();
361 reg_name.consume_front(
"$");
369 if (
error.Success()) {
378 if (
error.AsCString()) {
380 "Failed to write register '%s' with value '%s': %s\n",
381 reg_name.str().c_str(), value_str.str().c_str(),
385 "Failed to write register '%s' with value '%s'",
386 reg_name.str().c_str(), value_str.str().c_str());
390 reg_name.str().c_str());
400 "Commands to access registers for the current "
401 "thread and stack frame.",
402 "register [read|write] ...") {
static llvm::raw_ostream & error(Stream &strm)
OptionValueArray set_indexes
Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_value, ExecutionContext *execution_context) override
void OptionParsingStarting(ExecutionContext *execution_context) override
~CommandOptions() override=default
llvm::ArrayRef< OptionDefinition > GetDefinitions() override
OptionValueBoolean dump_all_sets
OptionValueBoolean alternate_name
bool DumpRegisterSet(const ExecutionContext &exe_ctx, Stream &strm, RegisterContext *reg_ctx, size_t set_idx, bool primitive_only=false)
OptionGroupOptions m_option_group
CommandOptions m_command_options
bool DumpRegister(const ExecutionContext &exe_ctx, Stream &strm, RegisterContext *reg_ctx, const RegisterInfo *reg_info)
void HandleArgumentCompletion(CompletionRequest &request, OptionElementVector &opt_element_vector) override
The input array contains a parsed version of the line.
~CommandObjectRegisterRead() override=default
CommandObjectRegisterRead(CommandInterpreter &interpreter)
Options * GetOptions() override
OptionGroupFormat m_format_options
bool DoExecute(Args &command, CommandReturnObject &result) override
void HandleArgumentCompletion(CompletionRequest &request, OptionElementVector &opt_element_vector) override
The input array contains a parsed version of the line.
~CommandObjectRegisterWrite() override=default
bool DoExecute(Args &command, CommandReturnObject &result) override
CommandObjectRegisterWrite(CommandInterpreter &interpreter)
A section + offset based address class.
@ DumpStyleResolvedDescription
Display the details about what an address resolves to.
bool Dump(Stream *s, ExecutionContextScope *exe_scope, DumpStyle style, DumpStyle fallback_style=DumpStyleInvalid, uint32_t addr_byte_size=UINT32_MAX, bool all_ranges=false) const
Dump a description of this object to a Stream.
A command line argument class.
size_t GetArgumentCount() const
Gets the number of arguments left in this command object.
static bool InvokeCommonCompletionCallbacks(CommandInterpreter &interpreter, uint32_t completion_mask, lldb_private::CompletionRequest &request, SearchFilter *searcher)
bool LoadSubCommand(llvm::StringRef cmd_name, const lldb::CommandObjectSP &command_obj) override
~CommandObjectRegister() override
CommandObjectRegister(CommandInterpreter &interpreter)
std::vector< CommandArgumentData > CommandArgumentEntry
ExecutionContext m_exe_ctx
std::vector< CommandArgumentEntry > m_arguments
CommandInterpreter & GetCommandInterpreter()
void AppendErrorWithFormatv(const char *format, Args &&... args)
void void AppendError(llvm::StringRef in_string)
void SetStatus(lldb::ReturnStatus status)
void AppendErrorWithFormat(const char *format,...) __attribute__((format(printf
Stream & GetOutputStream()
"lldb/Utility/ArgCompletionRequest.h"
size_t GetCursorIndex() const
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
bool HasProcessScope() const
Returns true the ExecutionContext object contains a valid target and process.
ExecutionContextScope * GetBestExecutionContextScope() const
Target & GetTargetRef() const
Returns a reference to the target object.
Process * GetProcessPtr() const
Returns a pointer to the process object.
Thread & GetThreadRef() const
Returns a reference to the thread object.
RegisterContext * GetRegisterContext() const
void Append(OptionGroup *group)
Append options from a OptionGroup class.
bool AppendValue(const lldb::OptionValueSP &value_sp)
void SetCurrentValue(bool value)
bool GetCurrentValue() const
static lldb::OptionValueSP Create(llvm::StringRef value_str, Status &error)
uint64_t GetUInt64Value(uint64_t fail_value, bool *success_ptr)
A command line option parsing protocol class.
A plug-in interface definition class for debugging a process.
uint32_t GetAddressByteSize() const
virtual const RegisterSet * GetRegisterSet(size_t reg_set)=0
virtual const RegisterInfo * GetRegisterInfoAtIndex(size_t reg)=0
virtual bool WriteRegister(const RegisterInfo *reg_info, const RegisterValue ®_value)=0
virtual size_t GetRegisterSetCount()=0
const RegisterInfo * GetRegisterInfoByName(llvm::StringRef reg_name, uint32_t start_idx=0)
virtual bool ReadRegister(const RegisterInfo *reg_info, RegisterValue ®_value)=0
Status SetValueFromString(const RegisterInfo *reg_info, llvm::StringRef value_str)
uint64_t GetAsUInt64(uint64_t fail_value=UINT64_MAX, bool *success_ptr=nullptr) const
bool ResolveLoadAddress(lldb::addr_t load_addr, Address &so_addr, bool allow_section_end=false) const
A stream class that can stream formatted output to a file.
size_t Indent(llvm::StringRef s="")
Indent the current line in the stream.
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
size_t PutCString(llvm::StringRef cstr)
Output a C string to the stream.
size_t EOL()
Output and End of Line character to the stream.
void IndentLess(unsigned amount=2)
Decrement the current indentation level.
void IndentMore(unsigned amount=2)
Increment the current indentation level.
SectionLoadList & GetSectionLoadList()
#define LLDB_INVALID_ADDRESS
A class that represents a running process on the host machine.
std::vector< OptionArgElement > OptionElementVector
void DumpRegisterValue(const RegisterValue ®_val, Stream *s, const RegisterInfo *reg_info, bool prefix_with_name, bool prefix_with_alt_name, lldb::Format format, uint32_t reg_name_right_align_at=0, ExecutionContextScope *exe_scope=nullptr)
@ eEncodingUint
unsigned integer
@ eEncodingSint
signed integer
@ eReturnStatusSuccessFinishNoResult
Used to build individual command argument lists.
ArgumentRepetitionType arg_repetition
lldb::CommandArgumentType arg_type