1 //===--------------------- RegisterNumber.cpp -------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "lldb/Utility/RegisterNumber.h"
11 #include "lldb/Target/Thread.h"
12 #include "lldb/Target/RegisterContext.h"
14 using namespace lldb_private;
17 RegisterNumber::RegisterNumber (lldb_private::Thread &thread, lldb::RegisterKind kind, uint32_t num) :
18 m_reg_ctx_sp (thread.GetRegisterContext()),
24 if (m_reg_ctx_sp.get())
26 const lldb_private::RegisterInfo *reginfo = m_reg_ctx_sp->GetRegisterInfoAtIndex (GetAsKind (lldb::eRegisterKindLLDB));
27 if (reginfo && reginfo->name)
29 m_name = reginfo->name;
34 RegisterNumber::RegisterNumber () :
36 m_regnum (LLDB_INVALID_REGNUM),
37 m_kind (lldb::kNumRegisterKinds),
44 RegisterNumber::init (lldb_private::Thread &thread, lldb::RegisterKind kind, uint32_t num)
46 m_reg_ctx_sp = thread.GetRegisterContext();
49 if (m_reg_ctx_sp.get())
51 const lldb_private::RegisterInfo *reginfo = m_reg_ctx_sp->GetRegisterInfoAtIndex (GetAsKind (lldb::eRegisterKindLLDB));
52 if (reginfo && reginfo->name)
54 m_name = reginfo->name;
59 const RegisterNumber &
60 RegisterNumber::operator = (const RegisterNumber &rhs)
62 m_reg_ctx_sp = rhs.m_reg_ctx_sp;
63 m_regnum = rhs.m_regnum;
65 for (auto it : rhs.m_kind_regnum_map)
66 m_kind_regnum_map[it.first] = it.second;
72 RegisterNumber::operator == (RegisterNumber &rhs)
74 if (IsValid() != rhs.IsValid())
77 if (m_kind == rhs.m_kind)
79 if (m_regnum == rhs.m_regnum)
85 uint32_t rhs_regnum = rhs.GetAsKind (m_kind);
86 if (rhs_regnum != LLDB_INVALID_REGNUM)
88 if (m_regnum == rhs_regnum)
93 uint32_t lhs_regnum = GetAsKind (rhs.m_kind);
95 if (lhs_regnum == rhs.m_regnum)
104 RegisterNumber::operator != (RegisterNumber &rhs)
106 return !(*this == rhs);
110 RegisterNumber::IsValid () const
112 return m_reg_ctx_sp.get()
113 && m_kind != lldb::kNumRegisterKinds
114 && m_regnum != LLDB_INVALID_REGNUM;
118 RegisterNumber::GetAsKind (lldb::RegisterKind kind)
120 if (m_regnum == LLDB_INVALID_REGNUM)
121 return LLDB_INVALID_REGNUM;
126 Collection::iterator iter = m_kind_regnum_map.find (kind);
127 if (iter != m_kind_regnum_map.end())
131 uint32_t output_regnum = LLDB_INVALID_REGNUM;
133 && m_reg_ctx_sp->ConvertBetweenRegisterKinds (m_kind, m_regnum, kind, output_regnum)
134 && output_regnum != LLDB_INVALID_REGNUM)
136 m_kind_regnum_map[kind] = output_regnum;
138 return output_regnum;
142 RegisterNumber::GetRegisterNumber () const
148 RegisterNumber::GetRegisterKind () const
154 RegisterNumber::GetName ()