1 //===-- RegisterInfos_ppc64le.h ---------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #ifdef DECLARE_REGISTER_INFOS_PPC64LE_STRUCT
11 
12 // C Includes
13 #include <stddef.h>
14 
15 // Computes the offset of the given GPR in the user data area.
16 #define GPR_OFFSET(regname) (offsetof(GPR, regname))
17 #define GPR_SIZE(regname) (sizeof(((GPR *)NULL)->regname))
18 
19 #include "Utility/PPC64LE_DWARF_Registers.h"
20 #include "lldb-ppc64le-register-enums.h"
21 
22 // Note that the size and offset will be updated by platform-specific classes.
23 #define DEFINE_GPR(reg, alt, lldb_kind)                                        \
24   {                                                                            \
25     #reg, alt, GPR_SIZE(reg), GPR_OFFSET(reg), lldb::eEncodingUint,            \
26                                          lldb::eFormatHex,                     \
27                                          {ppc64le_dwarf::dwarf_##reg##_ppc64le,\
28                                           ppc64le_dwarf::dwarf_##reg##_ppc64le,\
29                                           lldb_kind,                           \
30                                           LLDB_INVALID_REGNUM,                 \
31                                           gpr_##reg##_ppc64le },               \
32                                           NULL, NULL, NULL, 0                  \
33   }
34 
35 // General purpose registers.
36 // EH_Frame, Generic, Process Plugin
37 #define POWERPC_REGS                                                           \
38   DEFINE_GPR(r0, NULL, LLDB_INVALID_REGNUM)                                    \
39   , DEFINE_GPR(r1, "sp", LLDB_REGNUM_GENERIC_SP),                              \
40       DEFINE_GPR(r2, NULL, LLDB_INVALID_REGNUM),                               \
41       DEFINE_GPR(r3, "arg1", LLDB_REGNUM_GENERIC_ARG1),                        \
42       DEFINE_GPR(r4, "arg2", LLDB_REGNUM_GENERIC_ARG2),                        \
43       DEFINE_GPR(r5, "arg3", LLDB_REGNUM_GENERIC_ARG3),                        \
44       DEFINE_GPR(r6, "arg4", LLDB_REGNUM_GENERIC_ARG4),                        \
45       DEFINE_GPR(r7, "arg5", LLDB_REGNUM_GENERIC_ARG5),                        \
46       DEFINE_GPR(r8, "arg6", LLDB_REGNUM_GENERIC_ARG6),                        \
47       DEFINE_GPR(r9, "arg7", LLDB_REGNUM_GENERIC_ARG7),                        \
48       DEFINE_GPR(r10, "arg8", LLDB_REGNUM_GENERIC_ARG8),                       \
49       DEFINE_GPR(r11, NULL, LLDB_INVALID_REGNUM),                              \
50       DEFINE_GPR(r12, NULL, LLDB_INVALID_REGNUM),                              \
51       DEFINE_GPR(r13, NULL, LLDB_INVALID_REGNUM),                              \
52       DEFINE_GPR(r14, NULL, LLDB_INVALID_REGNUM),                              \
53       DEFINE_GPR(r15, NULL, LLDB_INVALID_REGNUM),                              \
54       DEFINE_GPR(r16, NULL, LLDB_INVALID_REGNUM),                              \
55       DEFINE_GPR(r17, NULL, LLDB_INVALID_REGNUM),                              \
56       DEFINE_GPR(r18, NULL, LLDB_INVALID_REGNUM),                              \
57       DEFINE_GPR(r19, NULL, LLDB_INVALID_REGNUM),                              \
58       DEFINE_GPR(r20, NULL, LLDB_INVALID_REGNUM),                              \
59       DEFINE_GPR(r21, NULL, LLDB_INVALID_REGNUM),                              \
60       DEFINE_GPR(r22, NULL, LLDB_INVALID_REGNUM),                              \
61       DEFINE_GPR(r23, NULL, LLDB_INVALID_REGNUM),                              \
62       DEFINE_GPR(r24, NULL, LLDB_INVALID_REGNUM),                              \
63       DEFINE_GPR(r25, NULL, LLDB_INVALID_REGNUM),                              \
64       DEFINE_GPR(r26, NULL, LLDB_INVALID_REGNUM),                              \
65       DEFINE_GPR(r27, NULL, LLDB_INVALID_REGNUM),                              \
66       DEFINE_GPR(r28, NULL, LLDB_INVALID_REGNUM),                              \
67       DEFINE_GPR(r29, NULL, LLDB_INVALID_REGNUM),                              \
68       DEFINE_GPR(r30, NULL, LLDB_INVALID_REGNUM),                              \
69       DEFINE_GPR(r31, NULL, LLDB_INVALID_REGNUM),                              \
70       DEFINE_GPR(pc, "pc", LLDB_REGNUM_GENERIC_PC),                            \
71       DEFINE_GPR(lr, "lr", LLDB_REGNUM_GENERIC_RA),                            \
72       DEFINE_GPR(msr, "msr", LLDB_INVALID_REGNUM),                             \
73       DEFINE_GPR(origr3, "orig_r3", LLDB_INVALID_REGNUM),                      \
74       DEFINE_GPR(ctr, "ctr", LLDB_INVALID_REGNUM),                             \
75       DEFINE_GPR(xer, "xer", LLDB_INVALID_REGNUM),                             \
76       DEFINE_GPR(cr, "cr", LLDB_REGNUM_GENERIC_FLAGS),                         \
77       DEFINE_GPR(softe, "softe", LLDB_INVALID_REGNUM),                         \
78       DEFINE_GPR(trap, "trap", LLDB_INVALID_REGNUM),                           \
79       /* */
80 
81 typedef struct _GPR {
82   uint64_t r0;
83   uint64_t r1;
84   uint64_t r2;
85   uint64_t r3;
86   uint64_t r4;
87   uint64_t r5;
88   uint64_t r6;
89   uint64_t r7;
90   uint64_t r8;
91   uint64_t r9;
92   uint64_t r10;
93   uint64_t r11;
94   uint64_t r12;
95   uint64_t r13;
96   uint64_t r14;
97   uint64_t r15;
98   uint64_t r16;
99   uint64_t r17;
100   uint64_t r18;
101   uint64_t r19;
102   uint64_t r20;
103   uint64_t r21;
104   uint64_t r22;
105   uint64_t r23;
106   uint64_t r24;
107   uint64_t r25;
108   uint64_t r26;
109   uint64_t r27;
110   uint64_t r28;
111   uint64_t r29;
112   uint64_t r30;
113   uint64_t r31;
114   uint64_t pc;
115   uint64_t msr;
116   uint64_t origr3;
117   uint64_t ctr;
118   uint64_t lr;
119   uint64_t xer;
120   uint64_t cr;
121   uint64_t softe;
122   uint64_t trap;
123   uint64_t pad[4];
124 } GPR;
125 
126 static lldb_private::RegisterInfo g_register_infos_ppc64le[] = {
127     POWERPC_REGS
128 };
129 
130 static_assert((sizeof(g_register_infos_ppc64le) /
131                sizeof(g_register_infos_ppc64le[0])) ==
132                   k_num_registers_ppc64le,
133               "g_register_infos_powerpc64 has wrong number of register infos");
134 
135 #undef DEFINE_GPR
136 
137 #endif // DECLARE_REGISTER_INFOS_PPC64LE_STRUCT
138