forked from OSchip/llvm-project
Merge RegisterContextPOSIX_x86_64 and RegisterContextPOSIX_i386 into RegisterContextPOSIX_x86
llvm-svn: 192332
This commit is contained in:
parent
935d01d80a
commit
762df1f139
|
@ -10,12 +10,10 @@ add_lldb_library(lldbPluginProcessPOSIX
|
|||
ProcessMessage.cpp
|
||||
ProcessPOSIX.cpp
|
||||
ProcessPOSIXLog.cpp
|
||||
RegisterContextPOSIX_i386.cpp
|
||||
RegisterContextPOSIX_x86_64.cpp
|
||||
RegisterContextPOSIX_x86.cpp
|
||||
RegisterContextPOSIXProcessMonitor_x86.cpp
|
||||
RegisterContextFreeBSD_i386.cpp
|
||||
RegisterContextFreeBSD_x86_64.cpp
|
||||
RegisterContextLinux_i386.cpp
|
||||
RegisterContextLinux_x86_64.cpp
|
||||
RegisterContextPOSIXProcessMonitor_i386.cpp
|
||||
RegisterContextPOSIXProcessMonitor_x86_64.cpp
|
||||
)
|
||||
|
|
|
@ -29,9 +29,7 @@
|
|||
#include "ProcessPOSIX.h"
|
||||
#include "ProcessPOSIXLog.h"
|
||||
#include "ProcessMonitor.h"
|
||||
#include "RegisterContextPOSIX_i386.h"
|
||||
#include "RegisterContextPOSIXProcessMonitor_i386.h"
|
||||
#include "RegisterContextPOSIXProcessMonitor_x86_64.h"
|
||||
#include "RegisterContextPOSIXProcessMonitor_x86.h"
|
||||
#include "RegisterContextLinux_i386.h"
|
||||
#include "RegisterContextLinux_x86_64.h"
|
||||
#include "RegisterContextFreeBSD_i386.h"
|
||||
|
@ -143,67 +141,27 @@ POSIXThread::GetRegisterContext()
|
|||
{
|
||||
m_posix_thread = NULL;
|
||||
|
||||
RegisterInfoInterface *reg_interface = NULL;
|
||||
const ArchSpec &target_arch = GetProcess()->GetTarget().GetArchitecture();
|
||||
const ArchSpec &host_arch = Host::GetArchitecture();
|
||||
switch (host_arch.GetCore())
|
||||
|
||||
switch (target_arch.GetTriple().getOS())
|
||||
{
|
||||
default:
|
||||
assert(false && "CPU type not supported!");
|
||||
break;
|
||||
|
||||
case ArchSpec::eCore_x86_32_i386:
|
||||
case ArchSpec::eCore_x86_32_i486:
|
||||
case ArchSpec::eCore_x86_32_i486sx:
|
||||
{
|
||||
RegisterInfoInterface *reg_interface = NULL;
|
||||
|
||||
switch (target_arch.GetTriple().getOS())
|
||||
{
|
||||
case llvm::Triple::FreeBSD:
|
||||
reg_interface = new RegisterContextFreeBSD_i386(target_arch);
|
||||
break;
|
||||
case llvm::Triple::Linux:
|
||||
reg_interface = new RegisterContextLinux_i386(target_arch);
|
||||
break;
|
||||
default:
|
||||
assert(false && "OS not supported");
|
||||
break;
|
||||
}
|
||||
|
||||
if (reg_interface)
|
||||
{
|
||||
RegisterContextPOSIXProcessMonitor_i386 *reg_ctx = new RegisterContextPOSIXProcessMonitor_i386(*this, 0, reg_interface);
|
||||
m_posix_thread = reg_ctx;
|
||||
m_reg_context_sp.reset(reg_ctx);
|
||||
}
|
||||
break;
|
||||
case llvm::Triple::FreeBSD:
|
||||
reg_interface = new RegisterContextFreeBSD_x86_64(target_arch);
|
||||
break;
|
||||
case llvm::Triple::Linux:
|
||||
reg_interface = new RegisterContextLinux_x86_64(target_arch);
|
||||
break;
|
||||
default:
|
||||
assert(false && "OS not supported");
|
||||
break;
|
||||
}
|
||||
|
||||
case ArchSpec::eCore_x86_64_x86_64:
|
||||
if (reg_interface)
|
||||
{
|
||||
RegisterInfoInterface *reg_interface = NULL;
|
||||
|
||||
switch (target_arch.GetTriple().getOS())
|
||||
{
|
||||
case llvm::Triple::FreeBSD:
|
||||
reg_interface = new RegisterContextFreeBSD_x86_64(target_arch);
|
||||
break;
|
||||
case llvm::Triple::Linux:
|
||||
reg_interface = new RegisterContextLinux_x86_64(target_arch);
|
||||
break;
|
||||
default:
|
||||
assert(false && "OS not supported");
|
||||
break;
|
||||
}
|
||||
|
||||
if (reg_interface)
|
||||
{
|
||||
RegisterContextPOSIXProcessMonitor_x86_64 *reg_ctx = new RegisterContextPOSIXProcessMonitor_x86_64(*this, 0, reg_interface);
|
||||
m_posix_thread = reg_ctx;
|
||||
m_reg_context_sp.reset(reg_ctx);
|
||||
}
|
||||
break;
|
||||
}
|
||||
RegisterContextPOSIXProcessMonitor_x86_64 *reg_ctx = new RegisterContextPOSIXProcessMonitor_x86_64(*this, 0, reg_interface);
|
||||
m_posix_thread = reg_ctx;
|
||||
m_reg_context_sp.reset(reg_ctx);
|
||||
}
|
||||
}
|
||||
return m_reg_context_sp;
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
//
|
||||
//===---------------------------------------------------------------------===//
|
||||
|
||||
#include "RegisterContextPOSIX_i386.h"
|
||||
#include "RegisterContextPOSIX_x86.h"
|
||||
#include "RegisterContextFreeBSD_i386.h"
|
||||
|
||||
using namespace lldb_private;
|
||||
|
|
|
@ -8,8 +8,7 @@
|
|||
//===---------------------------------------------------------------------===//
|
||||
|
||||
#include <vector>
|
||||
#include "RegisterContextPOSIX_i386.h"
|
||||
#include "RegisterContextPOSIX_x86_64.h"
|
||||
#include "RegisterContextPOSIX_x86.h"
|
||||
#include "RegisterContextFreeBSD_i386.h"
|
||||
#include "RegisterContextFreeBSD_x86_64.h"
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
//
|
||||
//===---------------------------------------------------------------------===//
|
||||
|
||||
#include "RegisterContextPOSIX_i386.h"
|
||||
#include "RegisterContextPOSIX_x86.h"
|
||||
#include "RegisterContextLinux_i386.h"
|
||||
|
||||
using namespace lldb_private;
|
||||
|
|
|
@ -8,8 +8,7 @@
|
|||
//===---------------------------------------------------------------------===//
|
||||
|
||||
#include <vector>
|
||||
#include "RegisterContextPOSIX_i386.h"
|
||||
#include "RegisterContextPOSIX_x86_64.h"
|
||||
#include "RegisterContextPOSIX_x86.h"
|
||||
#include "RegisterContextLinux_i386.h"
|
||||
#include "RegisterContextLinux_x86_64.h"
|
||||
|
||||
|
|
|
@ -1,75 +0,0 @@
|
|||
//===-- RegisterContextPOSIXProcessMonitor_i386.h --------------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===---------------------------------------------------------------------===//
|
||||
|
||||
#include "lldb/Target/Thread.h"
|
||||
|
||||
#include "ProcessPOSIX.h"
|
||||
#include "RegisterContextPOSIXProcessMonitor_i386.h"
|
||||
#include "ProcessMonitor.h"
|
||||
|
||||
using namespace lldb_private;
|
||||
using namespace lldb;
|
||||
|
||||
RegisterContextPOSIXProcessMonitor_i386::RegisterContextPOSIXProcessMonitor_i386(Thread &thread,
|
||||
uint32_t concrete_frame_idx,
|
||||
RegisterInfoInterface *register_info)
|
||||
: RegisterContextPOSIX_i386(thread, concrete_frame_idx, register_info)
|
||||
{
|
||||
}
|
||||
|
||||
ProcessMonitor &
|
||||
RegisterContextPOSIXProcessMonitor_i386::GetMonitor()
|
||||
{
|
||||
ProcessSP base = CalculateProcess();
|
||||
ProcessPOSIX *process = static_cast<ProcessPOSIX*>(base.get());
|
||||
return process->GetMonitor();
|
||||
}
|
||||
|
||||
bool
|
||||
RegisterContextPOSIXProcessMonitor_i386::ReadGPR()
|
||||
{
|
||||
assert(false);
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
RegisterContextPOSIXProcessMonitor_i386::ReadFPR()
|
||||
{
|
||||
assert(false);
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
RegisterContextPOSIXProcessMonitor_i386::WriteGPR()
|
||||
{
|
||||
assert(false);
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
RegisterContextPOSIXProcessMonitor_i386::WriteFPR()
|
||||
{
|
||||
assert(false);
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
RegisterContextPOSIXProcessMonitor_i386::ReadRegister(const RegisterInfo *reg_info,
|
||||
RegisterValue &value)
|
||||
{
|
||||
assert(false);
|
||||
return false;
|
||||
}
|
||||
|
||||
bool RegisterContextPOSIXProcessMonitor_i386::WriteRegister(const RegisterInfo *reg_info,
|
||||
const RegisterValue &value)
|
||||
{
|
||||
assert(false);
|
||||
return false;
|
||||
}
|
|
@ -1,76 +0,0 @@
|
|||
//===-- RegisterContextPOSIXProcessMonitor_i386.h ---------------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef liblldb_RegisterContextPOSIXProcessMonitor_i386_H_
|
||||
#define liblldb_RegisterContextPOSIXProcessMonitor_i386_H_
|
||||
|
||||
#include "Plugins/Process/POSIX/RegisterContextPOSIX_i386.h"
|
||||
|
||||
class RegisterContextPOSIXProcessMonitor_i386:
|
||||
public RegisterContextPOSIX_i386,
|
||||
public POSIXBreakpointProtocol
|
||||
{
|
||||
public:
|
||||
RegisterContextPOSIXProcessMonitor_i386(lldb_private::Thread &thread,
|
||||
uint32_t concrete_frame_idx,
|
||||
RegisterInfoInterface *register_info);
|
||||
|
||||
protected:
|
||||
bool
|
||||
ReadGPR();
|
||||
|
||||
bool
|
||||
ReadFPR();
|
||||
|
||||
bool
|
||||
WriteGPR();
|
||||
|
||||
bool
|
||||
WriteFPR();
|
||||
|
||||
bool
|
||||
ReadRegister(const lldb_private::RegisterInfo *reg_info, lldb_private::RegisterValue &value);
|
||||
|
||||
bool
|
||||
WriteRegister(const lldb_private::RegisterInfo *reg_info, const lldb_private::RegisterValue &value);
|
||||
|
||||
// POSIXBreakpointProtocol
|
||||
virtual bool
|
||||
UpdateAfterBreakpoint() { return true; }
|
||||
|
||||
virtual unsigned
|
||||
GetRegisterIndexFromOffset(unsigned offset) { return LLDB_INVALID_REGNUM; }
|
||||
|
||||
virtual bool
|
||||
IsWatchpointHit (uint32_t hw_index) { return false; }
|
||||
|
||||
virtual bool
|
||||
ClearWatchpointHits () { return false; }
|
||||
|
||||
virtual lldb::addr_t
|
||||
GetWatchpointAddress (uint32_t hw_index) { return LLDB_INVALID_ADDRESS; }
|
||||
|
||||
virtual bool
|
||||
IsWatchpointVacant (uint32_t hw_index) { return false; }
|
||||
|
||||
virtual bool
|
||||
SetHardwareWatchpointWithIndex (lldb::addr_t addr, size_t size,
|
||||
bool read, bool write,
|
||||
uint32_t hw_index) { return false; }
|
||||
|
||||
// From lldb_private::RegisterContext
|
||||
virtual uint32_t
|
||||
NumSupportedHardwareWatchpoints () { return 0; }
|
||||
|
||||
private:
|
||||
ProcessMonitor &
|
||||
GetMonitor();
|
||||
};
|
||||
|
||||
#endif
|
|
@ -1,4 +1,4 @@
|
|||
//===-- RegisterContextPOSIXProcessMonitor_x86_64.h ------------*- C++ -*-===//
|
||||
//===-- RegisterContextPOSIXProcessMonitor_x86.h ---------------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
|
@ -10,9 +10,8 @@
|
|||
#include "lldb/Target/Thread.h"
|
||||
#include "lldb/Core/RegisterValue.h"
|
||||
|
||||
#include "RegisterContextPOSIX_i386.h"
|
||||
#include "ProcessPOSIX.h"
|
||||
#include "RegisterContextPOSIXProcessMonitor_x86_64.h"
|
||||
#include "RegisterContextPOSIXProcessMonitor_x86.h"
|
||||
#include "ProcessMonitor.h"
|
||||
|
||||
using namespace lldb_private;
|
||||
|
@ -55,7 +54,7 @@ size_and_rw_bits(size_t size, bool read, bool write)
|
|||
RegisterContextPOSIXProcessMonitor_x86_64::RegisterContextPOSIXProcessMonitor_x86_64(Thread &thread,
|
||||
uint32_t concrete_frame_idx,
|
||||
RegisterInfoInterface *register_info)
|
||||
: RegisterContextPOSIX_x86_64(thread, concrete_frame_idx, register_info)
|
||||
: RegisterContextPOSIX_x86(thread, concrete_frame_idx, register_info)
|
||||
{
|
||||
}
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
//===-- RegisterContextPOSIXProcessMonitor_x86_64.h -------------*- C++ -*-===//
|
||||
//===-- RegisterContextPOSIXProcessMonitor_x86.h ----------------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
|
@ -7,13 +7,13 @@
|
|||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef liblldb_RegisterContextPOSIXProcessMonitor_x86_64_H_
|
||||
#define liblldb_RegisterContextPOSIXProcessMonitor_x86_64_H_
|
||||
#ifndef liblldb_RegisterContextPOSIXProcessMonitor_x86_H_
|
||||
#define liblldb_RegisterContextPOSIXProcessMonitor_x86_H_
|
||||
|
||||
#include "Plugins/Process/POSIX/RegisterContextPOSIX_x86_64.h"
|
||||
#include "Plugins/Process/POSIX/RegisterContextPOSIX_x86.h"
|
||||
|
||||
class RegisterContextPOSIXProcessMonitor_x86_64:
|
||||
public RegisterContextPOSIX_x86_64,
|
||||
public RegisterContextPOSIX_x86,
|
||||
public POSIXBreakpointProtocol
|
||||
{
|
||||
public:
|
|
@ -1,295 +0,0 @@
|
|||
//===-- RegisterContextPOSIX_i386.cpp ---------------------------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "lldb/Core/DataExtractor.h"
|
||||
#include "lldb/Target/Thread.h"
|
||||
#include "lldb/Host/Endian.h"
|
||||
#include "llvm/Support/Compiler.h"
|
||||
|
||||
#include "ProcessPOSIX.h"
|
||||
#include "ProcessPOSIXLog.h"
|
||||
#include "ProcessMonitor.h"
|
||||
#include "RegisterContextPOSIX_i386.h"
|
||||
#include "RegisterContext_x86.h"
|
||||
|
||||
using namespace lldb_private;
|
||||
using namespace lldb;
|
||||
|
||||
const uint32_t
|
||||
RegisterContextPOSIX_i386::g_gpr_regnums[] =
|
||||
{
|
||||
gpr_eax_i386,
|
||||
gpr_ebx_i386,
|
||||
gpr_ecx_i386,
|
||||
gpr_edx_i386,
|
||||
gpr_edi_i386,
|
||||
gpr_esi_i386,
|
||||
gpr_ebp_i386,
|
||||
gpr_esp_i386,
|
||||
gpr_eip_i386,
|
||||
gpr_eflags_i386,
|
||||
gpr_cs_i386,
|
||||
gpr_fs_i386,
|
||||
gpr_gs_i386,
|
||||
gpr_ss_i386,
|
||||
gpr_ds_i386,
|
||||
gpr_es_i386,
|
||||
gpr_ax_i386,
|
||||
gpr_bx_i386,
|
||||
gpr_cx_i386,
|
||||
gpr_dx_i386,
|
||||
gpr_di_i386,
|
||||
gpr_si_i386,
|
||||
gpr_bp_i386,
|
||||
gpr_sp_i386,
|
||||
gpr_ah_i386,
|
||||
gpr_bh_i386,
|
||||
gpr_ch_i386,
|
||||
gpr_dh_i386,
|
||||
gpr_al_i386,
|
||||
gpr_bl_i386,
|
||||
gpr_cl_i386,
|
||||
gpr_dl_i386
|
||||
};
|
||||
static_assert((sizeof(RegisterContextPOSIX_i386::g_gpr_regnums) / sizeof(RegisterContextPOSIX_i386::g_gpr_regnums[0])) == k_num_gpr_registers_i386,
|
||||
"g_gpr_regnums has wrong number of register infos");
|
||||
|
||||
const uint32_t
|
||||
RegisterContextPOSIX_i386::g_fpu_regnums[] =
|
||||
{
|
||||
fpu_fctrl_i386,
|
||||
fpu_fstat_i386,
|
||||
fpu_ftag_i386,
|
||||
fpu_fop_i386,
|
||||
fpu_fiseg_i386,
|
||||
fpu_fioff_i386,
|
||||
fpu_foseg_i386,
|
||||
fpu_fooff_i386,
|
||||
fpu_mxcsr_i386,
|
||||
fpu_mxcsrmask_i386,
|
||||
fpu_st0_i386,
|
||||
fpu_st1_i386,
|
||||
fpu_st2_i386,
|
||||
fpu_st3_i386,
|
||||
fpu_st4_i386,
|
||||
fpu_st5_i386,
|
||||
fpu_st6_i386,
|
||||
fpu_st7_i386,
|
||||
fpu_mm0_i386,
|
||||
fpu_mm1_i386,
|
||||
fpu_mm2_i386,
|
||||
fpu_mm3_i386,
|
||||
fpu_mm4_i386,
|
||||
fpu_mm5_i386,
|
||||
fpu_mm6_i386,
|
||||
fpu_mm7_i386,
|
||||
fpu_xmm0_i386,
|
||||
fpu_xmm1_i386,
|
||||
fpu_xmm2_i386,
|
||||
fpu_xmm3_i386,
|
||||
fpu_xmm4_i386,
|
||||
fpu_xmm5_i386,
|
||||
fpu_xmm6_i386,
|
||||
fpu_xmm7_i386
|
||||
};
|
||||
static_assert((sizeof(RegisterContextPOSIX_i386::g_fpu_regnums) / sizeof(RegisterContextPOSIX_i386::g_fpu_regnums[0])) == k_num_fpr_registers_i386,
|
||||
"g_gpr_regnums has wrong number of register infos");
|
||||
|
||||
const uint32_t
|
||||
RegisterContextPOSIX_i386::g_avx_regnums[] =
|
||||
{
|
||||
fpu_ymm0_i386,
|
||||
fpu_ymm1_i386,
|
||||
fpu_ymm2_i386,
|
||||
fpu_ymm3_i386,
|
||||
fpu_ymm4_i386,
|
||||
fpu_ymm5_i386,
|
||||
fpu_ymm6_i386,
|
||||
fpu_ymm7_i386
|
||||
};
|
||||
static_assert((sizeof(RegisterContextPOSIX_i386::g_avx_regnums) / sizeof(RegisterContextPOSIX_i386::g_avx_regnums[0])) == k_num_avx_registers_i386,
|
||||
"g_gpr_regnums has wrong number of register infos");
|
||||
|
||||
uint32_t RegisterContextPOSIX_i386::g_contained_eax[] = { gpr_eax_i386, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_i386::g_contained_ebx[] = { gpr_ebx_i386, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_i386::g_contained_ecx[] = { gpr_ecx_i386, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_i386::g_contained_edx[] = { gpr_edx_i386, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_i386::g_contained_edi[] = { gpr_edi_i386, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_i386::g_contained_esi[] = { gpr_esi_i386, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_i386::g_contained_ebp[] = { gpr_ebp_i386, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_i386::g_contained_esp[] = { gpr_esp_i386, LLDB_INVALID_REGNUM };
|
||||
|
||||
uint32_t RegisterContextPOSIX_i386::g_invalidate_eax[] = { gpr_eax_i386, gpr_ax_i386, gpr_ah_i386, gpr_al_i386, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_i386::g_invalidate_ebx[] = { gpr_ebx_i386, gpr_bx_i386, gpr_bh_i386, gpr_bl_i386, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_i386::g_invalidate_ecx[] = { gpr_ecx_i386, gpr_cx_i386, gpr_ch_i386, gpr_cl_i386, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_i386::g_invalidate_edx[] = { gpr_edx_i386, gpr_dx_i386, gpr_dh_i386, gpr_dl_i386, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_i386::g_invalidate_edi[] = { gpr_edi_i386, gpr_di_i386, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_i386::g_invalidate_esi[] = { gpr_esi_i386, gpr_si_i386, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_i386::g_invalidate_ebp[] = { gpr_ebp_i386, gpr_bp_i386, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_i386::g_invalidate_esp[] = { gpr_esp_i386, gpr_sp_i386, LLDB_INVALID_REGNUM };
|
||||
|
||||
// Number of register sets provided by this context.
|
||||
enum
|
||||
{
|
||||
k_num_extended_register_sets = 1,
|
||||
k_num_register_sets = 3
|
||||
};
|
||||
|
||||
static const RegisterSet
|
||||
g_reg_sets[k_num_register_sets] =
|
||||
{
|
||||
{ "General Purpose Registers", "gpr", k_num_gpr_registers_i386, RegisterContextPOSIX_i386::g_gpr_regnums },
|
||||
{ "Floating Point Registers", "fpu", k_num_fpr_registers_i386, RegisterContextPOSIX_i386::g_fpu_regnums },
|
||||
{ "Advanced Vector Extensions", "avx", k_num_avx_registers_i386, RegisterContextPOSIX_i386::g_avx_regnums }
|
||||
};
|
||||
|
||||
|
||||
RegisterContextPOSIX_i386::RegisterContextPOSIX_i386(Thread &thread,
|
||||
uint32_t concrete_frame_idx,
|
||||
RegisterInfoInterface *register_info)
|
||||
: RegisterContext(thread, concrete_frame_idx)
|
||||
{
|
||||
m_register_info_ap.reset(register_info);
|
||||
}
|
||||
|
||||
RegisterContextPOSIX_i386::~RegisterContextPOSIX_i386()
|
||||
{
|
||||
}
|
||||
|
||||
RegisterContextPOSIX_i386::FPRType RegisterContextPOSIX_i386::GetFPRType()
|
||||
{
|
||||
if (m_fpr_type == eNotValid)
|
||||
{
|
||||
// TODO: Use assembly to call cpuid on the inferior and query ebx or ecx
|
||||
m_fpr_type = eXSAVE; // extended floating-point registers, if available
|
||||
if (false == ReadFPR())
|
||||
m_fpr_type = eFXSAVE; // assume generic floating-point registers
|
||||
}
|
||||
return m_fpr_type;
|
||||
}
|
||||
|
||||
void
|
||||
RegisterContextPOSIX_i386::Invalidate()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
RegisterContextPOSIX_i386::InvalidateAllRegisters()
|
||||
{
|
||||
}
|
||||
|
||||
unsigned RegisterContextPOSIX_i386::GetRegisterOffset(unsigned reg)
|
||||
{
|
||||
assert(reg < k_num_registers_i386 && "Invalid register number.");
|
||||
return GetRegisterInfo()[reg].byte_offset;
|
||||
}
|
||||
|
||||
unsigned RegisterContextPOSIX_i386::GetRegisterSize(unsigned reg)
|
||||
{
|
||||
assert(reg < k_num_registers_i386 && "Invalid register number.");
|
||||
return GetRegisterInfo()[reg].byte_size;
|
||||
}
|
||||
|
||||
const RegisterInfo *
|
||||
RegisterContextPOSIX_i386::GetRegisterInfo()
|
||||
{
|
||||
// Commonly, this method is overridden and g_register_infos is copied and specialized.
|
||||
// So, use GetRegisterInfo() rather than g_register_infos in this scope.
|
||||
return m_register_info_ap->GetRegisterInfo ();
|
||||
}
|
||||
|
||||
size_t
|
||||
RegisterContextPOSIX_i386::GetRegisterCount()
|
||||
{
|
||||
size_t num_registers = k_num_gpr_registers_i386 + k_num_fpr_registers_i386;
|
||||
if (GetFPRType() == eXSAVE)
|
||||
return num_registers + k_num_avx_registers_i386;
|
||||
return num_registers;
|
||||
}
|
||||
|
||||
const RegisterInfo *
|
||||
RegisterContextPOSIX_i386::GetRegisterInfoAtIndex(size_t reg)
|
||||
{
|
||||
if (reg < k_num_registers_i386)
|
||||
return &GetRegisterInfo()[reg];
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
size_t
|
||||
RegisterContextPOSIX_i386::GetRegisterSetCount()
|
||||
{
|
||||
return k_num_register_sets;
|
||||
}
|
||||
|
||||
const RegisterSet *
|
||||
RegisterContextPOSIX_i386::GetRegisterSet(size_t set)
|
||||
{
|
||||
if (set < k_num_register_sets)
|
||||
return &g_reg_sets[set];
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const char *
|
||||
RegisterContextPOSIX_i386::GetRegisterName(unsigned reg)
|
||||
{
|
||||
assert(reg < k_num_registers_i386 && "Invalid register offset.");
|
||||
return GetRegisterInfo()[reg].name;
|
||||
}
|
||||
|
||||
bool
|
||||
RegisterContextPOSIX_i386::ReadAllRegisterValues(DataBufferSP &data_sp)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
RegisterContextPOSIX_i386::WriteAllRegisterValues(const DataBufferSP &data)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
RegisterContextPOSIX_i386::UpdateAfterBreakpoint()
|
||||
{
|
||||
// PC points one byte past the int3 responsible for the breakpoint.
|
||||
lldb::addr_t pc;
|
||||
|
||||
if ((pc = GetPC()) == LLDB_INVALID_ADDRESS)
|
||||
return false;
|
||||
|
||||
SetPC(pc - 1);
|
||||
return true;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
RegisterContextPOSIX_i386::ConvertRegisterKindToRegisterNumber(uint32_t kind,
|
||||
uint32_t num)
|
||||
{
|
||||
const uint32_t num_regs = GetRegisterCount();
|
||||
|
||||
assert (kind < kNumRegisterKinds);
|
||||
for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx)
|
||||
{
|
||||
const RegisterInfo *reg_info = GetRegisterInfoAtIndex (reg_idx);
|
||||
|
||||
if (reg_info->kinds[kind] == num)
|
||||
return reg_idx;
|
||||
}
|
||||
|
||||
return LLDB_INVALID_REGNUM;
|
||||
|
||||
}
|
||||
|
||||
bool
|
||||
RegisterContextPOSIX_i386::HardwareSingleStep(bool enable)
|
||||
{
|
||||
return false;
|
||||
}
|
|
@ -1,250 +0,0 @@
|
|||
//===-- RegisterContextPOSIX_i386.h -----------------------------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef liblldb_RegisterContext_i386_h_
|
||||
#define liblldb_RegisterContext_i386_h_
|
||||
|
||||
// C Includes
|
||||
// C++ Includes
|
||||
// Other libraries and framework includes
|
||||
// Project includes
|
||||
#include "lldb/Core/Log.h"
|
||||
#include "RegisterContextPOSIX.h"
|
||||
#include "RegisterContext_x86.h"
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Internal codes for all i386 registers.
|
||||
//---------------------------------------------------------------------------
|
||||
enum
|
||||
{
|
||||
k_first_gpr_i386,
|
||||
gpr_eax_i386 = k_first_gpr_i386,
|
||||
gpr_ebx_i386,
|
||||
gpr_ecx_i386,
|
||||
gpr_edx_i386,
|
||||
gpr_edi_i386,
|
||||
gpr_esi_i386,
|
||||
gpr_ebp_i386,
|
||||
gpr_esp_i386,
|
||||
gpr_eip_i386,
|
||||
gpr_eflags_i386,
|
||||
gpr_cs_i386,
|
||||
gpr_fs_i386,
|
||||
gpr_gs_i386,
|
||||
gpr_ss_i386,
|
||||
gpr_ds_i386,
|
||||
gpr_es_i386,
|
||||
|
||||
k_first_alias_i386,
|
||||
gpr_ax_i386 = k_first_alias_i386,
|
||||
gpr_bx_i386,
|
||||
gpr_cx_i386,
|
||||
gpr_dx_i386,
|
||||
gpr_di_i386,
|
||||
gpr_si_i386,
|
||||
gpr_bp_i386,
|
||||
gpr_sp_i386,
|
||||
gpr_ah_i386,
|
||||
gpr_bh_i386,
|
||||
gpr_ch_i386,
|
||||
gpr_dh_i386,
|
||||
gpr_al_i386,
|
||||
gpr_bl_i386,
|
||||
gpr_cl_i386,
|
||||
gpr_dl_i386,
|
||||
k_last_alias_i386 = gpr_dl_i386,
|
||||
|
||||
k_last_gpr_i386 = k_last_alias_i386,
|
||||
|
||||
k_first_fpr_i386,
|
||||
fpu_fctrl_i386 = k_first_fpr_i386,
|
||||
fpu_fstat_i386,
|
||||
fpu_ftag_i386,
|
||||
fpu_fop_i386,
|
||||
fpu_fiseg_i386,
|
||||
fpu_fioff_i386,
|
||||
fpu_foseg_i386,
|
||||
fpu_fooff_i386,
|
||||
fpu_mxcsr_i386,
|
||||
fpu_mxcsrmask_i386,
|
||||
fpu_st0_i386,
|
||||
fpu_st1_i386,
|
||||
fpu_st2_i386,
|
||||
fpu_st3_i386,
|
||||
fpu_st4_i386,
|
||||
fpu_st5_i386,
|
||||
fpu_st6_i386,
|
||||
fpu_st7_i386,
|
||||
fpu_mm0_i386,
|
||||
fpu_mm1_i386,
|
||||
fpu_mm2_i386,
|
||||
fpu_mm3_i386,
|
||||
fpu_mm4_i386,
|
||||
fpu_mm5_i386,
|
||||
fpu_mm6_i386,
|
||||
fpu_mm7_i386,
|
||||
fpu_xmm0_i386,
|
||||
fpu_xmm1_i386,
|
||||
fpu_xmm2_i386,
|
||||
fpu_xmm3_i386,
|
||||
fpu_xmm4_i386,
|
||||
fpu_xmm5_i386,
|
||||
fpu_xmm6_i386,
|
||||
fpu_xmm7_i386,
|
||||
k_last_fpr_i386 = fpu_xmm7_i386,
|
||||
|
||||
k_first_avx_i386,
|
||||
fpu_ymm0_i386 = k_first_avx_i386,
|
||||
fpu_ymm1_i386,
|
||||
fpu_ymm2_i386,
|
||||
fpu_ymm3_i386,
|
||||
fpu_ymm4_i386,
|
||||
fpu_ymm5_i386,
|
||||
fpu_ymm6_i386,
|
||||
fpu_ymm7_i386,
|
||||
k_last_avx_i386 = fpu_ymm7_i386,
|
||||
|
||||
dr0_i386,
|
||||
dr1_i386,
|
||||
dr2_i386,
|
||||
dr3_i386,
|
||||
dr4_i386,
|
||||
dr5_i386,
|
||||
dr6_i386,
|
||||
dr7_i386,
|
||||
|
||||
k_num_registers_i386,
|
||||
k_num_gpr_registers_i386 = k_last_gpr_i386 - k_first_gpr_i386 + 1,
|
||||
k_num_fpr_registers_i386 = k_last_fpr_i386 - k_first_fpr_i386 + 1,
|
||||
k_num_avx_registers_i386 = k_last_avx_i386 - k_first_avx_i386 + 1
|
||||
};
|
||||
|
||||
class RegisterContextPOSIX_i386 :
|
||||
public lldb_private::RegisterContext
|
||||
{
|
||||
public:
|
||||
RegisterContextPOSIX_i386(lldb_private::Thread &thread,
|
||||
uint32_t concreate_frame_idx,
|
||||
RegisterInfoInterface *register_info);
|
||||
|
||||
~RegisterContextPOSIX_i386();
|
||||
|
||||
void
|
||||
Invalidate();
|
||||
|
||||
void
|
||||
InvalidateAllRegisters();
|
||||
|
||||
size_t
|
||||
GetRegisterCount();
|
||||
|
||||
virtual unsigned
|
||||
GetRegisterSize(unsigned reg);
|
||||
|
||||
virtual unsigned
|
||||
GetRegisterOffset(unsigned reg);
|
||||
|
||||
const lldb_private::RegisterInfo *
|
||||
GetRegisterInfoAtIndex(size_t reg);
|
||||
|
||||
size_t
|
||||
GetRegisterSetCount();
|
||||
|
||||
const lldb_private::RegisterSet *
|
||||
GetRegisterSet(size_t set);
|
||||
|
||||
const char *
|
||||
GetRegisterName(unsigned reg);
|
||||
|
||||
bool
|
||||
ReadRegisterValue(uint32_t reg, lldb_private::Scalar &value);
|
||||
|
||||
bool
|
||||
ReadRegisterBytes(uint32_t reg, lldb_private::DataExtractor &data);
|
||||
|
||||
virtual bool
|
||||
ReadRegister(const lldb_private::RegisterInfo *reg_info,
|
||||
lldb_private::RegisterValue &value) = 0;
|
||||
|
||||
bool
|
||||
ReadAllRegisterValues(lldb::DataBufferSP &data_sp);
|
||||
|
||||
bool
|
||||
WriteRegisterValue(uint32_t reg, const lldb_private::Scalar &value);
|
||||
|
||||
bool
|
||||
WriteRegisterBytes(uint32_t reg, lldb_private::DataExtractor &data,
|
||||
uint32_t data_offset = 0);
|
||||
|
||||
virtual bool
|
||||
WriteRegister(const lldb_private::RegisterInfo *reg_info,
|
||||
const lldb_private::RegisterValue &value) = 0;
|
||||
|
||||
bool
|
||||
WriteAllRegisterValues(const lldb::DataBufferSP &data_sp);
|
||||
|
||||
uint32_t
|
||||
ConvertRegisterKindToRegisterNumber(uint32_t kind, uint32_t num);
|
||||
|
||||
bool
|
||||
HardwareSingleStep(bool enable);
|
||||
|
||||
bool
|
||||
UpdateAfterBreakpoint();
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Note: prefer kernel definitions over user-land
|
||||
//---------------------------------------------------------------------------
|
||||
enum FPRType
|
||||
{
|
||||
eNotValid = 0,
|
||||
eFSAVE, // TODO
|
||||
eFXSAVE,
|
||||
eSOFT, // TODO
|
||||
eXSAVE
|
||||
};
|
||||
|
||||
static uint32_t g_contained_eax[];
|
||||
static uint32_t g_contained_ebx[];
|
||||
static uint32_t g_contained_ecx[];
|
||||
static uint32_t g_contained_edx[];
|
||||
static uint32_t g_contained_edi[];
|
||||
static uint32_t g_contained_esi[];
|
||||
static uint32_t g_contained_ebp[];
|
||||
static uint32_t g_contained_esp[];
|
||||
|
||||
static uint32_t g_invalidate_eax[];
|
||||
static uint32_t g_invalidate_ebx[];
|
||||
static uint32_t g_invalidate_ecx[];
|
||||
static uint32_t g_invalidate_edx[];
|
||||
static uint32_t g_invalidate_edi[];
|
||||
static uint32_t g_invalidate_esi[];
|
||||
static uint32_t g_invalidate_ebp[];
|
||||
static uint32_t g_invalidate_esp[];
|
||||
|
||||
static const uint32_t g_gpr_regnums[]; // k_num_gpr_registers_i386
|
||||
static const uint32_t g_fpu_regnums[]; // k_num_fpr_registers_i386
|
||||
static const uint32_t g_avx_regnums[]; // k_num_avx_registers_i386
|
||||
|
||||
protected:
|
||||
virtual const lldb_private::RegisterInfo *
|
||||
GetRegisterInfo();
|
||||
|
||||
FPRType m_fpr_type; // determines the type of data stored by union FPR, if any.
|
||||
std::unique_ptr<RegisterInfoInterface> m_register_info_ap; // Register Info Interface (FreeBSD or Linux)
|
||||
|
||||
FPRType GetFPRType();
|
||||
|
||||
virtual bool ReadGPR() = 0;
|
||||
virtual bool ReadFPR() = 0;
|
||||
virtual bool WriteGPR() = 0;
|
||||
virtual bool WriteFPR() = 0;
|
||||
};
|
||||
|
||||
#endif // #ifndef liblldb_RegisterContext_i386_h_
|
|
@ -1,4 +1,4 @@
|
|||
//===-- RegisterContextPOSIX_x86_64.cpp -------------------------*- C++ -*-===//
|
||||
//===-- RegisterContextPOSIX_x86.cpp ----------------------------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
|
@ -21,16 +21,110 @@
|
|||
#include "llvm/Support/Compiler.h"
|
||||
|
||||
#include "ProcessPOSIX.h"
|
||||
#include "RegisterContextPOSIX_i386.h"
|
||||
#include "RegisterContext_x86.h"
|
||||
#include "RegisterContextPOSIX_x86_64.h"
|
||||
#include "RegisterContextPOSIX_x86.h"
|
||||
#include "Plugins/Process/elf-core/ProcessElfCore.h"
|
||||
|
||||
using namespace lldb_private;
|
||||
using namespace lldb;
|
||||
|
||||
const uint32_t
|
||||
g_gpr_regnums_i386[] =
|
||||
{
|
||||
gpr_eax_i386,
|
||||
gpr_ebx_i386,
|
||||
gpr_ecx_i386,
|
||||
gpr_edx_i386,
|
||||
gpr_edi_i386,
|
||||
gpr_esi_i386,
|
||||
gpr_ebp_i386,
|
||||
gpr_esp_i386,
|
||||
gpr_eip_i386,
|
||||
gpr_eflags_i386,
|
||||
gpr_cs_i386,
|
||||
gpr_fs_i386,
|
||||
gpr_gs_i386,
|
||||
gpr_ss_i386,
|
||||
gpr_ds_i386,
|
||||
gpr_es_i386,
|
||||
gpr_ax_i386,
|
||||
gpr_bx_i386,
|
||||
gpr_cx_i386,
|
||||
gpr_dx_i386,
|
||||
gpr_di_i386,
|
||||
gpr_si_i386,
|
||||
gpr_bp_i386,
|
||||
gpr_sp_i386,
|
||||
gpr_ah_i386,
|
||||
gpr_bh_i386,
|
||||
gpr_ch_i386,
|
||||
gpr_dh_i386,
|
||||
gpr_al_i386,
|
||||
gpr_bl_i386,
|
||||
gpr_cl_i386,
|
||||
gpr_dl_i386
|
||||
};
|
||||
static_assert((sizeof(g_gpr_regnums_i386) / sizeof(g_gpr_regnums_i386[0])) == k_num_gpr_registers_i386,
|
||||
"g_gpr_regnums_i386 has wrong number of register infos");
|
||||
|
||||
const uint32_t
|
||||
g_fpu_regnums_i386[] =
|
||||
{
|
||||
fpu_fctrl_i386,
|
||||
fpu_fstat_i386,
|
||||
fpu_ftag_i386,
|
||||
fpu_fop_i386,
|
||||
fpu_fiseg_i386,
|
||||
fpu_fioff_i386,
|
||||
fpu_foseg_i386,
|
||||
fpu_fooff_i386,
|
||||
fpu_mxcsr_i386,
|
||||
fpu_mxcsrmask_i386,
|
||||
fpu_st0_i386,
|
||||
fpu_st1_i386,
|
||||
fpu_st2_i386,
|
||||
fpu_st3_i386,
|
||||
fpu_st4_i386,
|
||||
fpu_st5_i386,
|
||||
fpu_st6_i386,
|
||||
fpu_st7_i386,
|
||||
fpu_mm0_i386,
|
||||
fpu_mm1_i386,
|
||||
fpu_mm2_i386,
|
||||
fpu_mm3_i386,
|
||||
fpu_mm4_i386,
|
||||
fpu_mm5_i386,
|
||||
fpu_mm6_i386,
|
||||
fpu_mm7_i386,
|
||||
fpu_xmm0_i386,
|
||||
fpu_xmm1_i386,
|
||||
fpu_xmm2_i386,
|
||||
fpu_xmm3_i386,
|
||||
fpu_xmm4_i386,
|
||||
fpu_xmm5_i386,
|
||||
fpu_xmm6_i386,
|
||||
fpu_xmm7_i386
|
||||
};
|
||||
static_assert((sizeof(g_fpu_regnums_i386) / sizeof(g_fpu_regnums_i386[0])) == k_num_fpr_registers_i386,
|
||||
"g_fpu_regnums_i386 has wrong number of register infos");
|
||||
|
||||
const uint32_t
|
||||
g_avx_regnums_i386[] =
|
||||
{
|
||||
fpu_ymm0_i386,
|
||||
fpu_ymm1_i386,
|
||||
fpu_ymm2_i386,
|
||||
fpu_ymm3_i386,
|
||||
fpu_ymm4_i386,
|
||||
fpu_ymm5_i386,
|
||||
fpu_ymm6_i386,
|
||||
fpu_ymm7_i386
|
||||
};
|
||||
static_assert((sizeof(g_avx_regnums_i386) / sizeof(g_avx_regnums_i386[0])) == k_num_avx_registers_i386,
|
||||
" g_avx_regnums_i386 has wrong number of register infos");
|
||||
|
||||
static const
|
||||
uint32_t g_gpr_regnums[] =
|
||||
uint32_t g_gpr_regnums_x86_64[] =
|
||||
{
|
||||
gpr_rax_x86_64,
|
||||
gpr_rbx_x86_64,
|
||||
|
@ -109,11 +203,11 @@ uint32_t g_gpr_regnums[] =
|
|||
gpr_r14l_x86_64, // Low 8 bits or r14
|
||||
gpr_r15l_x86_64, // Low 8 bits or r15
|
||||
};
|
||||
static_assert((sizeof(g_gpr_regnums) / sizeof(g_gpr_regnums[0])) == k_num_gpr_registers_x86_64,
|
||||
"g_gpr_regnums has wrong number of register infos");
|
||||
static_assert((sizeof(g_gpr_regnums_x86_64) / sizeof(g_gpr_regnums_x86_64[0])) == k_num_gpr_registers_x86_64,
|
||||
"g_gpr_regnums_x86_64 has wrong number of register infos");
|
||||
|
||||
static const uint32_t
|
||||
g_fpu_regnums[] =
|
||||
g_fpu_regnums_x86_64[] =
|
||||
{
|
||||
fpu_fctrl_x86_64,
|
||||
fpu_fstat_x86_64,
|
||||
|
@ -158,11 +252,11 @@ g_fpu_regnums[] =
|
|||
fpu_xmm14_x86_64,
|
||||
fpu_xmm15_x86_64
|
||||
};
|
||||
static_assert((sizeof(g_fpu_regnums) / sizeof(g_fpu_regnums[0])) == k_num_fpr_registers_x86_64,
|
||||
"g_gpr_regnums has wrong number of register infos");
|
||||
static_assert((sizeof(g_fpu_regnums_x86_64) / sizeof(g_fpu_regnums_x86_64[0])) == k_num_fpr_registers_x86_64,
|
||||
"g_fpu_regnums_x86_64 has wrong number of register infos");
|
||||
|
||||
static const uint32_t
|
||||
g_avx_regnums[] =
|
||||
g_avx_regnums_x86_64[] =
|
||||
{
|
||||
fpu_ymm0_x86_64,
|
||||
fpu_ymm1_x86_64,
|
||||
|
@ -181,42 +275,60 @@ g_avx_regnums[] =
|
|||
fpu_ymm14_x86_64,
|
||||
fpu_ymm15_x86_64
|
||||
};
|
||||
static_assert((sizeof(g_avx_regnums) / sizeof(g_gpr_regnums[0])) == k_num_avx_registers_x86_64,
|
||||
"g_gpr_regnums has wrong number of register infos");
|
||||
static_assert((sizeof(g_avx_regnums_x86_64) / sizeof(g_avx_regnums_x86_64[0])) == k_num_avx_registers_x86_64,
|
||||
"g_avx_regnums_x86_64 has wrong number of register infos");
|
||||
|
||||
uint32_t RegisterContextPOSIX_x86_64::g_contained_rax[] = { gpr_rax_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86_64::g_contained_rbx[] = { gpr_rbx_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86_64::g_contained_rcx[] = { gpr_rcx_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86_64::g_contained_rdx[] = { gpr_rdx_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86_64::g_contained_rdi[] = { gpr_rdi_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86_64::g_contained_rsi[] = { gpr_rsi_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86_64::g_contained_rbp[] = { gpr_rbp_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86_64::g_contained_rsp[] = { gpr_rsp_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86_64::g_contained_r8[] = { gpr_r8_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86_64::g_contained_r9[] = { gpr_r9_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86_64::g_contained_r10[] = { gpr_r10_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86_64::g_contained_r11[] = { gpr_r11_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86_64::g_contained_r12[] = { gpr_r12_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86_64::g_contained_r13[] = { gpr_r13_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86_64::g_contained_r14[] = { gpr_r14_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86_64::g_contained_r15[] = { gpr_r15_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_contained_eax[] = { gpr_eax_i386, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_contained_ebx[] = { gpr_ebx_i386, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_contained_ecx[] = { gpr_ecx_i386, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_contained_edx[] = { gpr_edx_i386, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_contained_edi[] = { gpr_edi_i386, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_contained_esi[] = { gpr_esi_i386, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_contained_ebp[] = { gpr_ebp_i386, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_contained_esp[] = { gpr_esp_i386, LLDB_INVALID_REGNUM };
|
||||
|
||||
uint32_t RegisterContextPOSIX_x86_64::g_invalidate_rax[] = { gpr_rax_x86_64, gpr_eax_x86_64, gpr_ax_x86_64, gpr_ah_x86_64, gpr_al_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86_64::g_invalidate_rbx[] = { gpr_rbx_x86_64, gpr_ebx_x86_64, gpr_bx_x86_64, gpr_bh_x86_64, gpr_bl_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86_64::g_invalidate_rcx[] = { gpr_rcx_x86_64, gpr_ecx_x86_64, gpr_cx_x86_64, gpr_ch_x86_64, gpr_cl_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86_64::g_invalidate_rdx[] = { gpr_rdx_x86_64, gpr_edx_x86_64, gpr_dx_x86_64, gpr_dh_x86_64, gpr_dl_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86_64::g_invalidate_rdi[] = { gpr_rdi_x86_64, gpr_edi_x86_64, gpr_di_x86_64, gpr_dil_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86_64::g_invalidate_rsi[] = { gpr_rsi_x86_64, gpr_esi_x86_64, gpr_si_x86_64, gpr_sil_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86_64::g_invalidate_rbp[] = { gpr_rbp_x86_64, gpr_ebp_x86_64, gpr_bp_x86_64, gpr_bpl_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86_64::g_invalidate_rsp[] = { gpr_rsp_x86_64, gpr_esp_x86_64, gpr_sp_x86_64, gpr_spl_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86_64::g_invalidate_r8[] = { gpr_r8_x86_64, gpr_r8d_x86_64, gpr_r8w_x86_64, gpr_r8l_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86_64::g_invalidate_r9[] = { gpr_r9_x86_64, gpr_r9d_x86_64, gpr_r9w_x86_64, gpr_r9l_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86_64::g_invalidate_r10[] = { gpr_r10_x86_64, gpr_r10d_x86_64, gpr_r10w_x86_64, gpr_r10l_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86_64::g_invalidate_r11[] = { gpr_r11_x86_64, gpr_r11d_x86_64, gpr_r11w_x86_64, gpr_r11l_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86_64::g_invalidate_r12[] = { gpr_r12_x86_64, gpr_r12d_x86_64, gpr_r12w_x86_64, gpr_r12l_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86_64::g_invalidate_r13[] = { gpr_r13_x86_64, gpr_r13d_x86_64, gpr_r13w_x86_64, gpr_r13l_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86_64::g_invalidate_r14[] = { gpr_r14_x86_64, gpr_r14d_x86_64, gpr_r14w_x86_64, gpr_r14l_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86_64::g_invalidate_r15[] = { gpr_r15_x86_64, gpr_r15d_x86_64, gpr_r15w_x86_64, gpr_r15l_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_invalidate_eax[] = { gpr_eax_i386, gpr_ax_i386, gpr_ah_i386, gpr_al_i386, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_invalidate_ebx[] = { gpr_ebx_i386, gpr_bx_i386, gpr_bh_i386, gpr_bl_i386, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_invalidate_ecx[] = { gpr_ecx_i386, gpr_cx_i386, gpr_ch_i386, gpr_cl_i386, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_invalidate_edx[] = { gpr_edx_i386, gpr_dx_i386, gpr_dh_i386, gpr_dl_i386, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_invalidate_edi[] = { gpr_edi_i386, gpr_di_i386, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_invalidate_esi[] = { gpr_esi_i386, gpr_si_i386, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_invalidate_ebp[] = { gpr_ebp_i386, gpr_bp_i386, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_invalidate_esp[] = { gpr_esp_i386, gpr_sp_i386, LLDB_INVALID_REGNUM };
|
||||
|
||||
uint32_t RegisterContextPOSIX_x86::g_contained_rax[] = { gpr_rax_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_contained_rbx[] = { gpr_rbx_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_contained_rcx[] = { gpr_rcx_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_contained_rdx[] = { gpr_rdx_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_contained_rdi[] = { gpr_rdi_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_contained_rsi[] = { gpr_rsi_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_contained_rbp[] = { gpr_rbp_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_contained_rsp[] = { gpr_rsp_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_contained_r8[] = { gpr_r8_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_contained_r9[] = { gpr_r9_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_contained_r10[] = { gpr_r10_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_contained_r11[] = { gpr_r11_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_contained_r12[] = { gpr_r12_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_contained_r13[] = { gpr_r13_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_contained_r14[] = { gpr_r14_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_contained_r15[] = { gpr_r15_x86_64, LLDB_INVALID_REGNUM };
|
||||
|
||||
uint32_t RegisterContextPOSIX_x86::g_invalidate_rax[] = { gpr_rax_x86_64, gpr_eax_x86_64, gpr_ax_x86_64, gpr_ah_x86_64, gpr_al_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_invalidate_rbx[] = { gpr_rbx_x86_64, gpr_ebx_x86_64, gpr_bx_x86_64, gpr_bh_x86_64, gpr_bl_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_invalidate_rcx[] = { gpr_rcx_x86_64, gpr_ecx_x86_64, gpr_cx_x86_64, gpr_ch_x86_64, gpr_cl_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_invalidate_rdx[] = { gpr_rdx_x86_64, gpr_edx_x86_64, gpr_dx_x86_64, gpr_dh_x86_64, gpr_dl_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_invalidate_rdi[] = { gpr_rdi_x86_64, gpr_edi_x86_64, gpr_di_x86_64, gpr_dil_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_invalidate_rsi[] = { gpr_rsi_x86_64, gpr_esi_x86_64, gpr_si_x86_64, gpr_sil_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_invalidate_rbp[] = { gpr_rbp_x86_64, gpr_ebp_x86_64, gpr_bp_x86_64, gpr_bpl_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_invalidate_rsp[] = { gpr_rsp_x86_64, gpr_esp_x86_64, gpr_sp_x86_64, gpr_spl_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_invalidate_r8[] = { gpr_r8_x86_64, gpr_r8d_x86_64, gpr_r8w_x86_64, gpr_r8l_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_invalidate_r9[] = { gpr_r9_x86_64, gpr_r9d_x86_64, gpr_r9w_x86_64, gpr_r9l_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_invalidate_r10[] = { gpr_r10_x86_64, gpr_r10d_x86_64, gpr_r10w_x86_64, gpr_r10l_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_invalidate_r11[] = { gpr_r11_x86_64, gpr_r11d_x86_64, gpr_r11w_x86_64, gpr_r11l_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_invalidate_r12[] = { gpr_r12_x86_64, gpr_r12d_x86_64, gpr_r12w_x86_64, gpr_r12l_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_invalidate_r13[] = { gpr_r13_x86_64, gpr_r13d_x86_64, gpr_r13w_x86_64, gpr_r13l_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_invalidate_r14[] = { gpr_r14_x86_64, gpr_r14d_x86_64, gpr_r14w_x86_64, gpr_r14l_x86_64, LLDB_INVALID_REGNUM };
|
||||
uint32_t RegisterContextPOSIX_x86::g_invalidate_r15[] = { gpr_r15_x86_64, gpr_r15d_x86_64, gpr_r15w_x86_64, gpr_r15l_x86_64, LLDB_INVALID_REGNUM };
|
||||
|
||||
// Number of register sets provided by this context.
|
||||
enum
|
||||
|
@ -226,37 +338,37 @@ enum
|
|||
};
|
||||
|
||||
static const RegisterSet
|
||||
g_reg_sets_x86_64[k_num_register_sets] =
|
||||
g_reg_sets_i386[k_num_register_sets] =
|
||||
{
|
||||
{ "General Purpose Registers", "gpr", k_num_gpr_registers_x86_64, g_gpr_regnums },
|
||||
{ "Floating Point Registers", "fpu", k_num_fpr_registers_x86_64, g_fpu_regnums },
|
||||
{ "Advanced Vector Extensions", "avx", k_num_avx_registers_x86_64, g_avx_regnums }
|
||||
{ "General Purpose Registers", "gpr", k_num_gpr_registers_i386, g_gpr_regnums_i386 },
|
||||
{ "Floating Point Registers", "fpu", k_num_fpr_registers_i386, g_fpu_regnums_i386 },
|
||||
{ "Advanced Vector Extensions", "avx", k_num_avx_registers_i386, g_avx_regnums_i386 }
|
||||
};
|
||||
|
||||
static const RegisterSet
|
||||
g_reg_sets_i386[k_num_register_sets] =
|
||||
g_reg_sets_x86_64[k_num_register_sets] =
|
||||
{
|
||||
{ "General Purpose Registers", "gpr", k_num_gpr_registers_i386, RegisterContextPOSIX_i386::g_gpr_regnums },
|
||||
{ "Floating Point Registers", "fpu", k_num_fpr_registers_i386, RegisterContextPOSIX_i386::g_fpu_regnums },
|
||||
{ "Advanced Vector Extensions", "avx", k_num_avx_registers_i386, RegisterContextPOSIX_i386::g_avx_regnums }
|
||||
{ "General Purpose Registers", "gpr", k_num_gpr_registers_x86_64, g_gpr_regnums_x86_64 },
|
||||
{ "Floating Point Registers", "fpu", k_num_fpr_registers_x86_64, g_fpu_regnums_x86_64 },
|
||||
{ "Advanced Vector Extensions", "avx", k_num_avx_registers_x86_64, g_avx_regnums_x86_64 }
|
||||
};
|
||||
|
||||
bool RegisterContextPOSIX_x86_64::IsGPR(unsigned reg)
|
||||
bool RegisterContextPOSIX_x86::IsGPR(unsigned reg)
|
||||
{
|
||||
return reg <= m_reg_info.last_gpr; // GPR's come first.
|
||||
}
|
||||
|
||||
bool RegisterContextPOSIX_x86_64::IsFPR(unsigned reg)
|
||||
bool RegisterContextPOSIX_x86::IsFPR(unsigned reg)
|
||||
{
|
||||
return (m_reg_info.first_fpr <= reg && reg <= m_reg_info.last_fpr);
|
||||
}
|
||||
|
||||
bool RegisterContextPOSIX_x86_64::IsAVX(unsigned reg)
|
||||
bool RegisterContextPOSIX_x86::IsAVX(unsigned reg)
|
||||
{
|
||||
return (m_reg_info.first_ymm <= reg && reg <= m_reg_info.last_ymm);
|
||||
}
|
||||
|
||||
bool RegisterContextPOSIX_x86_64::IsFPR(unsigned reg, FPRType fpr_type)
|
||||
bool RegisterContextPOSIX_x86::IsFPR(unsigned reg, FPRType fpr_type)
|
||||
{
|
||||
bool generic_fpr = IsFPR(reg);
|
||||
|
||||
|
@ -265,9 +377,9 @@ bool RegisterContextPOSIX_x86_64::IsFPR(unsigned reg, FPRType fpr_type)
|
|||
return generic_fpr;
|
||||
}
|
||||
|
||||
RegisterContextPOSIX_x86_64::RegisterContextPOSIX_x86_64(Thread &thread,
|
||||
uint32_t concrete_frame_idx,
|
||||
RegisterInfoInterface *register_info)
|
||||
RegisterContextPOSIX_x86::RegisterContextPOSIX_x86(Thread &thread,
|
||||
uint32_t concrete_frame_idx,
|
||||
RegisterInfoInterface *register_info)
|
||||
: RegisterContext(thread, concrete_frame_idx)
|
||||
{
|
||||
m_register_info_ap.reset(register_info);
|
||||
|
@ -335,11 +447,11 @@ RegisterContextPOSIX_x86_64::RegisterContextPOSIX_x86_64(Thread &thread,
|
|||
m_fpr_type = eNotValid;
|
||||
}
|
||||
|
||||
RegisterContextPOSIX_x86_64::~RegisterContextPOSIX_x86_64()
|
||||
RegisterContextPOSIX_x86::~RegisterContextPOSIX_x86()
|
||||
{
|
||||
}
|
||||
|
||||
RegisterContextPOSIX_x86_64::FPRType RegisterContextPOSIX_x86_64::GetFPRType()
|
||||
RegisterContextPOSIX_x86::FPRType RegisterContextPOSIX_x86::GetFPRType()
|
||||
{
|
||||
if (m_fpr_type == eNotValid)
|
||||
{
|
||||
|
@ -352,31 +464,31 @@ RegisterContextPOSIX_x86_64::FPRType RegisterContextPOSIX_x86_64::GetFPRType()
|
|||
}
|
||||
|
||||
void
|
||||
RegisterContextPOSIX_x86_64::Invalidate()
|
||||
RegisterContextPOSIX_x86::Invalidate()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
RegisterContextPOSIX_x86_64::InvalidateAllRegisters()
|
||||
RegisterContextPOSIX_x86::InvalidateAllRegisters()
|
||||
{
|
||||
}
|
||||
|
||||
unsigned
|
||||
RegisterContextPOSIX_x86_64::GetRegisterOffset(unsigned reg)
|
||||
RegisterContextPOSIX_x86::GetRegisterOffset(unsigned reg)
|
||||
{
|
||||
assert(reg < m_reg_info.num_registers && "Invalid register number.");
|
||||
return GetRegisterInfo()[reg].byte_offset;
|
||||
}
|
||||
|
||||
unsigned
|
||||
RegisterContextPOSIX_x86_64::GetRegisterSize(unsigned reg)
|
||||
RegisterContextPOSIX_x86::GetRegisterSize(unsigned reg)
|
||||
{
|
||||
assert(reg < m_reg_info.num_registers && "Invalid register number.");
|
||||
return GetRegisterInfo()[reg].byte_size;
|
||||
}
|
||||
|
||||
size_t
|
||||
RegisterContextPOSIX_x86_64::GetRegisterCount()
|
||||
RegisterContextPOSIX_x86::GetRegisterCount()
|
||||
{
|
||||
size_t num_registers = m_reg_info.num_gpr_registers + m_reg_info.num_fpr_registers;
|
||||
if (GetFPRType() == eXSAVE)
|
||||
|
@ -385,13 +497,13 @@ RegisterContextPOSIX_x86_64::GetRegisterCount()
|
|||
}
|
||||
|
||||
size_t
|
||||
RegisterContextPOSIX_x86_64::GetGPRSize()
|
||||
RegisterContextPOSIX_x86::GetGPRSize()
|
||||
{
|
||||
return m_register_info_ap->GetGPRSize ();
|
||||
}
|
||||
|
||||
const RegisterInfo *
|
||||
RegisterContextPOSIX_x86_64::GetRegisterInfo()
|
||||
RegisterContextPOSIX_x86::GetRegisterInfo()
|
||||
{
|
||||
// Commonly, this method is overridden and g_register_infos is copied and specialized.
|
||||
// So, use GetRegisterInfo() rather than g_register_infos in this scope.
|
||||
|
@ -399,7 +511,7 @@ RegisterContextPOSIX_x86_64::GetRegisterInfo()
|
|||
}
|
||||
|
||||
const RegisterInfo *
|
||||
RegisterContextPOSIX_x86_64::GetRegisterInfoAtIndex(size_t reg)
|
||||
RegisterContextPOSIX_x86::GetRegisterInfoAtIndex(size_t reg)
|
||||
{
|
||||
if (reg < m_reg_info.num_registers)
|
||||
return &GetRegisterInfo()[reg];
|
||||
|
@ -408,7 +520,7 @@ RegisterContextPOSIX_x86_64::GetRegisterInfoAtIndex(size_t reg)
|
|||
}
|
||||
|
||||
size_t
|
||||
RegisterContextPOSIX_x86_64::GetRegisterSetCount()
|
||||
RegisterContextPOSIX_x86::GetRegisterSetCount()
|
||||
{
|
||||
size_t sets = 0;
|
||||
for (size_t set = 0; set < k_num_register_sets; ++set)
|
||||
|
@ -421,7 +533,7 @@ RegisterContextPOSIX_x86_64::GetRegisterSetCount()
|
|||
}
|
||||
|
||||
const RegisterSet *
|
||||
RegisterContextPOSIX_x86_64::GetRegisterSet(size_t set)
|
||||
RegisterContextPOSIX_x86::GetRegisterSet(size_t set)
|
||||
{
|
||||
if (IsRegisterSetAvailable(set))
|
||||
{
|
||||
|
@ -442,14 +554,14 @@ RegisterContextPOSIX_x86_64::GetRegisterSet(size_t set)
|
|||
}
|
||||
|
||||
const char *
|
||||
RegisterContextPOSIX_x86_64::GetRegisterName(unsigned reg)
|
||||
RegisterContextPOSIX_x86::GetRegisterName(unsigned reg)
|
||||
{
|
||||
assert(reg < m_reg_info.num_registers && "Invalid register offset.");
|
||||
return GetRegisterInfo()[reg].name;
|
||||
}
|
||||
|
||||
lldb::ByteOrder
|
||||
RegisterContextPOSIX_x86_64::GetByteOrder()
|
||||
RegisterContextPOSIX_x86::GetByteOrder()
|
||||
{
|
||||
// Get the target process whose privileged thread was used for the register read.
|
||||
lldb::ByteOrder byte_order = eByteOrderInvalid;
|
||||
|
@ -461,7 +573,7 @@ RegisterContextPOSIX_x86_64::GetByteOrder()
|
|||
}
|
||||
|
||||
// Parse ymm registers and into xmm.bytes and ymmh.bytes.
|
||||
bool RegisterContextPOSIX_x86_64::CopyYMMtoXSTATE(uint32_t reg, lldb::ByteOrder byte_order)
|
||||
bool RegisterContextPOSIX_x86::CopyYMMtoXSTATE(uint32_t reg, lldb::ByteOrder byte_order)
|
||||
{
|
||||
if (!IsAVX(reg))
|
||||
return false;
|
||||
|
@ -491,7 +603,7 @@ bool RegisterContextPOSIX_x86_64::CopyYMMtoXSTATE(uint32_t reg, lldb::ByteOrder
|
|||
}
|
||||
|
||||
// Concatenate xmm.bytes with ymmh.bytes
|
||||
bool RegisterContextPOSIX_x86_64::CopyXSTATEtoYMM(uint32_t reg, lldb::ByteOrder byte_order)
|
||||
bool RegisterContextPOSIX_x86::CopyXSTATEtoYMM(uint32_t reg, lldb::ByteOrder byte_order)
|
||||
{
|
||||
if (!IsAVX(reg))
|
||||
return false;
|
||||
|
@ -521,7 +633,7 @@ bool RegisterContextPOSIX_x86_64::CopyXSTATEtoYMM(uint32_t reg, lldb::ByteOrder
|
|||
}
|
||||
|
||||
bool
|
||||
RegisterContextPOSIX_x86_64::IsRegisterSetAvailable(size_t set_index)
|
||||
RegisterContextPOSIX_x86::IsRegisterSetAvailable(size_t set_index)
|
||||
{
|
||||
// Note: Extended register sets are assumed to be at the end of g_reg_sets...
|
||||
size_t num_sets = k_num_register_sets - k_num_extended_register_sets;
|
||||
|
@ -535,7 +647,7 @@ RegisterContextPOSIX_x86_64::IsRegisterSetAvailable(size_t set_index)
|
|||
// Used when parsing DWARF and EH frame information and any other
|
||||
// object file sections that contain register numbers in them.
|
||||
uint32_t
|
||||
RegisterContextPOSIX_x86_64::ConvertRegisterKindToRegisterNumber(uint32_t kind,
|
||||
RegisterContextPOSIX_x86::ConvertRegisterKindToRegisterNumber(uint32_t kind,
|
||||
uint32_t num)
|
||||
{
|
||||
const uint32_t num_regs = GetRegisterCount();
|
|
@ -1,4 +1,4 @@
|
|||
//===-- RegisterContextPOSIX_x86_64.h ---------------------------*- C++ -*-===//
|
||||
//===-- RegisterContextPOSIX_x86.h ------------------------------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
|
@ -7,8 +7,8 @@
|
|||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef liblldb_RegisterContextPOSIX_x86_64_H_
|
||||
#define liblldb_RegisterContextPOSIX_x86_64_H_
|
||||
#ifndef liblldb_RegisterContextPOSIX_x86_H_
|
||||
#define liblldb_RegisterContextPOSIX_x86_H_
|
||||
|
||||
#include "lldb/Core/Log.h"
|
||||
#include "RegisterContextPOSIX.h"
|
||||
|
@ -16,6 +16,113 @@
|
|||
|
||||
class ProcessMonitor;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Internal codes for all i386 registers.
|
||||
//---------------------------------------------------------------------------
|
||||
enum
|
||||
{
|
||||
k_first_gpr_i386,
|
||||
gpr_eax_i386 = k_first_gpr_i386,
|
||||
gpr_ebx_i386,
|
||||
gpr_ecx_i386,
|
||||
gpr_edx_i386,
|
||||
gpr_edi_i386,
|
||||
gpr_esi_i386,
|
||||
gpr_ebp_i386,
|
||||
gpr_esp_i386,
|
||||
gpr_eip_i386,
|
||||
gpr_eflags_i386,
|
||||
gpr_cs_i386,
|
||||
gpr_fs_i386,
|
||||
gpr_gs_i386,
|
||||
gpr_ss_i386,
|
||||
gpr_ds_i386,
|
||||
gpr_es_i386,
|
||||
|
||||
k_first_alias_i386,
|
||||
gpr_ax_i386 = k_first_alias_i386,
|
||||
gpr_bx_i386,
|
||||
gpr_cx_i386,
|
||||
gpr_dx_i386,
|
||||
gpr_di_i386,
|
||||
gpr_si_i386,
|
||||
gpr_bp_i386,
|
||||
gpr_sp_i386,
|
||||
gpr_ah_i386,
|
||||
gpr_bh_i386,
|
||||
gpr_ch_i386,
|
||||
gpr_dh_i386,
|
||||
gpr_al_i386,
|
||||
gpr_bl_i386,
|
||||
gpr_cl_i386,
|
||||
gpr_dl_i386,
|
||||
k_last_alias_i386 = gpr_dl_i386,
|
||||
|
||||
k_last_gpr_i386 = k_last_alias_i386,
|
||||
|
||||
k_first_fpr_i386,
|
||||
fpu_fctrl_i386 = k_first_fpr_i386,
|
||||
fpu_fstat_i386,
|
||||
fpu_ftag_i386,
|
||||
fpu_fop_i386,
|
||||
fpu_fiseg_i386,
|
||||
fpu_fioff_i386,
|
||||
fpu_foseg_i386,
|
||||
fpu_fooff_i386,
|
||||
fpu_mxcsr_i386,
|
||||
fpu_mxcsrmask_i386,
|
||||
fpu_st0_i386,
|
||||
fpu_st1_i386,
|
||||
fpu_st2_i386,
|
||||
fpu_st3_i386,
|
||||
fpu_st4_i386,
|
||||
fpu_st5_i386,
|
||||
fpu_st6_i386,
|
||||
fpu_st7_i386,
|
||||
fpu_mm0_i386,
|
||||
fpu_mm1_i386,
|
||||
fpu_mm2_i386,
|
||||
fpu_mm3_i386,
|
||||
fpu_mm4_i386,
|
||||
fpu_mm5_i386,
|
||||
fpu_mm6_i386,
|
||||
fpu_mm7_i386,
|
||||
fpu_xmm0_i386,
|
||||
fpu_xmm1_i386,
|
||||
fpu_xmm2_i386,
|
||||
fpu_xmm3_i386,
|
||||
fpu_xmm4_i386,
|
||||
fpu_xmm5_i386,
|
||||
fpu_xmm6_i386,
|
||||
fpu_xmm7_i386,
|
||||
k_last_fpr_i386 = fpu_xmm7_i386,
|
||||
|
||||
k_first_avx_i386,
|
||||
fpu_ymm0_i386 = k_first_avx_i386,
|
||||
fpu_ymm1_i386,
|
||||
fpu_ymm2_i386,
|
||||
fpu_ymm3_i386,
|
||||
fpu_ymm4_i386,
|
||||
fpu_ymm5_i386,
|
||||
fpu_ymm6_i386,
|
||||
fpu_ymm7_i386,
|
||||
k_last_avx_i386 = fpu_ymm7_i386,
|
||||
|
||||
dr0_i386,
|
||||
dr1_i386,
|
||||
dr2_i386,
|
||||
dr3_i386,
|
||||
dr4_i386,
|
||||
dr5_i386,
|
||||
dr6_i386,
|
||||
dr7_i386,
|
||||
|
||||
k_num_registers_i386,
|
||||
k_num_gpr_registers_i386 = k_last_gpr_i386 - k_first_gpr_i386 + 1,
|
||||
k_num_fpr_registers_i386 = k_last_fpr_i386 - k_first_fpr_i386 + 1,
|
||||
k_num_avx_registers_i386 = k_last_avx_i386 - k_first_avx_i386 + 1
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Internal codes for all x86_64 registers.
|
||||
//---------------------------------------------------------------------------
|
||||
|
@ -183,15 +290,15 @@ enum
|
|||
k_num_avx_registers_x86_64 = k_last_avx_x86_64 - k_first_avx_x86_64 + 1
|
||||
};
|
||||
|
||||
class RegisterContextPOSIX_x86_64
|
||||
class RegisterContextPOSIX_x86
|
||||
: public lldb_private::RegisterContext
|
||||
{
|
||||
public:
|
||||
RegisterContextPOSIX_x86_64 (lldb_private::Thread &thread,
|
||||
RegisterContextPOSIX_x86 (lldb_private::Thread &thread,
|
||||
uint32_t concrete_frame_idx,
|
||||
RegisterInfoInterface *register_info);
|
||||
|
||||
~RegisterContextPOSIX_x86_64();
|
||||
~RegisterContextPOSIX_x86();
|
||||
|
||||
void
|
||||
Invalidate();
|
||||
|
@ -238,6 +345,24 @@ public:
|
|||
eXSAVE
|
||||
};
|
||||
|
||||
static uint32_t g_contained_eax[];
|
||||
static uint32_t g_contained_ebx[];
|
||||
static uint32_t g_contained_ecx[];
|
||||
static uint32_t g_contained_edx[];
|
||||
static uint32_t g_contained_edi[];
|
||||
static uint32_t g_contained_esi[];
|
||||
static uint32_t g_contained_ebp[];
|
||||
static uint32_t g_contained_esp[];
|
||||
|
||||
static uint32_t g_invalidate_eax[];
|
||||
static uint32_t g_invalidate_ebx[];
|
||||
static uint32_t g_invalidate_ecx[];
|
||||
static uint32_t g_invalidate_edx[];
|
||||
static uint32_t g_invalidate_edi[];
|
||||
static uint32_t g_invalidate_esi[];
|
||||
static uint32_t g_invalidate_ebp[];
|
||||
static uint32_t g_invalidate_esp[];
|
||||
|
||||
static uint32_t g_contained_rax[];
|
||||
static uint32_t g_contained_rbx[];
|
||||
static uint32_t g_contained_rcx[];
|
||||
|
@ -334,4 +459,4 @@ protected:
|
|||
virtual bool WriteFPR() = 0;
|
||||
};
|
||||
|
||||
#endif // #ifndef liblldb_RegisterContextPOSIX_x86_64_H_
|
||||
#endif // #ifndef liblldb_RegisterContextPOSIX_x86_H_
|
|
@ -77,13 +77,13 @@
|
|||
|
||||
#define DEFINE_GPR_PSEUDO_16(reg16, reg32) \
|
||||
{ #reg16, NULL, 2, GPR_OFFSET(reg32), eEncodingUint, \
|
||||
eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_##reg16##_i386 }, RegisterContextPOSIX_i386::g_contained_##reg32, RegisterContextPOSIX_i386::g_invalidate_##reg32 }
|
||||
eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_##reg16##_i386 }, RegisterContextPOSIX_x86::g_contained_##reg32, RegisterContextPOSIX_x86::g_invalidate_##reg32 }
|
||||
#define DEFINE_GPR_PSEUDO_8H(reg8, reg32) \
|
||||
{ #reg8, NULL, 1, GPR_OFFSET(reg32)+1, eEncodingUint, \
|
||||
eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_##reg8##_i386 }, RegisterContextPOSIX_i386::g_contained_##reg32, RegisterContextPOSIX_i386::g_invalidate_##reg32 }
|
||||
eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_##reg8##_i386 }, RegisterContextPOSIX_x86::g_contained_##reg32, RegisterContextPOSIX_x86::g_invalidate_##reg32 }
|
||||
#define DEFINE_GPR_PSEUDO_8L(reg8, reg32) \
|
||||
{ #reg8, NULL, 1, GPR_OFFSET(reg32), eEncodingUint, \
|
||||
eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_##reg8##_i386 }, RegisterContextPOSIX_i386::g_contained_##reg32, RegisterContextPOSIX_i386::g_invalidate_##reg32 }
|
||||
eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_##reg8##_i386 }, RegisterContextPOSIX_x86::g_contained_##reg32, RegisterContextPOSIX_x86::g_invalidate_##reg32 }
|
||||
|
||||
static RegisterInfo
|
||||
g_register_infos_i386[] =
|
||||
|
|
|
@ -74,20 +74,18 @@
|
|||
{ LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, \
|
||||
LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM }, NULL, NULL }
|
||||
|
||||
#define REG_CONTEXT_SIZE (GetGPRSize() + sizeof(RegisterContextPOSIX_x86_64::FPR))
|
||||
|
||||
#define DEFINE_GPR_PSEUDO_32(reg32, reg64) \
|
||||
{ #reg32, NULL, 4, GPR_OFFSET(reg64), eEncodingUint, \
|
||||
eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_##reg32##_x86_64 }, RegisterContextPOSIX_x86_64::g_contained_##reg64, RegisterContextPOSIX_x86_64::g_invalidate_##reg64 }
|
||||
eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_##reg32##_x86_64 }, RegisterContextPOSIX_x86::g_contained_##reg64, RegisterContextPOSIX_x86::g_invalidate_##reg64 }
|
||||
#define DEFINE_GPR_PSEUDO_16(reg16, reg64) \
|
||||
{ #reg16, NULL, 2, GPR_OFFSET(reg64), eEncodingUint, \
|
||||
eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_##reg16##_x86_64 }, RegisterContextPOSIX_x86_64::g_contained_##reg64, RegisterContextPOSIX_x86_64::g_invalidate_##reg64 }
|
||||
eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_##reg16##_x86_64 }, RegisterContextPOSIX_x86::g_contained_##reg64, RegisterContextPOSIX_x86::g_invalidate_##reg64 }
|
||||
#define DEFINE_GPR_PSEUDO_8H(reg8, reg64) \
|
||||
{ #reg8, NULL, 1, GPR_OFFSET(reg64)+1, eEncodingUint, \
|
||||
eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_##reg8##_x86_64 }, RegisterContextPOSIX_x86_64::g_contained_##reg64, RegisterContextPOSIX_x86_64::g_invalidate_##reg64 }
|
||||
eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_##reg8##_x86_64 }, RegisterContextPOSIX_x86::g_contained_##reg64, RegisterContextPOSIX_x86::g_invalidate_##reg64 }
|
||||
#define DEFINE_GPR_PSEUDO_8L(reg8, reg64) \
|
||||
{ #reg8, NULL, 1, GPR_OFFSET(reg64), eEncodingUint, \
|
||||
eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_##reg8##_x86_64 }, RegisterContextPOSIX_x86_64::g_contained_##reg64, RegisterContextPOSIX_x86_64::g_invalidate_##reg64 }
|
||||
eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_##reg8##_x86_64 }, RegisterContextPOSIX_x86::g_contained_##reg64, RegisterContextPOSIX_x86::g_invalidate_##reg64 }
|
||||
|
||||
static RegisterInfo
|
||||
g_register_infos_x86_64[] =
|
||||
|
@ -260,7 +258,6 @@ static_assert((sizeof(g_register_infos_x86_64) / sizeof(g_register_infos_x86_64[
|
|||
#undef DEFINE_XMM
|
||||
#undef DEFINE_YMM
|
||||
#undef DEFINE_DR
|
||||
#undef REG_CONTEXT_SIZE
|
||||
#undef DEFINE_GPR_PSEUDO_32
|
||||
#undef DEFINE_GPR_PSEUDO_16
|
||||
#undef DEFINE_GPR_PSEUDO_8H
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
//===-- RegisterContextCorePOSIX_x86_64.cpp -------------------------*- C++ -*-===//
|
||||
//===-- RegisterContextCorePOSIX_x86_64.cpp ---------------------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
|
@ -19,7 +19,7 @@ RegisterContextCorePOSIX_x86_64::RegisterContextCorePOSIX_x86_64(Thread &thread,
|
|||
RegisterInfoInterface *register_info,
|
||||
const DataExtractor &gpregset,
|
||||
const DataExtractor &fpregset)
|
||||
: RegisterContextPOSIX_x86_64 (thread, 0, register_info)
|
||||
: RegisterContextPOSIX_x86 (thread, 0, register_info)
|
||||
{
|
||||
size_t size, len;
|
||||
|
||||
|
|
|
@ -10,10 +10,10 @@
|
|||
#ifndef liblldb_RegisterContextCorePOSIX_x86_64_H_
|
||||
#define liblldb_RegisterContextCorePOSIX_x86_64_H_
|
||||
|
||||
#include "Plugins/Process/POSIX/RegisterContextPOSIX_x86_64.h"
|
||||
#include "Plugins/Process/POSIX/RegisterContextPOSIX_x86.h"
|
||||
|
||||
class RegisterContextCorePOSIX_x86_64 :
|
||||
public RegisterContextPOSIX_x86_64
|
||||
public RegisterContextPOSIX_x86
|
||||
{
|
||||
public:
|
||||
RegisterContextCorePOSIX_x86_64 (lldb_private::Thread &thread,
|
||||
|
|
|
@ -102,7 +102,7 @@ UnwindTable::GetFuncUnwindersContainingAddress (const Address& addr, SymbolConte
|
|||
|
||||
FuncUnwindersSP func_unwinder_sp(new FuncUnwinders(*this, m_assembly_profiler, range));
|
||||
m_unwinds.insert (insert_pos, std::make_pair(range.GetBaseAddress().GetFileAddress(), func_unwinder_sp));
|
||||
// StreamFile s(stdout);
|
||||
// StreamFile s(stdout, false);
|
||||
// Dump (s);
|
||||
return func_unwinder_sp;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue