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