1dda28197Spatrick //===-- RegisterContextMinidump_ARM.cpp -----------------------------------===//
2061da546Spatrick //
3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6061da546Spatrick //
7061da546Spatrick //===----------------------------------------------------------------------===//
8061da546Spatrick 
9061da546Spatrick #include "RegisterContextMinidump_ARM.h"
10061da546Spatrick 
11061da546Spatrick #include "Utility/ARM_DWARF_Registers.h"
12061da546Spatrick #include "Utility/ARM_ehframe_Registers.h"
13061da546Spatrick #include "lldb/Utility/RegisterValue.h"
14061da546Spatrick #include "lldb/Utility/DataExtractor.h"
15061da546Spatrick #include "lldb/Utility/LLDBAssert.h"
16061da546Spatrick #include "lldb/lldb-enumerations.h"
17061da546Spatrick 
18061da546Spatrick // C includes
19be691f3bSpatrick #include <cassert>
20061da546Spatrick 
21061da546Spatrick // C++ includes
22061da546Spatrick 
23061da546Spatrick using namespace lldb;
24061da546Spatrick using namespace lldb_private;
25061da546Spatrick using namespace minidump;
26061da546Spatrick 
27061da546Spatrick #define INV LLDB_INVALID_REGNUM
28061da546Spatrick #define OFFSET(r) (offsetof(RegisterContextMinidump_ARM::Context, r))
29061da546Spatrick 
30061da546Spatrick #define DEF_R(i)                                                               \
31061da546Spatrick   {                                                                            \
32061da546Spatrick     "r" #i, nullptr, 4, OFFSET(r) + i * 4, eEncodingUint, eFormatHex,          \
33*f6aab3d8Srobert         {ehframe_r##i, dwarf_r##i, INV, INV, reg_r##i}, nullptr, nullptr,      \
34061da546Spatrick   }
35061da546Spatrick 
36061da546Spatrick #define DEF_R_ARG(i, n)                                                        \
37061da546Spatrick   {                                                                            \
38061da546Spatrick     "r" #i, "arg" #n, 4, OFFSET(r) + i * 4, eEncodingUint, eFormatHex,         \
39*f6aab3d8Srobert         {ehframe_r##i, dwarf_r##i, LLDB_REGNUM_GENERIC_ARG1 + i, INV,          \
40*f6aab3d8Srobert          reg_r##i},                                                            \
41*f6aab3d8Srobert         nullptr, nullptr,                                                      \
42061da546Spatrick   }
43061da546Spatrick 
44061da546Spatrick #define DEF_D(i)                                                               \
45061da546Spatrick   {                                                                            \
46061da546Spatrick     "d" #i, nullptr, 8, OFFSET(d) + i * 8, eEncodingVector,                    \
47061da546Spatrick         eFormatVectorOfUInt8, {dwarf_d##i, dwarf_d##i, INV, INV, reg_d##i},    \
48*f6aab3d8Srobert         nullptr, nullptr,                                                      \
49061da546Spatrick   }
50061da546Spatrick 
51061da546Spatrick #define DEF_S(i)                                                               \
52061da546Spatrick   {                                                                            \
53061da546Spatrick     "s" #i, nullptr, 4, OFFSET(s) + i * 4, eEncodingIEEE754, eFormatFloat,     \
54*f6aab3d8Srobert         {dwarf_s##i, dwarf_s##i, INV, INV, reg_s##i}, nullptr, nullptr,        \
55061da546Spatrick   }
56061da546Spatrick 
57061da546Spatrick #define DEF_Q(i)                                                               \
58061da546Spatrick   {                                                                            \
59061da546Spatrick     "q" #i, nullptr, 16, OFFSET(q) + i * 16, eEncodingVector,                  \
60061da546Spatrick         eFormatVectorOfUInt8, {dwarf_q##i, dwarf_q##i, INV, INV, reg_q##i},    \
61*f6aab3d8Srobert         nullptr, nullptr,                                                      \
62061da546Spatrick   }
63061da546Spatrick 
64061da546Spatrick // Zero based LLDB register numbers for this register context
65061da546Spatrick enum {
66061da546Spatrick   // General Purpose Registers
67061da546Spatrick   reg_r0,
68061da546Spatrick   reg_r1,
69061da546Spatrick   reg_r2,
70061da546Spatrick   reg_r3,
71061da546Spatrick   reg_r4,
72061da546Spatrick   reg_r5,
73061da546Spatrick   reg_r6,
74061da546Spatrick   reg_r7,
75061da546Spatrick   reg_r8,
76061da546Spatrick   reg_r9,
77061da546Spatrick   reg_r10,
78061da546Spatrick   reg_r11,
79061da546Spatrick   reg_r12,
80061da546Spatrick   reg_sp,
81061da546Spatrick   reg_lr,
82061da546Spatrick   reg_pc,
83061da546Spatrick   reg_cpsr,
84061da546Spatrick   // Floating Point Registers
85061da546Spatrick   reg_fpscr,
86061da546Spatrick   reg_d0,
87061da546Spatrick   reg_d1,
88061da546Spatrick   reg_d2,
89061da546Spatrick   reg_d3,
90061da546Spatrick   reg_d4,
91061da546Spatrick   reg_d5,
92061da546Spatrick   reg_d6,
93061da546Spatrick   reg_d7,
94061da546Spatrick   reg_d8,
95061da546Spatrick   reg_d9,
96061da546Spatrick   reg_d10,
97061da546Spatrick   reg_d11,
98061da546Spatrick   reg_d12,
99061da546Spatrick   reg_d13,
100061da546Spatrick   reg_d14,
101061da546Spatrick   reg_d15,
102061da546Spatrick   reg_d16,
103061da546Spatrick   reg_d17,
104061da546Spatrick   reg_d18,
105061da546Spatrick   reg_d19,
106061da546Spatrick   reg_d20,
107061da546Spatrick   reg_d21,
108061da546Spatrick   reg_d22,
109061da546Spatrick   reg_d23,
110061da546Spatrick   reg_d24,
111061da546Spatrick   reg_d25,
112061da546Spatrick   reg_d26,
113061da546Spatrick   reg_d27,
114061da546Spatrick   reg_d28,
115061da546Spatrick   reg_d29,
116061da546Spatrick   reg_d30,
117061da546Spatrick   reg_d31,
118061da546Spatrick   reg_s0,
119061da546Spatrick   reg_s1,
120061da546Spatrick   reg_s2,
121061da546Spatrick   reg_s3,
122061da546Spatrick   reg_s4,
123061da546Spatrick   reg_s5,
124061da546Spatrick   reg_s6,
125061da546Spatrick   reg_s7,
126061da546Spatrick   reg_s8,
127061da546Spatrick   reg_s9,
128061da546Spatrick   reg_s10,
129061da546Spatrick   reg_s11,
130061da546Spatrick   reg_s12,
131061da546Spatrick   reg_s13,
132061da546Spatrick   reg_s14,
133061da546Spatrick   reg_s15,
134061da546Spatrick   reg_s16,
135061da546Spatrick   reg_s17,
136061da546Spatrick   reg_s18,
137061da546Spatrick   reg_s19,
138061da546Spatrick   reg_s20,
139061da546Spatrick   reg_s21,
140061da546Spatrick   reg_s22,
141061da546Spatrick   reg_s23,
142061da546Spatrick   reg_s24,
143061da546Spatrick   reg_s25,
144061da546Spatrick   reg_s26,
145061da546Spatrick   reg_s27,
146061da546Spatrick   reg_s28,
147061da546Spatrick   reg_s29,
148061da546Spatrick   reg_s30,
149061da546Spatrick   reg_s31,
150061da546Spatrick   reg_q0,
151061da546Spatrick   reg_q1,
152061da546Spatrick   reg_q2,
153061da546Spatrick   reg_q3,
154061da546Spatrick   reg_q4,
155061da546Spatrick   reg_q5,
156061da546Spatrick   reg_q6,
157061da546Spatrick   reg_q7,
158061da546Spatrick   reg_q8,
159061da546Spatrick   reg_q9,
160061da546Spatrick   reg_q10,
161061da546Spatrick   reg_q11,
162061da546Spatrick   reg_q12,
163061da546Spatrick   reg_q13,
164061da546Spatrick   reg_q14,
165061da546Spatrick   reg_q15,
166061da546Spatrick   k_num_regs
167061da546Spatrick };
168061da546Spatrick 
169061da546Spatrick static RegisterInfo g_reg_info_apple_fp = {
170061da546Spatrick     "fp",
171061da546Spatrick     "r7",
172061da546Spatrick     4,
173061da546Spatrick     OFFSET(r) + 7 * 4,
174061da546Spatrick     eEncodingUint,
175061da546Spatrick     eFormatHex,
176061da546Spatrick     {ehframe_r7, dwarf_r7, LLDB_REGNUM_GENERIC_FP, INV, reg_r7},
177061da546Spatrick     nullptr,
178061da546Spatrick     nullptr,
179*f6aab3d8Srobert };
180061da546Spatrick 
181061da546Spatrick static RegisterInfo g_reg_info_fp = {
182061da546Spatrick     "fp",
183061da546Spatrick     "r11",
184061da546Spatrick     4,
185061da546Spatrick     OFFSET(r) + 11 * 4,
186061da546Spatrick     eEncodingUint,
187061da546Spatrick     eFormatHex,
188061da546Spatrick     {ehframe_r11, dwarf_r11, LLDB_REGNUM_GENERIC_FP, INV, reg_r11},
189061da546Spatrick     nullptr,
190061da546Spatrick     nullptr,
191*f6aab3d8Srobert };
192061da546Spatrick 
193061da546Spatrick // Register info definitions for this register context
194061da546Spatrick static RegisterInfo g_reg_infos[] = {
195061da546Spatrick     DEF_R_ARG(0, 1),
196061da546Spatrick     DEF_R_ARG(1, 2),
197061da546Spatrick     DEF_R_ARG(2, 3),
198061da546Spatrick     DEF_R_ARG(3, 4),
199061da546Spatrick     DEF_R(4),
200061da546Spatrick     DEF_R(5),
201061da546Spatrick     DEF_R(6),
202061da546Spatrick     DEF_R(7),
203061da546Spatrick     DEF_R(8),
204061da546Spatrick     DEF_R(9),
205061da546Spatrick     DEF_R(10),
206061da546Spatrick     DEF_R(11),
207061da546Spatrick     DEF_R(12),
208061da546Spatrick     {"sp",
209061da546Spatrick      "r13",
210061da546Spatrick      4,
211061da546Spatrick      OFFSET(r) + 13 * 4,
212061da546Spatrick      eEncodingUint,
213061da546Spatrick      eFormatHex,
214061da546Spatrick      {ehframe_sp, dwarf_sp, LLDB_REGNUM_GENERIC_SP, INV, reg_sp},
215061da546Spatrick      nullptr,
216061da546Spatrick      nullptr,
217*f6aab3d8Srobert     },
218061da546Spatrick     {"lr",
219061da546Spatrick      "r14",
220061da546Spatrick      4,
221061da546Spatrick      OFFSET(r) + 14 * 4,
222061da546Spatrick      eEncodingUint,
223061da546Spatrick      eFormatHex,
224061da546Spatrick      {ehframe_lr, dwarf_lr, LLDB_REGNUM_GENERIC_RA, INV, reg_lr},
225061da546Spatrick      nullptr,
226061da546Spatrick      nullptr,
227*f6aab3d8Srobert     },
228061da546Spatrick     {"pc",
229061da546Spatrick      "r15",
230061da546Spatrick      4,
231061da546Spatrick      OFFSET(r) + 15 * 4,
232061da546Spatrick      eEncodingUint,
233061da546Spatrick      eFormatHex,
234061da546Spatrick      {ehframe_pc, dwarf_pc, LLDB_REGNUM_GENERIC_PC, INV, reg_pc},
235061da546Spatrick      nullptr,
236061da546Spatrick      nullptr,
237*f6aab3d8Srobert     },
238061da546Spatrick     {"cpsr",
239061da546Spatrick      "psr",
240061da546Spatrick      4,
241061da546Spatrick      OFFSET(cpsr),
242061da546Spatrick      eEncodingUint,
243061da546Spatrick      eFormatHex,
244061da546Spatrick      {ehframe_cpsr, dwarf_cpsr, LLDB_REGNUM_GENERIC_FLAGS, INV, reg_cpsr},
245061da546Spatrick      nullptr,
246061da546Spatrick      nullptr,
247*f6aab3d8Srobert     },
248061da546Spatrick     {"fpscr",
249061da546Spatrick      nullptr,
250061da546Spatrick      8,
251061da546Spatrick      OFFSET(fpscr),
252061da546Spatrick      eEncodingUint,
253061da546Spatrick      eFormatHex,
254061da546Spatrick      {INV, INV, INV, INV, reg_fpscr},
255061da546Spatrick      nullptr,
256061da546Spatrick      nullptr,
257*f6aab3d8Srobert     },
258061da546Spatrick     DEF_D(0),
259061da546Spatrick     DEF_D(1),
260061da546Spatrick     DEF_D(2),
261061da546Spatrick     DEF_D(3),
262061da546Spatrick     DEF_D(4),
263061da546Spatrick     DEF_D(5),
264061da546Spatrick     DEF_D(6),
265061da546Spatrick     DEF_D(7),
266061da546Spatrick     DEF_D(8),
267061da546Spatrick     DEF_D(9),
268061da546Spatrick     DEF_D(10),
269061da546Spatrick     DEF_D(11),
270061da546Spatrick     DEF_D(12),
271061da546Spatrick     DEF_D(13),
272061da546Spatrick     DEF_D(14),
273061da546Spatrick     DEF_D(15),
274061da546Spatrick     DEF_D(16),
275061da546Spatrick     DEF_D(17),
276061da546Spatrick     DEF_D(18),
277061da546Spatrick     DEF_D(19),
278061da546Spatrick     DEF_D(20),
279061da546Spatrick     DEF_D(21),
280061da546Spatrick     DEF_D(22),
281061da546Spatrick     DEF_D(23),
282061da546Spatrick     DEF_D(24),
283061da546Spatrick     DEF_D(25),
284061da546Spatrick     DEF_D(26),
285061da546Spatrick     DEF_D(27),
286061da546Spatrick     DEF_D(28),
287061da546Spatrick     DEF_D(29),
288061da546Spatrick     DEF_D(30),
289061da546Spatrick     DEF_D(31),
290061da546Spatrick     DEF_S(0),
291061da546Spatrick     DEF_S(1),
292061da546Spatrick     DEF_S(2),
293061da546Spatrick     DEF_S(3),
294061da546Spatrick     DEF_S(4),
295061da546Spatrick     DEF_S(5),
296061da546Spatrick     DEF_S(6),
297061da546Spatrick     DEF_S(7),
298061da546Spatrick     DEF_S(8),
299061da546Spatrick     DEF_S(9),
300061da546Spatrick     DEF_S(10),
301061da546Spatrick     DEF_S(11),
302061da546Spatrick     DEF_S(12),
303061da546Spatrick     DEF_S(13),
304061da546Spatrick     DEF_S(14),
305061da546Spatrick     DEF_S(15),
306061da546Spatrick     DEF_S(16),
307061da546Spatrick     DEF_S(17),
308061da546Spatrick     DEF_S(18),
309061da546Spatrick     DEF_S(19),
310061da546Spatrick     DEF_S(20),
311061da546Spatrick     DEF_S(21),
312061da546Spatrick     DEF_S(22),
313061da546Spatrick     DEF_S(23),
314061da546Spatrick     DEF_S(24),
315061da546Spatrick     DEF_S(25),
316061da546Spatrick     DEF_S(26),
317061da546Spatrick     DEF_S(27),
318061da546Spatrick     DEF_S(28),
319061da546Spatrick     DEF_S(29),
320061da546Spatrick     DEF_S(30),
321061da546Spatrick     DEF_S(31),
322061da546Spatrick     DEF_Q(0),
323061da546Spatrick     DEF_Q(1),
324061da546Spatrick     DEF_Q(2),
325061da546Spatrick     DEF_Q(3),
326061da546Spatrick     DEF_Q(4),
327061da546Spatrick     DEF_Q(5),
328061da546Spatrick     DEF_Q(6),
329061da546Spatrick     DEF_Q(7),
330061da546Spatrick     DEF_Q(8),
331061da546Spatrick     DEF_Q(9),
332061da546Spatrick     DEF_Q(10),
333061da546Spatrick     DEF_Q(11),
334061da546Spatrick     DEF_Q(12),
335061da546Spatrick     DEF_Q(13),
336061da546Spatrick     DEF_Q(14),
337061da546Spatrick     DEF_Q(15)};
338061da546Spatrick 
339*f6aab3d8Srobert constexpr size_t k_num_reg_infos = std::size(g_reg_infos);
340061da546Spatrick 
341061da546Spatrick // ARM general purpose registers.
342061da546Spatrick const uint32_t g_gpr_regnums[] = {
343061da546Spatrick     reg_r0,
344061da546Spatrick     reg_r1,
345061da546Spatrick     reg_r2,
346061da546Spatrick     reg_r3,
347061da546Spatrick     reg_r4,
348061da546Spatrick     reg_r5,
349061da546Spatrick     reg_r6,
350061da546Spatrick     reg_r7,
351061da546Spatrick     reg_r8,
352061da546Spatrick     reg_r9,
353061da546Spatrick     reg_r10,
354061da546Spatrick     reg_r11,
355061da546Spatrick     reg_r12,
356061da546Spatrick     reg_sp,
357061da546Spatrick     reg_lr,
358061da546Spatrick     reg_pc,
359061da546Spatrick     reg_cpsr,
360061da546Spatrick     LLDB_INVALID_REGNUM // register sets need to end with this flag
361061da546Spatrick };
362061da546Spatrick const uint32_t g_fpu_regnums[] = {
363061da546Spatrick     reg_fpscr,
364061da546Spatrick     reg_d0,
365061da546Spatrick     reg_d1,
366061da546Spatrick     reg_d2,
367061da546Spatrick     reg_d3,
368061da546Spatrick     reg_d4,
369061da546Spatrick     reg_d5,
370061da546Spatrick     reg_d6,
371061da546Spatrick     reg_d7,
372061da546Spatrick     reg_d8,
373061da546Spatrick     reg_d9,
374061da546Spatrick     reg_d10,
375061da546Spatrick     reg_d11,
376061da546Spatrick     reg_d12,
377061da546Spatrick     reg_d13,
378061da546Spatrick     reg_d14,
379061da546Spatrick     reg_d15,
380061da546Spatrick     reg_d16,
381061da546Spatrick     reg_d17,
382061da546Spatrick     reg_d18,
383061da546Spatrick     reg_d19,
384061da546Spatrick     reg_d20,
385061da546Spatrick     reg_d21,
386061da546Spatrick     reg_d22,
387061da546Spatrick     reg_d23,
388061da546Spatrick     reg_d24,
389061da546Spatrick     reg_d25,
390061da546Spatrick     reg_d26,
391061da546Spatrick     reg_d27,
392061da546Spatrick     reg_d28,
393061da546Spatrick     reg_d29,
394061da546Spatrick     reg_d30,
395061da546Spatrick     reg_d31,
396061da546Spatrick     reg_s0,
397061da546Spatrick     reg_s1,
398061da546Spatrick     reg_s2,
399061da546Spatrick     reg_s3,
400061da546Spatrick     reg_s4,
401061da546Spatrick     reg_s5,
402061da546Spatrick     reg_s6,
403061da546Spatrick     reg_s7,
404061da546Spatrick     reg_s8,
405061da546Spatrick     reg_s9,
406061da546Spatrick     reg_s10,
407061da546Spatrick     reg_s11,
408061da546Spatrick     reg_s12,
409061da546Spatrick     reg_s13,
410061da546Spatrick     reg_s14,
411061da546Spatrick     reg_s15,
412061da546Spatrick     reg_s16,
413061da546Spatrick     reg_s17,
414061da546Spatrick     reg_s18,
415061da546Spatrick     reg_s19,
416061da546Spatrick     reg_s20,
417061da546Spatrick     reg_s21,
418061da546Spatrick     reg_s22,
419061da546Spatrick     reg_s23,
420061da546Spatrick     reg_s24,
421061da546Spatrick     reg_s25,
422061da546Spatrick     reg_s26,
423061da546Spatrick     reg_s27,
424061da546Spatrick     reg_s28,
425061da546Spatrick     reg_s29,
426061da546Spatrick     reg_s30,
427061da546Spatrick     reg_s31,
428061da546Spatrick     reg_q0,
429061da546Spatrick     reg_q1,
430061da546Spatrick     reg_q2,
431061da546Spatrick     reg_q3,
432061da546Spatrick     reg_q4,
433061da546Spatrick     reg_q5,
434061da546Spatrick     reg_q6,
435061da546Spatrick     reg_q7,
436061da546Spatrick     reg_q8,
437061da546Spatrick     reg_q9,
438061da546Spatrick     reg_q10,
439061da546Spatrick     reg_q11,
440061da546Spatrick     reg_q12,
441061da546Spatrick     reg_q13,
442061da546Spatrick     reg_q14,
443061da546Spatrick     reg_q15,
444061da546Spatrick     LLDB_INVALID_REGNUM // register sets need to end with this flag
445061da546Spatrick };
446061da546Spatrick 
447061da546Spatrick // Skip the last LLDB_INVALID_REGNUM in each count below by subtracting 1
448*f6aab3d8Srobert constexpr size_t k_num_gpr_regs = std::size(g_gpr_regnums) - 1;
449*f6aab3d8Srobert constexpr size_t k_num_fpu_regs = std::size(g_fpu_regnums) - 1;
450061da546Spatrick 
451061da546Spatrick static RegisterSet g_reg_sets[] = {
452061da546Spatrick     {"General Purpose Registers", "gpr", k_num_gpr_regs, g_gpr_regnums},
453061da546Spatrick     {"Floating Point Registers", "fpu", k_num_fpu_regs, g_fpu_regnums},
454061da546Spatrick };
455061da546Spatrick 
456*f6aab3d8Srobert constexpr size_t k_num_reg_sets = std::size(g_reg_sets);
457061da546Spatrick 
RegisterContextMinidump_ARM(lldb_private::Thread & thread,const DataExtractor & data,bool apple)458061da546Spatrick RegisterContextMinidump_ARM::RegisterContextMinidump_ARM(
459061da546Spatrick     lldb_private::Thread &thread, const DataExtractor &data, bool apple)
460061da546Spatrick     : RegisterContext(thread, 0), m_apple(apple) {
461061da546Spatrick   lldb::offset_t offset = 0;
462061da546Spatrick   m_regs.context_flags = data.GetU32(&offset);
463*f6aab3d8Srobert   for (unsigned i = 0; i < std::size(m_regs.r); ++i)
464061da546Spatrick     m_regs.r[i] = data.GetU32(&offset);
465061da546Spatrick   m_regs.cpsr = data.GetU32(&offset);
466061da546Spatrick   m_regs.fpscr = data.GetU64(&offset);
467*f6aab3d8Srobert   for (unsigned i = 0; i < std::size(m_regs.d); ++i)
468061da546Spatrick     m_regs.d[i] = data.GetU64(&offset);
469061da546Spatrick   lldbassert(k_num_regs == k_num_reg_infos);
470061da546Spatrick }
471061da546Spatrick 
GetRegisterCountStatic()472061da546Spatrick size_t RegisterContextMinidump_ARM::GetRegisterCountStatic() {
473061da546Spatrick   return k_num_regs;
474061da546Spatrick }
475061da546Spatrick 
476061da546Spatrick // Used for unit testing so we can verify register info is filled in for
477061da546Spatrick // all register flavors (DWARF, EH Frame, generic, etc).
GetRegisterCount()478061da546Spatrick size_t RegisterContextMinidump_ARM::GetRegisterCount() {
479061da546Spatrick   return GetRegisterCountStatic();
480061da546Spatrick }
481061da546Spatrick 
482061da546Spatrick // Used for unit testing so we can verify register info is filled in.
483061da546Spatrick const RegisterInfo *
GetRegisterInfoAtIndexStatic(size_t reg,bool apple)484061da546Spatrick RegisterContextMinidump_ARM::GetRegisterInfoAtIndexStatic(size_t reg,
485061da546Spatrick                                                           bool apple) {
486061da546Spatrick   if (reg < k_num_reg_infos) {
487061da546Spatrick     if (apple) {
488061da546Spatrick       if (reg == reg_r7)
489061da546Spatrick         return &g_reg_info_apple_fp;
490061da546Spatrick     } else {
491061da546Spatrick       if (reg == reg_r11)
492061da546Spatrick         return &g_reg_info_fp;
493061da546Spatrick     }
494061da546Spatrick     return &g_reg_infos[reg];
495061da546Spatrick   }
496061da546Spatrick   return nullptr;
497061da546Spatrick }
498061da546Spatrick 
499061da546Spatrick const RegisterInfo *
GetRegisterInfoAtIndex(size_t reg)500061da546Spatrick RegisterContextMinidump_ARM::GetRegisterInfoAtIndex(size_t reg) {
501061da546Spatrick   return GetRegisterInfoAtIndexStatic(reg, m_apple);
502061da546Spatrick }
503061da546Spatrick 
GetRegisterSetCount()504061da546Spatrick size_t RegisterContextMinidump_ARM::GetRegisterSetCount() {
505061da546Spatrick   return k_num_reg_sets;
506061da546Spatrick }
507061da546Spatrick 
GetRegisterSet(size_t set)508061da546Spatrick const RegisterSet *RegisterContextMinidump_ARM::GetRegisterSet(size_t set) {
509061da546Spatrick   if (set < k_num_reg_sets)
510061da546Spatrick     return &g_reg_sets[set];
511061da546Spatrick   return nullptr;
512061da546Spatrick }
513061da546Spatrick 
GetRegisterName(unsigned reg)514061da546Spatrick const char *RegisterContextMinidump_ARM::GetRegisterName(unsigned reg) {
515061da546Spatrick   if (reg < k_num_reg_infos)
516061da546Spatrick     return g_reg_infos[reg].name;
517061da546Spatrick   return nullptr;
518061da546Spatrick }
519061da546Spatrick 
ReadRegister(const RegisterInfo * reg_info,RegisterValue & reg_value)520061da546Spatrick bool RegisterContextMinidump_ARM::ReadRegister(const RegisterInfo *reg_info,
521061da546Spatrick                                                RegisterValue &reg_value) {
522061da546Spatrick   Status error;
523061da546Spatrick   reg_value.SetFromMemoryData(
524*f6aab3d8Srobert       *reg_info, (const uint8_t *)&m_regs + reg_info->byte_offset,
525061da546Spatrick       reg_info->byte_size, lldb::eByteOrderLittle, error);
526061da546Spatrick   return error.Success();
527061da546Spatrick }
528061da546Spatrick 
WriteRegister(const RegisterInfo *,const RegisterValue &)529061da546Spatrick bool RegisterContextMinidump_ARM::WriteRegister(const RegisterInfo *,
530061da546Spatrick                                                 const RegisterValue &) {
531061da546Spatrick   return false;
532061da546Spatrick }
533061da546Spatrick 
ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind,uint32_t num)534061da546Spatrick uint32_t RegisterContextMinidump_ARM::ConvertRegisterKindToRegisterNumber(
535061da546Spatrick     lldb::RegisterKind kind, uint32_t num) {
536061da546Spatrick   for (size_t i = 0; i < k_num_regs; ++i) {
537061da546Spatrick     if (g_reg_infos[i].kinds[kind] == num)
538061da546Spatrick       return i;
539061da546Spatrick   }
540061da546Spatrick   return LLDB_INVALID_REGNUM;
541061da546Spatrick }
542