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