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