brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.3 KiB · 56dda8d Raw
107 lines · cpp
1//===-- RegisterNumber.cpp ------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "lldb/Target/RegisterNumber.h"10#include "lldb/Target/RegisterContext.h"11#include "lldb/Target/Thread.h"12 13using namespace lldb_private;14 15RegisterNumber::RegisterNumber(lldb_private::Thread &thread,16                               lldb::RegisterKind kind, uint32_t num)17    : m_reg_ctx_sp(thread.GetRegisterContext()), m_regnum(num), m_kind(kind),18      m_kind_regnum_map(), m_name("") {19  if (m_reg_ctx_sp.get()) {20    const lldb_private::RegisterInfo *reginfo =21        m_reg_ctx_sp->GetRegisterInfoAtIndex(22            GetAsKind(lldb::eRegisterKindLLDB));23    if (reginfo && reginfo->name) {24      m_name = reginfo->name;25    }26  }27}28 29RegisterNumber::RegisterNumber() : m_reg_ctx_sp(), m_kind_regnum_map() {}30 31void RegisterNumber::init(lldb_private::Thread &thread, lldb::RegisterKind kind,32                          uint32_t num) {33  m_reg_ctx_sp = thread.GetRegisterContext();34  m_regnum = num;35  m_kind = kind;36  if (m_reg_ctx_sp.get()) {37    const lldb_private::RegisterInfo *reginfo =38        m_reg_ctx_sp->GetRegisterInfoAtIndex(39            GetAsKind(lldb::eRegisterKindLLDB));40    if (reginfo && reginfo->name) {41      m_name = reginfo->name;42    }43  }44}45 46const RegisterNumber &RegisterNumber::operator=(const RegisterNumber &rhs) {47  m_reg_ctx_sp = rhs.m_reg_ctx_sp;48  m_regnum = rhs.m_regnum;49  m_kind = rhs.m_kind;50  m_kind_regnum_map.clear();51  for (auto it : rhs.m_kind_regnum_map)52    m_kind_regnum_map[it.first] = it.second;53  m_name = rhs.m_name;54  return *this;55}56 57bool RegisterNumber::operator==(RegisterNumber &rhs) {58  if (IsValid() != rhs.IsValid())59    return false;60 61  if (m_kind == rhs.m_kind) {62    return m_regnum == rhs.m_regnum;63  }64 65  uint32_t rhs_regnum = rhs.GetAsKind(m_kind);66  if (rhs_regnum != LLDB_INVALID_REGNUM) {67    return m_regnum == rhs_regnum;68  }69  uint32_t lhs_regnum = GetAsKind(rhs.m_kind);70  { return lhs_regnum == rhs.m_regnum; }71  return false;72}73 74bool RegisterNumber::operator!=(RegisterNumber &rhs) { return !(*this == rhs); }75 76bool RegisterNumber::IsValid() const {77  return m_reg_ctx_sp.get() && m_kind != lldb::kNumRegisterKinds &&78         m_regnum != LLDB_INVALID_REGNUM;79}80 81uint32_t RegisterNumber::GetAsKind(lldb::RegisterKind kind) {82  if (m_regnum == LLDB_INVALID_REGNUM)83    return LLDB_INVALID_REGNUM;84 85  if (kind == m_kind)86    return m_regnum;87 88  Collection::iterator iter = m_kind_regnum_map.find(kind);89  if (iter != m_kind_regnum_map.end()) {90    return iter->second;91  }92  uint32_t output_regnum = LLDB_INVALID_REGNUM;93  if (m_reg_ctx_sp &&94      m_reg_ctx_sp->ConvertBetweenRegisterKinds(m_kind, m_regnum, kind,95                                                output_regnum) &&96      output_regnum != LLDB_INVALID_REGNUM) {97    m_kind_regnum_map[kind] = output_regnum;98  }99  return output_regnum;100}101 102uint32_t RegisterNumber::GetRegisterNumber() const { return m_regnum; }103 104lldb::RegisterKind RegisterNumber::GetRegisterKind() const { return m_kind; }105 106const char *RegisterNumber::GetName() { return m_name; }107