1f678e45dSDimitry Andric //===--------------------- RegisterNumber.cpp -------------------*- C++ -*-===//
2f678e45dSDimitry Andric //
3f678e45dSDimitry Andric // The LLVM Compiler Infrastructure
4f678e45dSDimitry Andric //
5f678e45dSDimitry Andric // This file is distributed under the University of Illinois Open Source
6f678e45dSDimitry Andric // License. See LICENSE.TXT for details.
7f678e45dSDimitry Andric //
8f678e45dSDimitry Andric //===----------------------------------------------------------------------===//
9f678e45dSDimitry Andric
10f678e45dSDimitry Andric #include "lldb/Target/RegisterNumber.h"
11f678e45dSDimitry Andric #include "lldb/Target/RegisterContext.h"
12f678e45dSDimitry Andric #include "lldb/Target/Thread.h"
13f678e45dSDimitry Andric
14f678e45dSDimitry Andric using namespace lldb_private;
15f678e45dSDimitry Andric
RegisterNumber(lldb_private::Thread & thread,lldb::RegisterKind kind,uint32_t num)16f678e45dSDimitry Andric RegisterNumber::RegisterNumber(lldb_private::Thread &thread,
17f678e45dSDimitry Andric lldb::RegisterKind kind, uint32_t num)
18f678e45dSDimitry Andric : m_reg_ctx_sp(thread.GetRegisterContext()), m_regnum(num), m_kind(kind),
19f678e45dSDimitry Andric m_kind_regnum_map(), m_name("") {
20f678e45dSDimitry Andric if (m_reg_ctx_sp.get()) {
21f678e45dSDimitry Andric const lldb_private::RegisterInfo *reginfo =
22f678e45dSDimitry Andric m_reg_ctx_sp->GetRegisterInfoAtIndex(
23f678e45dSDimitry Andric GetAsKind(lldb::eRegisterKindLLDB));
24f678e45dSDimitry Andric if (reginfo && reginfo->name) {
25f678e45dSDimitry Andric m_name = reginfo->name;
26f678e45dSDimitry Andric }
27f678e45dSDimitry Andric }
28f678e45dSDimitry Andric }
29f678e45dSDimitry Andric
RegisterNumber()30f678e45dSDimitry Andric RegisterNumber::RegisterNumber()
31f678e45dSDimitry Andric : m_reg_ctx_sp(), m_regnum(LLDB_INVALID_REGNUM),
32f678e45dSDimitry Andric m_kind(lldb::kNumRegisterKinds), m_kind_regnum_map(), m_name(nullptr) {}
33f678e45dSDimitry Andric
init(lldb_private::Thread & thread,lldb::RegisterKind kind,uint32_t num)34f678e45dSDimitry Andric void RegisterNumber::init(lldb_private::Thread &thread, lldb::RegisterKind kind,
35f678e45dSDimitry Andric uint32_t num) {
36f678e45dSDimitry Andric m_reg_ctx_sp = thread.GetRegisterContext();
37f678e45dSDimitry Andric m_regnum = num;
38f678e45dSDimitry Andric m_kind = kind;
39f678e45dSDimitry Andric if (m_reg_ctx_sp.get()) {
40f678e45dSDimitry Andric const lldb_private::RegisterInfo *reginfo =
41f678e45dSDimitry Andric m_reg_ctx_sp->GetRegisterInfoAtIndex(
42f678e45dSDimitry Andric GetAsKind(lldb::eRegisterKindLLDB));
43f678e45dSDimitry Andric if (reginfo && reginfo->name) {
44f678e45dSDimitry Andric m_name = reginfo->name;
45f678e45dSDimitry Andric }
46f678e45dSDimitry Andric }
47f678e45dSDimitry Andric }
48f678e45dSDimitry Andric
operator =(const RegisterNumber & rhs)49f678e45dSDimitry Andric const RegisterNumber &RegisterNumber::operator=(const RegisterNumber &rhs) {
50f678e45dSDimitry Andric m_reg_ctx_sp = rhs.m_reg_ctx_sp;
51f678e45dSDimitry Andric m_regnum = rhs.m_regnum;
52f678e45dSDimitry Andric m_kind = rhs.m_kind;
53f678e45dSDimitry Andric for (auto it : rhs.m_kind_regnum_map)
54f678e45dSDimitry Andric m_kind_regnum_map[it.first] = it.second;
55f678e45dSDimitry Andric m_name = rhs.m_name;
56f678e45dSDimitry Andric return *this;
57f678e45dSDimitry Andric }
58f678e45dSDimitry Andric
operator ==(RegisterNumber & rhs)59f678e45dSDimitry Andric bool RegisterNumber::operator==(RegisterNumber &rhs) {
60f678e45dSDimitry Andric if (IsValid() != rhs.IsValid())
61f678e45dSDimitry Andric return false;
62f678e45dSDimitry Andric
63f678e45dSDimitry Andric if (m_kind == rhs.m_kind) {
64*b5893f02SDimitry Andric return m_regnum == rhs.m_regnum;
65f678e45dSDimitry Andric }
66f678e45dSDimitry Andric
67f678e45dSDimitry Andric uint32_t rhs_regnum = rhs.GetAsKind(m_kind);
68f678e45dSDimitry Andric if (rhs_regnum != LLDB_INVALID_REGNUM) {
69*b5893f02SDimitry Andric return m_regnum == rhs_regnum;
70f678e45dSDimitry Andric }
71f678e45dSDimitry Andric uint32_t lhs_regnum = GetAsKind(rhs.m_kind);
72*b5893f02SDimitry Andric { return lhs_regnum == rhs.m_regnum; }
73f678e45dSDimitry Andric return false;
74f678e45dSDimitry Andric }
75f678e45dSDimitry Andric
operator !=(RegisterNumber & rhs)76f678e45dSDimitry Andric bool RegisterNumber::operator!=(RegisterNumber &rhs) { return !(*this == rhs); }
77f678e45dSDimitry Andric
IsValid() const78f678e45dSDimitry Andric bool RegisterNumber::IsValid() const {
79f678e45dSDimitry Andric return m_reg_ctx_sp.get() && m_kind != lldb::kNumRegisterKinds &&
80f678e45dSDimitry Andric m_regnum != LLDB_INVALID_REGNUM;
81f678e45dSDimitry Andric }
82f678e45dSDimitry Andric
GetAsKind(lldb::RegisterKind kind)83f678e45dSDimitry Andric uint32_t RegisterNumber::GetAsKind(lldb::RegisterKind kind) {
84f678e45dSDimitry Andric if (m_regnum == LLDB_INVALID_REGNUM)
85f678e45dSDimitry Andric return LLDB_INVALID_REGNUM;
86f678e45dSDimitry Andric
87f678e45dSDimitry Andric if (kind == m_kind)
88f678e45dSDimitry Andric return m_regnum;
89f678e45dSDimitry Andric
90f678e45dSDimitry Andric Collection::iterator iter = m_kind_regnum_map.find(kind);
91f678e45dSDimitry Andric if (iter != m_kind_regnum_map.end()) {
92f678e45dSDimitry Andric return iter->second;
93f678e45dSDimitry Andric }
94f678e45dSDimitry Andric uint32_t output_regnum = LLDB_INVALID_REGNUM;
95f678e45dSDimitry Andric if (m_reg_ctx_sp &&
96f678e45dSDimitry Andric m_reg_ctx_sp->ConvertBetweenRegisterKinds(m_kind, m_regnum, kind,
97f678e45dSDimitry Andric output_regnum) &&
98f678e45dSDimitry Andric output_regnum != LLDB_INVALID_REGNUM) {
99f678e45dSDimitry Andric m_kind_regnum_map[kind] = output_regnum;
100f678e45dSDimitry Andric }
101f678e45dSDimitry Andric return output_regnum;
102f678e45dSDimitry Andric }
103f678e45dSDimitry Andric
GetRegisterNumber() const104f678e45dSDimitry Andric uint32_t RegisterNumber::GetRegisterNumber() const { return m_regnum; }
105f678e45dSDimitry Andric
GetRegisterKind() const106f678e45dSDimitry Andric lldb::RegisterKind RegisterNumber::GetRegisterKind() const { return m_kind; }
107f678e45dSDimitry Andric
GetName()108f678e45dSDimitry Andric const char *RegisterNumber::GetName() { return m_name; }
109