1*435933ddSDimitry Andric //===-- RegisterInfoPOSIX_arm64.cpp ----------------------------*- C++ -*-===//
2*435933ddSDimitry Andric //
3*435933ddSDimitry Andric //                     The LLVM Compiler Infrastructure
4*435933ddSDimitry Andric //
5*435933ddSDimitry Andric // This file is distributed under the University of Illinois Open Source
6*435933ddSDimitry Andric // License. See LICENSE.TXT for details.
7*435933ddSDimitry Andric //
8*435933ddSDimitry Andric //===---------------------------------------------------------------------===//
9*435933ddSDimitry Andric 
10*435933ddSDimitry Andric #include <cassert>
11*435933ddSDimitry Andric #include <stddef.h>
12*435933ddSDimitry Andric #include <vector>
13*435933ddSDimitry Andric 
14*435933ddSDimitry Andric #include "lldb/lldb-defines.h"
15*435933ddSDimitry Andric #include "llvm/Support/Compiler.h"
16*435933ddSDimitry Andric 
17*435933ddSDimitry Andric #include "RegisterInfoPOSIX_arm64.h"
18*435933ddSDimitry Andric 
19*435933ddSDimitry Andric // Based on RegisterContextDarwin_arm64.cpp
20*435933ddSDimitry Andric #define GPR_OFFSET(idx) ((idx)*8)
21*435933ddSDimitry Andric #define GPR_OFFSET_NAME(reg)                                                   \
22*435933ddSDimitry Andric   (LLVM_EXTENSION offsetof(RegisterInfoPOSIX_arm64::GPR, reg))
23*435933ddSDimitry Andric 
24*435933ddSDimitry Andric #define FPU_OFFSET(idx) ((idx)*16 + sizeof(RegisterInfoPOSIX_arm64::GPR))
25*435933ddSDimitry Andric #define FPU_OFFSET_NAME(reg)                                                   \
26*435933ddSDimitry Andric   (LLVM_EXTENSION offsetof(RegisterInfoPOSIX_arm64::FPU, reg) +                \
27*435933ddSDimitry Andric    sizeof(RegisterInfoPOSIX_arm64::GPR))
28*435933ddSDimitry Andric 
29*435933ddSDimitry Andric #define EXC_OFFSET_NAME(reg)                                                   \
30*435933ddSDimitry Andric   (LLVM_EXTENSION offsetof(RegisterInfoPOSIX_arm64::EXC, reg) +                \
31*435933ddSDimitry Andric    sizeof(RegisterInfoPOSIX_arm64::GPR) +                                      \
32*435933ddSDimitry Andric    sizeof(RegisterInfoPOSIX_arm64::FPU))
33*435933ddSDimitry Andric #define DBG_OFFSET_NAME(reg)                                                   \
34*435933ddSDimitry Andric   (LLVM_EXTENSION offsetof(RegisterInfoPOSIX_arm64::DBG, reg) +                \
35*435933ddSDimitry Andric    sizeof(RegisterInfoPOSIX_arm64::GPR) +                                      \
36*435933ddSDimitry Andric    sizeof(RegisterInfoPOSIX_arm64::FPU) +                                      \
37*435933ddSDimitry Andric    sizeof(RegisterInfoPOSIX_arm64::EXC))
38*435933ddSDimitry Andric 
39*435933ddSDimitry Andric #define DEFINE_DBG(reg, i)                                                     \
40*435933ddSDimitry Andric   #reg, NULL,                                                                  \
41*435933ddSDimitry Andric       sizeof(((RegisterInfoPOSIX_arm64::DBG *) NULL)->reg[i]),                 \
42*435933ddSDimitry Andric               DBG_OFFSET_NAME(reg[i]), lldb::eEncodingUint, lldb::eFormatHex,  \
43*435933ddSDimitry Andric                               {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,       \
44*435933ddSDimitry Andric                                LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,       \
45*435933ddSDimitry Andric                                dbg_##reg##i },                                 \
46*435933ddSDimitry Andric                                NULL, NULL, NULL, 0
47*435933ddSDimitry Andric #define REG_CONTEXT_SIZE                                                       \
48*435933ddSDimitry Andric   (sizeof(RegisterInfoPOSIX_arm64::GPR) +                                      \
49*435933ddSDimitry Andric    sizeof(RegisterInfoPOSIX_arm64::FPU) +                                      \
50*435933ddSDimitry Andric    sizeof(RegisterInfoPOSIX_arm64::EXC))
51*435933ddSDimitry Andric 
52*435933ddSDimitry Andric //-----------------------------------------------------------------------------
53*435933ddSDimitry Andric // Include RegisterInfos_arm64 to declare our g_register_infos_arm64 structure.
54*435933ddSDimitry Andric //-----------------------------------------------------------------------------
55*435933ddSDimitry Andric #define DECLARE_REGISTER_INFOS_ARM64_STRUCT
56*435933ddSDimitry Andric #include "RegisterInfos_arm64.h"
57*435933ddSDimitry Andric #undef DECLARE_REGISTER_INFOS_ARM64_STRUCT
58*435933ddSDimitry Andric 
59*435933ddSDimitry Andric static const lldb_private::RegisterInfo *
GetRegisterInfoPtr(const lldb_private::ArchSpec & target_arch)60*435933ddSDimitry Andric GetRegisterInfoPtr(const lldb_private::ArchSpec &target_arch) {
61*435933ddSDimitry Andric   switch (target_arch.GetMachine()) {
62*435933ddSDimitry Andric   case llvm::Triple::aarch64:
63*435933ddSDimitry Andric     return g_register_infos_arm64_le;
64*435933ddSDimitry Andric   default:
65*435933ddSDimitry Andric     assert(false && "Unhandled target architecture.");
66*435933ddSDimitry Andric     return NULL;
67*435933ddSDimitry Andric   }
68*435933ddSDimitry Andric }
69*435933ddSDimitry Andric 
70*435933ddSDimitry Andric static uint32_t
GetRegisterInfoCount(const lldb_private::ArchSpec & target_arch)71*435933ddSDimitry Andric GetRegisterInfoCount(const lldb_private::ArchSpec &target_arch) {
72*435933ddSDimitry Andric   switch (target_arch.GetMachine()) {
73*435933ddSDimitry Andric   case llvm::Triple::aarch64:
74*435933ddSDimitry Andric     return static_cast<uint32_t>(sizeof(g_register_infos_arm64_le) /
75*435933ddSDimitry Andric                                  sizeof(g_register_infos_arm64_le[0]));
76*435933ddSDimitry Andric   default:
77*435933ddSDimitry Andric     assert(false && "Unhandled target architecture.");
78*435933ddSDimitry Andric     return 0;
79*435933ddSDimitry Andric   }
80*435933ddSDimitry Andric }
81*435933ddSDimitry Andric 
RegisterInfoPOSIX_arm64(const lldb_private::ArchSpec & target_arch)82*435933ddSDimitry Andric RegisterInfoPOSIX_arm64::RegisterInfoPOSIX_arm64(
83*435933ddSDimitry Andric     const lldb_private::ArchSpec &target_arch)
84*435933ddSDimitry Andric     : lldb_private::RegisterInfoInterface(target_arch),
85*435933ddSDimitry Andric       m_register_info_p(GetRegisterInfoPtr(target_arch)),
86*435933ddSDimitry Andric       m_register_info_count(GetRegisterInfoCount(target_arch)) {}
87*435933ddSDimitry Andric 
GetGPRSize() const88*435933ddSDimitry Andric size_t RegisterInfoPOSIX_arm64::GetGPRSize() const {
89*435933ddSDimitry Andric   return sizeof(struct RegisterInfoPOSIX_arm64::GPR);
90*435933ddSDimitry Andric }
91*435933ddSDimitry Andric 
92*435933ddSDimitry Andric const lldb_private::RegisterInfo *
GetRegisterInfo() const93*435933ddSDimitry Andric RegisterInfoPOSIX_arm64::GetRegisterInfo() const {
94*435933ddSDimitry Andric   return m_register_info_p;
95*435933ddSDimitry Andric }
96*435933ddSDimitry Andric 
GetRegisterCount() const97*435933ddSDimitry Andric uint32_t RegisterInfoPOSIX_arm64::GetRegisterCount() const {
98*435933ddSDimitry Andric   return m_register_info_count;
99*435933ddSDimitry Andric }
100