1#!/usr/bin/env python
2#===-- x86_64_target_definition.py -----------------------------*- C++ -*-===//
3#
4# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5# See https://llvm.org/LICENSE.txt for license information.
6# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7#
8#===----------------------------------------------------------------------===//
9
10#----------------------------------------------------------------------
11# DESCRIPTION
12#
13# This file can be used with the following setting:
14#   plugin.process.gdb-remote.target-definition-file
15# This setting should be used when you are trying to connect to a
16# remote GDB server that doesn't support any of the register discovery
17# packets that LLDB normally uses.
18#
19# Why is this necessary? LLDB doesn't require a new build of LLDB that
20# targets each new architecture you will debug with. Instead, all
21# architectures are supported and LLDB relies on extra GDB server
22# packets to discover the target we are connecting to so that is can
23# show the right registers for each target. This allows the GDB server
24# to change and add new registers without requiring a new LLDB build
25# just so we can see new registers.
26#
27# This file implements the x86_64 registers for the darwin version of
28# GDB and allows you to connect to servers that use this register set.
29#
30# USAGE
31#
32# (lldb) settings set plugin.process.gdb-remote.target-definition-file /path/to/x86_64_target_definition.py
33# (lldb) gdb-remote other.baz.com:1234
34#
35# The target definition file will get used if and only if the
36# qRegisterInfo packets are not supported when connecting to a remote
37# GDB server.
38#----------------------------------------------------------------------
39from lldb import *
40
41# Compiler and DWARF register numbers
42name_to_gcc_dwarf_regnum = {
43    'rax': 0,
44    'rdx': 1,
45    'rcx': 2,
46    'rbx': 3,
47    'rsi': 4,
48    'rdi': 5,
49    'rbp': 6,
50    'rsp': 7,
51    'r8': 8,
52    'r9': 9,
53    'r10': 10,
54    'r11': 11,
55    'r12': 12,
56    'r13': 13,
57    'r14': 14,
58    'r15': 15,
59    'rip': 16,
60    'xmm0': 17,
61    'xmm1': 18,
62    'xmm2': 19,
63    'xmm3': 20,
64    'xmm4': 21,
65    'xmm5': 22,
66    'xmm6': 23,
67    'xmm7': 24,
68    'xmm8': 25,
69    'xmm9': 26,
70    'xmm10': 27,
71    'xmm11': 28,
72    'xmm12': 29,
73    'xmm13': 30,
74    'xmm14': 31,
75    'xmm15': 32,
76    'stmm0': 33,
77    'stmm1': 34,
78    'stmm2': 35,
79    'stmm3': 36,
80    'stmm4': 37,
81    'stmm5': 38,
82    'stmm6': 39,
83    'stmm7': 30,
84    'ymm0': 41,
85    'ymm1': 42,
86    'ymm2': 43,
87    'ymm3': 44,
88    'ymm4': 45,
89    'ymm5': 46,
90    'ymm6': 47,
91    'ymm7': 48,
92    'ymm8': 49,
93    'ymm9': 40,
94    'ymm10': 41,
95    'ymm11': 42,
96    'ymm12': 43,
97    'ymm13': 44,
98    'ymm14': 45,
99    'ymm15': 46
100}
101
102name_to_gdb_regnum = {
103    'rax': 0,
104    'rbx': 1,
105    'rcx': 2,
106    'rdx': 3,
107    'rsi': 4,
108    'rdi': 5,
109    'rbp': 6,
110    'rsp': 7,
111    'r8': 8,
112    'r9': 9,
113    'r10': 10,
114    'r11': 11,
115    'r12': 12,
116    'r13': 13,
117    'r14': 14,
118    'r15': 15,
119    'rip': 16,
120    'rflags': 17,
121    'cs': 18,
122    'ss': 19,
123    'ds': 20,
124    'es': 21,
125    'fs': 22,
126    'gs': 23,
127    'stmm0': 24,
128    'stmm1': 25,
129    'stmm2': 26,
130    'stmm3': 27,
131    'stmm4': 28,
132    'stmm5': 29,
133    'stmm6': 30,
134    'stmm7': 31,
135    'fctrl': 32,
136    'fstat': 33,
137    'ftag': 34,
138    'fiseg': 35,
139    'fioff': 36,
140    'foseg': 37,
141    'fooff': 38,
142    'fop': 39,
143    'xmm0': 40,
144    'xmm1': 41,
145    'xmm2': 42,
146    'xmm3': 43,
147    'xmm4': 44,
148    'xmm5': 45,
149    'xmm6': 46,
150    'xmm7': 47,
151    'xmm8': 48,
152    'xmm9': 49,
153    'xmm10': 50,
154    'xmm11': 51,
155    'xmm12': 52,
156    'xmm13': 53,
157    'xmm14': 54,
158    'xmm15': 55,
159    'mxcsr': 56,
160    'ymm0': 57,
161    'ymm1': 58,
162    'ymm2': 59,
163    'ymm3': 60,
164    'ymm4': 61,
165    'ymm5': 62,
166    'ymm6': 63,
167    'ymm7': 64,
168    'ymm8': 65,
169    'ymm9': 66,
170    'ymm10': 67,
171    'ymm11': 68,
172    'ymm12': 69,
173    'ymm13': 70,
174    'ymm14': 71,
175    'ymm15': 72
176}
177
178name_to_generic_regnum = {
179    'rip': LLDB_REGNUM_GENERIC_PC,
180    'rsp': LLDB_REGNUM_GENERIC_SP,
181    'rbp': LLDB_REGNUM_GENERIC_FP,
182    'rdi': LLDB_REGNUM_GENERIC_ARG1,
183    'rsi': LLDB_REGNUM_GENERIC_ARG2,
184    'rdx': LLDB_REGNUM_GENERIC_ARG3,
185    'rcx': LLDB_REGNUM_GENERIC_ARG4,
186    'r8': LLDB_REGNUM_GENERIC_ARG5,
187    'r9': LLDB_REGNUM_GENERIC_ARG6
188}
189
190
191def get_reg_num(reg_num_dict, reg_name):
192    if reg_name in reg_num_dict:
193        return reg_num_dict[reg_name]
194    return LLDB_INVALID_REGNUM
195
196
197def get_reg_num(reg_num_dict, reg_name):
198    if reg_name in reg_num_dict:
199        return reg_num_dict[reg_name]
200    return LLDB_INVALID_REGNUM
201
202x86_64_register_infos = [
203    {'name': 'rax',
204     'set': 0,
205     'bitsize': 64,
206     'encoding': eEncodingUint,
207     'format': eFormatAddressInfo},
208    {'name': 'rbx',
209     'set': 0,
210     'bitsize': 64,
211     'encoding': eEncodingUint,
212     'format': eFormatAddressInfo},
213    {'name': 'rcx', 'set': 0, 'bitsize': 64, 'encoding': eEncodingUint,
214        'format': eFormatAddressInfo, 'alt-name': 'arg4'},
215    {'name': 'rdx', 'set': 0, 'bitsize': 64, 'encoding': eEncodingUint,
216        'format': eFormatAddressInfo, 'alt-name': 'arg3'},
217    {'name': 'rsi', 'set': 0, 'bitsize': 64, 'encoding': eEncodingUint,
218        'format': eFormatAddressInfo, 'alt-name': 'arg2'},
219    {'name': 'rdi', 'set': 0, 'bitsize': 64, 'encoding': eEncodingUint,
220        'format': eFormatAddressInfo, 'alt-name': 'arg1'},
221    {'name': 'rbp', 'set': 0, 'bitsize': 64, 'encoding': eEncodingUint,
222        'format': eFormatAddressInfo, 'alt-name': 'fp'},
223    {'name': 'rsp', 'set': 0, 'bitsize': 64, 'encoding': eEncodingUint,
224        'format': eFormatAddressInfo, 'alt-name': 'sp'},
225    {'name': 'r8', 'set': 0, 'bitsize': 64, 'encoding': eEncodingUint,
226        'format': eFormatAddressInfo, 'alt-name': 'arg5'},
227    {'name': 'r9', 'set': 0, 'bitsize': 64, 'encoding': eEncodingUint,
228        'format': eFormatAddressInfo, 'alt-name': 'arg6'},
229    {'name': 'r10',
230     'set': 0,
231     'bitsize': 64,
232     'encoding': eEncodingUint,
233     'format': eFormatAddressInfo},
234    {'name': 'r11',
235     'set': 0,
236     'bitsize': 64,
237     'encoding': eEncodingUint,
238     'format': eFormatAddressInfo},
239    {'name': 'r12',
240     'set': 0,
241     'bitsize': 64,
242     'encoding': eEncodingUint,
243     'format': eFormatAddressInfo},
244    {'name': 'r13',
245     'set': 0,
246     'bitsize': 64,
247     'encoding': eEncodingUint,
248     'format': eFormatAddressInfo},
249    {'name': 'r14',
250     'set': 0,
251     'bitsize': 64,
252     'encoding': eEncodingUint,
253     'format': eFormatAddressInfo},
254    {'name': 'r15',
255     'set': 0,
256     'bitsize': 64,
257     'encoding': eEncodingUint,
258     'format': eFormatAddressInfo},
259    {'name': 'rip', 'set': 0, 'bitsize': 64, 'encoding': eEncodingUint,
260        'format': eFormatAddressInfo, 'alt-name': 'pc'},
261    {'name': 'rflags', 'set': 0, 'bitsize': 32,
262        'encoding': eEncodingUint, 'format': eFormatHex},
263    {'name': 'cs', 'set': 0, 'bitsize': 32,
264        'encoding': eEncodingUint, 'format': eFormatHex},
265    {'name': 'ss', 'set': 0, 'bitsize': 32,
266        'encoding': eEncodingUint, 'format': eFormatHex},
267    {'name': 'ds', 'set': 0, 'bitsize': 32,
268        'encoding': eEncodingUint, 'format': eFormatHex},
269    {'name': 'es', 'set': 0, 'bitsize': 32,
270        'encoding': eEncodingUint, 'format': eFormatHex},
271    {'name': 'fs', 'set': 0, 'bitsize': 32,
272        'encoding': eEncodingUint, 'format': eFormatHex},
273    {'name': 'gs', 'set': 0, 'bitsize': 32,
274        'encoding': eEncodingUint, 'format': eFormatHex},
275    {'name': 'stmm0',
276     'set': 1,
277     'bitsize': 80,
278     'encoding': eEncodingVector,
279     'format': eFormatVectorOfUInt8},
280    {'name': 'stmm1',
281     'set': 1,
282     'bitsize': 80,
283     'encoding': eEncodingVector,
284     'format': eFormatVectorOfUInt8},
285    {'name': 'stmm2',
286     'set': 1,
287     'bitsize': 80,
288     'encoding': eEncodingVector,
289     'format': eFormatVectorOfUInt8},
290    {'name': 'stmm3',
291     'set': 1,
292     'bitsize': 80,
293     'encoding': eEncodingVector,
294     'format': eFormatVectorOfUInt8},
295    {'name': 'stmm4',
296     'set': 1,
297     'bitsize': 80,
298     'encoding': eEncodingVector,
299     'format': eFormatVectorOfUInt8},
300    {'name': 'stmm5',
301     'set': 1,
302     'bitsize': 80,
303     'encoding': eEncodingVector,
304     'format': eFormatVectorOfUInt8},
305    {'name': 'stmm6',
306     'set': 1,
307     'bitsize': 80,
308     'encoding': eEncodingVector,
309     'format': eFormatVectorOfUInt8},
310    {'name': 'stmm7',
311     'set': 1,
312     'bitsize': 80,
313     'encoding': eEncodingVector,
314     'format': eFormatVectorOfUInt8},
315    {'name': 'fctrl', 'set': 1, 'bitsize': 32,
316        'encoding': eEncodingUint, 'format': eFormatHex},
317    {'name': 'fstat', 'set': 1, 'bitsize': 32,
318        'encoding': eEncodingUint, 'format': eFormatHex},
319    {'name': 'ftag', 'set': 1, 'bitsize': 32,
320        'encoding': eEncodingUint, 'format': eFormatHex},
321    {'name': 'fiseg', 'set': 1, 'bitsize': 32,
322        'encoding': eEncodingUint, 'format': eFormatHex},
323    {'name': 'fioff', 'set': 1, 'bitsize': 32,
324        'encoding': eEncodingUint, 'format': eFormatHex},
325    {'name': 'foseg', 'set': 1, 'bitsize': 32,
326        'encoding': eEncodingUint, 'format': eFormatHex},
327    {'name': 'fooff', 'set': 1, 'bitsize': 32,
328        'encoding': eEncodingUint, 'format': eFormatHex},
329    {'name': 'fop', 'set': 1, 'bitsize': 32,
330        'encoding': eEncodingUint, 'format': eFormatHex},
331    {'name': 'xmm0',
332     'set': 1,
333     'bitsize': 128,
334     'encoding': eEncodingVector,
335     'format': eFormatVectorOfUInt8},
336    {'name': 'xmm1',
337     'set': 1,
338     'bitsize': 128,
339     'encoding': eEncodingVector,
340     'format': eFormatVectorOfUInt8},
341    {'name': 'xmm2',
342     'set': 1,
343     'bitsize': 128,
344     'encoding': eEncodingVector,
345     'format': eFormatVectorOfUInt8},
346    {'name': 'xmm3',
347     'set': 1,
348     'bitsize': 128,
349     'encoding': eEncodingVector,
350     'format': eFormatVectorOfUInt8},
351    {'name': 'xmm4',
352     'set': 1,
353     'bitsize': 128,
354     'encoding': eEncodingVector,
355     'format': eFormatVectorOfUInt8},
356    {'name': 'xmm5',
357     'set': 1,
358     'bitsize': 128,
359     'encoding': eEncodingVector,
360     'format': eFormatVectorOfUInt8},
361    {'name': 'xmm6',
362     'set': 1,
363     'bitsize': 128,
364     'encoding': eEncodingVector,
365     'format': eFormatVectorOfUInt8},
366    {'name': 'xmm7',
367     'set': 1,
368     'bitsize': 128,
369     'encoding': eEncodingVector,
370     'format': eFormatVectorOfUInt8},
371    {'name': 'xmm8',
372     'set': 1,
373     'bitsize': 128,
374     'encoding': eEncodingVector,
375     'format': eFormatVectorOfUInt8},
376    {'name': 'xmm9',
377     'set': 1,
378     'bitsize': 128,
379     'encoding': eEncodingVector,
380     'format': eFormatVectorOfUInt8},
381    {'name': 'xmm10',
382     'set': 1,
383     'bitsize': 128,
384     'encoding': eEncodingVector,
385     'format': eFormatVectorOfUInt8},
386    {'name': 'xmm11',
387     'set': 1,
388     'bitsize': 128,
389     'encoding': eEncodingVector,
390     'format': eFormatVectorOfUInt8},
391    {'name': 'xmm12',
392     'set': 1,
393     'bitsize': 128,
394     'encoding': eEncodingVector,
395     'format': eFormatVectorOfUInt8},
396    {'name': 'xmm13',
397     'set': 1,
398     'bitsize': 128,
399     'encoding': eEncodingVector,
400     'format': eFormatVectorOfUInt8},
401    {'name': 'xmm14',
402     'set': 1,
403     'bitsize': 128,
404     'encoding': eEncodingVector,
405     'format': eFormatVectorOfUInt8},
406    {'name': 'xmm15',
407     'set': 1,
408     'bitsize': 128,
409     'encoding': eEncodingVector,
410     'format': eFormatVectorOfUInt8},
411    {'name': 'mxcsr', 'set': 1, 'bitsize': 32,
412        'encoding': eEncodingUint, 'format': eFormatHex},
413    # Registers that are contained in or composed of one of more other
414    # registers
415    {'name': 'eax',
416     'set': 0,
417     'bitsize': 32,
418     'encoding': eEncodingUint,
419     'format': eFormatHex,
420     'slice': 'rax[31:0]'},
421    {'name': 'ebx',
422     'set': 0,
423     'bitsize': 32,
424     'encoding': eEncodingUint,
425     'format': eFormatHex,
426     'slice': 'rbx[31:0]'},
427    {'name': 'ecx',
428     'set': 0,
429     'bitsize': 32,
430     'encoding': eEncodingUint,
431     'format': eFormatHex,
432     'slice': 'rcx[31:0]'},
433    {'name': 'edx',
434     'set': 0,
435     'bitsize': 32,
436     'encoding': eEncodingUint,
437     'format': eFormatHex,
438     'slice': 'rdx[31:0]'},
439    {'name': 'edi',
440     'set': 0,
441     'bitsize': 32,
442     'encoding': eEncodingUint,
443     'format': eFormatHex,
444     'slice': 'rdi[31:0]'},
445    {'name': 'esi',
446     'set': 0,
447     'bitsize': 32,
448     'encoding': eEncodingUint,
449     'format': eFormatHex,
450     'slice': 'rsi[31:0]'},
451    {'name': 'ebp',
452     'set': 0,
453     'bitsize': 32,
454     'encoding': eEncodingUint,
455     'format': eFormatHex,
456     'slice': 'rbp[31:0]'},
457    {'name': 'esp',
458     'set': 0,
459     'bitsize': 32,
460     'encoding': eEncodingUint,
461     'format': eFormatHex,
462     'slice': 'rsp[31:0]'},
463    {'name': 'r8d',
464     'set': 0,
465     'bitsize': 32,
466     'encoding': eEncodingUint,
467     'format': eFormatHex,
468     'slice': 'r8[31:0]'},
469    {'name': 'r9d',
470     'set': 0,
471     'bitsize': 32,
472     'encoding': eEncodingUint,
473     'format': eFormatHex,
474     'slice': 'r9[31:0]'},
475    {'name': 'r10d',
476     'set': 0,
477     'bitsize': 32,
478     'encoding': eEncodingUint,
479     'format': eFormatHex,
480     'slice': 'r10[31:0]'},
481    {'name': 'r11d',
482     'set': 0,
483     'bitsize': 32,
484     'encoding': eEncodingUint,
485     'format': eFormatHex,
486     'slice': 'r11[31:0]'},
487    {'name': 'r12d',
488     'set': 0,
489     'bitsize': 32,
490     'encoding': eEncodingUint,
491     'format': eFormatHex,
492     'slice': 'r12[31:0]'},
493    {'name': 'r13d',
494     'set': 0,
495     'bitsize': 32,
496     'encoding': eEncodingUint,
497     'format': eFormatHex,
498     'slice': 'r13[31:0]'},
499    {'name': 'r14d',
500     'set': 0,
501     'bitsize': 32,
502     'encoding': eEncodingUint,
503     'format': eFormatHex,
504     'slice': 'r14[31:0]'},
505    {'name': 'r15d',
506     'set': 0,
507     'bitsize': 32,
508     'encoding': eEncodingUint,
509     'format': eFormatHex,
510     'slice': 'r15[31:0]'},
511
512    {'name': 'ax',
513     'set': 0,
514     'bitsize': 16,
515     'encoding': eEncodingUint,
516     'format': eFormatHex,
517     'slice': 'rax[15:0]'},
518    {'name': 'bx',
519     'set': 0,
520     'bitsize': 16,
521     'encoding': eEncodingUint,
522     'format': eFormatHex,
523     'slice': 'rbx[15:0]'},
524    {'name': 'cx',
525     'set': 0,
526     'bitsize': 16,
527     'encoding': eEncodingUint,
528     'format': eFormatHex,
529     'slice': 'rcx[15:0]'},
530    {'name': 'dx',
531     'set': 0,
532     'bitsize': 16,
533     'encoding': eEncodingUint,
534     'format': eFormatHex,
535     'slice': 'rdx[15:0]'},
536    {'name': 'di',
537     'set': 0,
538     'bitsize': 16,
539     'encoding': eEncodingUint,
540     'format': eFormatHex,
541     'slice': 'rdi[15:0]'},
542    {'name': 'si',
543     'set': 0,
544     'bitsize': 16,
545     'encoding': eEncodingUint,
546     'format': eFormatHex,
547     'slice': 'rsi[15:0]'},
548    {'name': 'bp',
549     'set': 0,
550     'bitsize': 16,
551     'encoding': eEncodingUint,
552     'format': eFormatHex,
553     'slice': 'rbp[15:0]'},
554    {'name': 'sp',
555     'set': 0,
556     'bitsize': 16,
557     'encoding': eEncodingUint,
558     'format': eFormatHex,
559     'slice': 'rsp[15:0]'},
560    {'name': 'r8w',
561     'set': 0,
562     'bitsize': 16,
563     'encoding': eEncodingUint,
564     'format': eFormatHex,
565     'slice': 'r8[15:0]'},
566    {'name': 'r9w',
567     'set': 0,
568     'bitsize': 16,
569     'encoding': eEncodingUint,
570     'format': eFormatHex,
571     'slice': 'r9[15:0]'},
572    {'name': 'r10w',
573     'set': 0,
574     'bitsize': 16,
575     'encoding': eEncodingUint,
576     'format': eFormatHex,
577     'slice': 'r10[15:0]'},
578    {'name': 'r11w',
579     'set': 0,
580     'bitsize': 16,
581     'encoding': eEncodingUint,
582     'format': eFormatHex,
583     'slice': 'r11[15:0]'},
584    {'name': 'r12w',
585     'set': 0,
586     'bitsize': 16,
587     'encoding': eEncodingUint,
588     'format': eFormatHex,
589     'slice': 'r12[15:0]'},
590    {'name': 'r13w',
591     'set': 0,
592     'bitsize': 16,
593     'encoding': eEncodingUint,
594     'format': eFormatHex,
595     'slice': 'r13[15:0]'},
596    {'name': 'r14w',
597     'set': 0,
598     'bitsize': 16,
599     'encoding': eEncodingUint,
600     'format': eFormatHex,
601     'slice': 'r14[15:0]'},
602    {'name': 'r15w',
603     'set': 0,
604     'bitsize': 16,
605     'encoding': eEncodingUint,
606     'format': eFormatHex,
607     'slice': 'r15[15:0]'},
608
609    {'name': 'ah',
610     'set': 0,
611     'bitsize': 8,
612     'encoding': eEncodingUint,
613     'format': eFormatHex,
614     'slice': 'rax[15:8]'},
615    {'name': 'bh',
616     'set': 0,
617     'bitsize': 8,
618     'encoding': eEncodingUint,
619     'format': eFormatHex,
620     'slice': 'rbx[15:8]'},
621    {'name': 'ch',
622     'set': 0,
623     'bitsize': 8,
624     'encoding': eEncodingUint,
625     'format': eFormatHex,
626     'slice': 'rcx[15:8]'},
627    {'name': 'dh',
628     'set': 0,
629     'bitsize': 8,
630     'encoding': eEncodingUint,
631     'format': eFormatHex,
632     'slice': 'rdx[15:8]'},
633
634    {'name': 'al',
635     'set': 0,
636     'bitsize': 8,
637     'encoding': eEncodingUint,
638     'format': eFormatHex,
639     'slice': 'rax[7:0]'},
640    {'name': 'bl',
641     'set': 0,
642     'bitsize': 8,
643     'encoding': eEncodingUint,
644     'format': eFormatHex,
645     'slice': 'rbx[7:0]'},
646    {'name': 'cl',
647     'set': 0,
648     'bitsize': 8,
649     'encoding': eEncodingUint,
650     'format': eFormatHex,
651     'slice': 'rcx[7:0]'},
652    {'name': 'dl',
653     'set': 0,
654     'bitsize': 8,
655     'encoding': eEncodingUint,
656     'format': eFormatHex,
657     'slice': 'rdx[7:0]'},
658    {'name': 'dil',
659     'set': 0,
660     'bitsize': 8,
661     'encoding': eEncodingUint,
662     'format': eFormatHex,
663     'slice': 'rdi[7:0]'},
664    {'name': 'sil',
665     'set': 0,
666     'bitsize': 8,
667     'encoding': eEncodingUint,
668     'format': eFormatHex,
669     'slice': 'rsi[7:0]'},
670    {'name': 'bpl',
671     'set': 0,
672     'bitsize': 8,
673     'encoding': eEncodingUint,
674     'format': eFormatHex,
675     'slice': 'rbp[7:0]'},
676    {'name': 'spl',
677     'set': 0,
678     'bitsize': 8,
679     'encoding': eEncodingUint,
680     'format': eFormatHex,
681     'slice': 'rsp[7:0]'},
682    {'name': 'r8l',
683     'set': 0,
684     'bitsize': 8,
685     'encoding': eEncodingUint,
686     'format': eFormatHex,
687     'slice': 'r8[7:0]'},
688    {'name': 'r9l',
689     'set': 0,
690     'bitsize': 8,
691     'encoding': eEncodingUint,
692     'format': eFormatHex,
693     'slice': 'r9[7:0]'},
694    {'name': 'r10l',
695     'set': 0,
696     'bitsize': 8,
697     'encoding': eEncodingUint,
698     'format': eFormatHex,
699     'slice': 'r10[7:0]'},
700    {'name': 'r11l',
701     'set': 0,
702     'bitsize': 8,
703     'encoding': eEncodingUint,
704     'format': eFormatHex,
705     'slice': 'r11[7:0]'},
706    {'name': 'r12l',
707     'set': 0,
708     'bitsize': 8,
709     'encoding': eEncodingUint,
710     'format': eFormatHex,
711     'slice': 'r12[7:0]'},
712    {'name': 'r13l',
713     'set': 0,
714     'bitsize': 8,
715     'encoding': eEncodingUint,
716     'format': eFormatHex,
717     'slice': 'r13[7:0]'},
718    {'name': 'r14l',
719     'set': 0,
720     'bitsize': 8,
721     'encoding': eEncodingUint,
722     'format': eFormatHex,
723     'slice': 'r14[7:0]'},
724    {'name': 'r15l',
725     'set': 0,
726     'bitsize': 8,
727     'encoding': eEncodingUint,
728     'format': eFormatHex,
729     'slice': 'r15[7:0]'},
730]
731
732g_target_definition = None
733
734
735def get_target_definition():
736    global g_target_definition
737    if g_target_definition is None:
738        g_target_definition = {}
739        offset = 0
740        for reg_info in x86_64_register_infos:
741            reg_name = reg_info['name']
742
743            # Only fill in the offset if there is no 'slice' in the register
744            # info
745            if 'slice' not in reg_info and 'composite' not in reg_info:
746                reg_info['offset'] = offset
747                offset += reg_info['bitsize'] // 8
748
749            # Set the GCC/DWARF register number for this register if it has one
750            reg_num = get_reg_num(name_to_gcc_dwarf_regnum, reg_name)
751            if reg_num != LLDB_INVALID_REGNUM:
752                reg_info['gcc'] = reg_num
753                reg_info['dwarf'] = reg_num
754
755            # Set the generic register number for this register if it has one
756            reg_num = get_reg_num(name_to_generic_regnum, reg_name)
757            if reg_num != LLDB_INVALID_REGNUM:
758                reg_info['generic'] = reg_num
759
760            # Set the GDB register number for this register if it has one
761            reg_num = get_reg_num(name_to_gdb_regnum, reg_name)
762            if reg_num != LLDB_INVALID_REGNUM:
763                reg_info['gdb'] = reg_num
764
765        g_target_definition['sets'] = [
766            'General Purpose Registers',
767            'Floating Point Registers']
768        g_target_definition['registers'] = x86_64_register_infos
769        g_target_definition[
770            'host-info'] = {'triple': 'x86_64-apple-macosx', 'endian': eByteOrderLittle}
771        g_target_definition['g-packet-size'] = offset
772    return g_target_definition
773
774
775def get_dynamic_setting(target, setting_name):
776    if setting_name == 'gdb-server-target-definition':
777        return get_target_definition()
778