Switch the EmulateInstruction to use the standard RegisterInfo structure that is defined in the lldb private types intead of passing the reg kind and reg num everywhere. EmulateInstruction subclasses also need to provide RegisterInfo structs given a reg kind and reg num. This eliminates the need for the GetRegisterName() virtual function and allows more complete information to be passed around in the read/write register callbacks. Subclasses should always provide RegiterInfo structs with the generic register info filled in as well as at least one kind of register number in the RegisterInfo.kinds[] array. llvm-svn: 130256
102 lines
3.0 KiB
C++
102 lines
3.0 KiB
C++
//===-- lldb_EmulationStateARM.h --------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef lldb_EmulationStateARM_h_
|
|
#define lldb_EmulationStateARM_h_
|
|
|
|
#include <map>
|
|
|
|
#include "lldb/Core/EmulateInstruction.h"
|
|
#include "lldb/Core/Opcode.h"
|
|
#include "lldb/Interpreter/NamedOptionValue.h"
|
|
|
|
class EmulationStateARM {
|
|
public:
|
|
|
|
EmulationStateARM ();
|
|
|
|
virtual
|
|
~EmulationStateARM ();
|
|
|
|
bool
|
|
StorePseudoRegisterValue (uint32_t reg_num, uint64_t value);
|
|
|
|
uint64_t
|
|
ReadPseudoRegisterValue (uint32_t reg_num, bool &success);
|
|
|
|
bool
|
|
StoreToPseudoAddress (lldb::addr_t p_address, uint64_t value, uint32_t size);
|
|
|
|
uint32_t
|
|
ReadFromPseudoAddress (lldb::addr_t p_address, uint32_t size, bool &success);
|
|
|
|
void
|
|
ClearPseudoRegisters ();
|
|
|
|
void
|
|
ClearPseudoMemory ();
|
|
|
|
bool
|
|
LoadPseudoRegistersFromFrame (lldb_private::StackFrame &frame);
|
|
|
|
bool
|
|
LoadStateFromDictionary (lldb_private::OptionValueDictionary *test_data);
|
|
|
|
bool
|
|
CompareState (EmulationStateARM &other_state);
|
|
|
|
static size_t
|
|
ReadPseudoMemory (lldb_private::EmulateInstruction *instruction,
|
|
void *baton,
|
|
const lldb_private::EmulateInstruction::Context &context,
|
|
lldb::addr_t addr,
|
|
void *dst,
|
|
size_t length);
|
|
|
|
static size_t
|
|
WritePseudoMemory (lldb_private::EmulateInstruction *instruction,
|
|
void *baton,
|
|
const lldb_private::EmulateInstruction::Context &context,
|
|
lldb::addr_t addr,
|
|
const void *dst,
|
|
size_t length);
|
|
|
|
static bool
|
|
ReadPseudoRegister (lldb_private::EmulateInstruction *instruction,
|
|
void *baton,
|
|
const lldb_private::RegisterInfo ®_info,
|
|
uint64_t ®_value);
|
|
|
|
static bool
|
|
WritePseudoRegister (lldb_private::EmulateInstruction *instruction,
|
|
void *baton,
|
|
const lldb_private::EmulateInstruction::Context &context,
|
|
const lldb_private::RegisterInfo ®_info,
|
|
uint64_t reg_value);
|
|
private:
|
|
uint32_t m_gpr[17];
|
|
struct sd_regs
|
|
{
|
|
union
|
|
{
|
|
uint32_t s_reg[2];
|
|
uint64_t d_reg;
|
|
} sd_regs[16]; // sregs 0 - 31 & dregs 0 - 15
|
|
|
|
uint64_t d_regs[16]; // dregs 16-31
|
|
|
|
} m_vfp_regs;
|
|
|
|
std::map<lldb::addr_t, uint32_t> m_memory; // Eventually will want to change uint32_t to a data buffer heap type.
|
|
|
|
DISALLOW_COPY_AND_ASSIGN (EmulationStateARM);
|
|
};
|
|
|
|
#endif // lldb_EmulationStateARM_h_
|