llvm/lldb/examples/python/x86_64_qemu_target_definition.py

#!/usr/bin/env python
# ===-- x86_64_qemu_target_definition.py -----------------------------*- C++ -*-===//
#
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#
# ===----------------------------------------------------------------------===//

# ----------------------------------------------------------------------
# DESCRIPTION
#
# This file can be used with the following setting:
#   plugin.process.gdb-remote.target-definition-file
# This setting should be used when you are trying to connect to a
# remote GDB server that doesn't support any of the register discovery
# packets that LLDB normally uses.
#
# Why is this necessary? LLDB doesn't require a new build of LLDB that
# targets each new architecture you will debug with. Instead, all
# architectures are supported and LLDB relies on extra GDB server
# packets to discover the target we are connecting to so that is can
# show the right registers for each target. This allows the remote stub
# to change and add new registers without requiring a new LLDB build
# just so we can see new registers.
#
# This file implements the x86_64 registers for the user mode qemu on linux.
# The only difference with the Linux file is the absense of orig_rax register.
#
# USAGE
#
# (lldb) settings set plugin.process.gdb-remote.target-definition-file /path/to/x86_64_qemu_target_definition.py
# (lldb) gdb-remote other.baz.com:1234
#
# The target definition file will get used if and only if the
# qRegisterInfo packets are not supported when connecting to a remote
# GDB stub.
# ----------------------------------------------------------------------
from lldb import *

# Compiler and DWARF register numbers
name_to_gcc_dwarf_regnum = {
    "rax": 0,
    "rdx": 1,
    "rcx": 2,
    "rbx": 3,
    "rsi": 4,
    "rdi": 5,
    "rbp": 6,
    "rsp": 7,
    "r8": 8,
    "r9": 9,
    "r10": 10,
    "r11": 11,
    "r12": 12,
    "r13": 13,
    "r14": 14,
    "r15": 15,
    "rip": 16,
    "xmm0": 17,
    "xmm1": 18,
    "xmm2": 19,
    "xmm3": 20,
    "xmm4": 21,
    "xmm5": 22,
    "xmm6": 23,
    "xmm7": 24,
    "xmm8": 25,
    "xmm9": 26,
    "xmm10": 27,
    "xmm11": 28,
    "xmm12": 29,
    "xmm13": 30,
    "xmm14": 31,
    "xmm15": 32,
    "stmm0": 33,
    "stmm1": 34,
    "stmm2": 35,
    "stmm3": 36,
    "stmm4": 37,
    "stmm5": 38,
    "stmm6": 39,
    "stmm7": 30,
    "ymm0": 41,
    "ymm1": 42,
    "ymm2": 43,
    "ymm3": 44,
    "ymm4": 45,
    "ymm5": 46,
    "ymm6": 47,
    "ymm7": 48,
    "ymm8": 49,
    "ymm9": 40,
    "ymm10": 41,
    "ymm11": 42,
    "ymm12": 43,
    "ymm13": 44,
    "ymm14": 45,
    "ymm15": 46,
}

