RegisterContextHistory.cpp revision 314564
12061Sjkh//===-- RegisterContextHistory.cpp ---------------------------------*- C++
236683Sbde//-*-===//
32061Sjkh//
433611Sjb//                     The LLVM Compiler Infrastructure
532427Sjb//
632427Sjb// This file is distributed under the University of Illinois Open Source
736111Sjb// License. See LICENSE.TXT for details.
833611Sjb//
932427Sjb//===----------------------------------------------------------------------===//
1032427Sjb
112061Sjkh#include "lldb/Core/Address.h"
1215603Smarkm#include "lldb/Core/AddressRange.h"
1330169Sjkh#include "lldb/Core/DataBufferHeap.h"
1420710Sasami#include "lldb/Core/Log.h"
1520710Sasami#include "lldb/Core/Module.h"
163197Scsgr#include "lldb/Core/RegisterValue.h"
172061Sjkh#include "lldb/Core/Value.h"
1812483Speter#include "lldb/Expression/DWARFExpression.h"
1934509Sbde#include "lldb/Symbol/FuncUnwinders.h"
202160Scsgr#include "lldb/Symbol/Function.h"
212834Swollman#include "lldb/Symbol/ObjectFile.h"
222061Sjkh#include "lldb/Symbol/Symbol.h"
232061Sjkh#include "lldb/Symbol/SymbolContext.h"
242160Scsgr#include "lldb/Target/ABI.h"
2517308Speter#include "lldb/Target/DynamicLoader.h"
2619320Sadam#include "lldb/Target/ExecutionContext.h"
2727788Sasami#include "lldb/Target/Process.h"
2830169Sjkh#include "lldb/Target/StackFrame.h"
2925980Sasami#include "lldb/Target/Target.h"
301594Srgrimes#include "lldb/Target/Thread.h"
3117308Speter#include "lldb/lldb-private.h"
3217308Speter
3327910Sasami#include "RegisterContextHistory.h"
3427910Sasami
3527910Sasamiusing namespace lldb;
3617308Speterusing namespace lldb_private;
3717308Speter
3817308SpeterRegisterContextHistory::RegisterContextHistory(Thread &thread,
3919175Sbde                                               uint32_t concrete_frame_idx,
4019175Sbde                                               uint32_t address_byte_size,
4119175Sbde                                               addr_t pc_value)
4219175Sbde    : RegisterContext(thread, concrete_frame_idx), m_pc_value(pc_value) {
4317308Speter  m_reg_set0.name = "General Purpose Registers";
4427910Sasami  m_reg_set0.short_name = "GPR";
4534509Sbde  m_reg_set0.num_registers = 1;
4627910Sasami  m_reg_set0.registers = new uint32_t(0);
4717308Speter
482061Sjkh  m_pc_reg_info.name = "pc";
492061Sjkh  m_pc_reg_info.alt_name = "pc";
501594Srgrimes  m_pc_reg_info.byte_offset = 0;
5130169Sjkh  m_pc_reg_info.byte_size = address_byte_size;
5230169Sjkh  m_pc_reg_info.encoding = eEncodingUint;
5330169Sjkh  m_pc_reg_info.format = eFormatPointer;
5430169Sjkh  m_pc_reg_info.invalidate_regs = NULL;
5530169Sjkh  m_pc_reg_info.value_regs = NULL;
5630169Sjkh  m_pc_reg_info.kinds[eRegisterKindEHFrame] = LLDB_INVALID_REGNUM;
5730169Sjkh  m_pc_reg_info.kinds[eRegisterKindDWARF] = LLDB_INVALID_REGNUM;
5830169Sjkh  m_pc_reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_PC;
597407Srgrimes  m_pc_reg_info.kinds[eRegisterKindProcessPlugin] = LLDB_INVALID_REGNUM;
607108Sphk  m_pc_reg_info.kinds[eRegisterKindLLDB] = LLDB_INVALID_REGNUM;
617108Sphk}
627108Sphk
637407SrgrimesRegisterContextHistory::~RegisterContextHistory() {
647407Srgrimes  delete m_reg_set0.registers;
657407Srgrimes  delete m_pc_reg_info.invalidate_regs;
667108Sphk  delete m_pc_reg_info.value_regs;
672061Sjkh}
682061Sjkh
692061Sjkhvoid RegisterContextHistory::InvalidateAllRegisters() {}
7017308Speter
712061Sjkhsize_t RegisterContextHistory::GetRegisterCount() { return 1; }
722061Sjkh
732061Sjkhconst lldb_private::RegisterInfo *
742061SjkhRegisterContextHistory::GetRegisterInfoAtIndex(size_t reg) {
752061Sjkh  if (reg)
7635427Sbde    return NULL;
7735427Sbde  return &m_pc_reg_info;
7830169Sjkh}
792626Scsgr
802061Sjkhsize_t RegisterContextHistory::GetRegisterSetCount() { return 1; }
812061Sjkh
822061Sjkhconst lldb_private::RegisterSet *
832061SjkhRegisterContextHistory::GetRegisterSet(size_t reg_set) {
842061Sjkh  if (reg_set)
852061Sjkh    return NULL;
8619320Sadam  return &m_reg_set0;
872061Sjkh}
882061Sjkh
892061Sjkhbool RegisterContextHistory::ReadRegister(
902061Sjkh    const lldb_private::RegisterInfo *reg_info,
912061Sjkh    lldb_private::RegisterValue &value) {
922061Sjkh  if (!reg_info)
932061Sjkh    return false;
942061Sjkh  uint32_t reg_number = reg_info->kinds[eRegisterKindGeneric];
952061Sjkh  if (reg_number == LLDB_REGNUM_GENERIC_PC) {
962061Sjkh    value.SetUInt(m_pc_value, reg_info->byte_size);
972061Sjkh    return true;
982834Swollman  }
992834Swollman  return false;
1002834Swollman}
1012834Swollman
1022834Swollmanbool RegisterContextHistory::WriteRegister(
1032834Swollman    const lldb_private::RegisterInfo *reg_info,
1041594Srgrimes    const lldb_private::RegisterValue &value) {
1054486Sphk  return false;
1064486Sphk}
1074486Sphk
1084486Sphkbool RegisterContextHistory::ReadAllRegisterValues(
1094486Sphk    lldb::DataBufferSP &data_sp) {
1102061Sjkh  return false;
1112061Sjkh}
11225979Sjkh
11325979Sjkhbool RegisterContextHistory::WriteAllRegisterValues(
11425979Sjkh    const lldb::DataBufferSP &data_sp) {
11525979Sjkh  return false;
1162061Sjkh}
11725979Sjkh
1182061Sjkhuint32_t RegisterContextHistory::ConvertRegisterKindToRegisterNumber(
1192061Sjkh    lldb::RegisterKind kind, uint32_t num) {
12017308Speter  if (kind == eRegisterKindGeneric && num == LLDB_REGNUM_GENERIC_PC)
1212061Sjkh    return 0;
1222061Sjkh  return LLDB_INVALID_REGNUM;
1232061Sjkh}
1242061Sjkh