xref: /llvm-project/lldb/examples/python/x86_64_linux_target_definition.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
1#!/usr/bin/env python
2# ===-- x86_64_linux_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_linux_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
197x86_64_register_infos = [
198    {
199        "name": "rax",
200        "set": 0,
201        "bitsize": 64,
202        "encoding": eEncodingUint,
203        "format": eFormatAddressInfo,
204    },
205    {
206        "name": "rbx",
207        "set": 0,
208        "bitsize": 64,
209        "encoding": eEncodingUint,
210        "format": eFormatAddressInfo,
211    },
212    {
213        "name": "rcx",
214        "set": 0,
215        "bitsize": 64,
216        "encoding": eEncodingUint,
217        "format": eFormatAddressInfo,
218        "alt-name": "arg4",
219    },
220    {
221        "name": "rdx",
222        "set": 0,
223        "bitsize": 64,
224        "encoding": eEncodingUint,
225        "format": eFormatAddressInfo,
226        "alt-name": "arg3",
227    },
228    {
229        "name": "rsi",
230        "set": 0,
231        "bitsize": 64,
232        "encoding": eEncodingUint,
233        "format": eFormatAddressInfo,
234        "alt-name": "arg2",
235    },
236    {
237        "name": "rdi",
238        "set": 0,
239        "bitsize": 64,
240        "encoding": eEncodingUint,
241        "format": eFormatAddressInfo,
242        "alt-name": "arg1",
243    },
244    {
245        "name": "rbp",
246        "set": 0,
247        "bitsize": 64,
248        "encoding": eEncodingUint,
249        "format": eFormatAddressInfo,
250        "alt-name": "fp",
251    },
252    {
253        "name": "rsp",
254        "set": 0,
255        "bitsize": 64,
256        "encoding": eEncodingUint,
257        "format": eFormatAddressInfo,
258        "alt-name": "sp",
259    },
260    {
261        "name": "r8",
262        "set": 0,
263        "bitsize": 64,
264        "encoding": eEncodingUint,
265        "format": eFormatAddressInfo,
266        "alt-name": "arg5",
267    },
268    {
269        "name": "r9",
270        "set": 0,
271        "bitsize": 64,
272        "encoding": eEncodingUint,
273        "format": eFormatAddressInfo,
274        "alt-name": "arg6",
275    },
276    {
277        "name": "r10",
278        "set": 0,
279        "bitsize": 64,
280        "encoding": eEncodingUint,
281        "format": eFormatAddressInfo,
282    },
283    {
284        "name": "r11",
285        "set": 0,
286        "bitsize": 64,
287        "encoding": eEncodingUint,
288        "format": eFormatAddressInfo,
289    },
290    {
291        "name": "r12",
292        "set": 0,
293        "bitsize": 64,
294        "encoding": eEncodingUint,
295        "format": eFormatAddressInfo,
296    },
297    {
298        "name": "r13",
299        "set": 0,
300        "bitsize": 64,
301        "encoding": eEncodingUint,
302        "format": eFormatAddressInfo,
303    },
304    {
305        "name": "r14",
306        "set": 0,
307        "bitsize": 64,
308        "encoding": eEncodingUint,
309        "format": eFormatAddressInfo,
310    },
311    {
312        "name": "r15",
313        "set": 0,
314        "bitsize": 64,
315        "encoding": eEncodingUint,
316        "format": eFormatAddressInfo,
317    },
318    {
319        "name": "rip",
320        "set": 0,
321        "bitsize": 64,
322        "encoding": eEncodingUint,
323        "format": eFormatAddressInfo,
324        "alt-name": "pc",
325    },
326    {
327        "name": "rflags",
328        "set": 0,
329        "bitsize": 32,
330        "encoding": eEncodingUint,
331        "format": eFormatHex,
332    },
333    {
334        "name": "cs",
335        "set": 0,
336        "bitsize": 32,
337        "encoding": eEncodingUint,
338        "format": eFormatHex,
339    },
340    {
341        "name": "ss",
342        "set": 0,
343        "bitsize": 32,
344        "encoding": eEncodingUint,
345        "format": eFormatHex,
346    },
347    {
348        "name": "ds",
349        "set": 0,
350        "bitsize": 32,
351        "encoding": eEncodingUint,
352        "format": eFormatHex,
353    },
354    {
355        "name": "es",
356        "set": 0,
357        "bitsize": 32,
358        "encoding": eEncodingUint,
359        "format": eFormatHex,
360    },
361    {
362        "name": "fs",
363        "set": 0,
364        "bitsize": 32,
365        "encoding": eEncodingUint,
366        "format": eFormatHex,
367    },
368    {
369        "name": "gs",
370        "set": 0,
371        "bitsize": 32,
372        "encoding": eEncodingUint,
373        "format": eFormatHex,
374    },
375    {
376        "name": "stmm0",
377        "set": 1,
378        "bitsize": 80,
379        "encoding": eEncodingVector,
380        "format": eFormatVectorOfUInt8,
381    },
382    {
383        "name": "stmm1",
384        "set": 1,
385        "bitsize": 80,
386        "encoding": eEncodingVector,
387        "format": eFormatVectorOfUInt8,
388    },
389    {
390        "name": "stmm2",
391        "set": 1,
392        "bitsize": 80,
393        "encoding": eEncodingVector,
394        "format": eFormatVectorOfUInt8,
395    },
396    {
397        "name": "stmm3",
398        "set": 1,
399        "bitsize": 80,
400        "encoding": eEncodingVector,
401        "format": eFormatVectorOfUInt8,
402    },
403    {
404        "name": "stmm4",
405        "set": 1,
406        "bitsize": 80,
407        "encoding": eEncodingVector,
408        "format": eFormatVectorOfUInt8,
409    },
410    {
411        "name": "stmm5",
412        "set": 1,
413        "bitsize": 80,
414        "encoding": eEncodingVector,
415        "format": eFormatVectorOfUInt8,
416    },
417    {
418        "name": "stmm6",
419        "set": 1,
420        "bitsize": 80,
421        "encoding": eEncodingVector,
422        "format": eFormatVectorOfUInt8,
423    },
424    {
425        "name": "stmm7",
426        "set": 1,
427        "bitsize": 80,
428        "encoding": eEncodingVector,
429        "format": eFormatVectorOfUInt8,
430    },
431    {
432        "name": "fctrl",
433        "set": 1,
434        "bitsize": 32,
435        "encoding": eEncodingUint,
436        "format": eFormatHex,
437    },
438    {
439        "name": "fstat",
440        "set": 1,
441        "bitsize": 32,
442        "encoding": eEncodingUint,
443        "format": eFormatHex,
444    },
445    {
446        "name": "ftag",
447        "set": 1,
448        "bitsize": 32,
449        "encoding": eEncodingUint,
450        "format": eFormatHex,
451    },
452    {
453        "name": "fiseg",
454        "set": 1,
455        "bitsize": 32,
456        "encoding": eEncodingUint,
457        "format": eFormatHex,
458    },
459    {
460        "name": "fioff",
461        "set": 1,
462        "bitsize": 32,
463        "encoding": eEncodingUint,
464        "format": eFormatHex,
465    },
466    {
467        "name": "foseg",
468        "set": 1,
469        "bitsize": 32,
470        "encoding": eEncodingUint,
471        "format": eFormatHex,
472    },
473    {
474        "name": "fooff",
475        "set": 1,
476        "bitsize": 32,
477        "encoding": eEncodingUint,
478        "format": eFormatHex,
479    },
480    {
481        "name": "fop",
482        "set": 1,
483        "bitsize": 32,
484        "encoding": eEncodingUint,
485        "format": eFormatHex,
486    },
487    {
488        "name": "xmm0",
489        "set": 1,
490        "bitsize": 128,
491        "encoding": eEncodingVector,
492        "format": eFormatVectorOfUInt8,
493    },
494    {
495        "name": "xmm1",
496        "set": 1,
497        "bitsize": 128,
498        "encoding": eEncodingVector,
499        "format": eFormatVectorOfUInt8,
500    },
501    {
502        "name": "xmm2",
503        "set": 1,
504        "bitsize": 128,
505        "encoding": eEncodingVector,
506        "format": eFormatVectorOfUInt8,
507    },
508    {
509        "name": "xmm3",
510        "set": 1,
511        "bitsize": 128,
512        "encoding": eEncodingVector,
513        "format": eFormatVectorOfUInt8,
514    },
515    {
516        "name": "xmm4",
517        "set": 1,
518        "bitsize": 128,
519        "encoding": eEncodingVector,
520        "format": eFormatVectorOfUInt8,
521    },
522    {
523        "name": "xmm5",
524        "set": 1,
525        "bitsize": 128,
526        "encoding": eEncodingVector,
527        "format": eFormatVectorOfUInt8,
528    },
529    {
530        "name": "xmm6",
531        "set": 1,
532        "bitsize": 128,
533        "encoding": eEncodingVector,
534        "format": eFormatVectorOfUInt8,
535    },
536    {
537        "name": "xmm7",
538        "set": 1,
539        "bitsize": 128,
540        "encoding": eEncodingVector,
541        "format": eFormatVectorOfUInt8,
542    },
543    {
544        "name": "xmm8",
545        "set": 1,
546        "bitsize": 128,
547        "encoding": eEncodingVector,
548        "format": eFormatVectorOfUInt8,
549    },
550    {
551        "name": "xmm9",
552        "set": 1,
553        "bitsize": 128,
554        "encoding": eEncodingVector,
555        "format": eFormatVectorOfUInt8,
556    },
557    {
558        "name": "xmm10",
559        "set": 1,
560        "bitsize": 128,
561        "encoding": eEncodingVector,
562        "format": eFormatVectorOfUInt8,
563    },
564    {
565        "name": "xmm11",
566        "set": 1,
567        "bitsize": 128,
568        "encoding": eEncodingVector,
569        "format": eFormatVectorOfUInt8,
570    },
571    {
572        "name": "xmm12",
573        "set": 1,
574        "bitsize": 128,
575        "encoding": eEncodingVector,
576        "format": eFormatVectorOfUInt8,
577    },
578    {
579        "name": "xmm13",
580        "set": 1,
581        "bitsize": 128,
582        "encoding": eEncodingVector,
583        "format": eFormatVectorOfUInt8,
584    },
585    {
586        "name": "xmm14",
587        "set": 1,
588        "bitsize": 128,
589        "encoding": eEncodingVector,
590        "format": eFormatVectorOfUInt8,
591    },
592    {
593        "name": "xmm15",
594        "set": 1,
595        "bitsize": 128,
596        "encoding": eEncodingVector,
597        "format": eFormatVectorOfUInt8,
598    },
599    {
600        "name": "mxcsr",
601        "set": 1,
602        "bitsize": 32,
603        "encoding": eEncodingUint,
604        "format": eFormatHex,
605    },
606    {
607        "name": "orig_rax",
608        "set": 1,
609        "bitsize": 64,
610        "encoding": eEncodingUint,
611        "format": eFormatHex,
612    },
613    # Registers that are contained in or composed of one of more other
614    # registers
615    {
616        "name": "eax",
617        "set": 0,
618        "bitsize": 32,
619        "encoding": eEncodingUint,
620        "format": eFormatHex,
621        "slice": "rax[31:0]",
622    },
623    {
624        "name": "ebx",
625        "set": 0,
626        "bitsize": 32,
627        "encoding": eEncodingUint,
628        "format": eFormatHex,
629        "slice": "rbx[31:0]",
630    },
631    {
632        "name": "ecx",
633        "set": 0,
634        "bitsize": 32,
635        "encoding": eEncodingUint,
636        "format": eFormatHex,
637        "slice": "rcx[31:0]",
638    },
639    {
640        "name": "edx",
641        "set": 0,
642        "bitsize": 32,
643        "encoding": eEncodingUint,
644        "format": eFormatHex,
645        "slice": "rdx[31:0]",
646    },
647    {
648        "name": "edi",
649        "set": 0,
650        "bitsize": 32,
651        "encoding": eEncodingUint,
652        "format": eFormatHex,
653        "slice": "rdi[31:0]",
654    },
655    {
656        "name": "esi",
657        "set": 0,
658        "bitsize": 32,
659        "encoding": eEncodingUint,
660        "format": eFormatHex,
661        "slice": "rsi[31:0]",
662    },
663    {
664        "name": "ebp",
665        "set": 0,
666        "bitsize": 32,
667        "encoding": eEncodingUint,
668        "format": eFormatHex,
669        "slice": "rbp[31:0]",
670    },
671    {
672        "name": "esp",
673        "set": 0,
674        "bitsize": 32,
675        "encoding": eEncodingUint,
676        "format": eFormatHex,
677        "slice": "rsp[31:0]",
678    },
679    {
680        "name": "r8d",
681        "set": 0,
682        "bitsize": 32,
683        "encoding": eEncodingUint,
684        "format": eFormatHex,
685        "slice": "r8[31:0]",
686    },
687    {
688        "name": "r9d",
689        "set": 0,
690        "bitsize": 32,
691        "encoding": eEncodingUint,
692        "format": eFormatHex,
693        "slice": "r9[31:0]",
694    },
695    {
696        "name": "r10d",
697        "set": 0,
698        "bitsize": 32,
699        "encoding": eEncodingUint,
700        "format": eFormatHex,
701        "slice": "r10[31:0]",
702    },
703    {
704        "name": "r11d",
705        "set": 0,
706        "bitsize": 32,
707        "encoding": eEncodingUint,
708        "format": eFormatHex,
709        "slice": "r11[31:0]",
710    },
711    {
712        "name": "r12d",
713        "set": 0,
714        "bitsize": 32,
715        "encoding": eEncodingUint,
716        "format": eFormatHex,
717        "slice": "r12[31:0]",
718    },
719    {
720        "name": "r13d",
721        "set": 0,
722        "bitsize": 32,
723        "encoding": eEncodingUint,
724        "format": eFormatHex,
725        "slice": "r13[31:0]",
726    },
727    {
728        "name": "r14d",
729        "set": 0,
730        "bitsize": 32,
731        "encoding": eEncodingUint,
732        "format": eFormatHex,
733        "slice": "r14[31:0]",
734    },
735    {
736        "name": "r15d",
737        "set": 0,
738        "bitsize": 32,
739        "encoding": eEncodingUint,
740        "format": eFormatHex,
741        "slice": "r15[31:0]",
742    },
743    {
744        "name": "ax",
745        "set": 0,
746        "bitsize": 16,
747        "encoding": eEncodingUint,
748        "format": eFormatHex,
749        "slice": "rax[15:0]",
750    },
751    {
752        "name": "bx",
753        "set": 0,
754        "bitsize": 16,
755        "encoding": eEncodingUint,
756        "format": eFormatHex,
757        "slice": "rbx[15:0]",
758    },
759    {
760        "name": "cx",
761        "set": 0,
762        "bitsize": 16,
763        "encoding": eEncodingUint,
764        "format": eFormatHex,
765        "slice": "rcx[15:0]",
766    },
767    {
768        "name": "dx",
769        "set": 0,
770        "bitsize": 16,
771        "encoding": eEncodingUint,
772        "format": eFormatHex,
773        "slice": "rdx[15:0]",
774    },
775    {
776        "name": "di",
777        "set": 0,
778        "bitsize": 16,
779        "encoding": eEncodingUint,
780        "format": eFormatHex,
781        "slice": "rdi[15:0]",
782    },
783    {
784        "name": "si",
785        "set": 0,
786        "bitsize": 16,
787        "encoding": eEncodingUint,
788        "format": eFormatHex,
789        "slice": "rsi[15:0]",
790    },
791    {
792        "name": "bp",
793        "set": 0,
794        "bitsize": 16,
795        "encoding": eEncodingUint,
796        "format": eFormatHex,
797        "slice": "rbp[15:0]",
798    },
799    {
800        "name": "sp",
801        "set": 0,
802        "bitsize": 16,
803        "encoding": eEncodingUint,
804        "format": eFormatHex,
805        "slice": "rsp[15:0]",
806    },
807    {
808        "name": "r8w",
809        "set": 0,
810        "bitsize": 16,
811        "encoding": eEncodingUint,
812        "format": eFormatHex,
813        "slice": "r8[15:0]",
814    },
815    {
816        "name": "r9w",
817        "set": 0,
818        "bitsize": 16,
819        "encoding": eEncodingUint,
820        "format": eFormatHex,
821        "slice": "r9[15:0]",
822    },
823    {
824        "name": "r10w",
825        "set": 0,
826        "bitsize": 16,
827        "encoding": eEncodingUint,
828        "format": eFormatHex,
829        "slice": "r10[15:0]",
830    },
831    {
832        "name": "r11w",
833        "set": 0,
834        "bitsize": 16,
835        "encoding": eEncodingUint,
836        "format": eFormatHex,
837        "slice": "r11[15:0]",
838    },
839    {
840        "name": "r12w",
841        "set": 0,
842        "bitsize": 16,
843        "encoding": eEncodingUint,
844        "format": eFormatHex,
845        "slice": "r12[15:0]",
846    },
847    {
848        "name": "r13w",
849        "set": 0,
850        "bitsize": 16,
851        "encoding": eEncodingUint,
852        "format": eFormatHex,
853        "slice": "r13[15:0]",
854    },
855    {
856        "name": "r14w",
857        "set": 0,
858        "bitsize": 16,
859        "encoding": eEncodingUint,
860        "format": eFormatHex,
861        "slice": "r14[15:0]",
862    },
863    {
864        "name": "r15w",
865        "set": 0,
866        "bitsize": 16,
867        "encoding": eEncodingUint,
868        "format": eFormatHex,
869        "slice": "r15[15:0]",
870    },
871    {
872        "name": "ah",
873        "set": 0,
874        "bitsize": 8,
875        "encoding": eEncodingUint,
876        "format": eFormatHex,
877        "slice": "rax[15:8]",
878    },
879    {
880        "name": "bh",
881        "set": 0,
882        "bitsize": 8,
883        "encoding": eEncodingUint,
884        "format": eFormatHex,
885        "slice": "rbx[15:8]",
886    },
887    {
888        "name": "ch",
889        "set": 0,
890        "bitsize": 8,
891        "encoding": eEncodingUint,
892        "format": eFormatHex,
893        "slice": "rcx[15:8]",
894    },
895    {
896        "name": "dh",
897        "set": 0,
898        "bitsize": 8,
899        "encoding": eEncodingUint,
900        "format": eFormatHex,
901        "slice": "rdx[15:8]",
902    },
903    {
904        "name": "al",
905        "set": 0,
906        "bitsize": 8,
907        "encoding": eEncodingUint,
908        "format": eFormatHex,
909        "slice": "rax[7:0]",
910    },
911    {
912        "name": "bl",
913        "set": 0,
914        "bitsize": 8,
915        "encoding": eEncodingUint,
916        "format": eFormatHex,
917        "slice": "rbx[7:0]",
918    },
919    {
920        "name": "cl",
921        "set": 0,
922        "bitsize": 8,
923        "encoding": eEncodingUint,
924        "format": eFormatHex,
925        "slice": "rcx[7:0]",
926    },
927    {
928        "name": "dl",
929        "set": 0,
930        "bitsize": 8,
931        "encoding": eEncodingUint,
932        "format": eFormatHex,
933        "slice": "rdx[7:0]",
934    },
935    {
936        "name": "dil",
937        "set": 0,
938        "bitsize": 8,
939        "encoding": eEncodingUint,
940        "format": eFormatHex,
941        "slice": "rdi[7:0]",
942    },
943    {
944        "name": "sil",
945        "set": 0,
946        "bitsize": 8,
947        "encoding": eEncodingUint,
948        "format": eFormatHex,
949        "slice": "rsi[7:0]",
950    },
951    {
952        "name": "bpl",
953        "set": 0,
954        "bitsize": 8,
955        "encoding": eEncodingUint,
956        "format": eFormatHex,
957        "slice": "rbp[7:0]",
958    },
959    {
960        "name": "spl",
961        "set": 0,
962        "bitsize": 8,
963        "encoding": eEncodingUint,
964        "format": eFormatHex,
965        "slice": "rsp[7:0]",
966    },
967    {
968        "name": "r8l",
969        "set": 0,
970        "bitsize": 8,
971        "encoding": eEncodingUint,
972        "format": eFormatHex,
973        "slice": "r8[7:0]",
974    },
975    {
976        "name": "r9l",
977        "set": 0,
978        "bitsize": 8,
979        "encoding": eEncodingUint,
980        "format": eFormatHex,
981        "slice": "r9[7:0]",
982    },
983    {
984        "name": "r10l",
985        "set": 0,
986        "bitsize": 8,
987        "encoding": eEncodingUint,
988        "format": eFormatHex,
989        "slice": "r10[7:0]",
990    },
991    {
992        "name": "r11l",
993        "set": 0,
994        "bitsize": 8,
995        "encoding": eEncodingUint,
996        "format": eFormatHex,
997        "slice": "r11[7:0]",
998    },
999    {
1000        "name": "r12l",
1001        "set": 0,
1002        "bitsize": 8,
1003        "encoding": eEncodingUint,
1004        "format": eFormatHex,
1005        "slice": "r12[7:0]",
1006    },
1007    {
1008        "name": "r13l",
1009        "set": 0,
1010        "bitsize": 8,
1011        "encoding": eEncodingUint,
1012        "format": eFormatHex,
1013        "slice": "r13[7:0]",
1014    },
1015    {
1016        "name": "r14l",
1017        "set": 0,
1018        "bitsize": 8,
1019        "encoding": eEncodingUint,
1020        "format": eFormatHex,
1021        "slice": "r14[7:0]",
1022    },
1023    {
1024        "name": "r15l",
1025        "set": 0,
1026        "bitsize": 8,
1027        "encoding": eEncodingUint,
1028        "format": eFormatHex,
1029        "slice": "r15[7:0]",
1030    },
1031]
1032
1033g_target_definition = None
1034
1035
1036def get_target_definition():
1037    global g_target_definition
1038    if g_target_definition is None:
1039        g_target_definition = {}
1040        offset = 0
1041        for reg_info in x86_64_register_infos:
1042            reg_name = reg_info["name"]
1043
1044            # Only fill in the offset if there is no 'slice' in the register
1045            # info
1046            if "slice" not in reg_info and "composite" not in reg_info:
1047                reg_info["offset"] = offset
1048                offset += reg_info["bitsize"] // 8
1049
1050            # Set the GCC/DWARF register number for this register if it has one
1051            reg_num = get_reg_num(name_to_gcc_dwarf_regnum, reg_name)
1052            if reg_num != LLDB_INVALID_REGNUM:
1053                reg_info["gcc"] = reg_num
1054                reg_info["dwarf"] = reg_num
1055
1056            # Set the generic register number for this register if it has one
1057            reg_num = get_reg_num(name_to_generic_regnum, reg_name)
1058            if reg_num != LLDB_INVALID_REGNUM:
1059                reg_info["generic"] = reg_num
1060
1061            # Set the GDB register number for this register if it has one
1062            reg_num = get_reg_num(name_to_gdb_regnum, reg_name)
1063            if reg_num != LLDB_INVALID_REGNUM:
1064                reg_info["gdb"] = reg_num
1065
1066        g_target_definition["sets"] = [
1067            "General Purpose Registers",
1068            "Floating Point Registers",
1069        ]
1070        g_target_definition["registers"] = x86_64_register_infos
1071        g_target_definition["host-info"] = {
1072            "triple": "x86_64-*-linux",
1073            "endian": eByteOrderLittle,
1074        }
1075        g_target_definition["g-packet-size"] = offset
1076        g_target_definition["breakpoint-pc-offset"] = -1
1077    return g_target_definition
1078
1079
1080def get_dynamic_setting(target, setting_name):
1081    if setting_name == "gdb-server-target-definition":
1082        return get_target_definition()
1083