name_to_gdb_regnum = {
    "rax": 0,
    "rbx": 1,
    "rcx": 2,
    "rdx": 3,
    "rsi": 4,
    "rdi": 5,
    "rbp": 6,
    "rsp": 7,
    "r8": 8,
    "r9": 9,
    "r10": 10,
    "r11": 11,
    "r12": 12,
    "r13": 13,
    "r14": 14,
    "r15": 15,
    "rip": 16,
    "rflags": 17,
    "cs": 18,
    "ss": 19,
    "ds": 20,
    "es": 21,
    "fs": 22,
    "gs": 23,
    "stmm0": 24,
    "stmm1": 25,
    "stmm2": 26,
    "stmm3": 27,
    "stmm4": 28,
    "stmm5": 29,
    "stmm6": 30,
    "stmm7": 31,
    "fctrl": 32,
    "fstat": 33,
    "ftag": 34,
    "fiseg": 35,
    "fioff": 36,
    "foseg": 37,
    "fooff": 38,
    "fop": 39,
    "xmm0": 40,
    "xmm1": 41,
    "xmm2": 42,
    "xmm3": 43,
    "xmm4": 44,
    "xmm5": 45,
    "xmm6": 46,
    "xmm7": 47,
    "xmm8": 48,
    "xmm9": 49,
    "xmm10": 50,
    "xmm11": 51,
    "xmm12": 52,
    "xmm13": 53,
    "xmm14": 54,
    "xmm15": 55,
    "mxcsr": 56,
    "ymm0": 57,
    "ymm1": 58,
    "ymm2": 59,
    "ymm3": 60,
    "ymm4": 61,
    "ymm5": 62,
    "ymm6": 63,
    "ymm7": 64,
    "ymm8": 65,
    "ymm9": 66,
    "ymm10": 67,
    "ymm11": 68,
    "ymm12": 69,
    "ymm13": 70,
    "ymm14": 71,
    "ymm15": 72,
}

name_to_generic_regnum = {
    "rip": LLDB_REGNUM_GENERIC_PC,
    "rsp": LLDB_REGNUM_GENERIC_SP,
    "rbp": LLDB_REGNUM_GENERIC_FP,
    "rdi": LLDB_REGNUM_GENERIC_ARG1,
    "rsi": LLDB_REGNUM_GENERIC_ARG2,
    "rdx": LLDB_REGNUM_GENERIC_ARG3,
    "rcx": LLDB_REGNUM_GENERIC_ARG4,
    "r8": LLDB_REGNUM_GENERIC_ARG5,
    "r9": LLDB_REGNUM_GENERIC_ARG6,
}


def get_reg_num(reg_num_dict, reg_name):
    if reg_name in reg_num_dict:
        return reg_num_dict[reg_name]
    return LLDB_INVALID_REGNUM


