diff options
Diffstat (limited to 'source/Plugins/Process/POSIX/RegisterContextFreeBSD_x86_64.cpp')
-rw-r--r-- | source/Plugins/Process/POSIX/RegisterContextFreeBSD_x86_64.cpp | 129 |
1 files changed, 54 insertions, 75 deletions
diff --git a/source/Plugins/Process/POSIX/RegisterContextFreeBSD_x86_64.cpp b/source/Plugins/Process/POSIX/RegisterContextFreeBSD_x86_64.cpp index 0fb9dc1cb3dc..471734580fff 100644 --- a/source/Plugins/Process/POSIX/RegisterContextFreeBSD_x86_64.cpp +++ b/source/Plugins/Process/POSIX/RegisterContextFreeBSD_x86_64.cpp @@ -1,4 +1,4 @@ -//===-- RegisterContextFreeBSD_x86_64.h ------------------------*- C++ -*-===// +//===-- RegisterContextFreeBSD_x86_64.cpp ----------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -7,27 +7,15 @@ // //===---------------------------------------------------------------------===// -#include "RegisterContextFreeBSD_x86_64.h" #include <vector> +#include "RegisterContextPOSIX_x86.h" +#include "RegisterContextFreeBSD_i386.h" +#include "RegisterContextFreeBSD_x86_64.h" using namespace lldb_private; +using namespace lldb; -// Computes the offset of the given GPR in the user data area. -#define GPR_OFFSET(regname) \ - (offsetof(GPR, regname)) - -// Update the FreeBSD specific information (offset and size). -#define UPDATE_GPR_INFO(reg) \ -do { \ - GetRegisterContext()[gpr_##reg].byte_size = sizeof(GPR::reg); \ - GetRegisterContext()[gpr_##reg].byte_offset = GPR_OFFSET(reg); \ -} while(false); - -#define UPDATE_I386_GPR_INFO(i386_reg, reg) \ -do { \ - GetRegisterContext()[gpr_##i386_reg].byte_offset = GPR_OFFSET(reg); \ -} while(false); - +// http://svnweb.freebsd.org/base/head/sys/x86/include/reg.h typedef struct _GPR { uint64_t r15; @@ -58,15 +46,47 @@ typedef struct _GPR uint64_t ss; } GPR; -// Use a singleton function to avoid global constructors in shared libraries. -static std::vector<RegisterInfo> & GetRegisterContext () { - static std::vector<RegisterInfo> g_register_infos; - return g_register_infos; +#define DR_SIZE 0 +#define DR_OFFSET(reg_index) 0 + +//--------------------------------------------------------------------------- +// Include RegisterInfos_x86_64 to declare our g_register_infos_x86_64 structure. +//--------------------------------------------------------------------------- +#define DECLARE_REGISTER_INFOS_X86_64_STRUCT +#include "RegisterInfos_x86_64.h" +#undef DECLARE_REGISTER_INFOS_X86_64_STRUCT + +static const RegisterInfo * +GetRegisterInfo_i386(const lldb_private::ArchSpec& arch) +{ + static std::vector<lldb_private::RegisterInfo> g_register_infos; + + // Allocate RegisterInfo only once + if (g_register_infos.empty()) + { + // Copy the register information from base class + std::unique_ptr<RegisterContextFreeBSD_i386> reg_interface(new RegisterContextFreeBSD_i386 (arch)); + const RegisterInfo *base_info = reg_interface->GetRegisterInfo(); + g_register_infos.insert(g_register_infos.end(), &base_info[0], &base_info[k_num_registers_i386]); + + //--------------------------------------------------------------------------- + // Include RegisterInfos_x86_64 to update the g_register_infos structure + // with x86_64 offsets. + //--------------------------------------------------------------------------- + #define UPDATE_REGISTER_INFOS_I386_STRUCT_WITH_X86_64_OFFSETS + #include "RegisterInfos_x86_64.h" + #undef UPDATE_REGISTER_INFOS_I386_STRUCT_WITH_X86_64_OFFSETS + } + + return &g_register_infos[0]; } +RegisterContextFreeBSD_x86_64::RegisterContextFreeBSD_x86_64(const ArchSpec &target_arch) : + RegisterInfoInterface(target_arch) +{ +} -RegisterContextFreeBSD_x86_64::RegisterContextFreeBSD_x86_64(Thread &thread, uint32_t concrete_frame_idx): - RegisterContext_x86_64(thread, concrete_frame_idx) +RegisterContextFreeBSD_x86_64::~RegisterContextFreeBSD_x86_64() { } @@ -79,58 +99,17 @@ RegisterContextFreeBSD_x86_64::GetGPRSize() const RegisterInfo * RegisterContextFreeBSD_x86_64::GetRegisterInfo() { - // Allocate RegisterInfo only once - if (GetRegisterContext().empty()) + switch (m_target_arch.GetCore()) { - // Copy the register information from base class - const RegisterInfo *base_info = RegisterContext_x86_64::GetRegisterInfo(); - if (base_info) - { - GetRegisterContext().insert(GetRegisterContext().end(), &base_info[0], &base_info[k_num_registers]); - // Update the FreeBSD specific register information (offset and size). - UpdateRegisterInfo(); - } + case ArchSpec::eCore_x86_32_i386: + case ArchSpec::eCore_x86_32_i486: + case ArchSpec::eCore_x86_32_i486sx: + return GetRegisterInfo_i386 (m_target_arch); + case ArchSpec::eCore_x86_64_x86_64: + return g_register_infos_x86_64; + default: + assert(false && "Unhandled target architecture."); + return NULL; } - return &GetRegisterContext()[0]; -} - -void -RegisterContextFreeBSD_x86_64::UpdateRegisterInfo() -{ - UPDATE_GPR_INFO(rax); - UPDATE_GPR_INFO(rbx); - UPDATE_GPR_INFO(rcx); - UPDATE_GPR_INFO(rdx); - UPDATE_GPR_INFO(rdi); - UPDATE_GPR_INFO(rsi); - UPDATE_GPR_INFO(rbp); - UPDATE_GPR_INFO(rsp); - UPDATE_GPR_INFO(r8); - UPDATE_GPR_INFO(r9); - UPDATE_GPR_INFO(r10); - UPDATE_GPR_INFO(r11); - UPDATE_GPR_INFO(r12); - UPDATE_GPR_INFO(r13); - UPDATE_GPR_INFO(r14); - UPDATE_GPR_INFO(r15); - UPDATE_GPR_INFO(rip); - UPDATE_GPR_INFO(rflags); - UPDATE_GPR_INFO(cs); - UPDATE_GPR_INFO(fs); - UPDATE_GPR_INFO(gs); - UPDATE_GPR_INFO(ss); - UPDATE_GPR_INFO(ds); - UPDATE_GPR_INFO(es); - - UPDATE_I386_GPR_INFO(eax, rax); - UPDATE_I386_GPR_INFO(ebx, rbx); - UPDATE_I386_GPR_INFO(ecx, rcx); - UPDATE_I386_GPR_INFO(edx, rdx); - UPDATE_I386_GPR_INFO(edi, rdi); - UPDATE_I386_GPR_INFO(esi, rsi); - UPDATE_I386_GPR_INFO(ebp, rbp); - UPDATE_I386_GPR_INFO(esp, rsp); - UPDATE_I386_GPR_INFO(eip, rip); - UPDATE_I386_GPR_INFO(eflags, rflags); } |