124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- GDBRemoteRegisterContext.h ------------------------------*- 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
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef lldb_GDBRemoteRegisterContext_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define lldb_GDBRemoteRegisterContext_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <vector>
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h"
203a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda#include "lldb/lldb-enumerations.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ConstString.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/DataExtractor.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h"
2474351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen#include "GDBRemoteCommunicationClient.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass ThreadGDBRemote;
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass ProcessGDBRemote;
28a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Claytonclass StringExtractor;
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass GDBRemoteDynamicRegisterInfo
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GDBRemoteDynamicRegisterInfo () :
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_regs (),
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_sets (),
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_set_reg_nums (),
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_reg_names (),
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_reg_alt_names (),
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_set_names (),
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_reg_data_byte_size (0)
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~GDBRemoteDynamicRegisterInfo ()
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
494c32029943b762dbba4750137d606c59adf26fe8Jason Molenda    AddRegister (lldb_private::RegisterInfo reg_info,
50b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                 lldb_private::ConstString &reg_name,
51b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                 lldb_private::ConstString &reg_alt_name,
52b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                 lldb_private::ConstString &set_name)
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
5436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        const uint32_t reg_num = (uint32_t)m_regs.size();
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_reg_names.push_back (reg_name);
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_reg_alt_names.push_back (reg_alt_name);
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        reg_info.name = reg_name.AsCString();
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (reg_info.name);
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        reg_info.alt_name = reg_alt_name.AsCString(NULL);
60c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton        uint32_t i;
61c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton        if (reg_info.value_regs)
62c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton        {
63c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton            for (i=0; reg_info.value_regs[i] != LLDB_INVALID_REGNUM; ++i)
64c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton                m_value_regs_map[reg_num].push_back(reg_info.value_regs[i]);
65c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton            m_value_regs_map[reg_num].push_back(LLDB_INVALID_REGNUM);
66c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton            reg_info.value_regs = m_value_regs_map[reg_num].data();
67c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton        }
68c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton        if (reg_info.invalidate_regs)
69c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton        {
70c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton            for (i=0; reg_info.invalidate_regs[i] != LLDB_INVALID_REGNUM; ++i)
71c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton                m_invalidate_regs_map[reg_num].push_back(reg_info.invalidate_regs[i]);
72c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton            m_invalidate_regs_map[reg_num].push_back(LLDB_INVALID_REGNUM);
73c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton            reg_info.invalidate_regs = m_invalidate_regs_map[reg_num].data();
74c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton        }
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_regs.push_back (reg_info);
7636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        uint32_t set = GetRegisterSetIndexByName (set_name);
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (set < m_sets.size());
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (set < m_set_reg_nums.size());
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        assert (set < m_set_names.size());
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_set_reg_nums[set].push_back(reg_num);
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        size_t end_reg_offset = reg_info.byte_offset + reg_info.byte_size;
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_reg_data_byte_size < end_reg_offset)
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_reg_data_byte_size = end_reg_offset;
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Finalize ()
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (uint32_t set = 0; set < m_sets.size(); ++set)
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            assert (m_sets.size() == m_set_reg_nums.size());
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_sets[set].num_registers = m_set_reg_nums[set].size();
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_sets[set].registers = &m_set_reg_nums[set][0];
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetNumRegisters() const
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_regs.size();
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetNumRegisterSets() const
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_sets.size();
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetRegisterDataByteSize() const
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_reg_data_byte_size;
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
115b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    const lldb_private::RegisterInfo *
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetRegisterInfoAtIndex (uint32_t i) const
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (i < m_regs.size())
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return &m_regs[i];
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
123b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    const lldb_private::RegisterSet *
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetRegisterSet (uint32_t i) const
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (i < m_sets.size())
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return &m_sets[i];
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t
13236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    GetRegisterSetIndexByName (lldb_private::ConstString &set_name)
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        name_collection::iterator pos, end = m_set_names.end();
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (pos = m_set_names.begin(); pos != end; ++pos)
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (*pos == set_name)
13836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                return static_cast<uint32_t>(std::distance (m_set_names.begin(), pos));
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_set_names.push_back(set_name);
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_set_reg_nums.resize(m_set_reg_nums.size()+1);
143b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        lldb_private::RegisterSet new_set = { set_name.AsCString(), NULL, 0, NULL };
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_sets.push_back (new_set);
14536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        return static_cast<uint32_t>(m_sets.size() - 1);
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ConvertRegisterKindToRegisterNumber (uint32_t kind, uint32_t num) const
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        reg_collection::const_iterator pos, end = m_regs.end();
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (pos = m_regs.begin(); pos != end; ++pos)
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (pos->kinds[kind] == num)
15536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                return static_cast<uint32_t>(std::distance (m_regs.begin(), pos));
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return LLDB_INVALID_REGNUM;
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Clear()
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_regs.clear();
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_sets.clear();
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_set_reg_nums.clear();
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_reg_names.clear();
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_reg_alt_names.clear();
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_set_names.clear();
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
172b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen    HardcodeARMRegisters(bool from_scratch);
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Classes that inherit from GDBRemoteRegisterContext can see and modify these
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
178b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    typedef std::vector <lldb_private::RegisterInfo> reg_collection;
179b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    typedef std::vector <lldb_private::RegisterSet> set_collection;
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef std::vector <uint32_t> reg_num_collection;
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef std::vector <reg_num_collection> set_reg_num_collection;
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef std::vector <lldb_private::ConstString> name_collection;
183c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton    typedef std::map<uint32_t, reg_num_collection> reg_to_regs_map;
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    reg_collection m_regs;
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    set_collection m_sets;
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    set_reg_num_collection m_set_reg_nums;
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    name_collection m_reg_names;
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    name_collection m_reg_alt_names;
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    name_collection m_set_names;
191c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton    reg_to_regs_map m_value_regs_map;
192c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton    reg_to_regs_map m_invalidate_regs_map;
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t m_reg_data_byte_size;   // The number of bytes required to store all registers
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass GDBRemoteRegisterContext : public lldb_private::RegisterContext
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Constructors and Destructors
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GDBRemoteRegisterContext (ThreadGDBRemote &thread,
20308d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton                              uint32_t concrete_frame_idx,
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                              GDBRemoteDynamicRegisterInfo &reg_info,
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                              bool read_all_at_once);
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~GDBRemoteRegisterContext ();
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Subclasses must override these functions
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual void
214a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton    InvalidateAllRegisters ();
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual size_t
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetRegisterCount ();
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
219b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    virtual const lldb_private::RegisterInfo *
22036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    GetRegisterInfoAtIndex (size_t reg);
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual size_t
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetRegisterSetCount ();
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
225b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    virtual const lldb_private::RegisterSet *
22636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    GetRegisterSet (size_t reg_set);
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
229061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    ReadRegister (const lldb_private::RegisterInfo *reg_info, lldb_private::RegisterValue &value);
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
232061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    WriteRegister (const lldb_private::RegisterInfo *reg_info, const lldb_private::RegisterValue &value);
233061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ReadAllRegisterValues (lldb::DataBufferSP &data_sp);
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    WriteAllRegisterValues (const lldb::DataBufferSP &data_sp);
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual uint32_t
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ConvertRegisterKindToRegisterNumber (uint32_t kind, uint32_t num);
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
244a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton    friend class ThreadGDBRemote;
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
246c3c4661c6a7527580e605dbb69bef7634971fe13Greg Clayton    bool
247061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    ReadRegisterBytes (const lldb_private::RegisterInfo *reg_info,
248061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                       lldb_private::DataExtractor &data);
249061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
250061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    bool
251061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    WriteRegisterBytes (const lldb_private::RegisterInfo *reg_info,
252061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                        lldb_private::DataExtractor &data,
253061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                        uint32_t data_offset);
254061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
255061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    bool
256a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton    PrivateSetRegisterValue (uint32_t reg, StringExtractor &response);
257a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton
258a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton    void
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetAllRegisterValid (bool b);
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
261c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton    bool
262c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton    GetRegisterIsValid (uint32_t reg) const
263c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton    {
264c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton#if defined (LLDB_CONFIGURATION_DEBUG)
265c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton        assert (reg < m_reg_valid.size());
266c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton#endif
267c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton        if (reg < m_reg_valid.size())
268c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton            return m_reg_valid[reg];
269c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton        return false;
270c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton    }
271c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton
272c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton    void
273c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton    SetRegisterIsValid (const lldb_private::RegisterInfo *reg_info, bool valid)
274c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton    {
275c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton        if (reg_info)
276c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton            return SetRegisterIsValid (reg_info->kinds[lldb::eRegisterKindLLDB], valid);
277c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton    }
278c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton
279c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton    void
280c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton    SetRegisterIsValid (uint32_t reg, bool valid)
281c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton    {
282c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton#if defined (LLDB_CONFIGURATION_DEBUG)
283c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton        assert (reg < m_reg_valid.size());
284c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton#endif
285c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton        if (reg < m_reg_valid.size())
286c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton            m_reg_valid[reg] = valid;
287c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton    }
288c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton
28973f6b49b568f48755bb5058a3db679c3b9093682Jim Ingham    void
29073f6b49b568f48755bb5058a3db679c3b9093682Jim Ingham    SyncThreadState(lldb_private::Process *process);  // Assumes the sequence mutex has already been acquired.
29173f6b49b568f48755bb5058a3db679c3b9093682Jim Ingham
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GDBRemoteDynamicRegisterInfo &m_reg_info;
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::vector<bool> m_reg_valid;
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb_private::DataExtractor m_reg_data;
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool m_read_all_at_once;
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
29874351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen    // Helper function for ReadRegisterBytes().
29974351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen    bool GetPrimordialRegister(const lldb_private::RegisterInfo *reg_info,
30074351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen                               GDBRemoteCommunicationClient &gdb_comm);
30174351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen    // Helper function for WriteRegisterBytes().
30274351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen    bool SetPrimordialRegister(const lldb_private::RegisterInfo *reg_info,
30374351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen                               GDBRemoteCommunicationClient &gdb_comm);
30474351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // For GDBRemoteRegisterContext only
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DISALLOW_COPY_AND_ASSIGN (GDBRemoteRegisterContext);
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // lldb_GDBRemoteRegisterContext_h_
312