Path: blob/main/contrib/llvm-project/lldb/source/Target/RegisterNumber.cpp
96333 views
//===-- RegisterNumber.cpp ------------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "lldb/Target/RegisterNumber.h"9#include "lldb/Target/RegisterContext.h"10#include "lldb/Target/Thread.h"1112using namespace lldb_private;1314RegisterNumber::RegisterNumber(lldb_private::Thread &thread,15lldb::RegisterKind kind, uint32_t num)16: m_reg_ctx_sp(thread.GetRegisterContext()), m_regnum(num), m_kind(kind),17m_kind_regnum_map(), m_name("") {18if (m_reg_ctx_sp.get()) {19const lldb_private::RegisterInfo *reginfo =20m_reg_ctx_sp->GetRegisterInfoAtIndex(21GetAsKind(lldb::eRegisterKindLLDB));22if (reginfo && reginfo->name) {23m_name = reginfo->name;24}25}26}2728RegisterNumber::RegisterNumber() : m_reg_ctx_sp(), m_kind_regnum_map() {}2930void RegisterNumber::init(lldb_private::Thread &thread, lldb::RegisterKind kind,31uint32_t num) {32m_reg_ctx_sp = thread.GetRegisterContext();33m_regnum = num;34m_kind = kind;35if (m_reg_ctx_sp.get()) {36const lldb_private::RegisterInfo *reginfo =37m_reg_ctx_sp->GetRegisterInfoAtIndex(38GetAsKind(lldb::eRegisterKindLLDB));39if (reginfo && reginfo->name) {40m_name = reginfo->name;41}42}43}4445const RegisterNumber &RegisterNumber::operator=(const RegisterNumber &rhs) {46m_reg_ctx_sp = rhs.m_reg_ctx_sp;47m_regnum = rhs.m_regnum;48m_kind = rhs.m_kind;49for (auto it : rhs.m_kind_regnum_map)50m_kind_regnum_map[it.first] = it.second;51m_name = rhs.m_name;52return *this;53}5455bool RegisterNumber::operator==(RegisterNumber &rhs) {56if (IsValid() != rhs.IsValid())57return false;5859if (m_kind == rhs.m_kind) {60return m_regnum == rhs.m_regnum;61}6263uint32_t rhs_regnum = rhs.GetAsKind(m_kind);64if (rhs_regnum != LLDB_INVALID_REGNUM) {65return m_regnum == rhs_regnum;66}67uint32_t lhs_regnum = GetAsKind(rhs.m_kind);68{ return lhs_regnum == rhs.m_regnum; }69return false;70}7172bool RegisterNumber::operator!=(RegisterNumber &rhs) { return !(*this == rhs); }7374bool RegisterNumber::IsValid() const {75return m_reg_ctx_sp.get() && m_kind != lldb::kNumRegisterKinds &&76m_regnum != LLDB_INVALID_REGNUM;77}7879uint32_t RegisterNumber::GetAsKind(lldb::RegisterKind kind) {80if (m_regnum == LLDB_INVALID_REGNUM)81return LLDB_INVALID_REGNUM;8283if (kind == m_kind)84return m_regnum;8586Collection::iterator iter = m_kind_regnum_map.find(kind);87if (iter != m_kind_regnum_map.end()) {88return iter->second;89}90uint32_t output_regnum = LLDB_INVALID_REGNUM;91if (m_reg_ctx_sp &&92m_reg_ctx_sp->ConvertBetweenRegisterKinds(m_kind, m_regnum, kind,93output_regnum) &&94output_regnum != LLDB_INVALID_REGNUM) {95m_kind_regnum_map[kind] = output_regnum;96}97return output_regnum;98}99100uint32_t RegisterNumber::GetRegisterNumber() const { return m_regnum; }101102lldb::RegisterKind RegisterNumber::GetRegisterKind() const { return m_kind; }103104const char *RegisterNumber::GetName() { return m_name; }105106107