x86_64_register_infos = [
    {
        "name": "rax",
        "set": 0,
        "bitsize": 64,
        "encoding": eEncodingUint,
        "format": eFormatAddressInfo,
    },
    {
        "name": "rbx",
        "set": 0,
        "bitsize": 64,
        "encoding": eEncodingUint,
        "format": eFormatAddressInfo,
    },
    {
        "name": "rcx",
        "set": 0,
        "bitsize": 64,
        "encoding": eEncodingUint,
        "format": eFormatAddressInfo,
        "alt-name": "arg4",
    },
    {
        "name": "rdx",
        "set": 0,
        "bitsize": 64,
        "encoding": eEncodingUint,
        "format": eFormatAddressInfo,
        "alt-name": "arg3",
    },
    {
        "name": "rsi",
        "set": 0,
        "bitsize": 64,
        "encoding": eEncodingUint,
        "format": eFormatAddressInfo,
        "alt-name": "arg2",
    },
    {
        "name": "rdi",
        "set": 0,
        "bitsize": 64,
        "encoding": eEncodingUint,
        "format": eFormatAddressInfo,
        "alt-name": "arg1",
    },
    {
        "name": "rbp",
        "set": 0,
        "bitsize": 64,
        "encoding": eEncodingUint,
        "format": eFormatAddressInfo,
        "alt-name": "fp",
    },
    {
        "name": "rsp",
        "set": 0,
        "bitsize": 64,
        "encoding": eEncodingUint,
        "format": eFormatAddressInfo,
        "alt-name": "sp",
    },
    {
        "name": "r8",
        "set": 0,
        "bitsize": 64,
        "encoding": eEncodingUint,
        "format": eFormatAddressInfo,
        "alt-name": "arg5",
    },
    {
        "name": "r9",
        "set": 0,
        "bitsize": 64,
        "encoding": eEncodingUint,
        "format": eFormatAddressInfo,
        "alt-name": "arg6",
    },
    {
        "name": "r10",
        "set": 0,
        "bitsize": 64,
        "encoding": eEncodingUint,
        "format": eFormatAddressInfo,
    },
    {
        "name": "r11",
        "set": 0,
        "bitsize": 64,
        "encoding": eEncodingUint,
        "format": eFormatAddressInfo,
    },
    {
        "name": "r12",
        "set": 0,
        "bitsize": 64,
        "encoding": eEncodingUint,
        "format": eFormatAddressInfo,
    },
    {
        "name": "r13",
        "set": 0,
        "bitsize": 64,
        "encoding": eEncodingUint,
        "format": eFormatAddressInfo,
    },
    {
        "name": "r14",
        "set": 0,
        "bitsize": 64,
        "encoding": eEncodingUint,
        "format": eFormatAddressInfo,
    },
    {
        "name": "r15",
        "set": 0,
        "bitsize": 64,
        "encoding": eEncodingUint,
        "format": eFormatAddressInfo,
    },
    {
        "name": "rip",
        "set": 0,
        "bitsize": 64,
        "encoding": eEncodingUint,
        "format": eFormatAddressInfo,
        "alt-name": "pc",
    },
    {
        "name": "rflags",
        "set": 0,
        "bitsize": 32,
        "encoding": eEncodingUint,
        "format": eFormatHex,
    },
    {
        "name": "cs",
        "set": 0,
        "bitsize": 32,
        "encoding": eEncodingUint,
        "format": eFormatHex,
    },
    {
        "name": "ss",
        "set": 0,
        "bitsize": 32,
        "encoding": eEncodingUint,
        "format": eFormatHex,
    },
    {
        "name": "ds",
        "set": 0,
        "bitsize": 32,
        "encoding": eEncodingUint,
        "format": eFormatHex,
    },
    {
        "name": "es",
        "set": 0,
        "bitsize": 32,
        "encoding": eEncodingUint,
        "format": eFormatHex,
    },
    {
        "name": "fs",
        "set": 0,
        "bitsize": 32,
        "encoding": eEncodingUint,
        "format": eFormatHex,
    },
    {
        "name": "gs",
        "set": 0,
        "bitsize": 32,
        "encoding": eEncodingUint,
        "format": eFormatHex,
    },
    {
        "name": "stmm0",
        "set": 1,
        "bitsize": 80,
        "encoding": eEncodingVector,
        "format": eFormatVectorOfUInt8,
    },
    {
        "name": "stmm1",
        "set": 1,
        "bitsize": 80,
        "encoding": eEncodingVector,
        "format": eFormatVectorOfUInt8,
    },
    {
        "name": "stmm2",
        "set": 1,
        "bitsize": 80,
        "encoding": eEncodingVector,
        "format": eFormatVectorOfUInt8,
    },
    {
        "name": "stmm3",
        "set": 1,
        "bitsize": 80,
        "encoding": eEncodingVector,
        "format": eFormatVectorOfUInt8,
    },
    {
        "name": "stmm4",
        "set": 1,
        "bitsize": 80,
        "encoding": eEncodingVector,
        "format": eFormatVectorOfUInt8,
    },
    {
        "name": "stmm5",
        "set": 1,
        "bitsize": 80,
        "encoding": eEncodingVector,
        "format": eFormatVectorOfUInt8,
    },
    {
        "name": "stmm6",
        "set": 1,
        "bitsize": 80,
        "encoding": eEncodingVector,
        "format": eFormatVectorOfUInt8,
    },
    {
        "name": "stmm7",
        "set": 1,
        "bitsize": 80,
        "encoding": eEncodingVector,
        "format": eFormatVectorOfUInt8,
    },
    {
        "name": "fctrl",
        "set": 1,
        "bitsize": 32,
        "encoding": eEncodingUint,
        "format": eFormatHex,
    },
    {
        "name": "fstat",
        "set": 1,
        "bitsize": 32,
        "encoding": eEncodingUint,
        "format": eFormatHex,
    },
    {
        "name": "ftag",
        "set": 1,
        "bitsize": 32,
        "encoding": eEncodingUint,
        "format": eFormatHex,
    },
    {
        "name": "fiseg",
        "set": 1,
        "bitsize": 32,
        "encoding": eEncodingUint,
        "format": eFormatHex,
    },
    {
        "name": "fioff",
        "set": 1,
        "bitsize": 32,
        "encoding": eEncodingUint,
        "format": eFormatHex,
    },
    {
        "name": "foseg",
        "set": 1,
        "bitsize": 32,
        "encoding": eEncodingUint,
        "format": eFormatHex,
    },
    {
        "name": "fooff",
        "set": 1,
        "bitsize": 32,
        "encoding": eEncodingUint,
        "format": eFormatHex,
    },
    {
        "name": "fop",
        "set": 1,
        "bitsize": 32,
        "encoding": eEncodingUint,
        "format": eFormatHex,
    },
    {
        "name": "xmm0",
        "set": 1,
        "bitsize": 128,
        "encoding": eEncodingVector,
        "format": eFormatVectorOfUInt8,
    },
    {
        "name": "xmm1",
        "set": 1,
        "bitsize": 128,
        "encoding": eEncodingVector,
        "format": eFormatVectorOfUInt8,
    },
    {
        "name": "xmm2",
        "set": 1,
        "bitsize": 128,
        "encoding": eEncodingVector,
        "format": eFormatVectorOfUInt8,
    },
    {
        "name": "xmm3",
        "set": 1,
        "bitsize": 128,
        "encoding": eEncodingVector,
        "format": eFormatVectorOfUInt8,
    },
    {
        "name": "xmm4",
        "set": 1,
        "bitsize": 128,
        "encoding": eEncodingVector,
        "format": eFormatVectorOfUInt8,
    },
    {
        "name": "xmm5",
        "set": 1,
        "bitsize": 128,
        "encoding": eEncodingVector,
        "format": eFormatVectorOfUInt8,
    },
    {
        "name": "xmm6",
        "set": 1,
        "bitsize": 128,
        "encoding": eEncodingVector,
        "format": eFormatVectorOfUInt8,
    },
    {
        "name": "xmm7",
        "set": 1,
        "bitsize": 128,
        "encoding": eEncodingVector,
        "format": eFormatVectorOfUInt8,
    },
    {
        "name": "xmm8",
        "set": 1,
        "bitsize": 128,
        "encoding": eEncodingVector,
        "format": eFormatVectorOfUInt8,
    },
    {
        "name": "xmm9",
        "set": 1,
        "bitsize": 128,
        "encoding": eEncodingVector,
        "format": eFormatVectorOfUInt8,
    },
    {
        "name": "xmm10",
        "set": 1,
        "bitsize": 128,
        "encoding": eEncodingVector,
        "format": eFormatVectorOfUInt8,
    },
    {
        "name": "xmm11",
        "set": 1,
        "bitsize": 128,
        "encoding": eEncodingVector,
        "format": eFormatVectorOfUInt8,
    },
    {
        "name": "xmm12",
        "set": 1,
        "bitsize": 128,
        "encoding": eEncodingVector,
        "format": eFormatVectorOfUInt8,
    },
    {
        "name": "xmm13",
        "set": 1,
        "bitsize": 128,
        "encoding": eEncodingVector,
        "format": eFormatVectorOfUInt8,
    },
    {
        "name": "xmm14",
        "set": 1,
        "bitsize": 128,
        "encoding": eEncodingVector,
        "format": eFormatVectorOfUInt8,
    },
    {
        "name": "xmm15",
        "set": 1,
        "bitsize": 128,
        "encoding": eEncodingVector,
        "format": eFormatVectorOfUInt8,
    },
    {
        "name": "mxcsr",
        "set": 1,
        "bitsize": 32,
        "encoding": eEncodingUint,
        "format": eFormatHex,
    },
    # Registers that are contained in or composed of one of more other
    # registers
    {
        "name": "eax",
        "set": 0,
        "bitsize": 32,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "rax[31:0]",
    },
    {
        "name": "ebx",
        "set": 0,
        "bitsize": 32,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "rbx[31:0]",
    },
    {
        "name": "ecx",
        "set": 0,
        "bitsize": 32,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "rcx[31:0]",
    },
    {
        "name": "edx",
        "set": 0,
        "bitsize": 32,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "rdx[31:0]",
    },
    {
        "name": "edi",
        "set": 0,
        "bitsize": 32,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "rdi[31:0]",
    },
    {
        "name": "esi",
        "set": 0,
        "bitsize": 32,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "rsi[31:0]",
    },
    {
        "name": "ebp",
        "set": 0,
        "bitsize": 32,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "rbp[31:0]",
    },
    {
        "name": "esp",
        "set": 0,
        "bitsize": 32,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "rsp[31:0]",
    },
    {
        "name": "r8d",
        "set": 0,
        "bitsize": 32,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "r8[31:0]",
    },
    {
        "name": "r9d",
        "set": 0,
        "bitsize": 32,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "r9[31:0]",
    },
    {
        "name": "r10d",
        "set": 0,
        "bitsize": 32,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "r10[31:0]",
    },
    {
        "name": "r11d",
        "set": 0,
        "bitsize": 32,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "r11[31:0]",
    },
    {
        "name": "r12d",
        "set": 0,
        "bitsize": 32,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "r12[31:0]",
    },
    {
        "name": "r13d",
        "set": 0,
        "bitsize": 32,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "r13[31:0]",
    },
    {
        "name": "r14d",
        "set": 0,
        "bitsize": 32,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "r14[31:0]",
    },
    {
        "name": "r15d",
        "set": 0,
        "bitsize": 32,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "r15[31:0]",
    },
    {
        "name": "ax",
        "set": 0,
        "bitsize": 16,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "rax[15:0]",
    },
    {
        "name": "bx",
        "set": 0,
        "bitsize": 16,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "rbx[15:0]",
    },
    {
        "name": "cx",
        "set": 0,
        "bitsize": 16,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "rcx[15:0]",
    },
    {
        "name": "dx",
        "set": 0,
        "bitsize": 16,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "rdx[15:0]",
    },
    {
        "name": "di",
        "set": 0,
        "bitsize": 16,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "rdi[15:0]",
    },
    {
        "name": "si",
        "set": 0,
        "bitsize": 16,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "rsi[15:0]",
    },
    {
        "name": "bp",
        "set": 0,
        "bitsize": 16,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "rbp[15:0]",
    },
    {
        "name": "sp",
        "set": 0,
        "bitsize": 16,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "rsp[15:0]",
    },
    {
        "name": "r8w",
        "set": 0,
        "bitsize": 16,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "r8[15:0]",
    },
    {
        "name": "r9w",
        "set": 0,
        "bitsize": 16,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "r9[15:0]",
    },
    {
        "name": "r10w",
        "set": 0,
        "bitsize": 16,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "r10[15:0]",
    },
    {
        "name": "r11w",
        "set": 0,
        "bitsize": 16,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "r11[15:0]",
    },
    {
        "name": "r12w",
        "set": 0,
        "bitsize": 16,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "r12[15:0]",
    },
    {
        "name": "r13w",
        "set": 0,
        "bitsize": 16,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "r13[15:0]",
    },
    {
        "name": "r14w",
        "set": 0,
        "bitsize": 16,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "r14[15:0]",
    },
    {
        "name": "r15w",
        "set": 0,
        "bitsize": 16,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "r15[15:0]",
    },
    {
        "name": "ah",
        "set": 0,
        "bitsize": 8,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "rax[15:8]",
    },
    {
        "name": "bh",
        "set": 0,
        "bitsize": 8,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "rbx[15:8]",
    },
    {
        "name": "ch",
        "set": 0,
        "bitsize": 8,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "rcx[15:8]",
    },
    {
        "name": "dh",
        "set": 0,
        "bitsize": 8,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "rdx[15:8]",
    },
    {
        "name": "al",
        "set": 0,
        "bitsize": 8,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "rax[7:0]",
    },
    {
        "name": "bl",
        "set": 0,
        "bitsize": 8,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "rbx[7:0]",
    },
    {
        "name": "cl",
        "set": 0,
        "bitsize": 8,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "rcx[7:0]",
    },
    {
        "name": "dl",
        "set": 0,
        "bitsize": 8,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "rdx[7:0]",
    },
    {
        "name": "dil",
        "set": 0,
        "bitsize": 8,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "rdi[7:0]",
    },
    {
        "name": "sil",
        "set": 0,
        "bitsize": 8,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "rsi[7:0]",
    },
    {
        "name": "bpl",
        "set": 0,
        "bitsize": 8,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "rbp[7:0]",
    },
    {
        "name": "spl",
        "set": 0,
        "bitsize": 8,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "rsp[7:0]",
    },
    {
        "name": "r8l",
        "set": 0,
        "bitsize": 8,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "r8[7:0]",
    },
    {
        "name": "r9l",
        "set": 0,
        "bitsize": 8,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "r9[7:0]",
    },
    {
        "name": "r10l",
        "set": 0,
        "bitsize": 8,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "r10[7:0]",
    },
    {
        "name": "r11l",
        "set": 0,
        "bitsize": 8,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "r11[7:0]",
    },
    {
        "name": "r12l",
        "set": 0,
        "bitsize": 8,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "r12[7:0]",
    },
    {
        "name": "r13l",
        "set": 0,
        "bitsize": 8,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "r13[7:0]",
    },
    {
        "name": "r14l",
        "set": 0,
        "bitsize": 8,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "r14[7:0]",
    },
    {
        "name": "r15l",
        "set": 0,
        "bitsize": 8,
        "encoding": eEncodingUint,
        "format": eFormatHex,
        "slice": "r15[7:0]",
    },
]

