Merge RegisterContextPOSIX_x86_64 and RegisterContextPOSIX_i386 into RegisterContextPOSIX_x86

llvm-svn: 192332
This commit is contained in:
Michael Sartain 2013-10-10 00:16:10 +00:00
parent 935d01d80a
commit 762df1f139
19 changed files with 364 additions and 873 deletions

View File

@ -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
)

View File

@ -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;

View File

@ -7,7 +7,7 @@
//
//===---------------------------------------------------------------------===//
#include "RegisterContextPOSIX_i386.h"
#include "RegisterContextPOSIX_x86.h"
#include "RegisterContextFreeBSD_i386.h"
using namespace lldb_private;

View File

@ -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"

View File

@ -7,7 +7,7 @@
//
//===---------------------------------------------------------------------===//
#include "RegisterContextPOSIX_i386.h"
#include "RegisterContextPOSIX_x86.h"
#include "RegisterContextLinux_i386.h"
using namespace lldb_private;

View File

@ -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"

View File

@ -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;
}

View File

@ -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

View File

@ -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)
{
}

View File

@ -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:

View File

@ -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;
}

View File

@ -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_

View File

@ -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();

View File

@ -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_

View File

@ -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[] =

View File

@ -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

View File

@ -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;

View File

@ -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,

View File

@ -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;
}