xref: /llvm-project/lldb/source/Plugins/Process/gdb-remote/GDBRemoteRegisterFallback.cpp (revision 81beb15d7e54b16f4beba0bafd982d56c6b95222)
1e69a3d18SMichał Górny //===-- GDBRemoteRegisterFallback.cpp -------------------------------------===//
2e69a3d18SMichał Górny //
3e69a3d18SMichał Górny // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e69a3d18SMichał Górny // See https://llvm.org/LICENSE.txt for license information.
5e69a3d18SMichał Górny // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e69a3d18SMichał Górny //
7e69a3d18SMichał Górny //===----------------------------------------------------------------------===//
8e69a3d18SMichał Górny 
9e69a3d18SMichał Górny #include "GDBRemoteRegisterFallback.h"
10e69a3d18SMichał Górny 
11e69a3d18SMichał Górny namespace lldb_private {
12e69a3d18SMichał Górny namespace process_gdb_remote {
13e69a3d18SMichał Górny 
14e69a3d18SMichał Górny #define REG(name, size)                                                        \
15e69a3d18SMichał Górny   DynamicRegisterInfo::Register {                                              \
16e69a3d18SMichał Górny     ConstString(#name), empty_alt_name, reg_set, size, LLDB_INVALID_INDEX32,   \
17e69a3d18SMichał Górny         lldb::eEncodingUint, lldb::eFormatHex, LLDB_INVALID_REGNUM,            \
18e69a3d18SMichał Górny         LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, {}, {}  \
19e69a3d18SMichał Górny   }
20e69a3d18SMichał Górny #define R64(name) REG(name, 8)
21e69a3d18SMichał Górny #define R32(name) REG(name, 4)
22*81beb15dSIlya Kuklin #define R16(name) REG(name, 2)
23e69a3d18SMichał Górny 
GetRegisters_aarch64()24e69a3d18SMichał Górny static std::vector<DynamicRegisterInfo::Register> GetRegisters_aarch64() {
25e69a3d18SMichał Górny   ConstString empty_alt_name;
26e69a3d18SMichał Górny   ConstString reg_set{"general purpose registers"};
27e69a3d18SMichał Górny 
28e69a3d18SMichał Górny   std::vector<DynamicRegisterInfo::Register> registers{
29e69a3d18SMichał Górny       R64(x0),  R64(x1),  R64(x2),  R64(x3),  R64(x4),  R64(x5),   R64(x6),
30e69a3d18SMichał Górny       R64(x7),  R64(x8),  R64(x9),  R64(x10), R64(x11), R64(x12),  R64(x13),
31e69a3d18SMichał Górny       R64(x14), R64(x15), R64(x16), R64(x17), R64(x18), R64(x19),  R64(x20),
32e69a3d18SMichał Górny       R64(x21), R64(x22), R64(x23), R64(x24), R64(x25), R64(x26),  R64(x27),
33e69a3d18SMichał Górny       R64(x28), R64(x29), R64(x30), R64(sp),  R64(pc),  R32(cpsr),
34e69a3d18SMichał Górny   };
35e69a3d18SMichał Górny 
36e69a3d18SMichał Górny   return registers;
37e69a3d18SMichał Górny }
38e69a3d18SMichał Górny 
GetRegisters_msp430()39*81beb15dSIlya Kuklin static std::vector<DynamicRegisterInfo::Register> GetRegisters_msp430() {
40*81beb15dSIlya Kuklin   ConstString empty_alt_name;
41*81beb15dSIlya Kuklin   ConstString reg_set{"general purpose registers"};
42*81beb15dSIlya Kuklin 
43*81beb15dSIlya Kuklin   std::vector<DynamicRegisterInfo::Register> registers{
44*81beb15dSIlya Kuklin       R16(pc),  R16(sp),  R16(r2),  R16(r3), R16(fp),  R16(r5),
45*81beb15dSIlya Kuklin       R16(r6),  R16(r7),  R16(r8),  R16(r9), R16(r10), R16(r11),
46*81beb15dSIlya Kuklin       R16(r12), R16(r13), R16(r14), R16(r15)};
47*81beb15dSIlya Kuklin 
48*81beb15dSIlya Kuklin   return registers;
49*81beb15dSIlya Kuklin }
50*81beb15dSIlya Kuklin 
GetRegisters_x86()51e69a3d18SMichał Górny static std::vector<DynamicRegisterInfo::Register> GetRegisters_x86() {
52e69a3d18SMichał Górny   ConstString empty_alt_name;
53e69a3d18SMichał Górny   ConstString reg_set{"general purpose registers"};
54e69a3d18SMichał Górny 
55e69a3d18SMichał Górny   std::vector<DynamicRegisterInfo::Register> registers{
56e69a3d18SMichał Górny       R32(eax), R32(ecx), R32(edx), R32(ebx),    R32(esp), R32(ebp),
57e69a3d18SMichał Górny       R32(esi), R32(edi), R32(eip), R32(eflags), R32(cs),  R32(ss),
58e69a3d18SMichał Górny       R32(ds),  R32(es),  R32(fs),  R32(gs),
59e69a3d18SMichał Górny   };
60e69a3d18SMichał Górny 
61e69a3d18SMichał Górny   return registers;
62e69a3d18SMichał Górny }
63e69a3d18SMichał Górny 
GetRegisters_x86_64()64e69a3d18SMichał Górny static std::vector<DynamicRegisterInfo::Register> GetRegisters_x86_64() {
65e69a3d18SMichał Górny   ConstString empty_alt_name;
66e69a3d18SMichał Górny   ConstString reg_set{"general purpose registers"};
67e69a3d18SMichał Górny 
68e69a3d18SMichał Górny   std::vector<DynamicRegisterInfo::Register> registers{
69e69a3d18SMichał Górny       R64(rax), R64(rbx), R64(rcx), R64(rdx), R64(rsi), R64(rdi),
70e69a3d18SMichał Górny       R64(rbp), R64(rsp), R64(r8),  R64(r9),  R64(r10), R64(r11),
71e69a3d18SMichał Górny       R64(r12), R64(r13), R64(r14), R64(r15), R64(rip), R32(eflags),
72e69a3d18SMichał Górny       R32(cs),  R32(ss),  R32(ds),  R32(es),  R32(fs),  R32(gs),
73e69a3d18SMichał Górny   };
74e69a3d18SMichał Górny 
75e69a3d18SMichał Górny   return registers;
76e69a3d18SMichał Górny }
77e69a3d18SMichał Górny 
78e69a3d18SMichał Górny #undef R32
79e69a3d18SMichał Górny #undef R64
80e69a3d18SMichał Górny #undef REG
81e69a3d18SMichał Górny 
82e69a3d18SMichał Górny std::vector<DynamicRegisterInfo::Register>
GetFallbackRegisters(const ArchSpec & arch_to_use)83e69a3d18SMichał Górny GetFallbackRegisters(const ArchSpec &arch_to_use) {
84e69a3d18SMichał Górny   switch (arch_to_use.GetMachine()) {
85e69a3d18SMichał Górny   case llvm::Triple::aarch64:
86e69a3d18SMichał Górny     return GetRegisters_aarch64();
87*81beb15dSIlya Kuklin   case llvm::Triple::msp430:
88*81beb15dSIlya Kuklin     return GetRegisters_msp430();
89e69a3d18SMichał Górny   case llvm::Triple::x86:
90e69a3d18SMichał Górny     return GetRegisters_x86();
91e69a3d18SMichał Górny   case llvm::Triple::x86_64:
92e69a3d18SMichał Górny     return GetRegisters_x86_64();
93e69a3d18SMichał Górny   default:
94e69a3d18SMichał Górny     break;
95e69a3d18SMichał Górny   }
96e69a3d18SMichał Górny 
97e69a3d18SMichał Górny   return {};
98e69a3d18SMichał Górny }
99e69a3d18SMichał Górny 
100e69a3d18SMichał Górny } // namespace process_gdb_remote
101e69a3d18SMichał Górny } // namespace lldb_private
102