RegisterInfos_ppc64.h revision 341825
1//===-- RegisterInfos_ppc64.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_PPC64_STRUCT
11
12// C Includes
13#include <stddef.h>
14
15// Computes the offset of the given GPR_PPC64 in the user data area.
16#define GPR_PPC64_OFFSET(regname) (offsetof(GPR_PPC64, regname))
17#define FPR_PPC64_OFFSET(regname) (offsetof(FPR_PPC64, regname)                \
18                                   + sizeof(GPR_PPC64))
19#define VMX_PPC64_OFFSET(regname) (offsetof(VMX_PPC64, regname)                \
20                                   + sizeof(GPR_PPC64) + sizeof(FPR_PPC64))
21#define GPR_PPC64_SIZE(regname) (sizeof(((GPR_PPC64 *)NULL)->regname))
22
23#include "Utility/PPC64_DWARF_Registers.h"
24#include "lldb-ppc64-register-enums.h"
25
26// Note that the size and offset will be updated by platform-specific classes.
27#define DEFINE_GPR_PPC64(reg, alt, lldb_kind)                                  \
28  {                                                                            \
29    #reg, alt, GPR_PPC64_SIZE(reg), GPR_PPC64_OFFSET(reg), lldb::eEncodingUint,\
30                                         lldb::eFormatHex,                     \
31                                         {ppc64_dwarf::dwarf_##reg##_ppc64,    \
32                                          ppc64_dwarf::dwarf_##reg##_ppc64,    \
33                                          lldb_kind,                           \
34                                          LLDB_INVALID_REGNUM,                 \
35                                          gpr_##reg##_ppc64 },                 \
36                                          NULL, NULL, NULL, 0                  \
37  }
38#define DEFINE_FPR_PPC64(reg, alt, lldb_kind)                                  \
39  {                                                                            \
40#reg, alt, 8, FPR_PPC64_OFFSET(reg), lldb::eEncodingIEEE754,                   \
41        lldb::eFormatFloat,                                                    \
42        {ppc64_dwarf::dwarf_##reg##_ppc64,                                     \
43         ppc64_dwarf::dwarf_##reg##_ppc64, lldb_kind, LLDB_INVALID_REGNUM,     \
44         fpr_##reg##_ppc64 },                                                  \
45         NULL, NULL, NULL, 0                                                   \
46  }
47#define DEFINE_VMX_PPC64(reg, lldb_kind)                                       \
48  {                                                                            \
49#reg, NULL, 16, VMX_PPC64_OFFSET(reg), lldb::eEncodingVector,                  \
50        lldb::eFormatVectorOfUInt32,                                           \
51        {ppc64_dwarf::dwarf_##reg##_ppc64,                                     \
52         ppc64_dwarf::dwarf_##reg##_ppc64, lldb_kind, LLDB_INVALID_REGNUM,     \
53         vmx_##reg##_ppc64 },                                                  \
54         NULL, NULL, NULL, 0                                                   \
55  }
56
57// General purpose registers.
58// EH_Frame, Generic, Process Plugin
59#define PPC64_REGS                                                             \
60  DEFINE_GPR_PPC64(r0, NULL, LLDB_INVALID_REGNUM)                              \
61  , DEFINE_GPR_PPC64(r1, "sp", LLDB_REGNUM_GENERIC_SP),                        \
62      DEFINE_GPR_PPC64(r2, NULL, LLDB_INVALID_REGNUM),                         \
63      DEFINE_GPR_PPC64(r3, "arg1", LLDB_REGNUM_GENERIC_ARG1),                  \
64      DEFINE_GPR_PPC64(r4, "arg2", LLDB_REGNUM_GENERIC_ARG2),                  \
65      DEFINE_GPR_PPC64(r5, "arg3", LLDB_REGNUM_GENERIC_ARG3),                  \
66      DEFINE_GPR_PPC64(r6, "arg4", LLDB_REGNUM_GENERIC_ARG4),                  \
67      DEFINE_GPR_PPC64(r7, "arg5", LLDB_REGNUM_GENERIC_ARG5),                  \
68      DEFINE_GPR_PPC64(r8, "arg6", LLDB_REGNUM_GENERIC_ARG6),                  \
69      DEFINE_GPR_PPC64(r9, "arg7", LLDB_REGNUM_GENERIC_ARG7),                  \
70      DEFINE_GPR_PPC64(r10, "arg8", LLDB_REGNUM_GENERIC_ARG8),                 \
71      DEFINE_GPR_PPC64(r11, NULL, LLDB_INVALID_REGNUM),                        \
72      DEFINE_GPR_PPC64(r12, NULL, LLDB_INVALID_REGNUM),                        \
73      DEFINE_GPR_PPC64(r13, NULL, LLDB_INVALID_REGNUM),                        \
74      DEFINE_GPR_PPC64(r14, NULL, LLDB_INVALID_REGNUM),                        \
75      DEFINE_GPR_PPC64(r15, NULL, LLDB_INVALID_REGNUM),                        \
76      DEFINE_GPR_PPC64(r16, NULL, LLDB_INVALID_REGNUM),                        \
77      DEFINE_GPR_PPC64(r17, NULL, LLDB_INVALID_REGNUM),                        \
78      DEFINE_GPR_PPC64(r18, NULL, LLDB_INVALID_REGNUM),                        \
79      DEFINE_GPR_PPC64(r19, NULL, LLDB_INVALID_REGNUM),                        \
80      DEFINE_GPR_PPC64(r20, NULL, LLDB_INVALID_REGNUM),                        \
81      DEFINE_GPR_PPC64(r21, NULL, LLDB_INVALID_REGNUM),                        \
82      DEFINE_GPR_PPC64(r22, NULL, LLDB_INVALID_REGNUM),                        \
83      DEFINE_GPR_PPC64(r23, NULL, LLDB_INVALID_REGNUM),                        \
84      DEFINE_GPR_PPC64(r24, NULL, LLDB_INVALID_REGNUM),                        \
85      DEFINE_GPR_PPC64(r25, NULL, LLDB_INVALID_REGNUM),                        \
86      DEFINE_GPR_PPC64(r26, NULL, LLDB_INVALID_REGNUM),                        \
87      DEFINE_GPR_PPC64(r27, NULL, LLDB_INVALID_REGNUM),                        \
88      DEFINE_GPR_PPC64(r28, NULL, LLDB_INVALID_REGNUM),                        \
89      DEFINE_GPR_PPC64(r29, NULL, LLDB_INVALID_REGNUM),                        \
90      DEFINE_GPR_PPC64(r30, NULL, LLDB_INVALID_REGNUM),                        \
91      DEFINE_GPR_PPC64(r31, NULL, LLDB_INVALID_REGNUM),                        \
92      DEFINE_GPR_PPC64(cr, "cr", LLDB_REGNUM_GENERIC_FLAGS),                   \
93      DEFINE_GPR_PPC64(msr, "msr", LLDB_INVALID_REGNUM),                       \
94      DEFINE_GPR_PPC64(xer, "xer", LLDB_INVALID_REGNUM),                       \
95      DEFINE_GPR_PPC64(lr, "lr", LLDB_REGNUM_GENERIC_RA),                      \
96      DEFINE_GPR_PPC64(ctr, "ctr", LLDB_INVALID_REGNUM),                       \
97      DEFINE_GPR_PPC64(pc, "pc", LLDB_REGNUM_GENERIC_PC),                      \
98      DEFINE_FPR_PPC64(f0, NULL, LLDB_INVALID_REGNUM),                         \
99      DEFINE_FPR_PPC64(f1, NULL, LLDB_INVALID_REGNUM),                         \
100      DEFINE_FPR_PPC64(f2, NULL, LLDB_INVALID_REGNUM),                         \
101      DEFINE_FPR_PPC64(f3, NULL, LLDB_INVALID_REGNUM),                         \
102      DEFINE_FPR_PPC64(f4, NULL, LLDB_INVALID_REGNUM),                         \
103      DEFINE_FPR_PPC64(f5, NULL, LLDB_INVALID_REGNUM),                         \
104      DEFINE_FPR_PPC64(f6, NULL, LLDB_INVALID_REGNUM),                         \
105      DEFINE_FPR_PPC64(f7, NULL, LLDB_INVALID_REGNUM),                         \
106      DEFINE_FPR_PPC64(f8, NULL, LLDB_INVALID_REGNUM),                         \
107      DEFINE_FPR_PPC64(f9, NULL, LLDB_INVALID_REGNUM),                         \
108      DEFINE_FPR_PPC64(f10, NULL, LLDB_INVALID_REGNUM),                        \
109      DEFINE_FPR_PPC64(f11, NULL, LLDB_INVALID_REGNUM),                        \
110      DEFINE_FPR_PPC64(f12, NULL, LLDB_INVALID_REGNUM),                        \
111      DEFINE_FPR_PPC64(f13, NULL, LLDB_INVALID_REGNUM),                        \
112      DEFINE_FPR_PPC64(f14, NULL, LLDB_INVALID_REGNUM),                        \
113      DEFINE_FPR_PPC64(f15, NULL, LLDB_INVALID_REGNUM),                        \
114      DEFINE_FPR_PPC64(f16, NULL, LLDB_INVALID_REGNUM),                        \
115      DEFINE_FPR_PPC64(f17, NULL, LLDB_INVALID_REGNUM),                        \
116      DEFINE_FPR_PPC64(f18, NULL, LLDB_INVALID_REGNUM),                        \
117      DEFINE_FPR_PPC64(f19, NULL, LLDB_INVALID_REGNUM),                        \
118      DEFINE_FPR_PPC64(f20, NULL, LLDB_INVALID_REGNUM),                        \
119      DEFINE_FPR_PPC64(f21, NULL, LLDB_INVALID_REGNUM),                        \
120      DEFINE_FPR_PPC64(f22, NULL, LLDB_INVALID_REGNUM),                        \
121      DEFINE_FPR_PPC64(f23, NULL, LLDB_INVALID_REGNUM),                        \
122      DEFINE_FPR_PPC64(f24, NULL, LLDB_INVALID_REGNUM),                        \
123      DEFINE_FPR_PPC64(f25, NULL, LLDB_INVALID_REGNUM),                        \
124      DEFINE_FPR_PPC64(f26, NULL, LLDB_INVALID_REGNUM),                        \
125      DEFINE_FPR_PPC64(f27, NULL, LLDB_INVALID_REGNUM),                        \
126      DEFINE_FPR_PPC64(f28, NULL, LLDB_INVALID_REGNUM),                        \
127      DEFINE_FPR_PPC64(f29, NULL, LLDB_INVALID_REGNUM),                        \
128      DEFINE_FPR_PPC64(f30, NULL, LLDB_INVALID_REGNUM),                        \
129      DEFINE_FPR_PPC64(f31, NULL, LLDB_INVALID_REGNUM),                        \
130      {"fpscr",                                                                \
131       NULL,                                                                   \
132       8,                                                                      \
133       FPR_PPC64_OFFSET(fpscr),                                                \
134       lldb::eEncodingUint,                                                    \
135       lldb::eFormatHex,                                                       \
136       {ppc64_dwarf::dwarf_fpscr_ppc64,                                        \
137        ppc64_dwarf::dwarf_fpscr_ppc64, LLDB_INVALID_REGNUM,                   \
138        LLDB_INVALID_REGNUM, fpr_fpscr_ppc64},                                 \
139       NULL,                                                                   \
140       NULL,                                                                   \
141       NULL,                                                                   \
142       0},                                                                     \
143      DEFINE_VMX_PPC64(vr0, LLDB_INVALID_REGNUM),                              \
144      DEFINE_VMX_PPC64(vr1, LLDB_INVALID_REGNUM),                              \
145      DEFINE_VMX_PPC64(vr2, LLDB_INVALID_REGNUM),                              \
146      DEFINE_VMX_PPC64(vr3, LLDB_INVALID_REGNUM),                              \
147      DEFINE_VMX_PPC64(vr4, LLDB_INVALID_REGNUM),                              \
148      DEFINE_VMX_PPC64(vr5, LLDB_INVALID_REGNUM),                              \
149      DEFINE_VMX_PPC64(vr6, LLDB_INVALID_REGNUM),                              \
150      DEFINE_VMX_PPC64(vr7, LLDB_INVALID_REGNUM),                              \
151      DEFINE_VMX_PPC64(vr8, LLDB_INVALID_REGNUM),                              \
152      DEFINE_VMX_PPC64(vr9, LLDB_INVALID_REGNUM),                              \
153      DEFINE_VMX_PPC64(vr10, LLDB_INVALID_REGNUM),                             \
154      DEFINE_VMX_PPC64(vr11, LLDB_INVALID_REGNUM),                             \
155      DEFINE_VMX_PPC64(vr12, LLDB_INVALID_REGNUM),                             \
156      DEFINE_VMX_PPC64(vr13, LLDB_INVALID_REGNUM),                             \
157      DEFINE_VMX_PPC64(vr14, LLDB_INVALID_REGNUM),                             \
158      DEFINE_VMX_PPC64(vr15, LLDB_INVALID_REGNUM),                             \
159      DEFINE_VMX_PPC64(vr16, LLDB_INVALID_REGNUM),                             \
160      DEFINE_VMX_PPC64(vr17, LLDB_INVALID_REGNUM),                             \
161      DEFINE_VMX_PPC64(vr18, LLDB_INVALID_REGNUM),                             \
162      DEFINE_VMX_PPC64(vr19, LLDB_INVALID_REGNUM),                             \
163      DEFINE_VMX_PPC64(vr20, LLDB_INVALID_REGNUM),                             \
164      DEFINE_VMX_PPC64(vr21, LLDB_INVALID_REGNUM),                             \
165      DEFINE_VMX_PPC64(vr22, LLDB_INVALID_REGNUM),                             \
166      DEFINE_VMX_PPC64(vr23, LLDB_INVALID_REGNUM),                             \
167      DEFINE_VMX_PPC64(vr24, LLDB_INVALID_REGNUM),                             \
168      DEFINE_VMX_PPC64(vr25, LLDB_INVALID_REGNUM),                             \
169      DEFINE_VMX_PPC64(vr26, LLDB_INVALID_REGNUM),                             \
170      DEFINE_VMX_PPC64(vr27, LLDB_INVALID_REGNUM),                             \
171      DEFINE_VMX_PPC64(vr28, LLDB_INVALID_REGNUM),                             \
172      DEFINE_VMX_PPC64(vr29, LLDB_INVALID_REGNUM),                             \
173      DEFINE_VMX_PPC64(vr30, LLDB_INVALID_REGNUM),                             \
174      DEFINE_VMX_PPC64(vr31, LLDB_INVALID_REGNUM),                             \
175      {"vscr",                                                                 \
176       NULL,                                                                   \
177       4,                                                                      \
178       VMX_PPC64_OFFSET(vscr),                                                 \
179       lldb::eEncodingUint,                                                    \
180       lldb::eFormatHex,                                                       \
181       {ppc64_dwarf::dwarf_vscr_ppc64, ppc64_dwarf::dwarf_vscr_ppc64,          \
182        LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, vmx_vscr_ppc64},             \
183       NULL,                                                                   \
184       NULL,                                                                   \
185       NULL,                                                                   \
186       0},                                                                     \
187      {"vrsave",                                                               \
188       NULL,                                                                   \
189       4,                                                                      \
190       VMX_PPC64_OFFSET(vrsave),                                               \
191       lldb::eEncodingUint,                                                    \
192       lldb::eFormatHex,                                                       \
193       {ppc64_dwarf::dwarf_vrsave_ppc64,                                       \
194        ppc64_dwarf::dwarf_vrsave_ppc64, LLDB_INVALID_REGNUM,                  \
195        LLDB_INVALID_REGNUM, vmx_vrsave_ppc64},                                \
196       NULL,                                                                   \
197       NULL,                                                                   \
198       NULL,                                                                   \
199       0},  /* */
200
201typedef struct _GPR_PPC64 {
202  uint64_t r0;
203  uint64_t r1;
204  uint64_t r2;
205  uint64_t r3;
206  uint64_t r4;
207  uint64_t r5;
208  uint64_t r6;
209  uint64_t r7;
210  uint64_t r8;
211  uint64_t r9;
212  uint64_t r10;
213  uint64_t r11;
214  uint64_t r12;
215  uint64_t r13;
216  uint64_t r14;
217  uint64_t r15;
218  uint64_t r16;
219  uint64_t r17;
220  uint64_t r18;
221  uint64_t r19;
222  uint64_t r20;
223  uint64_t r21;
224  uint64_t r22;
225  uint64_t r23;
226  uint64_t r24;
227  uint64_t r25;
228  uint64_t r26;
229  uint64_t r27;
230  uint64_t r28;
231  uint64_t r29;
232  uint64_t r30;
233  uint64_t r31;
234  uint64_t cr;
235  uint64_t msr;
236  uint64_t xer;
237  uint64_t lr;
238  uint64_t ctr;
239  uint64_t pc;
240  uint64_t pad[3];
241} GPR_PPC64;
242
243typedef struct _FPR_PPC64 {
244  uint64_t f0;
245  uint64_t f1;
246  uint64_t f2;
247  uint64_t f3;
248  uint64_t f4;
249  uint64_t f5;
250  uint64_t f6;
251  uint64_t f7;
252  uint64_t f8;
253  uint64_t f9;
254  uint64_t f10;
255  uint64_t f11;
256  uint64_t f12;
257  uint64_t f13;
258  uint64_t f14;
259  uint64_t f15;
260  uint64_t f16;
261  uint64_t f17;
262  uint64_t f18;
263  uint64_t f19;
264  uint64_t f20;
265  uint64_t f21;
266  uint64_t f22;
267  uint64_t f23;
268  uint64_t f24;
269  uint64_t f25;
270  uint64_t f26;
271  uint64_t f27;
272  uint64_t f28;
273  uint64_t f29;
274  uint64_t f30;
275  uint64_t f31;
276  uint64_t fpscr;
277} FPR_PPC64;
278
279typedef struct _VMX_PPC64 {
280  uint32_t vr0[4];
281  uint32_t vr1[4];
282  uint32_t vr2[4];
283  uint32_t vr3[4];
284  uint32_t vr4[4];
285  uint32_t vr5[4];
286  uint32_t vr6[4];
287  uint32_t vr7[4];
288  uint32_t vr8[4];
289  uint32_t vr9[4];
290  uint32_t vr10[4];
291  uint32_t vr11[4];
292  uint32_t vr12[4];
293  uint32_t vr13[4];
294  uint32_t vr14[4];
295  uint32_t vr15[4];
296  uint32_t vr16[4];
297  uint32_t vr17[4];
298  uint32_t vr18[4];
299  uint32_t vr19[4];
300  uint32_t vr20[4];
301  uint32_t vr21[4];
302  uint32_t vr22[4];
303  uint32_t vr23[4];
304  uint32_t vr24[4];
305  uint32_t vr25[4];
306  uint32_t vr26[4];
307  uint32_t vr27[4];
308  uint32_t vr28[4];
309  uint32_t vr29[4];
310  uint32_t vr30[4];
311  uint32_t vr31[4];
312  uint32_t pad[2];
313  uint32_t vscr[2];
314  uint32_t vrsave;
315} VMX_PPC64;
316
317
318static lldb_private::RegisterInfo g_register_infos_ppc64[] = {
319    PPC64_REGS
320};
321
322static_assert((sizeof(g_register_infos_ppc64) /
323               sizeof(g_register_infos_ppc64[0])) ==
324                  k_num_registers_ppc64,
325              "g_register_infos_powerpc64 has wrong number of register infos");
326
327#undef DEFINE_FPR_PPC64
328#undef DEFINE_GPR_PPC64
329#undef DEFINE_VMX_PPC64
330
331#endif // DECLARE_REGISTER_INFOS_PPC64_STRUCT
332