g_target_definition = None


def get_target_definition():
    global g_target_definition
    if g_target_definition is None:
        g_target_definition = {}
        offset = 0
        for reg_info in x86_64_register_infos:
            reg_name = reg_info["name"]

            # Only fill in the offset if there is no 'slice' in the register
            # info
            if "slice" not in reg_info and "composite" not in reg_info:
                reg_info["offset"] = offset
                offset += reg_info["bitsize"] // 8

            # Set the GCC/DWARF register number for this register if it has one
            reg_num = get_reg_num(name_to_gcc_dwarf_regnum, reg_name)
            if reg_num != LLDB_INVALID_REGNUM:
                reg_info["gcc"] = reg_num
                reg_info["dwarf"] = reg_num

            # Set the generic register number for this register if it has one
            reg_num = get_reg_num(name_to_generic_regnum, reg_name)
            if reg_num != LLDB_INVALID_REGNUM:
                reg_info["generic"] = reg_num

            # Set the GDB register number for this register if it has one
            reg_num = get_reg_num(name_to_gdb_regnum, reg_name)
            if reg_num != LLDB_INVALID_REGNUM:
                reg_info["gdb"] = reg_num

        g_target_definition["sets"] = [
            "General Purpose Registers",
            "Floating Point Registers",
        ]
        g_target_definition["registers"] = x86_64_register_infos
        g_target_definition["host-info"] = {
            "triple": "x86_64-*-linux",
            "endian": eByteOrderLittle,
        }
        g_target_definition["g-packet-size"] = offset
        g_target_definition["breakpoint-pc-offset"] = -1
    return g_target_definition


def get_dynamic_setting(target, setting_name):
    if setting_name == "gdb-server-target-definition":
        return get_target_definition()