1dda28197Spatrick //===-- ABISysV_hexagon.cpp -----------------------------------------------===//
2dda28197Spatrick //
3dda28197Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4dda28197Spatrick // See https://llvm.org/LICENSE.txt for license information.
5dda28197Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6dda28197Spatrick //
7dda28197Spatrick //===----------------------------------------------------------------------===//
8dda28197Spatrick
9dda28197Spatrick #include "ABISysV_hexagon.h"
10dda28197Spatrick
11dda28197Spatrick #include "llvm/ADT/Triple.h"
12dda28197Spatrick #include "llvm/IR/DerivedTypes.h"
13dda28197Spatrick
14dda28197Spatrick #include "lldb/Core/Module.h"
15dda28197Spatrick #include "lldb/Core/PluginManager.h"
16dda28197Spatrick #include "lldb/Core/Value.h"
17dda28197Spatrick #include "lldb/Core/ValueObjectConstResult.h"
18dda28197Spatrick #include "lldb/Core/ValueObjectMemory.h"
19dda28197Spatrick #include "lldb/Core/ValueObjectRegister.h"
20dda28197Spatrick #include "lldb/Symbol/UnwindPlan.h"
21dda28197Spatrick #include "lldb/Target/Process.h"
22dda28197Spatrick #include "lldb/Target/RegisterContext.h"
23dda28197Spatrick #include "lldb/Target/StackFrame.h"
24dda28197Spatrick #include "lldb/Target/Target.h"
25dda28197Spatrick #include "lldb/Target/Thread.h"
26dda28197Spatrick #include "lldb/Utility/ConstString.h"
27dda28197Spatrick #include "lldb/Utility/DataExtractor.h"
28dda28197Spatrick #include "lldb/Utility/Log.h"
29dda28197Spatrick #include "lldb/Utility/RegisterValue.h"
30dda28197Spatrick #include "lldb/Utility/Status.h"
31dda28197Spatrick
32dda28197Spatrick using namespace lldb;
33dda28197Spatrick using namespace lldb_private;
34dda28197Spatrick
35dda28197Spatrick LLDB_PLUGIN_DEFINE_ADV(ABISysV_hexagon, ABIHexagon)
36dda28197Spatrick
37be691f3bSpatrick static const RegisterInfo g_register_infos[] = {
38dda28197Spatrick // hexagon-core.xml
39dda28197Spatrick {"r00",
40dda28197Spatrick "",
41dda28197Spatrick 4,
42dda28197Spatrick 0,
43dda28197Spatrick eEncodingUint,
44dda28197Spatrick eFormatAddressInfo,
45dda28197Spatrick {0, 0, LLDB_INVALID_REGNUM, 0, 0},
46dda28197Spatrick nullptr,
47dda28197Spatrick nullptr,
48*f6aab3d8Srobert },
49dda28197Spatrick {"r01",
50dda28197Spatrick "",
51dda28197Spatrick 4,
52dda28197Spatrick 0,
53dda28197Spatrick eEncodingUint,
54dda28197Spatrick eFormatAddressInfo,
55dda28197Spatrick {1, 1, LLDB_INVALID_REGNUM, 1, 1},
56dda28197Spatrick nullptr,
57dda28197Spatrick nullptr,
58*f6aab3d8Srobert },
59dda28197Spatrick {"r02",
60dda28197Spatrick "",
61dda28197Spatrick 4,
62dda28197Spatrick 0,
63dda28197Spatrick eEncodingUint,
64dda28197Spatrick eFormatAddressInfo,
65dda28197Spatrick {2, 2, LLDB_INVALID_REGNUM, 2, 2},
66dda28197Spatrick nullptr,
67dda28197Spatrick nullptr,
68*f6aab3d8Srobert },
69dda28197Spatrick {"r03",
70dda28197Spatrick "",
71dda28197Spatrick 4,
72dda28197Spatrick 0,
73dda28197Spatrick eEncodingUint,
74dda28197Spatrick eFormatAddressInfo,
75dda28197Spatrick {3, 3, LLDB_INVALID_REGNUM, 3, 3},
76dda28197Spatrick nullptr,
77dda28197Spatrick nullptr,
78*f6aab3d8Srobert },
79dda28197Spatrick {"r04",
80dda28197Spatrick "",
81dda28197Spatrick 4,
82dda28197Spatrick 0,
83dda28197Spatrick eEncodingUint,
84dda28197Spatrick eFormatAddressInfo,
85dda28197Spatrick {4, 4, LLDB_INVALID_REGNUM, 4, 4},
86dda28197Spatrick nullptr,
87dda28197Spatrick nullptr,
88*f6aab3d8Srobert },
89dda28197Spatrick {"r05",
90dda28197Spatrick "",
91dda28197Spatrick 4,
92dda28197Spatrick 0,
93dda28197Spatrick eEncodingUint,
94dda28197Spatrick eFormatAddressInfo,
95dda28197Spatrick {5, 5, LLDB_INVALID_REGNUM, 5, 5},
96dda28197Spatrick nullptr,
97dda28197Spatrick nullptr,
98*f6aab3d8Srobert },
99dda28197Spatrick {"r06",
100dda28197Spatrick "",
101dda28197Spatrick 4,
102dda28197Spatrick 0,
103dda28197Spatrick eEncodingUint,
104dda28197Spatrick eFormatAddressInfo,
105dda28197Spatrick {6, 6, LLDB_INVALID_REGNUM, 6, 6},
106dda28197Spatrick nullptr,
107dda28197Spatrick nullptr,
108*f6aab3d8Srobert },
109dda28197Spatrick {"r07",
110dda28197Spatrick "",
111dda28197Spatrick 4,
112dda28197Spatrick 0,
113dda28197Spatrick eEncodingUint,
114dda28197Spatrick eFormatAddressInfo,
115dda28197Spatrick {7, 7, LLDB_INVALID_REGNUM, 7, 7},
116dda28197Spatrick nullptr,
117dda28197Spatrick nullptr,
118*f6aab3d8Srobert },
119dda28197Spatrick {"r08",
120dda28197Spatrick "",
121dda28197Spatrick 4,
122dda28197Spatrick 0,
123dda28197Spatrick eEncodingUint,
124dda28197Spatrick eFormatAddressInfo,
125dda28197Spatrick {8, 8, LLDB_INVALID_REGNUM, 8, 8},
126dda28197Spatrick nullptr,
127dda28197Spatrick nullptr,
128*f6aab3d8Srobert },
129dda28197Spatrick {"r09",
130dda28197Spatrick "",
131dda28197Spatrick 4,
132dda28197Spatrick 0,
133dda28197Spatrick eEncodingUint,
134dda28197Spatrick eFormatAddressInfo,
135dda28197Spatrick {9, 9, LLDB_INVALID_REGNUM, 9, 9},
136dda28197Spatrick nullptr,
137dda28197Spatrick nullptr,
138*f6aab3d8Srobert },
139dda28197Spatrick {"r10",
140dda28197Spatrick "",
141dda28197Spatrick 4,
142dda28197Spatrick 0,
143dda28197Spatrick eEncodingUint,
144dda28197Spatrick eFormatAddressInfo,
145dda28197Spatrick {10, 10, LLDB_INVALID_REGNUM, 10, 10},
146dda28197Spatrick nullptr,
147dda28197Spatrick nullptr,
148*f6aab3d8Srobert },
149dda28197Spatrick {"r11",
150dda28197Spatrick "",
151dda28197Spatrick 4,
152dda28197Spatrick 0,
153dda28197Spatrick eEncodingUint,
154dda28197Spatrick eFormatAddressInfo,
155dda28197Spatrick {11, 11, LLDB_INVALID_REGNUM, 11, 11},
156dda28197Spatrick nullptr,
157dda28197Spatrick nullptr,
158*f6aab3d8Srobert },
159dda28197Spatrick {"r12",
160dda28197Spatrick "",
161dda28197Spatrick 4,
162dda28197Spatrick 0,
163dda28197Spatrick eEncodingUint,
164dda28197Spatrick eFormatAddressInfo,
165dda28197Spatrick {12, 12, LLDB_INVALID_REGNUM, 12, 12},
166dda28197Spatrick nullptr,
167dda28197Spatrick nullptr,
168*f6aab3d8Srobert },
169dda28197Spatrick {"r13",
170dda28197Spatrick "",
171dda28197Spatrick 4,
172dda28197Spatrick 0,
173dda28197Spatrick eEncodingUint,
174dda28197Spatrick eFormatAddressInfo,
175dda28197Spatrick {13, 13, LLDB_INVALID_REGNUM, 13, 13},
176dda28197Spatrick nullptr,
177dda28197Spatrick nullptr,
178*f6aab3d8Srobert },
179dda28197Spatrick {"r14",
180dda28197Spatrick "",
181dda28197Spatrick 4,
182dda28197Spatrick 0,
183dda28197Spatrick eEncodingUint,
184dda28197Spatrick eFormatAddressInfo,
185dda28197Spatrick {14, 14, LLDB_INVALID_REGNUM, 14, 14},
186dda28197Spatrick nullptr,
187dda28197Spatrick nullptr,
188*f6aab3d8Srobert },
189dda28197Spatrick {"r15",
190dda28197Spatrick "",
191dda28197Spatrick 4,
192dda28197Spatrick 0,
193dda28197Spatrick eEncodingUint,
194dda28197Spatrick eFormatAddressInfo,
195dda28197Spatrick {15, 15, LLDB_INVALID_REGNUM, 15, 15},
196dda28197Spatrick nullptr,
197dda28197Spatrick nullptr,
198*f6aab3d8Srobert },
199dda28197Spatrick {"r16",
200dda28197Spatrick "",
201dda28197Spatrick 4,
202dda28197Spatrick 0,
203dda28197Spatrick eEncodingUint,
204dda28197Spatrick eFormatAddressInfo,
205dda28197Spatrick {16, 16, LLDB_INVALID_REGNUM, 16, 16},
206dda28197Spatrick nullptr,
207dda28197Spatrick nullptr,
208*f6aab3d8Srobert },
209dda28197Spatrick {"r17",
210dda28197Spatrick "",
211dda28197Spatrick 4,
212dda28197Spatrick 0,
213dda28197Spatrick eEncodingUint,
214dda28197Spatrick eFormatAddressInfo,
215dda28197Spatrick {17, 17, LLDB_INVALID_REGNUM, 17, 17},
216dda28197Spatrick nullptr,
217dda28197Spatrick nullptr,
218*f6aab3d8Srobert },
219dda28197Spatrick {"r18",
220dda28197Spatrick "",
221dda28197Spatrick 4,
222dda28197Spatrick 0,
223dda28197Spatrick eEncodingUint,
224dda28197Spatrick eFormatAddressInfo,
225dda28197Spatrick {18, 18, LLDB_INVALID_REGNUM, 18, 18},
226dda28197Spatrick nullptr,
227dda28197Spatrick nullptr,
228*f6aab3d8Srobert },
229dda28197Spatrick {"r19",
230dda28197Spatrick "",
231dda28197Spatrick 4,
232dda28197Spatrick 0,
233dda28197Spatrick eEncodingUint,
234dda28197Spatrick eFormatAddressInfo,
235dda28197Spatrick {19, 19, LLDB_INVALID_REGNUM, 19, 19},
236dda28197Spatrick nullptr,
237dda28197Spatrick nullptr,
238*f6aab3d8Srobert },
239dda28197Spatrick {"r20",
240dda28197Spatrick "",
241dda28197Spatrick 4,
242dda28197Spatrick 0,
243dda28197Spatrick eEncodingUint,
244dda28197Spatrick eFormatAddressInfo,
245dda28197Spatrick {20, 20, LLDB_INVALID_REGNUM, 20, 20},
246dda28197Spatrick nullptr,
247dda28197Spatrick nullptr,
248*f6aab3d8Srobert },
249dda28197Spatrick {"r21",
250dda28197Spatrick "",
251dda28197Spatrick 4,
252dda28197Spatrick 0,
253dda28197Spatrick eEncodingUint,
254dda28197Spatrick eFormatAddressInfo,
255dda28197Spatrick {21, 21, LLDB_INVALID_REGNUM, 21, 21},
256dda28197Spatrick nullptr,
257dda28197Spatrick nullptr,
258*f6aab3d8Srobert },
259dda28197Spatrick {"r22",
260dda28197Spatrick "",
261dda28197Spatrick 4,
262dda28197Spatrick 0,
263dda28197Spatrick eEncodingUint,
264dda28197Spatrick eFormatAddressInfo,
265dda28197Spatrick {22, 22, LLDB_INVALID_REGNUM, 22, 22},
266dda28197Spatrick nullptr,
267dda28197Spatrick nullptr,
268*f6aab3d8Srobert },
269dda28197Spatrick {"r23",
270dda28197Spatrick "",
271dda28197Spatrick 4,
272dda28197Spatrick 0,
273dda28197Spatrick eEncodingUint,
274dda28197Spatrick eFormatAddressInfo,
275dda28197Spatrick {23, 23, LLDB_INVALID_REGNUM, 23, 23},
276dda28197Spatrick nullptr,
277dda28197Spatrick nullptr,
278*f6aab3d8Srobert },
279dda28197Spatrick {"r24",
280dda28197Spatrick "",
281dda28197Spatrick 4,
282dda28197Spatrick 0,
283dda28197Spatrick eEncodingUint,
284dda28197Spatrick eFormatAddressInfo,
285dda28197Spatrick {24, 24, LLDB_INVALID_REGNUM, 24, 24},
286dda28197Spatrick nullptr,
287dda28197Spatrick nullptr,
288*f6aab3d8Srobert },
289dda28197Spatrick {"r25",
290dda28197Spatrick "",
291dda28197Spatrick 4,
292dda28197Spatrick 0,
293dda28197Spatrick eEncodingUint,
294dda28197Spatrick eFormatAddressInfo,
295dda28197Spatrick {25, 25, LLDB_INVALID_REGNUM, 25, 25},
296dda28197Spatrick nullptr,
297dda28197Spatrick nullptr,
298*f6aab3d8Srobert },
299dda28197Spatrick {"r26",
300dda28197Spatrick "",
301dda28197Spatrick 4,
302dda28197Spatrick 0,
303dda28197Spatrick eEncodingUint,
304dda28197Spatrick eFormatAddressInfo,
305dda28197Spatrick {26, 26, LLDB_INVALID_REGNUM, 26, 26},
306dda28197Spatrick nullptr,
307dda28197Spatrick nullptr,
308*f6aab3d8Srobert },
309dda28197Spatrick {"r27",
310dda28197Spatrick "",
311dda28197Spatrick 4,
312dda28197Spatrick 0,
313dda28197Spatrick eEncodingUint,
314dda28197Spatrick eFormatAddressInfo,
315dda28197Spatrick {27, 27, LLDB_INVALID_REGNUM, 27, 27},
316dda28197Spatrick nullptr,
317dda28197Spatrick nullptr,
318*f6aab3d8Srobert },
319dda28197Spatrick {"r28",
320dda28197Spatrick "",
321dda28197Spatrick 4,
322dda28197Spatrick 0,
323dda28197Spatrick eEncodingUint,
324dda28197Spatrick eFormatAddressInfo,
325dda28197Spatrick {28, 28, LLDB_INVALID_REGNUM, 28, 28},
326dda28197Spatrick nullptr,
327dda28197Spatrick nullptr,
328*f6aab3d8Srobert },
329dda28197Spatrick {"sp",
330dda28197Spatrick "r29",
331dda28197Spatrick 4,
332dda28197Spatrick 0,
333dda28197Spatrick eEncodingUint,
334dda28197Spatrick eFormatAddressInfo,
335dda28197Spatrick {29, 29, LLDB_REGNUM_GENERIC_SP, 29, 29},
336dda28197Spatrick nullptr,
337dda28197Spatrick nullptr,
338*f6aab3d8Srobert },
339dda28197Spatrick {"fp",
340dda28197Spatrick "r30",
341dda28197Spatrick 4,
342dda28197Spatrick 0,
343dda28197Spatrick eEncodingUint,
344dda28197Spatrick eFormatAddressInfo,
345dda28197Spatrick {30, 30, LLDB_REGNUM_GENERIC_FP, 30, 30},
346dda28197Spatrick nullptr,
347dda28197Spatrick nullptr,
348*f6aab3d8Srobert },
349dda28197Spatrick {"lr",
350dda28197Spatrick "r31",
351dda28197Spatrick 4,
352dda28197Spatrick 0,
353dda28197Spatrick eEncodingUint,
354dda28197Spatrick eFormatAddressInfo,
355dda28197Spatrick {31, 31, LLDB_REGNUM_GENERIC_RA, 31, 31},
356dda28197Spatrick nullptr,
357dda28197Spatrick nullptr,
358*f6aab3d8Srobert },
359dda28197Spatrick {"sa0",
360dda28197Spatrick "",
361dda28197Spatrick 4,
362dda28197Spatrick 0,
363dda28197Spatrick eEncodingUint,
364dda28197Spatrick eFormatAddressInfo,
365dda28197Spatrick {32, 32, LLDB_INVALID_REGNUM, 32, 32},
366dda28197Spatrick nullptr,
367dda28197Spatrick nullptr,
368*f6aab3d8Srobert },
369dda28197Spatrick {"lc0",
370dda28197Spatrick "",
371dda28197Spatrick 4,
372dda28197Spatrick 0,
373dda28197Spatrick eEncodingUint,
374dda28197Spatrick eFormatAddressInfo,
375dda28197Spatrick {33, 33, LLDB_INVALID_REGNUM, 33, 33},
376dda28197Spatrick nullptr,
377dda28197Spatrick nullptr,
378*f6aab3d8Srobert },
379dda28197Spatrick {"sa1",
380dda28197Spatrick "",
381dda28197Spatrick 4,
382dda28197Spatrick 0,
383dda28197Spatrick eEncodingUint,
384dda28197Spatrick eFormatAddressInfo,
385dda28197Spatrick {34, 34, LLDB_INVALID_REGNUM, 34, 34},
386dda28197Spatrick nullptr,
387dda28197Spatrick nullptr,
388*f6aab3d8Srobert },
389dda28197Spatrick {"lc1",
390dda28197Spatrick "",
391dda28197Spatrick 4,
392dda28197Spatrick 0,
393dda28197Spatrick eEncodingUint,
394dda28197Spatrick eFormatAddressInfo,
395dda28197Spatrick {35, 35, LLDB_INVALID_REGNUM, 35, 35},
396dda28197Spatrick nullptr,
397dda28197Spatrick nullptr,
398*f6aab3d8Srobert },
399dda28197Spatrick // --> hexagon-v4/5/55/56-sim.xml
400dda28197Spatrick {"p3_0",
401dda28197Spatrick "",
402dda28197Spatrick 4,
403dda28197Spatrick 0,
404dda28197Spatrick eEncodingUint,
405dda28197Spatrick eFormatAddressInfo,
406dda28197Spatrick {36, 36, LLDB_INVALID_REGNUM, 36, 36},
407dda28197Spatrick nullptr,
408dda28197Spatrick nullptr,
409*f6aab3d8Srobert },
410dda28197Spatrick // PADDING {
411dda28197Spatrick {"p00",
412dda28197Spatrick "",
413dda28197Spatrick 4,
414dda28197Spatrick 0,
415dda28197Spatrick eEncodingInvalid,
416dda28197Spatrick eFormatInvalid,
417dda28197Spatrick {37, 37, LLDB_INVALID_REGNUM, 37, 37},
418dda28197Spatrick nullptr,
419dda28197Spatrick nullptr,
420*f6aab3d8Srobert },
421dda28197Spatrick // }
422dda28197Spatrick {"m0",
423dda28197Spatrick "",
424dda28197Spatrick 4,
425dda28197Spatrick 0,
426dda28197Spatrick eEncodingUint,
427dda28197Spatrick eFormatAddressInfo,
428dda28197Spatrick {38, 38, LLDB_INVALID_REGNUM, 38, 38},
429dda28197Spatrick nullptr,
430dda28197Spatrick nullptr,
431*f6aab3d8Srobert },
432dda28197Spatrick {"m1",
433dda28197Spatrick "",
434dda28197Spatrick 4,
435dda28197Spatrick 0,
436dda28197Spatrick eEncodingUint,
437dda28197Spatrick eFormatAddressInfo,
438dda28197Spatrick {39, 39, LLDB_INVALID_REGNUM, 39, 39},
439dda28197Spatrick nullptr,
440dda28197Spatrick nullptr,
441*f6aab3d8Srobert },
442dda28197Spatrick {"usr",
443dda28197Spatrick "",
444dda28197Spatrick 4,
445dda28197Spatrick 0,
446dda28197Spatrick eEncodingUint,
447dda28197Spatrick eFormatAddressInfo,
448dda28197Spatrick {40, 40, LLDB_INVALID_REGNUM, 40, 40},
449dda28197Spatrick nullptr,
450dda28197Spatrick nullptr,
451*f6aab3d8Srobert },
452dda28197Spatrick {"pc",
453dda28197Spatrick "",
454dda28197Spatrick 4,
455dda28197Spatrick 0,
456dda28197Spatrick eEncodingUint,
457dda28197Spatrick eFormatAddressInfo,
458dda28197Spatrick {41, 41, LLDB_REGNUM_GENERIC_PC, 41, 41},
459dda28197Spatrick nullptr,
460dda28197Spatrick nullptr,
461*f6aab3d8Srobert },
462dda28197Spatrick {"ugp",
463dda28197Spatrick "",
464dda28197Spatrick 4,
465dda28197Spatrick 0,
466dda28197Spatrick eEncodingUint,
467dda28197Spatrick eFormatAddressInfo,
468dda28197Spatrick {42, 42, LLDB_INVALID_REGNUM, 42, 42},
469dda28197Spatrick nullptr,
470dda28197Spatrick nullptr,
471*f6aab3d8Srobert },
472dda28197Spatrick {"gp",
473dda28197Spatrick "",
474dda28197Spatrick 4,
475dda28197Spatrick 0,
476dda28197Spatrick eEncodingUint,
477dda28197Spatrick eFormatAddressInfo,
478dda28197Spatrick {43, 43, LLDB_INVALID_REGNUM, 43, 43},
479dda28197Spatrick nullptr,
480dda28197Spatrick nullptr,
481*f6aab3d8Srobert },
482dda28197Spatrick {"cs0",
483dda28197Spatrick "",
484dda28197Spatrick 4,
485dda28197Spatrick 0,
486dda28197Spatrick eEncodingUint,
487dda28197Spatrick eFormatAddressInfo,
488dda28197Spatrick {44, 44, LLDB_INVALID_REGNUM, 44, 44},
489dda28197Spatrick nullptr,
490dda28197Spatrick nullptr,
491*f6aab3d8Srobert },
492dda28197Spatrick {"cs1",
493dda28197Spatrick "",
494dda28197Spatrick 4,
495dda28197Spatrick 0,
496dda28197Spatrick eEncodingUint,
497dda28197Spatrick eFormatAddressInfo,
498dda28197Spatrick {45, 45, LLDB_INVALID_REGNUM, 45, 45},
499dda28197Spatrick nullptr,
500dda28197Spatrick nullptr,
501*f6aab3d8Srobert },
502dda28197Spatrick // PADDING {
503dda28197Spatrick {"p01",
504dda28197Spatrick "",
505dda28197Spatrick 4,
506dda28197Spatrick 0,
507dda28197Spatrick eEncodingInvalid,
508dda28197Spatrick eFormatInvalid,
509dda28197Spatrick {46, 46, LLDB_INVALID_REGNUM, 46, 46},
510dda28197Spatrick nullptr,
511dda28197Spatrick nullptr,
512*f6aab3d8Srobert },
513dda28197Spatrick {"p02",
514dda28197Spatrick "",
515dda28197Spatrick 4,
516dda28197Spatrick 0,
517dda28197Spatrick eEncodingInvalid,
518dda28197Spatrick eFormatInvalid,
519dda28197Spatrick {47, 47, LLDB_INVALID_REGNUM, 47, 47},
520dda28197Spatrick nullptr,
521dda28197Spatrick nullptr,
522*f6aab3d8Srobert },
523dda28197Spatrick {"p03",
524dda28197Spatrick "",
525dda28197Spatrick 4,
526dda28197Spatrick 0,
527dda28197Spatrick eEncodingInvalid,
528dda28197Spatrick eFormatInvalid,
529dda28197Spatrick {48, 48, LLDB_INVALID_REGNUM, 48, 48},
530dda28197Spatrick nullptr,
531dda28197Spatrick nullptr,
532*f6aab3d8Srobert },
533dda28197Spatrick {"p04",
534dda28197Spatrick "",
535dda28197Spatrick 4,
536dda28197Spatrick 0,
537dda28197Spatrick eEncodingInvalid,
538dda28197Spatrick eFormatInvalid,
539dda28197Spatrick {49, 49, LLDB_INVALID_REGNUM, 49, 49},
540dda28197Spatrick nullptr,
541dda28197Spatrick nullptr,
542*f6aab3d8Srobert },
543dda28197Spatrick {"p05",
544dda28197Spatrick "",
545dda28197Spatrick 4,
546dda28197Spatrick 0,
547dda28197Spatrick eEncodingInvalid,
548dda28197Spatrick eFormatInvalid,
549dda28197Spatrick {50, 50, LLDB_INVALID_REGNUM, 50, 50},
550dda28197Spatrick nullptr,
551dda28197Spatrick nullptr,
552*f6aab3d8Srobert },
553dda28197Spatrick {"p06",
554dda28197Spatrick "",
555dda28197Spatrick 4,
556dda28197Spatrick 0,
557dda28197Spatrick eEncodingInvalid,
558dda28197Spatrick eFormatInvalid,
559dda28197Spatrick {51, 51, LLDB_INVALID_REGNUM, 51, 51},
560dda28197Spatrick nullptr,
561dda28197Spatrick nullptr,
562*f6aab3d8Srobert },
563dda28197Spatrick {"p07",
564dda28197Spatrick "",
565dda28197Spatrick 4,
566dda28197Spatrick 0,
567dda28197Spatrick eEncodingInvalid,
568dda28197Spatrick eFormatInvalid,
569dda28197Spatrick {52, 52, LLDB_INVALID_REGNUM, 52, 52},
570dda28197Spatrick nullptr,
571dda28197Spatrick nullptr,
572*f6aab3d8Srobert },
573dda28197Spatrick {"p08",
574dda28197Spatrick "",
575dda28197Spatrick 4,
576dda28197Spatrick 0,
577dda28197Spatrick eEncodingInvalid,
578dda28197Spatrick eFormatInvalid,
579dda28197Spatrick {53, 53, LLDB_INVALID_REGNUM, 53, 53},
580dda28197Spatrick nullptr,
581dda28197Spatrick nullptr,
582*f6aab3d8Srobert },
583dda28197Spatrick {"p09",
584dda28197Spatrick "",
585dda28197Spatrick 4,
586dda28197Spatrick 0,
587dda28197Spatrick eEncodingInvalid,
588dda28197Spatrick eFormatInvalid,
589dda28197Spatrick {54, 54, LLDB_INVALID_REGNUM, 54, 54},
590dda28197Spatrick nullptr,
591dda28197Spatrick nullptr,
592*f6aab3d8Srobert },
593dda28197Spatrick {"p10",
594dda28197Spatrick "",
595dda28197Spatrick 4,
596dda28197Spatrick 0,
597dda28197Spatrick eEncodingInvalid,
598dda28197Spatrick eFormatInvalid,
599dda28197Spatrick {55, 55, LLDB_INVALID_REGNUM, 55, 55},
600dda28197Spatrick nullptr,
601dda28197Spatrick nullptr,
602*f6aab3d8Srobert },
603dda28197Spatrick {"p11",
604dda28197Spatrick "",
605dda28197Spatrick 4,
606dda28197Spatrick 0,
607dda28197Spatrick eEncodingInvalid,
608dda28197Spatrick eFormatInvalid,
609dda28197Spatrick {56, 56, LLDB_INVALID_REGNUM, 56, 56},
610dda28197Spatrick nullptr,
611dda28197Spatrick nullptr,
612*f6aab3d8Srobert },
613dda28197Spatrick {"p12",
614dda28197Spatrick "",
615dda28197Spatrick 4,
616dda28197Spatrick 0,
617dda28197Spatrick eEncodingInvalid,
618dda28197Spatrick eFormatInvalid,
619dda28197Spatrick {57, 57, LLDB_INVALID_REGNUM, 57, 57},
620dda28197Spatrick nullptr,
621dda28197Spatrick nullptr,
622*f6aab3d8Srobert },
623dda28197Spatrick {"p13",
624dda28197Spatrick "",
625dda28197Spatrick 4,
626dda28197Spatrick 0,
627dda28197Spatrick eEncodingInvalid,
628dda28197Spatrick eFormatInvalid,
629dda28197Spatrick {58, 58, LLDB_INVALID_REGNUM, 58, 58},
630dda28197Spatrick nullptr,
631dda28197Spatrick nullptr,
632*f6aab3d8Srobert },
633dda28197Spatrick {"p14",
634dda28197Spatrick "",
635dda28197Spatrick 4,
636dda28197Spatrick 0,
637dda28197Spatrick eEncodingInvalid,
638dda28197Spatrick eFormatInvalid,
639dda28197Spatrick {59, 59, LLDB_INVALID_REGNUM, 59, 59},
640dda28197Spatrick nullptr,
641dda28197Spatrick nullptr,
642*f6aab3d8Srobert },
643dda28197Spatrick {"p15",
644dda28197Spatrick "",
645dda28197Spatrick 4,
646dda28197Spatrick 0,
647dda28197Spatrick eEncodingInvalid,
648dda28197Spatrick eFormatInvalid,
649dda28197Spatrick {60, 60, LLDB_INVALID_REGNUM, 60, 60},
650dda28197Spatrick nullptr,
651dda28197Spatrick nullptr,
652*f6aab3d8Srobert },
653dda28197Spatrick {"p16",
654dda28197Spatrick "",
655dda28197Spatrick 4,
656dda28197Spatrick 0,
657dda28197Spatrick eEncodingInvalid,
658dda28197Spatrick eFormatInvalid,
659dda28197Spatrick {61, 61, LLDB_INVALID_REGNUM, 61, 61},
660dda28197Spatrick nullptr,
661dda28197Spatrick nullptr,
662*f6aab3d8Srobert },
663dda28197Spatrick {"p17",
664dda28197Spatrick "",
665dda28197Spatrick 4,
666dda28197Spatrick 0,
667dda28197Spatrick eEncodingInvalid,
668dda28197Spatrick eFormatInvalid,
669dda28197Spatrick {62, 62, LLDB_INVALID_REGNUM, 62, 62},
670dda28197Spatrick nullptr,
671dda28197Spatrick nullptr,
672*f6aab3d8Srobert },
673dda28197Spatrick {"p18",
674dda28197Spatrick "",
675dda28197Spatrick 4,
676dda28197Spatrick 0,
677dda28197Spatrick eEncodingInvalid,
678dda28197Spatrick eFormatInvalid,
679dda28197Spatrick {63, 63, LLDB_INVALID_REGNUM, 63, 63},
680dda28197Spatrick nullptr,
681dda28197Spatrick nullptr,
682*f6aab3d8Srobert },
683dda28197Spatrick // }
684dda28197Spatrick {"sgp0",
685dda28197Spatrick "",
686dda28197Spatrick 4,
687dda28197Spatrick 0,
688dda28197Spatrick eEncodingUint,
689dda28197Spatrick eFormatAddressInfo,
690dda28197Spatrick {64, 64, LLDB_INVALID_REGNUM, 64, 64},
691dda28197Spatrick nullptr,
692dda28197Spatrick nullptr,
693*f6aab3d8Srobert },
694dda28197Spatrick // PADDING {
695dda28197Spatrick {"p19",
696dda28197Spatrick "",
697dda28197Spatrick 4,
698dda28197Spatrick 0,
699dda28197Spatrick eEncodingInvalid,
700dda28197Spatrick eFormatInvalid,
701dda28197Spatrick {65, 65, LLDB_INVALID_REGNUM, 65, 65},
702dda28197Spatrick nullptr,
703dda28197Spatrick nullptr,
704*f6aab3d8Srobert },
705dda28197Spatrick // }
706dda28197Spatrick {"stid",
707dda28197Spatrick "",
708dda28197Spatrick 4,
709dda28197Spatrick 0,
710dda28197Spatrick eEncodingUint,
711dda28197Spatrick eFormatAddressInfo,
712dda28197Spatrick {66, 66, LLDB_INVALID_REGNUM, 66, 66},
713dda28197Spatrick nullptr,
714dda28197Spatrick nullptr,
715*f6aab3d8Srobert },
716dda28197Spatrick {"elr",
717dda28197Spatrick "",
718dda28197Spatrick 4,
719dda28197Spatrick 0,
720dda28197Spatrick eEncodingUint,
721dda28197Spatrick eFormatAddressInfo,
722dda28197Spatrick {67, 67, LLDB_INVALID_REGNUM, 67, 67},
723dda28197Spatrick nullptr,
724dda28197Spatrick nullptr,
725*f6aab3d8Srobert },
726dda28197Spatrick {"badva0",
727dda28197Spatrick "",
728dda28197Spatrick 4,
729dda28197Spatrick 0,
730dda28197Spatrick eEncodingUint,
731dda28197Spatrick eFormatAddressInfo,
732dda28197Spatrick {68, 68, LLDB_INVALID_REGNUM, 68, 68},
733dda28197Spatrick nullptr,
734dda28197Spatrick nullptr,
735*f6aab3d8Srobert },
736dda28197Spatrick {"badva1",
737dda28197Spatrick "",
738dda28197Spatrick 4,
739dda28197Spatrick 0,
740dda28197Spatrick eEncodingUint,
741dda28197Spatrick eFormatAddressInfo,
742dda28197Spatrick {69, 69, LLDB_INVALID_REGNUM, 69, 69},
743dda28197Spatrick nullptr,
744dda28197Spatrick nullptr,
745*f6aab3d8Srobert },
746dda28197Spatrick {"ssr",
747dda28197Spatrick "",
748dda28197Spatrick 4,
749dda28197Spatrick 0,
750dda28197Spatrick eEncodingUint,
751dda28197Spatrick eFormatAddressInfo,
752dda28197Spatrick {70, 70, LLDB_INVALID_REGNUM, 70, 70},
753dda28197Spatrick nullptr,
754dda28197Spatrick nullptr,
755*f6aab3d8Srobert },
756dda28197Spatrick {"ccr",
757dda28197Spatrick "",
758dda28197Spatrick 4,
759dda28197Spatrick 0,
760dda28197Spatrick eEncodingUint,
761dda28197Spatrick eFormatAddressInfo,
762dda28197Spatrick {71, 71, LLDB_INVALID_REGNUM, 71, 71},
763dda28197Spatrick nullptr,
764dda28197Spatrick nullptr,
765*f6aab3d8Srobert },
766dda28197Spatrick {"htid",
767dda28197Spatrick "",
768dda28197Spatrick 4,
769dda28197Spatrick 0,
770dda28197Spatrick eEncodingUint,
771dda28197Spatrick eFormatAddressInfo,
772dda28197Spatrick {72, 72, LLDB_INVALID_REGNUM, 72, 72},
773dda28197Spatrick nullptr,
774dda28197Spatrick nullptr,
775*f6aab3d8Srobert },
776dda28197Spatrick // PADDING {
777dda28197Spatrick {"p20",
778dda28197Spatrick "",
779dda28197Spatrick 4,
780dda28197Spatrick 0,
781dda28197Spatrick eEncodingInvalid,
782dda28197Spatrick eFormatInvalid,
783dda28197Spatrick {73, 73, LLDB_INVALID_REGNUM, 73, 73},
784dda28197Spatrick nullptr,
785dda28197Spatrick nullptr,
786*f6aab3d8Srobert },
787dda28197Spatrick // }
788dda28197Spatrick {"imask",
789dda28197Spatrick "",
790dda28197Spatrick 4,
791dda28197Spatrick 0,
792dda28197Spatrick eEncodingUint,
793dda28197Spatrick eFormatAddressInfo,
794dda28197Spatrick {74, 74, LLDB_INVALID_REGNUM, 74, 74},
795dda28197Spatrick nullptr,
796dda28197Spatrick nullptr,
797*f6aab3d8Srobert },
798dda28197Spatrick // PADDING {
799dda28197Spatrick {"p21",
800dda28197Spatrick "",
801dda28197Spatrick 4,
802dda28197Spatrick 0,
803dda28197Spatrick eEncodingInvalid,
804dda28197Spatrick eFormatInvalid,
805dda28197Spatrick {75, 75, LLDB_INVALID_REGNUM, 75, 75},
806dda28197Spatrick nullptr,
807dda28197Spatrick nullptr,
808*f6aab3d8Srobert },
809dda28197Spatrick {"p22",
810dda28197Spatrick "",
811dda28197Spatrick 4,
812dda28197Spatrick 0,
813dda28197Spatrick eEncodingInvalid,
814dda28197Spatrick eFormatInvalid,
815dda28197Spatrick {76, 76, LLDB_INVALID_REGNUM, 76, 76},
816dda28197Spatrick nullptr,
817dda28197Spatrick nullptr,
818*f6aab3d8Srobert },
819dda28197Spatrick {"p23",
820dda28197Spatrick "",
821dda28197Spatrick 4,
822dda28197Spatrick 0,
823dda28197Spatrick eEncodingInvalid,
824dda28197Spatrick eFormatInvalid,
825dda28197Spatrick {77, 77, LLDB_INVALID_REGNUM, 77, 77},
826dda28197Spatrick nullptr,
827dda28197Spatrick nullptr,
828*f6aab3d8Srobert },
829dda28197Spatrick {"p24",
830dda28197Spatrick "",
831dda28197Spatrick 4,
832dda28197Spatrick 0,
833dda28197Spatrick eEncodingInvalid,
834dda28197Spatrick eFormatInvalid,
835dda28197Spatrick {78, 78, LLDB_INVALID_REGNUM, 78, 78},
836dda28197Spatrick nullptr,
837dda28197Spatrick nullptr,
838*f6aab3d8Srobert },
839dda28197Spatrick {"p25",
840dda28197Spatrick "",
841dda28197Spatrick 4,
842dda28197Spatrick 0,
843dda28197Spatrick eEncodingInvalid,
844dda28197Spatrick eFormatInvalid,
845dda28197Spatrick {79, 79, LLDB_INVALID_REGNUM, 79, 79},
846dda28197Spatrick nullptr,
847dda28197Spatrick nullptr,
848*f6aab3d8Srobert },
849dda28197Spatrick // }
850dda28197Spatrick {"g0",
851dda28197Spatrick "",
852dda28197Spatrick 4,
853dda28197Spatrick 0,
854dda28197Spatrick eEncodingUint,
855dda28197Spatrick eFormatAddressInfo,
856dda28197Spatrick {80, 80, LLDB_INVALID_REGNUM, 80, 80},
857dda28197Spatrick nullptr,
858dda28197Spatrick nullptr,
859*f6aab3d8Srobert },
860dda28197Spatrick {"g1",
861dda28197Spatrick "",
862dda28197Spatrick 4,
863dda28197Spatrick 0,
864dda28197Spatrick eEncodingUint,
865dda28197Spatrick eFormatAddressInfo,
866dda28197Spatrick {81, 81, LLDB_INVALID_REGNUM, 81, 81},
867dda28197Spatrick nullptr,
868dda28197Spatrick nullptr,
869*f6aab3d8Srobert },
870dda28197Spatrick {"g2",
871dda28197Spatrick "",
872dda28197Spatrick 4,
873dda28197Spatrick 0,
874dda28197Spatrick eEncodingUint,
875dda28197Spatrick eFormatAddressInfo,
876dda28197Spatrick {82, 82, LLDB_INVALID_REGNUM, 82, 82},
877dda28197Spatrick nullptr,
878dda28197Spatrick nullptr,
879*f6aab3d8Srobert },
880dda28197Spatrick {"g3",
881dda28197Spatrick "",
882dda28197Spatrick 4,
883dda28197Spatrick 0,
884dda28197Spatrick eEncodingUint,
885dda28197Spatrick eFormatAddressInfo,
886dda28197Spatrick {83, 83, LLDB_INVALID_REGNUM, 83, 83},
887dda28197Spatrick nullptr,
888dda28197Spatrick nullptr,
889*f6aab3d8Srobert }};
890dda28197Spatrick
891dda28197Spatrick static const uint32_t k_num_register_infos =
892dda28197Spatrick sizeof(g_register_infos) / sizeof(RegisterInfo);
893dda28197Spatrick
894dda28197Spatrick const lldb_private::RegisterInfo *
GetRegisterInfoArray(uint32_t & count)895dda28197Spatrick ABISysV_hexagon::GetRegisterInfoArray(uint32_t &count) {
896dda28197Spatrick count = k_num_register_infos;
897dda28197Spatrick return g_register_infos;
898dda28197Spatrick }
899dda28197Spatrick
900dda28197Spatrick /*
901dda28197Spatrick http://en.wikipedia.org/wiki/Red_zone_%28computing%29
902dda28197Spatrick
903dda28197Spatrick In computing, a red zone is a fixed size area in memory beyond the stack
904dda28197Spatrick pointer that has not been
905dda28197Spatrick "allocated". This region of memory is not to be modified by
906dda28197Spatrick interrupt/exception/signal handlers.
907dda28197Spatrick This allows the space to be used for temporary data without the extra
908dda28197Spatrick overhead of modifying the
909dda28197Spatrick stack pointer. The x86-64 ABI mandates a 128 byte red zone.[1] The OpenRISC
910dda28197Spatrick toolchain assumes a
911dda28197Spatrick 128 byte red zone though it is not documented.
912dda28197Spatrick */
GetRedZoneSize() const913dda28197Spatrick size_t ABISysV_hexagon::GetRedZoneSize() const { return 0; }
914dda28197Spatrick
915dda28197Spatrick // Static Functions
916dda28197Spatrick
917dda28197Spatrick ABISP
CreateInstance(lldb::ProcessSP process_sp,const ArchSpec & arch)918dda28197Spatrick ABISysV_hexagon::CreateInstance(lldb::ProcessSP process_sp, const ArchSpec &arch) {
919dda28197Spatrick if (arch.GetTriple().getArch() == llvm::Triple::hexagon) {
920dda28197Spatrick return ABISP(
921dda28197Spatrick new ABISysV_hexagon(std::move(process_sp), MakeMCRegisterInfo(arch)));
922dda28197Spatrick }
923dda28197Spatrick return ABISP();
924dda28197Spatrick }
925dda28197Spatrick
PrepareTrivialCall(Thread & thread,lldb::addr_t sp,lldb::addr_t pc,lldb::addr_t ra,llvm::ArrayRef<addr_t> args) const926dda28197Spatrick bool ABISysV_hexagon::PrepareTrivialCall(Thread &thread, lldb::addr_t sp,
927dda28197Spatrick lldb::addr_t pc, lldb::addr_t ra,
928dda28197Spatrick llvm::ArrayRef<addr_t> args) const {
929dda28197Spatrick // we don't use the traditional trivial call specialized for jit
930dda28197Spatrick return false;
931dda28197Spatrick }
932dda28197Spatrick
933dda28197Spatrick /*
934dda28197Spatrick
935dda28197Spatrick // AD:
936dda28197Spatrick // . safeguard the current stack
937dda28197Spatrick // . how can we know that the called function will create its own frame
938dda28197Spatrick properly?
939dda28197Spatrick // . we could manually make a new stack first:
940dda28197Spatrick // 2. push RA
941dda28197Spatrick // 3. push FP
942dda28197Spatrick // 4. FP = SP
943dda28197Spatrick // 5. SP = SP ( since no locals in our temp frame )
944dda28197Spatrick
945dda28197Spatrick // AD 6/05/2014
946dda28197Spatrick // . variable argument list parameters are not passed via registers, they are
947dda28197Spatrick passed on
948dda28197Spatrick // the stack. This presents us with a problem, since we need to know when
949dda28197Spatrick the valist
950dda28197Spatrick // starts. Currently I can find out if a function is varg, but not how many
951dda28197Spatrick // real parameters it takes. Thus I don't know when to start spilling the
952dda28197Spatrick vargs. For
953dda28197Spatrick // the time being, to progress, I will assume that it takes on real parameter
954dda28197Spatrick before
955dda28197Spatrick // the vargs list starts.
956dda28197Spatrick
957dda28197Spatrick // AD 06/05/2014
958dda28197Spatrick // . how do we adhere to the stack alignment requirements
959dda28197Spatrick
960dda28197Spatrick // AD 06/05/2014
961dda28197Spatrick // . handle 64bit values and their register / stack requirements
962dda28197Spatrick
963dda28197Spatrick */
964dda28197Spatrick #define HEX_ABI_DEBUG 0
PrepareTrivialCall(Thread & thread,lldb::addr_t sp,lldb::addr_t pc,lldb::addr_t ra,llvm::Type & prototype,llvm::ArrayRef<ABI::CallArgument> args) const965dda28197Spatrick bool ABISysV_hexagon::PrepareTrivialCall(
966dda28197Spatrick Thread &thread, lldb::addr_t sp, lldb::addr_t pc, lldb::addr_t ra,
967dda28197Spatrick llvm::Type &prototype, llvm::ArrayRef<ABI::CallArgument> args) const {
968dda28197Spatrick // default number of register passed arguments for varg functions
969dda28197Spatrick const int nVArgRegParams = 1;
970dda28197Spatrick Status error;
971dda28197Spatrick
972dda28197Spatrick // grab the process so we have access to the memory for spilling
973dda28197Spatrick lldb::ProcessSP proc = thread.GetProcess();
974dda28197Spatrick
975dda28197Spatrick // get the register context for modifying all of the registers
976dda28197Spatrick RegisterContext *reg_ctx = thread.GetRegisterContext().get();
977dda28197Spatrick if (!reg_ctx)
978dda28197Spatrick return false;
979dda28197Spatrick
980dda28197Spatrick uint32_t pc_reg = reg_ctx->ConvertRegisterKindToRegisterNumber(
981dda28197Spatrick eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC);
982dda28197Spatrick if (pc_reg == LLDB_INVALID_REGNUM)
983dda28197Spatrick return false;
984dda28197Spatrick
985dda28197Spatrick uint32_t ra_reg = reg_ctx->ConvertRegisterKindToRegisterNumber(
986dda28197Spatrick eRegisterKindGeneric, LLDB_REGNUM_GENERIC_RA);
987dda28197Spatrick if (ra_reg == LLDB_INVALID_REGNUM)
988dda28197Spatrick return false;
989dda28197Spatrick
990dda28197Spatrick uint32_t sp_reg = reg_ctx->ConvertRegisterKindToRegisterNumber(
991dda28197Spatrick eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP);
992dda28197Spatrick if (sp_reg == LLDB_INVALID_REGNUM)
993dda28197Spatrick return false;
994dda28197Spatrick
995dda28197Spatrick // push host data onto target
996dda28197Spatrick for (size_t i = 0; i < args.size(); i++) {
997dda28197Spatrick const ABI::CallArgument &arg = args[i];
998dda28197Spatrick // skip over target values
999dda28197Spatrick if (arg.type == ABI::CallArgument::TargetValue)
1000dda28197Spatrick continue;
1001dda28197Spatrick // round up to 8 byte multiple
1002dda28197Spatrick size_t argSize = (arg.size | 0x7) + 1;
1003dda28197Spatrick
1004dda28197Spatrick // create space on the stack for this data
1005dda28197Spatrick sp -= argSize;
1006dda28197Spatrick
1007dda28197Spatrick // write this argument onto the stack of the host process
1008dda28197Spatrick proc->WriteMemory(sp, arg.data_up.get(), arg.size, error);
1009dda28197Spatrick if (error.Fail())
1010dda28197Spatrick return false;
1011dda28197Spatrick
1012dda28197Spatrick // update the argument with the target pointer
1013dda28197Spatrick // XXX: This is a gross hack for getting around the const
1014dda28197Spatrick *const_cast<lldb::addr_t *>(&arg.value) = sp;
1015dda28197Spatrick }
1016dda28197Spatrick
1017dda28197Spatrick #if HEX_ABI_DEBUG
1018dda28197Spatrick // print the original stack pointer
1019dda28197Spatrick printf("sp : %04" PRIx64 " \n", sp);
1020dda28197Spatrick #endif
1021dda28197Spatrick
1022dda28197Spatrick // make sure number of parameters matches prototype
1023dda28197Spatrick assert(prototype.getFunctionNumParams() == args.size());
1024dda28197Spatrick
1025dda28197Spatrick // check if this is a variable argument function
1026dda28197Spatrick bool isVArg = prototype.isFunctionVarArg();
1027dda28197Spatrick
1028dda28197Spatrick // number of arguments passed by register
1029dda28197Spatrick int nRegArgs = nVArgRegParams;
1030dda28197Spatrick if (!isVArg) {
1031dda28197Spatrick // number of arguments is limited by [R0 : R5] space
1032dda28197Spatrick nRegArgs = args.size();
1033dda28197Spatrick if (nRegArgs > 6)
1034dda28197Spatrick nRegArgs = 6;
1035dda28197Spatrick }
1036dda28197Spatrick
1037dda28197Spatrick // pass arguments that are passed via registers
1038dda28197Spatrick for (int i = 0; i < nRegArgs; i++) {
1039dda28197Spatrick // get the parameter as a u32
1040dda28197Spatrick uint32_t param = (uint32_t)args[i].value;
1041dda28197Spatrick // write argument into register
1042dda28197Spatrick if (!reg_ctx->WriteRegisterFromUnsigned(i, param))
1043dda28197Spatrick return false;
1044dda28197Spatrick }
1045dda28197Spatrick
1046dda28197Spatrick // number of arguments to spill onto stack
1047dda28197Spatrick int nSpillArgs = args.size() - nRegArgs;
1048dda28197Spatrick // make space on the stack for arguments
1049dda28197Spatrick sp -= 4 * nSpillArgs;
1050dda28197Spatrick // align stack on an 8 byte boundary
1051dda28197Spatrick if (sp & 7)
1052dda28197Spatrick sp -= 4;
1053dda28197Spatrick
1054dda28197Spatrick // arguments that are passed on the stack
1055dda28197Spatrick for (size_t i = nRegArgs, offs = 0; i < args.size(); i++) {
1056dda28197Spatrick // get the parameter as a u32
1057dda28197Spatrick uint32_t param = (uint32_t)args[i].value;
1058dda28197Spatrick // write argument to stack
1059dda28197Spatrick proc->WriteMemory(sp + offs, (void *)¶m, sizeof(param), error);
1060dda28197Spatrick if (!error.Success())
1061dda28197Spatrick return false;
1062dda28197Spatrick //
1063dda28197Spatrick offs += 4;
1064dda28197Spatrick }
1065dda28197Spatrick
1066dda28197Spatrick // update registers with current function call state
1067dda28197Spatrick reg_ctx->WriteRegisterFromUnsigned(pc_reg, pc);
1068dda28197Spatrick reg_ctx->WriteRegisterFromUnsigned(ra_reg, ra);
1069dda28197Spatrick reg_ctx->WriteRegisterFromUnsigned(sp_reg, sp);
1070dda28197Spatrick
1071dda28197Spatrick #if HEX_ABI_DEBUG
1072dda28197Spatrick // quick and dirty stack dumper for debugging
1073dda28197Spatrick for (int i = -8; i < 8; i++) {
1074dda28197Spatrick uint32_t data = 0;
1075dda28197Spatrick lldb::addr_t addr = sp + i * 4;
1076dda28197Spatrick proc->ReadMemory(addr, (void *)&data, sizeof(data), error);
1077dda28197Spatrick printf("\n0x%04" PRIx64 " 0x%08x ", addr, data);
1078dda28197Spatrick if (i == 0)
1079dda28197Spatrick printf("<<-- sp");
1080dda28197Spatrick }
1081dda28197Spatrick printf("\n");
1082dda28197Spatrick #endif
1083dda28197Spatrick
1084dda28197Spatrick return true;
1085dda28197Spatrick }
1086dda28197Spatrick
GetArgumentValues(Thread & thread,ValueList & values) const1087dda28197Spatrick bool ABISysV_hexagon::GetArgumentValues(Thread &thread,
1088dda28197Spatrick ValueList &values) const {
1089dda28197Spatrick return false;
1090dda28197Spatrick }
1091dda28197Spatrick
1092dda28197Spatrick Status
SetReturnValueObject(lldb::StackFrameSP & frame_sp,lldb::ValueObjectSP & new_value_sp)1093dda28197Spatrick ABISysV_hexagon::SetReturnValueObject(lldb::StackFrameSP &frame_sp,
1094dda28197Spatrick lldb::ValueObjectSP &new_value_sp) {
1095dda28197Spatrick Status error;
1096dda28197Spatrick return error;
1097dda28197Spatrick }
1098dda28197Spatrick
GetReturnValueObjectSimple(Thread & thread,CompilerType & return_compiler_type) const1099dda28197Spatrick ValueObjectSP ABISysV_hexagon::GetReturnValueObjectSimple(
1100dda28197Spatrick Thread &thread, CompilerType &return_compiler_type) const {
1101dda28197Spatrick ValueObjectSP return_valobj_sp;
1102dda28197Spatrick return return_valobj_sp;
1103dda28197Spatrick }
1104dda28197Spatrick
GetReturnValueObjectImpl(Thread & thread,CompilerType & return_compiler_type) const1105dda28197Spatrick ValueObjectSP ABISysV_hexagon::GetReturnValueObjectImpl(
1106dda28197Spatrick Thread &thread, CompilerType &return_compiler_type) const {
1107dda28197Spatrick ValueObjectSP return_valobj_sp;
1108dda28197Spatrick return return_valobj_sp;
1109dda28197Spatrick }
1110dda28197Spatrick
1111dda28197Spatrick // called when we are on the first instruction of a new function for hexagon
1112dda28197Spatrick // the return address is in RA (R31)
CreateFunctionEntryUnwindPlan(UnwindPlan & unwind_plan)1113dda28197Spatrick bool ABISysV_hexagon::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) {
1114dda28197Spatrick unwind_plan.Clear();
1115dda28197Spatrick unwind_plan.SetRegisterKind(eRegisterKindGeneric);
1116dda28197Spatrick unwind_plan.SetReturnAddressRegister(LLDB_REGNUM_GENERIC_RA);
1117dda28197Spatrick
1118dda28197Spatrick UnwindPlan::RowSP row(new UnwindPlan::Row);
1119dda28197Spatrick
1120dda28197Spatrick // Our Call Frame Address is the stack pointer value
1121dda28197Spatrick row->GetCFAValue().SetIsRegisterPlusOffset(LLDB_REGNUM_GENERIC_SP, 4);
1122dda28197Spatrick row->SetOffset(0);
1123dda28197Spatrick
1124dda28197Spatrick // The previous PC is in the LR
1125dda28197Spatrick row->SetRegisterLocationToRegister(LLDB_REGNUM_GENERIC_PC,
1126dda28197Spatrick LLDB_REGNUM_GENERIC_RA, true);
1127dda28197Spatrick unwind_plan.AppendRow(row);
1128dda28197Spatrick
1129dda28197Spatrick unwind_plan.SetSourceName("hexagon at-func-entry default");
1130dda28197Spatrick unwind_plan.SetSourcedFromCompiler(eLazyBoolNo);
1131dda28197Spatrick return true;
1132dda28197Spatrick }
1133dda28197Spatrick
CreateDefaultUnwindPlan(UnwindPlan & unwind_plan)1134dda28197Spatrick bool ABISysV_hexagon::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) {
1135dda28197Spatrick unwind_plan.Clear();
1136dda28197Spatrick unwind_plan.SetRegisterKind(eRegisterKindGeneric);
1137dda28197Spatrick
1138dda28197Spatrick uint32_t fp_reg_num = LLDB_REGNUM_GENERIC_FP;
1139dda28197Spatrick uint32_t sp_reg_num = LLDB_REGNUM_GENERIC_SP;
1140dda28197Spatrick uint32_t pc_reg_num = LLDB_REGNUM_GENERIC_PC;
1141dda28197Spatrick
1142dda28197Spatrick UnwindPlan::RowSP row(new UnwindPlan::Row);
1143dda28197Spatrick
1144be691f3bSpatrick row->SetUnspecifiedRegistersAreUndefined(true);
1145dda28197Spatrick row->GetCFAValue().SetIsRegisterPlusOffset(LLDB_REGNUM_GENERIC_FP, 8);
1146dda28197Spatrick
1147dda28197Spatrick row->SetRegisterLocationToAtCFAPlusOffset(fp_reg_num, -8, true);
1148dda28197Spatrick row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, -4, true);
1149dda28197Spatrick row->SetRegisterLocationToIsCFAPlusOffset(sp_reg_num, 0, true);
1150dda28197Spatrick
1151dda28197Spatrick unwind_plan.AppendRow(row);
1152dda28197Spatrick unwind_plan.SetSourceName("hexagon default unwind plan");
1153dda28197Spatrick unwind_plan.SetSourcedFromCompiler(eLazyBoolNo);
1154dda28197Spatrick unwind_plan.SetUnwindPlanValidAtAllInstructions(eLazyBoolNo);
1155dda28197Spatrick unwind_plan.SetUnwindPlanForSignalTrap(eLazyBoolNo);
1156dda28197Spatrick return true;
1157dda28197Spatrick }
1158dda28197Spatrick
1159dda28197Spatrick /*
1160dda28197Spatrick Register Usage Saved By
1161dda28197Spatrick
1162dda28197Spatrick R0 - R5 parameters(a) -
1163dda28197Spatrick R6 - R15 Scratch(b) Caller
1164dda28197Spatrick R16 - R27 Scratch Callee
1165dda28197Spatrick R28 Scratch(b) Caller
1166dda28197Spatrick R29 - R31 Stack Frames Callee(c)
1167dda28197Spatrick P3:0 Processor State Caller
1168dda28197Spatrick
1169dda28197Spatrick a = the caller can change parameter values
1170dda28197Spatrick b = R14 - R15 and R28 are used by the procedure linkage table
1171dda28197Spatrick c = R29 - R31 are saved and restored by allocframe() and deallocframe()
1172dda28197Spatrick */
RegisterIsVolatile(const RegisterInfo * reg_info)1173dda28197Spatrick bool ABISysV_hexagon::RegisterIsVolatile(const RegisterInfo *reg_info) {
1174dda28197Spatrick return !RegisterIsCalleeSaved(reg_info);
1175dda28197Spatrick }
1176dda28197Spatrick
RegisterIsCalleeSaved(const RegisterInfo * reg_info)1177dda28197Spatrick bool ABISysV_hexagon::RegisterIsCalleeSaved(const RegisterInfo *reg_info) {
1178dda28197Spatrick int reg = ((reg_info->byte_offset) / 4);
1179dda28197Spatrick
1180dda28197Spatrick bool save = (reg >= 16) && (reg <= 27);
1181dda28197Spatrick save |= (reg >= 29) && (reg <= 32);
1182dda28197Spatrick
1183dda28197Spatrick return save;
1184dda28197Spatrick }
1185dda28197Spatrick
Initialize()1186dda28197Spatrick void ABISysV_hexagon::Initialize() {
1187dda28197Spatrick PluginManager::RegisterPlugin(GetPluginNameStatic(),
1188dda28197Spatrick "System V ABI for hexagon targets",
1189dda28197Spatrick CreateInstance);
1190dda28197Spatrick }
1191dda28197Spatrick
Terminate()1192dda28197Spatrick void ABISysV_hexagon::Terminate() {
1193dda28197Spatrick PluginManager::UnregisterPlugin(CreateInstance);
1194dda28197Spatrick }
1195dda28197Spatrick
1196dda28197Spatrick // get value object specialized to work with llvm IR types
1197dda28197Spatrick lldb::ValueObjectSP
GetReturnValueObjectImpl(lldb_private::Thread & thread,llvm::Type & retType) const1198dda28197Spatrick ABISysV_hexagon::GetReturnValueObjectImpl(lldb_private::Thread &thread,
1199dda28197Spatrick llvm::Type &retType) const {
1200dda28197Spatrick Value value;
1201dda28197Spatrick ValueObjectSP vObjSP;
1202dda28197Spatrick
1203dda28197Spatrick // get the current register context
1204dda28197Spatrick RegisterContext *reg_ctx = thread.GetRegisterContext().get();
1205dda28197Spatrick if (!reg_ctx)
1206dda28197Spatrick return vObjSP;
1207dda28197Spatrick
1208dda28197Spatrick // for now just pop R0 to find the return value
1209dda28197Spatrick const lldb_private::RegisterInfo *r0_info =
1210dda28197Spatrick reg_ctx->GetRegisterInfoAtIndex(0);
1211dda28197Spatrick if (r0_info == nullptr)
1212dda28197Spatrick return vObjSP;
1213dda28197Spatrick
1214dda28197Spatrick // void return type
1215dda28197Spatrick if (retType.isVoidTy()) {
1216dda28197Spatrick value.GetScalar() = 0;
1217dda28197Spatrick }
1218dda28197Spatrick // integer / pointer return type
1219dda28197Spatrick else if (retType.isIntegerTy() || retType.isPointerTy()) {
1220dda28197Spatrick // read r0 register value
1221dda28197Spatrick lldb_private::RegisterValue r0_value;
1222dda28197Spatrick if (!reg_ctx->ReadRegister(r0_info, r0_value))
1223dda28197Spatrick return vObjSP;
1224dda28197Spatrick
1225dda28197Spatrick // push r0 into value
1226dda28197Spatrick uint32_t r0_u32 = r0_value.GetAsUInt32();
1227dda28197Spatrick
1228dda28197Spatrick // account for integer size
1229dda28197Spatrick if (retType.isIntegerTy() && retType.isSized()) {
1230dda28197Spatrick uint64_t size = retType.getScalarSizeInBits();
1231dda28197Spatrick uint64_t mask = (1ull << size) - 1;
1232dda28197Spatrick // mask out higher order bits then the type we expect
1233dda28197Spatrick r0_u32 &= mask;
1234dda28197Spatrick }
1235dda28197Spatrick
1236dda28197Spatrick value.GetScalar() = r0_u32;
1237dda28197Spatrick }
1238dda28197Spatrick // unsupported return type
1239dda28197Spatrick else
1240dda28197Spatrick return vObjSP;
1241dda28197Spatrick
1242dda28197Spatrick // pack the value into a ValueObjectSP
1243dda28197Spatrick vObjSP = ValueObjectConstResult::Create(thread.GetStackFrameAtIndex(0).get(),
1244dda28197Spatrick value, ConstString(""));
1245dda28197Spatrick return vObjSP;
1246dda28197Spatrick }
1247