124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- CommandObjectRegister.cpp -------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h" 11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "CommandObjectRegister.h" 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/DataExtractor.h" 19061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#include "lldb/Core/RegisterValue.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Scalar.h" 2163094e0bb161580564954dee512955c1c79d3476Greg Clayton#include "lldb/Core/Debugger.h" 2263094e0bb161580564954dee512955c1c79d3476Greg Clayton#include "lldb/Interpreter/Args.h" 2363094e0bb161580564954dee512955c1c79d3476Greg Clayton#include "lldb/Interpreter/CommandInterpreter.h" 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandReturnObject.h" 25f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton#include "lldb/Interpreter/Options.h" 26a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton#include "lldb/Interpreter/OptionGroupFormat.h" 2773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#include "lldb/Interpreter/OptionValueArray.h" 2873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#include "lldb/Interpreter/OptionValueUInt64.h" 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ExecutionContext.h" 30557948555a9c33e29d33cec010c26af6726110aeGreg Clayton#include "lldb/Target/Process.h" 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h" 32557948555a9c33e29d33cec010c26af6726110aeGreg Clayton#include "lldb/Target/Thread.h" 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "register read" 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 40da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectRegisterRead : public CommandObjectParsed 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 43238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectRegisterRead (CommandInterpreter &interpreter) : 44da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 45da26bd203cbb104291b39891febf7481794f205fJim Ingham "register read", 46da26bd203cbb104291b39891febf7481794f205fJim Ingham "Dump the contents of one or more register values from the current frame. If no register is specified, dumps them all.", 47da26bd203cbb104291b39891febf7481794f205fJim Ingham NULL, 48ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagRequiresFrame | 49ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagRequiresRegContext | 50ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBeLaunched | 51ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBePaused ), 52a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton m_option_group (interpreter), 53a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton m_format_options (eFormatDefault), 54a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton m_command_options () 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 5643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentEntry arg; 5743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData register_arg; 5843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 5943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first (and only) variant of this arg. 6043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice register_arg.arg_type = eArgTypeRegisterName; 6143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice register_arg.arg_repetition = eArgRepeatStar; 6243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 6343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 6443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg.push_back (register_arg); 6543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 6643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Push the data for the first argument into the m_arguments vector. 6743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice m_arguments.push_back (arg); 68a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton 69a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton // Add the "--format" 7024a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton m_option_group.Append (&m_format_options, OptionGroupFormat::OPTION_GROUP_FORMAT | OptionGroupFormat::OPTION_GROUP_GDB_FMT, LLDB_OPT_SET_ALL); 71a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton m_option_group.Append (&m_command_options); 72a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton m_option_group.Finalize(); 73a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandObjectRegisterRead () 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton Options * 8224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton GetOptions () 8324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 84a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton return &m_option_group; 8524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 8624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 8717cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton bool 8817cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton DumpRegister (const ExecutionContext &exe_ctx, 8917cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton Stream &strm, 9017cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton RegisterContext *reg_ctx, 9117cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton const RegisterInfo *reg_info) 9217cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton { 9317cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton if (reg_info) 9417cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton { 95061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterValue reg_value; 9617cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton 97061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (reg_ctx->ReadRegister (reg_info, reg_value)) 9817cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton { 9917cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton strm.Indent (); 10017cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton 101a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton bool prefix_with_altname = m_command_options.alternate_name; 102997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton bool prefix_with_name = !prefix_with_altname; 1039d0f5082c651aca3e828ccf64fbf84c1bccd54f7Johnny Chen reg_value.Dump(&strm, reg_info, prefix_with_name, prefix_with_altname, m_format_options.GetFormat(), 8); 104f4124deeb9532044a38c0774ced872f2709347daGreg Clayton if ((reg_info->encoding == eEncodingUint) || (reg_info->encoding == eEncodingSint)) 10517cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton { 106f4124deeb9532044a38c0774ced872f2709347daGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 107f4124deeb9532044a38c0774ced872f2709347daGreg Clayton if (process && reg_info->byte_size == process->GetAddressByteSize()) 10817cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton { 109f4124deeb9532044a38c0774ced872f2709347daGreg Clayton addr_t reg_addr = reg_value.GetAsUInt64(LLDB_INVALID_ADDRESS); 110f4124deeb9532044a38c0774ced872f2709347daGreg Clayton if (reg_addr != LLDB_INVALID_ADDRESS) 11117cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton { 112f4124deeb9532044a38c0774ced872f2709347daGreg Clayton Address so_reg_addr; 113f4124deeb9532044a38c0774ced872f2709347daGreg Clayton if (exe_ctx.GetTargetRef().GetSectionLoadList().ResolveLoadAddress(reg_addr, so_reg_addr)) 114f4124deeb9532044a38c0774ced872f2709347daGreg Clayton { 115f4124deeb9532044a38c0774ced872f2709347daGreg Clayton strm.PutCString (" "); 116f4124deeb9532044a38c0774ced872f2709347daGreg Clayton so_reg_addr.Dump(&strm, exe_ctx.GetBestExecutionContextScope(), Address::DumpStyleResolvedDescription); 117f4124deeb9532044a38c0774ced872f2709347daGreg Clayton } 11817cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton } 11917cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton } 12017cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton } 12117cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton strm.EOL(); 12217cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton return true; 12317cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton } 12417cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton } 12517cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton return false; 12617cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton } 12717cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton 12817cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton bool 12917cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton DumpRegisterSet (const ExecutionContext &exe_ctx, 13017cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton Stream &strm, 13117cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton RegisterContext *reg_ctx, 13236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t set_idx, 13335f5dc76a37c7dca397566c34e4945f10ad163c1Johnny Chen bool primitive_only=false) 13417cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton { 13517cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton uint32_t unavailable_count = 0; 13617cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton uint32_t available_count = 0; 1370852cbb9660c92a448468a8ec7c39fb7245eca57Ashok Thirumurthi 1380852cbb9660c92a448468a8ec7c39fb7245eca57Ashok Thirumurthi if (!reg_ctx) 1390852cbb9660c92a448468a8ec7c39fb7245eca57Ashok Thirumurthi return false; // thread has no registers (i.e. core files are corrupt, incomplete crash logs...) 1400852cbb9660c92a448468a8ec7c39fb7245eca57Ashok Thirumurthi 14117cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton const RegisterSet * const reg_set = reg_ctx->GetRegisterSet(set_idx); 14217cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton if (reg_set) 14317cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton { 14417cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton strm.Printf ("%s:\n", reg_set->name); 14517cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton strm.IndentMore (); 14636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t num_registers = reg_set->num_registers; 14736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t reg_idx = 0; reg_idx < num_registers; ++reg_idx) 14817cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton { 14917cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton const uint32_t reg = reg_set->registers[reg_idx]; 15035f5dc76a37c7dca397566c34e4945f10ad163c1Johnny Chen const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex(reg); 15135f5dc76a37c7dca397566c34e4945f10ad163c1Johnny Chen // Skip the dumping of derived register if primitive_only is true. 15235f5dc76a37c7dca397566c34e4945f10ad163c1Johnny Chen if (primitive_only && reg_info && reg_info->value_regs) 15335f5dc76a37c7dca397566c34e4945f10ad163c1Johnny Chen continue; 1540852cbb9660c92a448468a8ec7c39fb7245eca57Ashok Thirumurthi 15535f5dc76a37c7dca397566c34e4945f10ad163c1Johnny Chen if (DumpRegister (exe_ctx, strm, reg_ctx, reg_info)) 15617cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton ++available_count; 15717cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton else 15817cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton ++unavailable_count; 15917cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton } 16017cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton strm.IndentLess (); 16117cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton if (unavailable_count) 16217cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton { 16317cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton strm.Indent (); 16417cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton strm.Printf("%u registers were unavailable.\n", unavailable_count); 16517cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton } 16617cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton strm.EOL(); 16717cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton } 16817cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton return available_count > 0; 16917cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton } 17017cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton 171da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 173da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& command, CommandReturnObject &result) 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 17517cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton Stream &strm = result.GetOutputStream(); 176ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton RegisterContext *reg_ctx = m_exe_ctx.GetRegisterContext (); 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 178ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const RegisterInfo *reg_info = NULL; 179ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (command.GetArgumentCount() == 0) 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 18136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t set_idx; 182ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 18336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t num_register_sets = 1; 18436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t set_array_size = m_command_options.set_indexes.GetSize(); 185ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (set_array_size > 0) 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 18736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t i=0; i<set_array_size; ++i) 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 189ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton set_idx = m_command_options.set_indexes[i]->GetUInt64Value (UINT32_MAX, NULL); 1900852cbb9660c92a448468a8ec7c39fb7245eca57Ashok Thirumurthi if (set_idx < reg_ctx->GetRegisterSetCount()) 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 192ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (!DumpRegisterSet (m_exe_ctx, strm, reg_ctx, set_idx)) 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1940852cbb9660c92a448468a8ec7c39fb7245eca57Ashok Thirumurthi if (errno) 1950852cbb9660c92a448468a8ec7c39fb7245eca57Ashok Thirumurthi result.AppendErrorWithFormat ("register read failed with errno: %d\n", errno); 1960852cbb9660c92a448468a8ec7c39fb7245eca57Ashok Thirumurthi else 1970852cbb9660c92a448468a8ec7c39fb7245eca57Ashok Thirumurthi result.AppendError ("unknown error while reading registers.\n"); 19817cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton result.SetStatus (eReturnStatusFailed); 19917cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton break; 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 202ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2040852cbb9660c92a448468a8ec7c39fb7245eca57Ashok Thirumurthi result.AppendErrorWithFormat ("invalid register set index: %zu\n", set_idx); 205ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.SetStatus (eReturnStatusFailed); 206ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton break; 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 212a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton if (m_command_options.dump_all_sets) 213ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton num_register_sets = reg_ctx->GetRegisterSetCount(); 214ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 215ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton for (set_idx = 0; set_idx < num_register_sets; ++set_idx) 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 217ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton // When dump_all_sets option is set, dump primitive as well as derived registers. 218ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton DumpRegisterSet (m_exe_ctx, strm, reg_ctx, set_idx, !m_command_options.dump_all_sets.GetCurrentValue()); 21917cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton } 220ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 221ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 222ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else 223ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 224ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (m_command_options.dump_all_sets) 225ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 226ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendError ("the --all option can't be used when registers names are supplied as arguments\n"); 227ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.SetStatus (eReturnStatusFailed); 228ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 229ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else if (m_command_options.set_indexes.GetSize() > 0) 230ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 231ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendError ("the --set <set> option can't be used when registers names are supplied as arguments\n"); 232ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.SetStatus (eReturnStatusFailed); 233ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 234ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else 235ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 236ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const char *arg_cstr; 237ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton for (int arg_idx = 0; (arg_cstr = command.GetArgumentAtIndex(arg_idx)) != NULL; ++arg_idx) 23817cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton { 239731493d11e161ef5679319adcaa3b69ad71e3338Enrico Granata // in most LLDB commands we accept $rbx as the name for register RBX - and here we would 240731493d11e161ef5679319adcaa3b69ad71e3338Enrico Granata // reject it and non-existant. we should be more consistent towards the user and allow them 241731493d11e161ef5679319adcaa3b69ad71e3338Enrico Granata // to say reg read $rbx - internally, however, we should be strict and not allow ourselves 242731493d11e161ef5679319adcaa3b69ad71e3338Enrico Granata // to call our registers $rbx in our own API 243731493d11e161ef5679319adcaa3b69ad71e3338Enrico Granata if (*arg_cstr == '$') 244731493d11e161ef5679319adcaa3b69ad71e3338Enrico Granata arg_cstr = arg_cstr+1; 245ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton reg_info = reg_ctx->GetRegisterInfoByName(arg_cstr); 24617cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton 247ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (reg_info) 248ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 249ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (!DumpRegister (m_exe_ctx, strm, reg_ctx, reg_info)) 250ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton strm.Printf("%-12s = error: unavailable\n", reg_info->name); 251ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 252ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else 253ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 254ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendErrorWithFormat ("Invalid register name '%s'.\n", arg_cstr); 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 26124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 262a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton class CommandOptions : public OptionGroup 26324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 26424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton public: 265a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton CommandOptions () : 266a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton OptionGroup(), 26717cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton set_indexes (OptionValue::ConvertTypeToMask (OptionValue::eTypeUInt64)), 268997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton dump_all_sets (false, false), // Initial and default values are false 269997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton alternate_name (false, false) 27024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 27124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 27224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 27324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton virtual 27424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton ~CommandOptions () 27524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 27624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 27724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 278a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton 279a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton virtual uint32_t 280a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton GetNumDefinitions (); 281a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton 282a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton virtual const OptionDefinition* 283a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton GetDefinitions () 284a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton { 285a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton return g_option_table; 286a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton } 287a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton 288a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton virtual void 289a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton OptionParsingStarting (CommandInterpreter &interpreter) 290a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton { 291a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton set_indexes.Clear(); 292a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton dump_all_sets.Clear(); 293a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton alternate_name.Clear(); 294a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton } 295a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton 29624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton virtual Error 297a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton SetOptionValue (CommandInterpreter &interpreter, 298a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton uint32_t option_idx, 299a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton const char *option_value) 30024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 30124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton Error error; 3026475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton const int short_option = g_option_table[option_idx].short_option; 30324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton switch (short_option) 30424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 30517cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton case 's': 30617cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton { 307a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton OptionValueSP value_sp (OptionValueUInt64::Create (option_value, error)); 30817cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton if (value_sp) 30917cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton set_indexes.AppendValue (value_sp); 31017cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton } 31117cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton break; 31217cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton 31317cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton case 'a': 314997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton // When we don't use OptionValue::SetValueFromCString(const char *) to 315997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton // set an option value, it won't be marked as being set in the options 316997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton // so we make a call to let users know the value was set via option 317997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton dump_all_sets.SetCurrentValue (true); 318997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton dump_all_sets.SetOptionWasSet (); 31924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton break; 32017cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton 321997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton case 'A': 322997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton // When we don't use OptionValue::SetValueFromCString(const char *) to 323997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton // set an option value, it won't be marked as being set in the options 324997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton // so we make a call to let users know the value was set via option 325997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton alternate_name.SetCurrentValue (true); 326997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton dump_all_sets.SetOptionWasSet (); 327997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton break; 328997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton 32924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton default: 3309c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat("unrecognized short option '%c'", short_option); 33124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton break; 33224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 33324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return error; 33424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 33524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 33624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // Options table: Required for subclasses of Options. 33724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 338a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton static const OptionDefinition g_option_table[]; 33924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 34024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // Instance variables to hold the values for command options. 34117cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton OptionValueArray set_indexes; 34217cd995147b3324680d845b3fc897febcc23c9e0Greg Clayton OptionValueBoolean dump_all_sets; 343997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton OptionValueBoolean alternate_name; 34424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton }; 34524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 346a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton OptionGroupOptions m_option_group; 347a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton OptionGroupFormat m_format_options; 348a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton CommandOptions m_command_options; 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3515325ce94667b391194bc0fa8417cefe32f73f053Johnny Chenconst OptionDefinition 35224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonCommandObjectRegisterRead::CommandOptions::g_option_table[] = 35324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 354997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton { LLDB_OPT_SET_ALL, false, "alternate", 'A', no_argument , NULL, 0, eArgTypeNone , "Display register names using the alternate register name if there is one."}, 355997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton { LLDB_OPT_SET_1 , false, "set" , 's', required_argument, NULL, 0, eArgTypeIndex , "Specify which register sets to dump by index."}, 356997b1e82f098a8b748b490d1ae6d0bbe597a59d5Greg Clayton { LLDB_OPT_SET_2 , false, "all" , 'a', no_argument , NULL, 0, eArgTypeNone , "Show all register sets."}, 35724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton}; 35824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 359a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Claytonuint32_t 360a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg ClaytonCommandObjectRegisterRead::CommandOptions::GetNumDefinitions () 361a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton{ 362a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton return sizeof(g_option_table)/sizeof(OptionDefinition); 363a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton} 36424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// "register write" 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 369da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectRegisterWrite : public CommandObjectParsed 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 372238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectRegisterWrite (CommandInterpreter &interpreter) : 373da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 374da26bd203cbb104291b39891febf7481794f205fJim Ingham "register write", 375da26bd203cbb104291b39891febf7481794f205fJim Ingham "Modify a single register value.", 376da26bd203cbb104291b39891febf7481794f205fJim Ingham NULL, 377ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagRequiresFrame | 378ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagRequiresRegContext | 379ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBeLaunched | 380ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBePaused) 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 38243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentEntry arg1; 38343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentEntry arg2; 38443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData register_arg; 38543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData value_arg; 38643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 38743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first (and only) variant of this arg. 38843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice register_arg.arg_type = eArgTypeRegisterName; 38943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice register_arg.arg_repetition = eArgRepeatPlain; 39043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 39143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 39243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg1.push_back (register_arg); 39343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 39443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first (and only) variant of this arg. 39543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice value_arg.arg_type = eArgTypeValue; 39643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice value_arg.arg_repetition = eArgRepeatPlain; 39743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 39843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 39943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg2.push_back (value_arg); 40043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 40143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Push the data for the first argument into the m_arguments vector. 40243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice m_arguments.push_back (arg1); 40343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice m_arguments.push_back (arg2); 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandObjectRegisterWrite () 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 411da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 413da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute(Args& command, CommandReturnObject &result) 41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DataExtractor reg_data; 416ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton RegisterContext *reg_ctx = m_exe_ctx.GetRegisterContext (); 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 418ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (command.GetArgumentCount() != 2) 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 420ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendError ("register write takes exactly 2 arguments: <reg-name> <value>"); 421ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.SetStatus (eReturnStatusFailed); 422ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 423ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else 424ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 425ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const char *reg_name = command.GetArgumentAtIndex(0); 426ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const char *value_str = command.GetArgumentAtIndex(1); 427731493d11e161ef5679319adcaa3b69ad71e3338Enrico Granata 428731493d11e161ef5679319adcaa3b69ad71e3338Enrico Granata 429731493d11e161ef5679319adcaa3b69ad71e3338Enrico Granata // in most LLDB commands we accept $rbx as the name for register RBX - and here we would 430731493d11e161ef5679319adcaa3b69ad71e3338Enrico Granata // reject it and non-existant. we should be more consistent towards the user and allow them 431731493d11e161ef5679319adcaa3b69ad71e3338Enrico Granata // to say reg write $rbx - internally, however, we should be strict and not allow ourselves 432731493d11e161ef5679319adcaa3b69ad71e3338Enrico Granata // to call our registers $rbx in our own API 433731493d11e161ef5679319adcaa3b69ad71e3338Enrico Granata if (reg_name && *reg_name == '$') 434731493d11e161ef5679319adcaa3b69ad71e3338Enrico Granata reg_name = reg_name+1; 435731493d11e161ef5679319adcaa3b69ad71e3338Enrico Granata 436ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoByName(reg_name); 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 438ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (reg_info) 439ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 440ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton RegisterValue reg_value; 441ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 442ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Error error (reg_value.SetValueFromCString (reg_info, value_str)); 443ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (error.Success()) 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 445ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (reg_ctx->WriteRegister (reg_info, reg_value)) 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 447ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton // Toss all frames and anything else in the thread 448ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton // after a register has been written. 449ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton m_exe_ctx.GetThreadRef().Flush(); 450ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.SetStatus (eReturnStatusSuccessFinishNoResult); 451ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton return true; 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 453ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 454ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (error.AsCString()) 455ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 456ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendErrorWithFormat ("Failed to write register '%s' with value '%s': %s\n", 457ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton reg_name, 458ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton value_str, 459ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton error.AsCString()); 46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 463ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendErrorWithFormat ("Failed to write register '%s' with value '%s'", 464ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton reg_name, 465ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton value_str); 46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 467ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.SetStatus (eReturnStatusFailed); 468ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 469ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else 470ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 471ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendErrorWithFormat ("Register not found for '%s'.\n", reg_name); 472ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.SetStatus (eReturnStatusFailed); 47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectRegister constructor 48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 48363094e0bb161580564954dee512955c1c79d3476Greg ClaytonCommandObjectRegister::CommandObjectRegister(CommandInterpreter &interpreter) : 484238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectMultiword (interpreter, 485238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "register", 486c1ad82eb979ee856b86aec6e2acb7bddf75f7c4fCaroline Tice "A set of commands to access thread registers.", 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "register [read|write] ...") 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 489238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("read", CommandObjectSP (new CommandObjectRegisterRead (interpreter))); 490238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("write", CommandObjectSP (new CommandObjectRegisterWrite (interpreter))); 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor 49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectRegister::~CommandObjectRegister() 49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 500