RegisterInfoPOSIX_arm.cpp revision 317027
1317027Sdim//===-- RegisterInfoPOSIX_arm.cpp ------------------------------*- C++ -*-===// 2317027Sdim// 3317027Sdim// The LLVM Compiler Infrastructure 4317027Sdim// 5317027Sdim// This file is distributed under the University of Illinois Open Source 6317027Sdim// License. See LICENSE.TXT for details. 7317027Sdim// 8317027Sdim//===---------------------------------------------------------------------===// 9317027Sdim 10317027Sdim#include <cassert> 11317027Sdim#include <stddef.h> 12317027Sdim#include <vector> 13317027Sdim 14317027Sdim#include "lldb/lldb-defines.h" 15317027Sdim#include "llvm/Support/Compiler.h" 16317027Sdim 17317027Sdim#include "RegisterInfoPOSIX_arm.h" 18317027Sdim 19317027Sdimusing namespace lldb; 20317027Sdimusing namespace lldb_private; 21317027Sdim 22317027Sdim// Based on RegisterContextDarwin_arm.cpp 23317027Sdim#define GPR_OFFSET(idx) ((idx)*4) 24317027Sdim#define FPU_OFFSET(idx) ((idx)*4 + sizeof(RegisterInfoPOSIX_arm::GPR)) 25317027Sdim#define FPSCR_OFFSET \ 26317027Sdim (LLVM_EXTENSION offsetof(RegisterInfoPOSIX_arm::FPU, fpscr) + \ 27317027Sdim sizeof(RegisterInfoPOSIX_arm::GPR)) 28317027Sdim#define EXC_OFFSET(idx) \ 29317027Sdim ((idx)*4 + sizeof(RegisterInfoPOSIX_arm::GPR) + \ 30317027Sdim sizeof(RegisterInfoPOSIX_arm::FPU)) 31317027Sdim#define DBG_OFFSET(reg) \ 32317027Sdim ((LLVM_EXTENSION offsetof(RegisterInfoPOSIX_arm::DBG, reg) + \ 33317027Sdim sizeof(RegisterInfoPOSIX_arm::GPR) + sizeof(RegisterInfoPOSIX_arm::FPU) + \ 34317027Sdim sizeof(RegisterInfoPOSIX_arm::EXC))) 35317027Sdim 36317027Sdim#define DEFINE_DBG(reg, i) \ 37317027Sdim #reg, NULL, sizeof(((RegisterInfoPOSIX_arm::DBG *) NULL)->reg[i]), \ 38317027Sdim DBG_OFFSET(reg[i]), eEncodingUint, eFormatHex, \ 39317027Sdim {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, \ 40317027Sdim LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, \ 41317027Sdim dbg_##reg##i }, \ 42317027Sdim NULL, NULL, NULL, 0 43317027Sdim#define REG_CONTEXT_SIZE \ 44317027Sdim (sizeof(RegisterInfoPOSIX_arm::GPR) + sizeof(RegisterInfoPOSIX_arm::FPU) + \ 45317027Sdim sizeof(RegisterInfoPOSIX_arm::EXC)) 46317027Sdim 47317027Sdim//----------------------------------------------------------------------------- 48317027Sdim// Include RegisterInfos_arm to declare our g_register_infos_arm structure. 49317027Sdim//----------------------------------------------------------------------------- 50317027Sdim#define DECLARE_REGISTER_INFOS_ARM_STRUCT 51317027Sdim#include "RegisterInfos_arm.h" 52317027Sdim#undef DECLARE_REGISTER_INFOS_ARM_STRUCT 53317027Sdim 54317027Sdimstatic const lldb_private::RegisterInfo * 55317027SdimGetRegisterInfoPtr(const lldb_private::ArchSpec &target_arch) { 56317027Sdim switch (target_arch.GetMachine()) { 57317027Sdim case llvm::Triple::arm: 58317027Sdim return g_register_infos_arm; 59317027Sdim default: 60317027Sdim assert(false && "Unhandled target architecture."); 61317027Sdim return NULL; 62317027Sdim } 63317027Sdim} 64317027Sdim 65317027Sdimstatic uint32_t 66317027SdimGetRegisterInfoCount(const lldb_private::ArchSpec &target_arch) { 67317027Sdim switch (target_arch.GetMachine()) { 68317027Sdim case llvm::Triple::arm: 69317027Sdim return static_cast<uint32_t>(sizeof(g_register_infos_arm) / 70317027Sdim sizeof(g_register_infos_arm[0])); 71317027Sdim default: 72317027Sdim assert(false && "Unhandled target architecture."); 73317027Sdim return 0; 74317027Sdim } 75317027Sdim} 76317027Sdim 77317027SdimRegisterInfoPOSIX_arm::RegisterInfoPOSIX_arm( 78317027Sdim const lldb_private::ArchSpec &target_arch) 79317027Sdim : lldb_private::RegisterInfoInterface(target_arch), 80317027Sdim m_register_info_p(GetRegisterInfoPtr(target_arch)), 81317027Sdim m_register_info_count(GetRegisterInfoCount(target_arch)) {} 82317027Sdim 83317027Sdimsize_t RegisterInfoPOSIX_arm::GetGPRSize() const { 84317027Sdim return sizeof(struct RegisterInfoPOSIX_arm::GPR); 85317027Sdim} 86317027Sdim 87317027Sdimconst lldb_private::RegisterInfo * 88317027SdimRegisterInfoPOSIX_arm::GetRegisterInfo() const { 89317027Sdim return m_register_info_p; 90317027Sdim} 91317027Sdim 92317027Sdimuint32_t RegisterInfoPOSIX_arm::GetRegisterCount() const { 93317027Sdim return m_register_info_count; 94317027Sdim} 95