124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ABISysV_x86_64.cpp --------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "ABISysV_x86_64.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ConstString.h"
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/DataExtractor.h"
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Error.h"
157a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan#include "lldb/Core/Log.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/PluginManager.h"
1861d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton#include "lldb/Core/RegisterValue.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Value.h"
20016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham#include "lldb/Core/ValueObjectConstResult.h"
21016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham#include "lldb/Core/ValueObjectRegister.h"
22016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham#include "lldb/Core/ValueObjectMemory.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h"
2475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton#include "lldb/Symbol/UnwindPlan.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Target.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h"
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrame.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "llvm/ADT/Triple.h"
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Claytonenum gcc_dwarf_regnums
3737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton{
3837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_rax = 0,
3937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_rdx,
4037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_rcx,
4137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_rbx,
4237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_rsi,
4337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_rdi,
4437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_rbp,
4537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_rsp,
4637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_r8,
4737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_r9,
4837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_r10,
4937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_r11,
5037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_r12,
5137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_r13,
5237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_r14,
5337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_r15,
5437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_rip,
5537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_xmm0,
5637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_xmm1,
5737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_xmm2,
5837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_xmm3,
5937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_xmm4,
6037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_xmm5,
6137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_xmm6,
6237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_xmm7,
6337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_xmm8,
6437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_xmm9,
6537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_xmm10,
6637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_xmm11,
6737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_xmm12,
6837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_xmm13,
6937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_xmm14,
7037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_xmm15,
7137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_stmm0,
7237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_stmm1,
7337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_stmm2,
7437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_stmm3,
7537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_stmm4,
7637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_stmm5,
7737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_stmm6,
7837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gcc_dwarf_stmm7,
7966bd7d7ed3f05ea14fe0630726835ddeb2d07be7Ashok Thirumurthi    gcc_dwarf_ymm0,
8066bd7d7ed3f05ea14fe0630726835ddeb2d07be7Ashok Thirumurthi    gcc_dwarf_ymm1,
8166bd7d7ed3f05ea14fe0630726835ddeb2d07be7Ashok Thirumurthi    gcc_dwarf_ymm2,
8266bd7d7ed3f05ea14fe0630726835ddeb2d07be7Ashok Thirumurthi    gcc_dwarf_ymm3,
8366bd7d7ed3f05ea14fe0630726835ddeb2d07be7Ashok Thirumurthi    gcc_dwarf_ymm4,
8466bd7d7ed3f05ea14fe0630726835ddeb2d07be7Ashok Thirumurthi    gcc_dwarf_ymm5,
8566bd7d7ed3f05ea14fe0630726835ddeb2d07be7Ashok Thirumurthi    gcc_dwarf_ymm6,
8666bd7d7ed3f05ea14fe0630726835ddeb2d07be7Ashok Thirumurthi    gcc_dwarf_ymm7,
8766bd7d7ed3f05ea14fe0630726835ddeb2d07be7Ashok Thirumurthi    gcc_dwarf_ymm8,
8866bd7d7ed3f05ea14fe0630726835ddeb2d07be7Ashok Thirumurthi    gcc_dwarf_ymm9,
8966bd7d7ed3f05ea14fe0630726835ddeb2d07be7Ashok Thirumurthi    gcc_dwarf_ymm10,
9066bd7d7ed3f05ea14fe0630726835ddeb2d07be7Ashok Thirumurthi    gcc_dwarf_ymm11,
9166bd7d7ed3f05ea14fe0630726835ddeb2d07be7Ashok Thirumurthi    gcc_dwarf_ymm12,
9266bd7d7ed3f05ea14fe0630726835ddeb2d07be7Ashok Thirumurthi    gcc_dwarf_ymm13,
9366bd7d7ed3f05ea14fe0630726835ddeb2d07be7Ashok Thirumurthi    gcc_dwarf_ymm14,
9466bd7d7ed3f05ea14fe0630726835ddeb2d07be7Ashok Thirumurthi    gcc_dwarf_ymm15
9537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton};
9637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton
9737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Claytonenum gdb_regnums
9837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton{
9937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_rax     =   0,
10037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_rbx     =   1,
10137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_rcx     =   2,
10237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_rdx     =   3,
10337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_rsi     =   4,
10437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_rdi     =   5,
10537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_rbp     =   6,
10637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_rsp     =   7,
10737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_r8      =   8,
10837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_r9      =   9,
10937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_r10     =  10,
11037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_r11     =  11,
11137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_r12     =  12,
11237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_r13     =  13,
11337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_r14     =  14,
11437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_r15     =  15,
11537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_rip     =  16,
11637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_rflags  =  17,
11737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_cs      =  18,
11837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_ss      =  19,
11937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_ds      =  20,
12037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_es      =  21,
12137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_fs      =  22,
12237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_gs      =  23,
12337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_stmm0   =  24,
12437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_stmm1   =  25,
12537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_stmm2   =  26,
12637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_stmm3   =  27,
12737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_stmm4   =  28,
12837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_stmm5   =  29,
12937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_stmm6   =  30,
13037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_stmm7   =  31,
13137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_fctrl   =  32,  gdb_fcw = gdb_fctrl,
13237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_fstat   =  33,  gdb_fsw = gdb_fstat,
13337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_ftag    =  34,  gdb_ftw = gdb_ftag,
13437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_fiseg   =  35,  gdb_fpu_cs  = gdb_fiseg,
13537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_fioff   =  36,  gdb_ip  = gdb_fioff,
13637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_foseg   =  37,  gdb_fpu_ds  = gdb_foseg,
13737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_fooff   =  38,  gdb_dp  = gdb_fooff,
13837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_fop     =  39,
13937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_xmm0    =  40,
14037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_xmm1    =  41,
14137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_xmm2    =  42,
14237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_xmm3    =  43,
14337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_xmm4    =  44,
14437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_xmm5    =  45,
14537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_xmm6    =  46,
14637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_xmm7    =  47,
14737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_xmm8    =  48,
14837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_xmm9    =  49,
14937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_xmm10   =  50,
15037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_xmm11   =  51,
15137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_xmm12   =  52,
15237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_xmm13   =  53,
15337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_xmm14   =  54,
15437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_xmm15   =  55,
15537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    gdb_mxcsr   =  56,
15666bd7d7ed3f05ea14fe0630726835ddeb2d07be7Ashok Thirumurthi    gdb_ymm0    =  57,
15766bd7d7ed3f05ea14fe0630726835ddeb2d07be7Ashok Thirumurthi    gdb_ymm1    =  58,
15866bd7d7ed3f05ea14fe0630726835ddeb2d07be7Ashok Thirumurthi    gdb_ymm2    =  59,
15966bd7d7ed3f05ea14fe0630726835ddeb2d07be7Ashok Thirumurthi    gdb_ymm3    =  60,
16066bd7d7ed3f05ea14fe0630726835ddeb2d07be7Ashok Thirumurthi    gdb_ymm4    =  61,
16166bd7d7ed3f05ea14fe0630726835ddeb2d07be7Ashok Thirumurthi    gdb_ymm5    =  62,
16266bd7d7ed3f05ea14fe0630726835ddeb2d07be7Ashok Thirumurthi    gdb_ymm6    =  63,
16366bd7d7ed3f05ea14fe0630726835ddeb2d07be7Ashok Thirumurthi    gdb_ymm7    =  64,
16466bd7d7ed3f05ea14fe0630726835ddeb2d07be7Ashok Thirumurthi    gdb_ymm8    =  65,
16566bd7d7ed3f05ea14fe0630726835ddeb2d07be7Ashok Thirumurthi    gdb_ymm9    =  66,
16666bd7d7ed3f05ea14fe0630726835ddeb2d07be7Ashok Thirumurthi    gdb_ymm10   =  67,
16766bd7d7ed3f05ea14fe0630726835ddeb2d07be7Ashok Thirumurthi    gdb_ymm11   =  68,
16866bd7d7ed3f05ea14fe0630726835ddeb2d07be7Ashok Thirumurthi    gdb_ymm12   =  69,
16966bd7d7ed3f05ea14fe0630726835ddeb2d07be7Ashok Thirumurthi    gdb_ymm13   =  70,
17066bd7d7ed3f05ea14fe0630726835ddeb2d07be7Ashok Thirumurthi    gdb_ymm14   =  71,
17166bd7d7ed3f05ea14fe0630726835ddeb2d07be7Ashok Thirumurthi    gdb_ymm15   =  72
17237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton};
17337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton
17437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton
17537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Claytonstatic RegisterInfo g_register_infos[] =
17637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton{
177402607fe513617c06282d4ae479522e244a53b71Johnny Chen  //  NAME      ALT      SZ OFF ENCODING         FORMAT              COMPILER                DWARF                 GENERIC                     GDB                   LLDB NATIVE            VALUE REGS    INVALIDATE REGS
178402607fe513617c06282d4ae479522e244a53b71Johnny Chen  //  ========  =======  == === =============    =================== ======================= ===================== =========================== ===================== ====================== ==========    ===============
179402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "rax"   , NULL,    8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_rax       , gcc_dwarf_rax       , LLDB_INVALID_REGNUM       , gdb_rax            , LLDB_INVALID_REGNUM },      NULL,              NULL},
180402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "rbx"   , NULL,    8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_rbx       , gcc_dwarf_rbx       , LLDB_INVALID_REGNUM       , gdb_rbx            , LLDB_INVALID_REGNUM },      NULL,              NULL},
181402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "rcx"   , "arg4",  8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_rcx       , gcc_dwarf_rcx       , LLDB_REGNUM_GENERIC_ARG4  , gdb_rcx            , LLDB_INVALID_REGNUM },      NULL,              NULL},
182402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "rdx"   , "arg3",  8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_rdx       , gcc_dwarf_rdx       , LLDB_REGNUM_GENERIC_ARG3  , gdb_rdx            , LLDB_INVALID_REGNUM },      NULL,              NULL},
183402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "rsi"   , "arg2",  8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_rsi       , gcc_dwarf_rsi       , LLDB_REGNUM_GENERIC_ARG2  , gdb_rsi            , LLDB_INVALID_REGNUM },      NULL,              NULL},
184402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "rdi"   , "arg1",  8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_rdi       , gcc_dwarf_rdi       , LLDB_REGNUM_GENERIC_ARG1  , gdb_rdi            , LLDB_INVALID_REGNUM },      NULL,              NULL},
185402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "rbp"   , "fp",    8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_rbp       , gcc_dwarf_rbp       , LLDB_REGNUM_GENERIC_FP    , gdb_rbp            , LLDB_INVALID_REGNUM },      NULL,              NULL},
186402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "rsp"   , "sp",    8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_rsp       , gcc_dwarf_rsp       , LLDB_REGNUM_GENERIC_SP    , gdb_rsp            , LLDB_INVALID_REGNUM },      NULL,              NULL},
187402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "r8"    , "arg5",  8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_r8        , gcc_dwarf_r8        , LLDB_REGNUM_GENERIC_ARG5  , gdb_r8             , LLDB_INVALID_REGNUM },      NULL,              NULL},
188402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "r9"    , "arg6",  8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_r9        , gcc_dwarf_r9        , LLDB_REGNUM_GENERIC_ARG6  , gdb_r9             , LLDB_INVALID_REGNUM },      NULL,              NULL},
189402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "r10"   , NULL,    8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_r10       , gcc_dwarf_r10       , LLDB_INVALID_REGNUM       , gdb_r10            , LLDB_INVALID_REGNUM },      NULL,              NULL},
190402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "r11"   , NULL,    8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_r11       , gcc_dwarf_r11       , LLDB_INVALID_REGNUM       , gdb_r11            , LLDB_INVALID_REGNUM },      NULL,              NULL},
191402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "r12"   , NULL,    8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_r12       , gcc_dwarf_r12       , LLDB_INVALID_REGNUM       , gdb_r12            , LLDB_INVALID_REGNUM },      NULL,              NULL},
192402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "r13"   , NULL,    8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_r13       , gcc_dwarf_r13       , LLDB_INVALID_REGNUM       , gdb_r13            , LLDB_INVALID_REGNUM },      NULL,              NULL},
193402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "r14"   , NULL,    8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_r14       , gcc_dwarf_r14       , LLDB_INVALID_REGNUM       , gdb_r14            , LLDB_INVALID_REGNUM },      NULL,              NULL},
194402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "r15"   , NULL,    8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_r15       , gcc_dwarf_r15       , LLDB_INVALID_REGNUM       , gdb_r15            , LLDB_INVALID_REGNUM },      NULL,              NULL},
195402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "rip"   , "pc",    8,  0, eEncodingUint  , eFormatHex          , { gcc_dwarf_rip       , gcc_dwarf_rip       , LLDB_REGNUM_GENERIC_PC    , gdb_rip            , LLDB_INVALID_REGNUM },      NULL,              NULL},
196402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "rflags", NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_REGNUM_GENERIC_FLAGS , gdb_rflags         , LLDB_INVALID_REGNUM },      NULL,              NULL},
197402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "cs"    , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_cs             , LLDB_INVALID_REGNUM },      NULL,              NULL},
198402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "ss"    , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_ss             , LLDB_INVALID_REGNUM },      NULL,              NULL},
199402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "ds"    , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_ds             , LLDB_INVALID_REGNUM },      NULL,              NULL},
200402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "es"    , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_es             , LLDB_INVALID_REGNUM },      NULL,              NULL},
201402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "fs"    , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_fs             , LLDB_INVALID_REGNUM },      NULL,              NULL},
202402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "gs"    , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_gs             , LLDB_INVALID_REGNUM },      NULL,              NULL},
203402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "stmm0" , NULL,   10,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_stmm0     , gcc_dwarf_stmm0     , LLDB_INVALID_REGNUM       , gdb_stmm0          , LLDB_INVALID_REGNUM },      NULL,              NULL},
204402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "stmm1" , NULL,   10,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_stmm1     , gcc_dwarf_stmm1     , LLDB_INVALID_REGNUM       , gdb_stmm1          , LLDB_INVALID_REGNUM },      NULL,              NULL},
205402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "stmm2" , NULL,   10,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_stmm2     , gcc_dwarf_stmm2     , LLDB_INVALID_REGNUM       , gdb_stmm2          , LLDB_INVALID_REGNUM },      NULL,              NULL},
206402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "stmm3" , NULL,   10,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_stmm3     , gcc_dwarf_stmm3     , LLDB_INVALID_REGNUM       , gdb_stmm3          , LLDB_INVALID_REGNUM },      NULL,              NULL},
207402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "stmm4" , NULL,   10,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_stmm4     , gcc_dwarf_stmm4     , LLDB_INVALID_REGNUM       , gdb_stmm4          , LLDB_INVALID_REGNUM },      NULL,              NULL},
208402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "stmm5" , NULL,   10,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_stmm5     , gcc_dwarf_stmm5     , LLDB_INVALID_REGNUM       , gdb_stmm5          , LLDB_INVALID_REGNUM },      NULL,              NULL},
209402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "stmm6" , NULL,   10,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_stmm6     , gcc_dwarf_stmm6     , LLDB_INVALID_REGNUM       , gdb_stmm6          , LLDB_INVALID_REGNUM },      NULL,              NULL},
210402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "stmm7" , NULL,   10,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_stmm7     , gcc_dwarf_stmm7     , LLDB_INVALID_REGNUM       , gdb_stmm7          , LLDB_INVALID_REGNUM },      NULL,              NULL},
211402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "fctrl" , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_fctrl          , LLDB_INVALID_REGNUM },      NULL,              NULL},
212402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "fstat" , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_fstat          , LLDB_INVALID_REGNUM },      NULL,              NULL},
213402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "ftag"  , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_ftag           , LLDB_INVALID_REGNUM },      NULL,              NULL},
214402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "fiseg" , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_fiseg          , LLDB_INVALID_REGNUM },      NULL,              NULL},
215402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "fioff" , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_fioff          , LLDB_INVALID_REGNUM },      NULL,              NULL},
216402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "foseg" , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_foseg          , LLDB_INVALID_REGNUM },      NULL,              NULL},
217402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "fooff" , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_fooff          , LLDB_INVALID_REGNUM },      NULL,              NULL},
218402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "fop"   , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_fop            , LLDB_INVALID_REGNUM },      NULL,              NULL},
219402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "xmm0"  , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_xmm0      , gcc_dwarf_xmm0      , LLDB_INVALID_REGNUM       , gdb_xmm0           , LLDB_INVALID_REGNUM },      NULL,              NULL},
220402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "xmm1"  , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_xmm1      , gcc_dwarf_xmm1      , LLDB_INVALID_REGNUM       , gdb_xmm1           , LLDB_INVALID_REGNUM },      NULL,              NULL},
221402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "xmm2"  , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_xmm2      , gcc_dwarf_xmm2      , LLDB_INVALID_REGNUM       , gdb_xmm2           , LLDB_INVALID_REGNUM },      NULL,              NULL},
222402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "xmm3"  , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_xmm3      , gcc_dwarf_xmm3      , LLDB_INVALID_REGNUM       , gdb_xmm3           , LLDB_INVALID_REGNUM },      NULL,              NULL},
223402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "xmm4"  , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_xmm4      , gcc_dwarf_xmm4      , LLDB_INVALID_REGNUM       , gdb_xmm4           , LLDB_INVALID_REGNUM },      NULL,              NULL},
224402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "xmm5"  , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_xmm5      , gcc_dwarf_xmm5      , LLDB_INVALID_REGNUM       , gdb_xmm5           , LLDB_INVALID_REGNUM },      NULL,              NULL},
225402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "xmm6"  , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_xmm6      , gcc_dwarf_xmm6      , LLDB_INVALID_REGNUM       , gdb_xmm6           , LLDB_INVALID_REGNUM },      NULL,              NULL},
226402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "xmm7"  , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_xmm7      , gcc_dwarf_xmm7      , LLDB_INVALID_REGNUM       , gdb_xmm7           , LLDB_INVALID_REGNUM },      NULL,              NULL},
227402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "xmm8"  , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_xmm8      , gcc_dwarf_xmm8      , LLDB_INVALID_REGNUM       , gdb_xmm8           , LLDB_INVALID_REGNUM },      NULL,              NULL},
228402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "xmm9"  , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_xmm9      , gcc_dwarf_xmm9      , LLDB_INVALID_REGNUM       , gdb_xmm9           , LLDB_INVALID_REGNUM },      NULL,              NULL},
229402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "xmm10" , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_xmm10     , gcc_dwarf_xmm10     , LLDB_INVALID_REGNUM       , gdb_xmm10          , LLDB_INVALID_REGNUM },      NULL,              NULL},
230402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "xmm11" , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_xmm11     , gcc_dwarf_xmm11     , LLDB_INVALID_REGNUM       , gdb_xmm11          , LLDB_INVALID_REGNUM },      NULL,              NULL},
231402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "xmm12" , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_xmm12     , gcc_dwarf_xmm12     , LLDB_INVALID_REGNUM       , gdb_xmm12          , LLDB_INVALID_REGNUM },      NULL,              NULL},
232402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "xmm13" , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_xmm13     , gcc_dwarf_xmm13     , LLDB_INVALID_REGNUM       , gdb_xmm13          , LLDB_INVALID_REGNUM },      NULL,              NULL},
233402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "xmm14" , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_xmm14     , gcc_dwarf_xmm14     , LLDB_INVALID_REGNUM       , gdb_xmm14          , LLDB_INVALID_REGNUM },      NULL,              NULL},
234402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "xmm15" , NULL,   16,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_xmm15     , gcc_dwarf_xmm15     , LLDB_INVALID_REGNUM       , gdb_xmm15          , LLDB_INVALID_REGNUM },      NULL,              NULL},
235402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "mxcsr" , NULL,    4,  0, eEncodingUint  , eFormatHex          , { LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM , LLDB_INVALID_REGNUM       , gdb_mxcsr          , LLDB_INVALID_REGNUM },      NULL,              NULL},
236402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "ymm0"  , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_ymm0      , gcc_dwarf_ymm0      , LLDB_INVALID_REGNUM       , gdb_ymm0           , LLDB_INVALID_REGNUM },      NULL,              NULL},
237402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "ymm1"  , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_ymm1      , gcc_dwarf_ymm1      , LLDB_INVALID_REGNUM       , gdb_ymm1           , LLDB_INVALID_REGNUM },      NULL,              NULL},
238402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "ymm2"  , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_ymm2      , gcc_dwarf_ymm2      , LLDB_INVALID_REGNUM       , gdb_ymm2           , LLDB_INVALID_REGNUM },      NULL,              NULL},
239402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "ymm3"  , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_ymm3      , gcc_dwarf_ymm3      , LLDB_INVALID_REGNUM       , gdb_ymm3           , LLDB_INVALID_REGNUM },      NULL,              NULL},
240402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "ymm4"  , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_ymm4      , gcc_dwarf_ymm4      , LLDB_INVALID_REGNUM       , gdb_ymm4           , LLDB_INVALID_REGNUM },      NULL,              NULL},
241402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "ymm5"  , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_ymm5      , gcc_dwarf_ymm5      , LLDB_INVALID_REGNUM       , gdb_ymm5           , LLDB_INVALID_REGNUM },      NULL,              NULL},
242402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "ymm6"  , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_ymm6      , gcc_dwarf_ymm6      , LLDB_INVALID_REGNUM       , gdb_ymm6           , LLDB_INVALID_REGNUM },      NULL,              NULL},
243402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "ymm7"  , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_ymm7      , gcc_dwarf_ymm7      , LLDB_INVALID_REGNUM       , gdb_ymm7           , LLDB_INVALID_REGNUM },      NULL,              NULL},
244402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "ymm8"  , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_ymm8      , gcc_dwarf_ymm8      , LLDB_INVALID_REGNUM       , gdb_ymm8           , LLDB_INVALID_REGNUM },      NULL,              NULL},
245402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "ymm9"  , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_ymm9      , gcc_dwarf_ymm9      , LLDB_INVALID_REGNUM       , gdb_ymm9           , LLDB_INVALID_REGNUM },      NULL,              NULL},
246402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "ymm10" , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_ymm10     , gcc_dwarf_ymm10     , LLDB_INVALID_REGNUM       , gdb_ymm10          , LLDB_INVALID_REGNUM },      NULL,              NULL},
247402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "ymm11" , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_ymm11     , gcc_dwarf_ymm11     , LLDB_INVALID_REGNUM       , gdb_ymm11          , LLDB_INVALID_REGNUM },      NULL,              NULL},
248402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "ymm12" , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_ymm12     , gcc_dwarf_ymm12     , LLDB_INVALID_REGNUM       , gdb_ymm12          , LLDB_INVALID_REGNUM },      NULL,              NULL},
249402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "ymm13" , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_ymm13     , gcc_dwarf_ymm13     , LLDB_INVALID_REGNUM       , gdb_ymm13          , LLDB_INVALID_REGNUM },      NULL,              NULL},
250402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "ymm14" , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_ymm14     , gcc_dwarf_ymm14     , LLDB_INVALID_REGNUM       , gdb_ymm14          , LLDB_INVALID_REGNUM },      NULL,              NULL},
251402607fe513617c06282d4ae479522e244a53b71Johnny Chen    { "ymm15" , NULL,   32,  0, eEncodingVector, eFormatVectorOfUInt8, { gcc_dwarf_ymm15     , gcc_dwarf_ymm15     , LLDB_INVALID_REGNUM       , gdb_ymm15          , LLDB_INVALID_REGNUM },      NULL,              NULL}
25237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton};
25337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton
25437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Claytonstatic const uint32_t k_num_register_infos = sizeof(g_register_infos)/sizeof(RegisterInfo);
25537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Claytonstatic bool g_register_info_names_constified = false;
25637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton
25737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Claytonconst lldb_private::RegisterInfo *
25837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg ClaytonABISysV_x86_64::GetRegisterInfoArray (uint32_t &count)
25937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton{
26037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    // Make the C-string names and alt_names for the register infos into const
26137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    // C-string values by having the ConstString unique the names in the global
26237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    // constant C-string pool.
26337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    if (!g_register_info_names_constified)
26437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    {
26537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton        g_register_info_names_constified = true;
26637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton        for (uint32_t i=0; i<k_num_register_infos; ++i)
26737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton        {
26837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton            if (g_register_infos[i].name)
26937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton                g_register_infos[i].name = ConstString(g_register_infos[i].name).GetCString();
27037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton            if (g_register_infos[i].alt_name)
27137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton                g_register_infos[i].alt_name = ConstString(g_register_infos[i].alt_name).GetCString();
27237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton        }
27337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    }
27437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    count = k_num_register_infos;
27537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    return g_register_infos;
27637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton}
27737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton
27875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerABISysV_x86_64::GetRedZoneSize () const
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 128;
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Static Functions
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
28875906e4ec98af3717e415727a8d663a4e246bb4fGreg ClaytonABISP
289395fc33dc4b06c048ed35047ec461bc092ef2df3Greg ClaytonABISysV_x86_64::CreateInstance (const ArchSpec &arch)
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
29175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    static ABISP g_abi_sp;
292395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton    if (arch.GetTriple().getArch() == llvm::Triple::x86_64)
29375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    {
29475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton        if (!g_abi_sp)
29575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton            g_abi_sp.reset (new ABISysV_x86_64);
29675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton        return g_abi_sp;
29775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    }
29875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    return ABISP();
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerABISysV_x86_64::PrepareTrivialCall (Thread &thread,
303989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton                                    addr_t sp,
304989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton                                    addr_t func_addr,
305989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton                                    addr_t return_addr,
306989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton                                    addr_t *arg1_ptr,
307989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton                                    addr_t *arg2_ptr,
308989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton                                    addr_t *arg3_ptr,
309989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton                                    addr_t *arg4_ptr,
310989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton                                    addr_t *arg5_ptr,
311989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton                                    addr_t *arg6_ptr) const
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
313952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
3147a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan
3157a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan    if (log)
31652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
31752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        StreamString s;
31852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        s.Printf("ABISysV_x86_64::PrepareTrivialCall (tid = 0x%" PRIx64 ", sp = 0x%" PRIx64 ", func_addr = 0x%" PRIx64 ", return_addr = 0x%" PRIx64,
31952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    thread.GetID(),
3207a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan                    (uint64_t)sp,
32161d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton                    (uint64_t)func_addr,
32252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    (uint64_t)return_addr);
32352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
32452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (arg1_ptr)
32552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
32652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            s.Printf (", arg1 = 0x%" PRIx64, (uint64_t)*arg1_ptr);
32752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (arg2_ptr)
32852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            {
32952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                s.Printf (", arg2 = 0x%" PRIx64, (uint64_t)*arg2_ptr);
33052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (arg3_ptr)
33152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                {
33252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    s.Printf (", arg3 = 0x%" PRIx64, (uint64_t)*arg3_ptr);
33352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (arg4_ptr)
33452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    {
33552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        s.Printf (", arg4 = 0x%" PRIx64, (uint64_t)*arg4_ptr);
33652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        if (arg5_ptr)
33752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        {
33852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            s.Printf (", arg5 = 0x%" PRIx64, (uint64_t)*arg5_ptr);
33952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            if (arg6_ptr)
34052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                s.Printf (", arg6 = 0x%" PRIx64, (uint64_t)*arg6_ptr);
34152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        }
34252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    }
34352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                }
34452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            }
34552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
34652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        s.PutCString (")");
34752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        log->PutCString(s.GetString().c_str());
34852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
3497a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan
35008d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton    RegisterContext *reg_ctx = thread.GetRegisterContext().get();
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!reg_ctx)
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
353059ce9b34bce8bfa47e40edffc504103dfe07465Sean Callanan
3542f085c6ca2895663687dca704589478ff040b849Greg Clayton    const RegisterInfo *reg_info = NULL;
35561d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton    if (arg1_ptr)
3563c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
3572f085c6ca2895663687dca704589478ff040b849Greg Clayton        reg_info = reg_ctx->GetRegisterInfoByName("rdi", 0);
3587a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan        if (log)
3595f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea            log->Printf("About to write arg1 (0x%" PRIx64 ") into %s", (uint64_t)*arg1_ptr, reg_info->name);
36061d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton
3612f085c6ca2895663687dca704589478ff040b849Greg Clayton        if (!reg_ctx->WriteRegisterFromUnsigned (reg_info, *arg1_ptr))
3623c9c5eb466869ede185e879d14a47335fb43194dSean Callanan            return false;
36361d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton
36461d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton        if (arg2_ptr)
36561d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton        {
3662f085c6ca2895663687dca704589478ff040b849Greg Clayton            reg_info = reg_ctx->GetRegisterInfoByName("rsi", 0);
36761d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton            if (log)
3685f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                log->Printf("About to write arg2 (0x%" PRIx64 ") into %s", (uint64_t)*arg2_ptr, reg_info->name);
3692f085c6ca2895663687dca704589478ff040b849Greg Clayton            if (!reg_ctx->WriteRegisterFromUnsigned (reg_info, *arg2_ptr))
37061d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton                return false;
37161d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton
37261d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton            if (arg3_ptr)
37361d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton            {
3742f085c6ca2895663687dca704589478ff040b849Greg Clayton                reg_info = reg_ctx->GetRegisterInfoByName("rdx", 0);
37561d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton                if (log)
3765f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                    log->Printf("About to write arg3 (0x%" PRIx64 ") into %s", (uint64_t)*arg3_ptr, reg_info->name);
3772f085c6ca2895663687dca704589478ff040b849Greg Clayton                if (!reg_ctx->WriteRegisterFromUnsigned (reg_info, *arg3_ptr))
37861d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton                    return false;
3792f085c6ca2895663687dca704589478ff040b849Greg Clayton
3802f085c6ca2895663687dca704589478ff040b849Greg Clayton                if (arg4_ptr)
3812f085c6ca2895663687dca704589478ff040b849Greg Clayton                {
3822f085c6ca2895663687dca704589478ff040b849Greg Clayton                    reg_info = reg_ctx->GetRegisterInfoByName("rcx", 0);
3832f085c6ca2895663687dca704589478ff040b849Greg Clayton                    if (log)
3845f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                        log->Printf("About to write arg4 (0x%" PRIx64 ") into %s", (uint64_t)*arg4_ptr, reg_info->name);
3852f085c6ca2895663687dca704589478ff040b849Greg Clayton                    if (!reg_ctx->WriteRegisterFromUnsigned (reg_info, *arg4_ptr))
3862f085c6ca2895663687dca704589478ff040b849Greg Clayton                        return false;
3872f085c6ca2895663687dca704589478ff040b849Greg Clayton
3882f085c6ca2895663687dca704589478ff040b849Greg Clayton                    if (arg5_ptr)
3892f085c6ca2895663687dca704589478ff040b849Greg Clayton                    {
3902f085c6ca2895663687dca704589478ff040b849Greg Clayton                        reg_info = reg_ctx->GetRegisterInfoByName("r8", 0);
3912f085c6ca2895663687dca704589478ff040b849Greg Clayton                        if (log)
3925f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                            log->Printf("About to write arg5 (0x%" PRIx64 ") into %s", (uint64_t)*arg5_ptr, reg_info->name);
3932f085c6ca2895663687dca704589478ff040b849Greg Clayton                        if (!reg_ctx->WriteRegisterFromUnsigned (reg_info, *arg5_ptr))
3942f085c6ca2895663687dca704589478ff040b849Greg Clayton                            return false;
3952f085c6ca2895663687dca704589478ff040b849Greg Clayton
3962f085c6ca2895663687dca704589478ff040b849Greg Clayton                        if (arg6_ptr)
3972f085c6ca2895663687dca704589478ff040b849Greg Clayton                        {
3982f085c6ca2895663687dca704589478ff040b849Greg Clayton                            reg_info = reg_ctx->GetRegisterInfoByName("r9", 0);
3992f085c6ca2895663687dca704589478ff040b849Greg Clayton                            if (log)
4005f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                                log->Printf("About to write arg6 (0x%" PRIx64 ") into %s", (uint64_t)*arg6_ptr, reg_info->name);
4012f085c6ca2895663687dca704589478ff040b849Greg Clayton                            if (!reg_ctx->WriteRegisterFromUnsigned (reg_info, *arg6_ptr))
4022f085c6ca2895663687dca704589478ff040b849Greg Clayton                                return false;
4032f085c6ca2895663687dca704589478ff040b849Greg Clayton                        }
4042f085c6ca2895663687dca704589478ff040b849Greg Clayton                    }
4052f085c6ca2895663687dca704589478ff040b849Greg Clayton                }
40661d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton            }
40761d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton        }
4083c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41061d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // First, align the SP
41261d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton
4137a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan    if (log)
4145f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        log->Printf("16-byte aligning SP: 0x%" PRIx64 " to 0x%" PRIx64, (uint64_t)sp, (uint64_t)(sp & ~0xfull));
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    sp &= ~(0xfull); // 16-byte alignment
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41861d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton    // The return address is pushed onto the stack (yes after the alignment...)
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    sp -= 8;
42061d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton
4212f085c6ca2895663687dca704589478ff040b849Greg Clayton    RegisterValue reg_value;
42261d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton    reg_value.SetUInt64 (return_addr);
42361d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton
4247a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan    if (log)
4255f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        log->Printf("Pushing the return address onto the stack: new SP 0x%" PRIx64 ", return address 0x%" PRIx64, (uint64_t)sp, (uint64_t)return_addr);
42661d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton
42761d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton    const RegisterInfo *pc_reg_info = reg_ctx->GetRegisterInfoByName("rip");
42861d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton    Error error (reg_ctx->WriteRegisterValueToMemory(pc_reg_info, sp, pc_reg_info->byte_size, reg_value));
42961d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton    if (error.Fail())
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // %rsp is set to the actual stack value.
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4347a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan    if (log)
4355f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        log->Printf("Writing SP (0x%" PRIx64 ") down", (uint64_t)sp);
4367a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan
4372f085c6ca2895663687dca704589478ff040b849Greg Clayton    if (!reg_ctx->WriteRegisterFromUnsigned (reg_ctx->GetRegisterInfoByName("rsp"), sp))
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // %rip is set to the address of the called function.
4417a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan
4427a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan    if (log)
4435f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        log->Printf("Writing new IP (0x%" PRIx64 ") down", (uint64_t)func_addr);
44461d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton
4452f085c6ca2895663687dca704589478ff040b849Greg Clayton    if (!reg_ctx->WriteRegisterFromUnsigned (pc_reg_info, func_addr))
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return true;
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic bool ReadIntegerArgument(Scalar           &scalar,
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                unsigned int     bit_width,
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                bool             is_signed,
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                Thread           &thread,
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                uint32_t         *argument_register_ids,
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                unsigned int     &current_argument_register,
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                addr_t           &current_stack_argument)
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (bit_width > 64)
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false; // Scalar can't hold large integer arguments
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (current_argument_register < 6)
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
464c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        scalar = thread.GetRegisterContext()->ReadRegisterAsUnsigned(argument_register_ids[current_argument_register], 0);
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        current_argument_register++;
466c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        if (is_signed)
467c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            scalar.SignExtend (bit_width);
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
471c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        uint32_t byte_size = (bit_width + (8-1))/8;
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Error error;
473f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        if (thread.GetProcess()->ReadScalarIntegerFromMemory(current_stack_argument, byte_size, is_signed, scalar, error))
47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
475c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            current_stack_argument += byte_size;
476c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            return true;
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
478c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        return false;
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return true;
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerABISysV_x86_64::GetArgumentValues (Thread &thread,
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                   ValueList &values) const
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    unsigned int num_values = values.GetSize();
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    unsigned int value_index;
48952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Extract the register context so we can read arguments from registers
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49208d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton    RegisterContext *reg_ctx = thread.GetRegisterContext().get();
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!reg_ctx)
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Get the pointer to the first stack argument so we have a place to start
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // when reading data
49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    addr_t sp = reg_ctx->GetSP(0);
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!sp)
50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    addr_t current_stack_argument = sp + 8; // jump over return address
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t argument_register_ids[6];
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5093a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda    argument_register_ids[0] = reg_ctx->GetRegisterInfoByName("rdi", 0)->kinds[eRegisterKindLLDB];
5103a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda    argument_register_ids[1] = reg_ctx->GetRegisterInfoByName("rsi", 0)->kinds[eRegisterKindLLDB];
5113a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda    argument_register_ids[2] = reg_ctx->GetRegisterInfoByName("rdx", 0)->kinds[eRegisterKindLLDB];
5123a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda    argument_register_ids[3] = reg_ctx->GetRegisterInfoByName("rcx", 0)->kinds[eRegisterKindLLDB];
5133a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda    argument_register_ids[4] = reg_ctx->GetRegisterInfoByName("r8", 0)->kinds[eRegisterKindLLDB];
5143a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda    argument_register_ids[5] = reg_ctx->GetRegisterInfoByName("r9", 0)->kinds[eRegisterKindLLDB];
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    unsigned int current_argument_register = 0;
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (value_index = 0;
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner         value_index < num_values;
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner         ++value_index)
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Value *value = values.GetValueAtIndex(value_index);
52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!value)
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // We currently only support extracting values with Clang QualTypes.
52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Do we care about others?
52952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        ClangASTType clang_type = value->GetClangType();
53052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (!clang_type)
53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
53252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        bool is_signed;
53352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
53452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (clang_type.IsIntegerType (is_signed))
53552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
53652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            ReadIntegerArgument(value->GetScalar(),
53752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                clang_type.GetBitSize(),
53852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                is_signed,
53952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                thread,
54052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                argument_register_ids,
54152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                current_argument_register,
54252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                current_stack_argument);
54352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
54452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        else if (clang_type.IsPointerType ())
54552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
54652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            ReadIntegerArgument(value->GetScalar(),
54752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                clang_type.GetBitSize(),
54852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                false,
54952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                thread,
55052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                argument_register_ids,
55152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                current_argument_register,
55252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                current_stack_argument);
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return true;
55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
559466574555e98bc093d443d88492ce9db6ef3015fJim InghamError
560466574555e98bc093d443d88492ce9db6ef3015fJim InghamABISysV_x86_64::SetReturnValueObject(lldb::StackFrameSP &frame_sp, lldb::ValueObjectSP &new_value_sp)
561466574555e98bc093d443d88492ce9db6ef3015fJim Ingham{
562466574555e98bc093d443d88492ce9db6ef3015fJim Ingham    Error error;
563466574555e98bc093d443d88492ce9db6ef3015fJim Ingham    if (!new_value_sp)
564466574555e98bc093d443d88492ce9db6ef3015fJim Ingham    {
565466574555e98bc093d443d88492ce9db6ef3015fJim Ingham        error.SetErrorString("Empty value object for return value.");
566466574555e98bc093d443d88492ce9db6ef3015fJim Ingham        return error;
567466574555e98bc093d443d88492ce9db6ef3015fJim Ingham    }
568466574555e98bc093d443d88492ce9db6ef3015fJim Ingham
56952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType clang_type = new_value_sp->GetClangType();
57052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!clang_type)
571466574555e98bc093d443d88492ce9db6ef3015fJim Ingham    {
572466574555e98bc093d443d88492ce9db6ef3015fJim Ingham        error.SetErrorString ("Null clang type for return value.");
573466574555e98bc093d443d88492ce9db6ef3015fJim Ingham        return error;
574466574555e98bc093d443d88492ce9db6ef3015fJim Ingham    }
575466574555e98bc093d443d88492ce9db6ef3015fJim Ingham
576466574555e98bc093d443d88492ce9db6ef3015fJim Ingham    Thread *thread = frame_sp->GetThread().get();
577466574555e98bc093d443d88492ce9db6ef3015fJim Ingham
578466574555e98bc093d443d88492ce9db6ef3015fJim Ingham    bool is_signed;
579466574555e98bc093d443d88492ce9db6ef3015fJim Ingham    uint32_t count;
580466574555e98bc093d443d88492ce9db6ef3015fJim Ingham    bool is_complex;
581466574555e98bc093d443d88492ce9db6ef3015fJim Ingham
582466574555e98bc093d443d88492ce9db6ef3015fJim Ingham    RegisterContext *reg_ctx = thread->GetRegisterContext().get();
583466574555e98bc093d443d88492ce9db6ef3015fJim Ingham
584466574555e98bc093d443d88492ce9db6ef3015fJim Ingham    bool set_it_simple = false;
58552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (clang_type.IsIntegerType (is_signed) || clang_type.IsPointerType())
586466574555e98bc093d443d88492ce9db6ef3015fJim Ingham    {
587466574555e98bc093d443d88492ce9db6ef3015fJim Ingham        const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoByName("rax", 0);
588466574555e98bc093d443d88492ce9db6ef3015fJim Ingham
589466574555e98bc093d443d88492ce9db6ef3015fJim Ingham        DataExtractor data;
590466574555e98bc093d443d88492ce9db6ef3015fJim Ingham        size_t num_bytes = new_value_sp->GetData(data);
59136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        lldb::offset_t offset = 0;
592a004cb58d6c71672877a272c212b5f405d7f822fFilipe Cabecinhas        if (num_bytes <= 8)
593466574555e98bc093d443d88492ce9db6ef3015fJim Ingham        {
594466574555e98bc093d443d88492ce9db6ef3015fJim Ingham            uint64_t raw_value = data.GetMaxU64(&offset, num_bytes);
595466574555e98bc093d443d88492ce9db6ef3015fJim Ingham
596466574555e98bc093d443d88492ce9db6ef3015fJim Ingham            if (reg_ctx->WriteRegisterFromUnsigned (reg_info, raw_value))
597466574555e98bc093d443d88492ce9db6ef3015fJim Ingham                set_it_simple = true;
598466574555e98bc093d443d88492ce9db6ef3015fJim Ingham        }
599466574555e98bc093d443d88492ce9db6ef3015fJim Ingham        else
600466574555e98bc093d443d88492ce9db6ef3015fJim Ingham        {
601466574555e98bc093d443d88492ce9db6ef3015fJim Ingham            error.SetErrorString("We don't support returning longer than 64 bit integer values at present.");
602466574555e98bc093d443d88492ce9db6ef3015fJim Ingham        }
603466574555e98bc093d443d88492ce9db6ef3015fJim Ingham
604466574555e98bc093d443d88492ce9db6ef3015fJim Ingham    }
60552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    else if (clang_type.IsFloatingPointType (count, is_complex))
606466574555e98bc093d443d88492ce9db6ef3015fJim Ingham    {
607466574555e98bc093d443d88492ce9db6ef3015fJim Ingham        if (is_complex)
608466574555e98bc093d443d88492ce9db6ef3015fJim Ingham            error.SetErrorString ("We don't support returning complex values at present");
609466574555e98bc093d443d88492ce9db6ef3015fJim Ingham        else
610466574555e98bc093d443d88492ce9db6ef3015fJim Ingham        {
61152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            size_t bit_width = clang_type.GetBitSize();
612466574555e98bc093d443d88492ce9db6ef3015fJim Ingham            if (bit_width <= 64)
613466574555e98bc093d443d88492ce9db6ef3015fJim Ingham            {
614466574555e98bc093d443d88492ce9db6ef3015fJim Ingham                const RegisterInfo *xmm0_info = reg_ctx->GetRegisterInfoByName("xmm0", 0);
615466574555e98bc093d443d88492ce9db6ef3015fJim Ingham                RegisterValue xmm0_value;
616466574555e98bc093d443d88492ce9db6ef3015fJim Ingham                DataExtractor data;
617466574555e98bc093d443d88492ce9db6ef3015fJim Ingham                size_t num_bytes = new_value_sp->GetData(data);
618466574555e98bc093d443d88492ce9db6ef3015fJim Ingham
619466574555e98bc093d443d88492ce9db6ef3015fJim Ingham                unsigned char buffer[16];
620466574555e98bc093d443d88492ce9db6ef3015fJim Ingham                ByteOrder byte_order = data.GetByteOrder();
621466574555e98bc093d443d88492ce9db6ef3015fJim Ingham
6226f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham                data.CopyByteOrderedData (0, num_bytes, buffer, 16, byte_order);
623466574555e98bc093d443d88492ce9db6ef3015fJim Ingham                xmm0_value.SetBytes(buffer, 16, byte_order);
624466574555e98bc093d443d88492ce9db6ef3015fJim Ingham                reg_ctx->WriteRegister(xmm0_info, xmm0_value);
625466574555e98bc093d443d88492ce9db6ef3015fJim Ingham                set_it_simple = true;
626466574555e98bc093d443d88492ce9db6ef3015fJim Ingham            }
627466574555e98bc093d443d88492ce9db6ef3015fJim Ingham            else
628466574555e98bc093d443d88492ce9db6ef3015fJim Ingham            {
629466574555e98bc093d443d88492ce9db6ef3015fJim Ingham                // FIXME - don't know how to do 80 bit long doubles yet.
630466574555e98bc093d443d88492ce9db6ef3015fJim Ingham                error.SetErrorString ("We don't support returning float values > 64 bits at present");
631466574555e98bc093d443d88492ce9db6ef3015fJim Ingham            }
632466574555e98bc093d443d88492ce9db6ef3015fJim Ingham        }
633466574555e98bc093d443d88492ce9db6ef3015fJim Ingham    }
634466574555e98bc093d443d88492ce9db6ef3015fJim Ingham
635466574555e98bc093d443d88492ce9db6ef3015fJim Ingham    if (!set_it_simple)
636466574555e98bc093d443d88492ce9db6ef3015fJim Ingham    {
637466574555e98bc093d443d88492ce9db6ef3015fJim Ingham        // Okay we've got a structure or something that doesn't fit in a simple register.
638466574555e98bc093d443d88492ce9db6ef3015fJim Ingham        // We should figure out where it really goes, but we don't support this yet.
639466574555e98bc093d443d88492ce9db6ef3015fJim Ingham        error.SetErrorString ("We only support setting simple integer and float return types at present.");
640466574555e98bc093d443d88492ce9db6ef3015fJim Ingham    }
641466574555e98bc093d443d88492ce9db6ef3015fJim Ingham
642466574555e98bc093d443d88492ce9db6ef3015fJim Ingham    return error;
643466574555e98bc093d443d88492ce9db6ef3015fJim Ingham}
644466574555e98bc093d443d88492ce9db6ef3015fJim Ingham
645466574555e98bc093d443d88492ce9db6ef3015fJim Ingham
646016ef8886cd429f8a53bff967e601f831e409eaaJim InghamValueObjectSP
647016ef8886cd429f8a53bff967e601f831e409eaaJim InghamABISysV_x86_64::GetReturnValueObjectSimple (Thread &thread,
64852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                            ClangASTType &return_clang_type) const
64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
650016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham    ValueObjectSP return_valobj_sp;
651016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham    Value value;
652016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
65352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!return_clang_type)
654016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        return return_valobj_sp;
655016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
65652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //value.SetContext (Value::eContextTypeClangType, return_value_type);
65752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    value.SetClangType (return_clang_type);
658016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
659016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham    RegisterContext *reg_ctx = thread.GetRegisterContext().get();
660016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham    if (!reg_ctx)
661016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        return return_valobj_sp;
662016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
66352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const uint32_t type_flags = return_clang_type.GetTypeInfo ();
66452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (type_flags & ClangASTType::eTypeIsScalar)
66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
666f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton        value.SetValueType(Value::eValueTypeScalar);
667f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton
668f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton        bool success = false;
66952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (type_flags & ClangASTType::eTypeIsInteger)
670016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        {
671f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton            // Extract the register context so we can read arguments from registers
672f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton
67352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            const size_t byte_size = return_clang_type.GetByteSize();
674f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton            uint64_t raw_value = thread.GetRegisterContext()->ReadRegisterAsUnsigned(reg_ctx->GetRegisterInfoByName("rax", 0), 0);
67552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            const bool is_signed = (type_flags & ClangASTType::eTypeIsSigned) != 0;
676f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton            switch (byte_size)
677f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton            {
678f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton            default:
679f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                break;
680f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton
681f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton            case sizeof(uint64_t):
682f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                if (is_signed)
683f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                    value.GetScalar() = (int64_t)(raw_value);
684f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                else
685f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                    value.GetScalar() = (uint64_t)(raw_value);
686f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                success = true;
687f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                break;
688f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton
689f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton            case sizeof(uint32_t):
690f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                if (is_signed)
691f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                    value.GetScalar() = (int32_t)(raw_value & UINT32_MAX);
692f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                else
693f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                    value.GetScalar() = (uint32_t)(raw_value & UINT32_MAX);
694f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                success = true;
695f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                break;
696f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton
697f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton            case sizeof(uint16_t):
698f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                if (is_signed)
699f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                    value.GetScalar() = (int16_t)(raw_value & UINT16_MAX);
700f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                else
701f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                    value.GetScalar() = (uint16_t)(raw_value & UINT16_MAX);
702f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                success = true;
703f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                break;
704f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton
705f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton            case sizeof(uint8_t):
706f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                if (is_signed)
707f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                    value.GetScalar() = (int8_t)(raw_value & UINT8_MAX);
708f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                else
709f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                    value.GetScalar() = (uint8_t)(raw_value & UINT8_MAX);
710f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                success = true;
711f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                break;
712f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton            }
713016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        }
71452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        else if (type_flags & ClangASTType::eTypeIsFloat)
715016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        {
71652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (type_flags & ClangASTType::eTypeIsComplex)
717016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            {
718f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                // Don't handle complex yet.
719f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton            }
720f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton            else
721f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton            {
72252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const size_t byte_size = return_clang_type.GetByteSize();
723f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                if (byte_size <= sizeof(long double))
724016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                {
725f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                    const RegisterInfo *xmm0_info = reg_ctx->GetRegisterInfoByName("xmm0", 0);
726f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                    RegisterValue xmm0_value;
727f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                    if (reg_ctx->ReadRegister (xmm0_info, xmm0_value))
728016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                    {
729f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                        DataExtractor data;
730f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                        if (xmm0_value.GetData(data))
731f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                        {
732f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                            lldb::offset_t offset = 0;
733f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                            if (byte_size == sizeof(float))
734f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                            {
735f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                                value.GetScalar() = (float) data.GetFloat(&offset);
736f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                                success = true;
737f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                            }
738f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                            else if (byte_size == sizeof(double))
739f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                            {
740f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                                value.GetScalar() = (double) data.GetDouble(&offset);
741f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                                success = true;
742f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                            }
743f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                            else if (byte_size == sizeof(long double))
744f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                            {
745f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                                // Don't handle long double since that can be encoded as 80 bit floats...
746f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                            }
747f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                        }
748016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                    }
749016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                }
750016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            }
751016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        }
752f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton
753f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton        if (success)
754f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton            return_valobj_sp = ValueObjectConstResult::Create (thread.GetStackFrameAtIndex(0).get(),
755f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                                                               value,
756f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                                                               ConstString(""));
757f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton
758016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham    }
75952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    else if (type_flags & ClangASTType::eTypeIsPointer)
760016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham    {
761016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        unsigned rax_id = reg_ctx->GetRegisterInfoByName("rax", 0)->kinds[eRegisterKindLLDB];
762016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        value.GetScalar() = (uint64_t)thread.GetRegisterContext()->ReadRegisterAsUnsigned(rax_id, 0);
763f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton        value.SetValueType(Value::eValueTypeScalar);
764f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton        return_valobj_sp = ValueObjectConstResult::Create (thread.GetStackFrameAtIndex(0).get(),
765f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                                                           value,
766f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                                                           ConstString(""));
767016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham    }
76852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    else if (type_flags & ClangASTType::eTypeIsVector)
769016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham    {
77052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        const size_t byte_size = return_clang_type.GetByteSize();
771f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton        if (byte_size > 0)
772f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton        {
773f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton
774f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton            const RegisterInfo *altivec_reg = reg_ctx->GetRegisterInfoByName("ymm0", 0);
775f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton            if (altivec_reg == NULL)
776f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton            {
777f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                altivec_reg = reg_ctx->GetRegisterInfoByName("xmm0", 0);
778f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                if (altivec_reg == NULL)
779f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                    altivec_reg = reg_ctx->GetRegisterInfoByName("mm0", 0);
780f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton            }
781f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton
782f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton            if (altivec_reg)
783f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton            {
784f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                if (byte_size <= altivec_reg->byte_size)
785f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                {
786f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                    ProcessSP process_sp (thread.GetProcess());
787f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                    if (process_sp)
788f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                    {
789102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton                        std::unique_ptr<DataBufferHeap> heap_data_ap (new DataBufferHeap(byte_size, 0));
790f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                        const ByteOrder byte_order = process_sp->GetByteOrder();
791f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                        RegisterValue reg_value;
792f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                        if (reg_ctx->ReadRegister(altivec_reg, reg_value))
793f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                        {
794f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                            Error error;
795f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                            if (reg_value.GetAsMemoryData (altivec_reg,
796f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                                                           heap_data_ap->GetBytes(),
797f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                                                           heap_data_ap->GetByteSize(),
798f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                                                           byte_order,
799f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                                                           error))
800f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                            {
801f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                                DataExtractor data (DataBufferSP (heap_data_ap.release()),
802f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                                                    byte_order,
803f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                                                    process_sp->GetTarget().GetArchitecture().GetAddressByteSize());
804f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                                return_valobj_sp = ValueObjectConstResult::Create (&thread,
80552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                   return_clang_type,
806f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                                                                                   ConstString(""),
807f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                                                                                   data);
808f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                            }
809f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                        }
810f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                    }
811f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton                }
812f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton            }
813f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton        }
814016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham    }
815016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
816016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham    return return_valobj_sp;
817016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham}
818016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
819016ef8886cd429f8a53bff967e601f831e409eaaJim InghamValueObjectSP
82052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonABISysV_x86_64::GetReturnValueObjectImpl (Thread &thread, ClangASTType &return_clang_type) const
821016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham{
822016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham    ValueObjectSP return_valobj_sp;
82352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
82452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!return_clang_type)
82552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return return_valobj_sp;
826016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
827f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    ExecutionContext exe_ctx (thread.shared_from_this());
82852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return_valobj_sp = GetReturnValueObjectSimple(thread, return_clang_type);
829016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham    if (return_valobj_sp)
830016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        return return_valobj_sp;
831016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
832016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham    RegisterContextSP reg_ctx_sp = thread.GetRegisterContext();
833016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham    if (!reg_ctx_sp)
834016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        return return_valobj_sp;
835016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
83652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const size_t bit_width = return_clang_type.GetBitSize();
83752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (return_clang_type.IsAggregateType())
838016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham    {
839f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        Target *target = exe_ctx.GetTargetPtr();
840016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        bool is_memory = true;
841016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        if (bit_width <= 128)
842016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        {
843f4124deeb9532044a38c0774ced872f2709347daGreg Clayton            ByteOrder target_byte_order = target->GetArchitecture().GetByteOrder();
844016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            DataBufferSP data_sp (new DataBufferHeap(16, 0));
845016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            DataExtractor return_ext (data_sp,
846016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                                      target_byte_order,
847f4124deeb9532044a38c0774ced872f2709347daGreg Clayton                                      target->GetArchitecture().GetAddressByteSize());
848016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
849016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            const RegisterInfo *rax_info = reg_ctx_sp->GetRegisterInfoByName("rax", 0);
850016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            const RegisterInfo *rdx_info = reg_ctx_sp->GetRegisterInfoByName("rdx", 0);
851016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            const RegisterInfo *xmm0_info = reg_ctx_sp->GetRegisterInfoByName("xmm0", 0);
852016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            const RegisterInfo *xmm1_info = reg_ctx_sp->GetRegisterInfoByName("xmm1", 0);
85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
854016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            RegisterValue rax_value, rdx_value, xmm0_value, xmm1_value;
855016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            reg_ctx_sp->ReadRegister (rax_info, rax_value);
856016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            reg_ctx_sp->ReadRegister (rdx_info, rdx_value);
857016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            reg_ctx_sp->ReadRegister (xmm0_info, xmm0_value);
858016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            reg_ctx_sp->ReadRegister (xmm1_info, xmm1_value);
859016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
860016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            DataExtractor rax_data, rdx_data, xmm0_data, xmm1_data;
86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
862016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            rax_value.GetData(rax_data);
863016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            rdx_value.GetData(rdx_data);
864016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            xmm0_value.GetData(xmm0_data);
865016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            xmm1_value.GetData(xmm1_data);
866016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
867016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            uint32_t fp_bytes = 0;       // Tracks how much of the xmm registers we've consumed so far
868016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            uint32_t integer_bytes = 0;  // Tracks how much of the rax/rds registers we've consumed so far
869016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
87052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            const uint32_t num_children = return_clang_type.GetNumFields ();
871016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
872016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            // Since we are in the small struct regime, assume we are not in memory.
873016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            is_memory = false;
874016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
875016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            for (uint32_t idx = 0; idx < num_children; idx++)
87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
877016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                std::string name;
878f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton                uint64_t field_bit_offset = 0;
879016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                bool is_signed;
880016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                bool is_complex;
881016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                uint32_t count;
88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
88352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                ClangASTType field_clang_type = return_clang_type.GetFieldAtIndex (idx, name, &field_bit_offset, NULL, NULL);
88452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                const size_t field_bit_width = field_clang_type.GetBitSize();
885016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
886016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                // If there are any unaligned fields, this is stored in memory.
887016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                if (field_bit_offset % field_bit_width != 0)
888016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                {
889016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                    is_memory = true;
890016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                    break;
891016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                }
89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
893016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                uint32_t field_byte_width = field_bit_width/8;
894016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                uint32_t field_byte_offset = field_bit_offset/8;
89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
896016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
897016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                DataExtractor *copy_from_extractor = NULL;
898016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                uint32_t       copy_from_offset    = 0;
89924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
90052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (field_clang_type.IsIntegerType (is_signed) || field_clang_type.IsPointerType ())
90124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
902016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                    if (integer_bytes < 8)
903016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                    {
904016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        if (integer_bytes + field_byte_width <= 8)
905016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        {
906016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                            // This is in RAX, copy from register to our result structure:
907016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                            copy_from_extractor = &rax_data;
908016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                            copy_from_offset = integer_bytes;
909016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                            integer_bytes += field_byte_width;
910016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        }
911016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        else
912016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        {
913016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                            // The next field wouldn't fit in the remaining space, so we pushed it to rdx.
914016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                            copy_from_extractor = &rdx_data;
915016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                            copy_from_offset = 0;
916016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                            integer_bytes = 8 + field_byte_width;
917016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
918016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        }
919016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                    }
920016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                    else if (integer_bytes + field_byte_width <= 16)
921016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                    {
922016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        copy_from_extractor = &rdx_data;
923016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        copy_from_offset = integer_bytes - 8;
924016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        integer_bytes += field_byte_width;
925016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                    }
92624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    else
927016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                    {
928016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        // The last field didn't fit.  I can't see how that would happen w/o the overall size being
929016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        // greater than 16 bytes.  For now, return a NULL return value object.
930016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        return return_valobj_sp;
931016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                    }
93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
93352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                else if (field_clang_type.IsFloatingPointType (count, is_complex))
934016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                {
935016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                    // Structs with long doubles are always passed in memory.
936016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                    if (field_bit_width == 128)
937016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                    {
938016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        is_memory = true;
939016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        break;
940016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                    }
941016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                    else if (field_bit_width == 64)
942016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                    {
943016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        // These have to be in a single xmm register.
944016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        if (fp_bytes == 0)
945016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                            copy_from_extractor = &xmm0_data;
946016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        else
947016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                            copy_from_extractor = &xmm1_data;
948016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
949016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        copy_from_offset = 0;
950016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        fp_bytes += field_byte_width;
951016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                    }
952016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                    else if (field_bit_width == 32)
953016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                    {
954016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        // This one is kind of complicated.  If we are in an "eightbyte" with another float, we'll
955016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        // be stuffed into an xmm register with it.  If we are in an "eightbyte" with one or more ints,
956016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        // then we will be stuffed into the appropriate GPR with them.
957016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        bool in_gpr;
958016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        if (field_byte_offset % 8 == 0)
959016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        {
960016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                            // We are at the beginning of one of the eightbytes, so check the next element (if any)
961016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                            if (idx == num_children - 1)
9628806edbc28001261a6dc36e09446321b1aa1c780Jim Ingham                                in_gpr = false;
963016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                            else
964016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                            {
965f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton                                uint64_t next_field_bit_offset = 0;
96652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                ClangASTType next_field_clang_type = return_clang_type.GetFieldAtIndex (idx + 1,
96752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                                        name,
96852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                                        &next_field_bit_offset,
96952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                                        NULL,
97052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                                        NULL);
97152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                if (next_field_clang_type.IsIntegerType (is_signed))
972016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                                    in_gpr = true;
973016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                                else
974016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                                {
975016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                                    copy_from_offset = 0;
976016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                                    in_gpr = false;
977016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                                }
978016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                            }
979016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
980016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        }
981016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        else if (field_byte_offset % 4 == 0)
982016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        {
983016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                            // We are inside of an eightbyte, so see if the field before us is floating point:
984016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                            // This could happen if somebody put padding in the structure.
985016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                            if (idx == 0)
986016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                                in_gpr = false;
987016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                            else
988016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                            {
989f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton                                uint64_t prev_field_bit_offset = 0;
99052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                ClangASTType prev_field_clang_type = return_clang_type.GetFieldAtIndex (idx - 1,
99152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                                        name,
99252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                                        &prev_field_bit_offset,
99352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                                        NULL,
99452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                                        NULL);
99552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                if (prev_field_clang_type.IsIntegerType (is_signed))
996016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                                    in_gpr = true;
997016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                                else
998016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                                {
999016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                                    copy_from_offset = 4;
1000016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                                    in_gpr = false;
1001016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                                }
1002016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                            }
1003016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
1004016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        }
1005016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        else
1006016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        {
1007016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                            is_memory = true;
1008016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                            continue;
1009016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        }
1010016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
1011016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        // Okay, we've figured out whether we are in GPR or XMM, now figure out which one.
1012016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        if (in_gpr)
1013016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        {
1014016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                            if (integer_bytes < 8)
1015016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                            {
1016016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                                // This is in RAX, copy from register to our result structure:
1017016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                                copy_from_extractor = &rax_data;
1018016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                                copy_from_offset = integer_bytes;
1019016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                                integer_bytes += field_byte_width;
1020016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                            }
1021016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                            else
1022016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                            {
1023016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                                copy_from_extractor = &rdx_data;
1024016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                                copy_from_offset = integer_bytes - 8;
1025016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                                integer_bytes += field_byte_width;
1026016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                            }
1027016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        }
1028016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        else
1029016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        {
1030016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                            if (fp_bytes < 8)
1031016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                                copy_from_extractor = &xmm0_data;
1032016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                            else
1033016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                                copy_from_extractor = &xmm1_data;
1034016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
1035016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                            fp_bytes += field_byte_width;
1036016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                        }
1037016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                    }
1038016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                }
1039ae00d56a85fc2dde28bc7f66ef06c544faa06239Jim Ingham
1040ae00d56a85fc2dde28bc7f66ef06c544faa06239Jim Ingham                // These two tests are just sanity checks.  If I somehow get the
1041ae00d56a85fc2dde28bc7f66ef06c544faa06239Jim Ingham                // type calculation wrong above it is better to just return nothing
1042db1bea7e973fbbc2887596e4aa061cf5aec2a566Jim Ingham                // than to assert or crash.
1043016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                if (!copy_from_extractor)
1044016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                    return return_valobj_sp;
1045ae00d56a85fc2dde28bc7f66ef06c544faa06239Jim Ingham                if (copy_from_offset + field_byte_width > copy_from_extractor->GetByteSize())
1046ae00d56a85fc2dde28bc7f66ef06c544faa06239Jim Ingham                    return return_valobj_sp;
1047016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
1048016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                copy_from_extractor->CopyByteOrderedData (copy_from_offset,
1049016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                                                          field_byte_width,
1050016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                                                          data_sp->GetBytes() + field_byte_offset,
1051016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                                                          field_byte_width,
1052016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                                                          target_byte_order);
105324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
1054016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
1055016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            if (!is_memory)
105624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
1057016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                // The result is in our data buffer.  Let's make a variable object out of it:
1058016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                return_valobj_sp = ValueObjectConstResult::Create (&thread,
105952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                   return_clang_type,
1060016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                                                                   ConstString(""),
1061016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                                                                   return_ext);
106224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
106324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
1064016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
10650bcec0b86e9fdf8fb53a19202fb4882dc5e23e4dJim Ingham
10660bcec0b86e9fdf8fb53a19202fb4882dc5e23e4dJim Ingham        // FIXME: This is just taking a guess, rax may very well no longer hold the return storage location.
10670bcec0b86e9fdf8fb53a19202fb4882dc5e23e4dJim Ingham        // If we are going to do this right, when we make a new frame we should check to see if it uses a memory
10680bcec0b86e9fdf8fb53a19202fb4882dc5e23e4dJim Ingham        // return, and if we are at the first instruction and if so stash away the return location.  Then we would
10690bcec0b86e9fdf8fb53a19202fb4882dc5e23e4dJim Ingham        // only return the memory return value if we know it is valid.
10700bcec0b86e9fdf8fb53a19202fb4882dc5e23e4dJim Ingham
1071016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        if (is_memory)
1072016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        {
1073016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            unsigned rax_id = reg_ctx_sp->GetRegisterInfoByName("rax", 0)->kinds[eRegisterKindLLDB];
1074016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            lldb::addr_t storage_addr = (uint64_t)thread.GetRegisterContext()->ReadRegisterAsUnsigned(rax_id, 0);
1075016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham            return_valobj_sp = ValueObjectMemory::Create (&thread,
1076016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                                                          "",
1077016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham                                                          Address (storage_addr, NULL),
107852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                          return_clang_type);
1079016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham        }
108024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
1081016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham
1082016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham    return return_valobj_sp;
108324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
108424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
108575906e4ec98af3717e415727a8d663a4e246bb4fGreg Claytonbool
108675906e4ec98af3717e415727a8d663a4e246bb4fGreg ClaytonABISysV_x86_64::CreateFunctionEntryUnwindPlan (UnwindPlan &unwind_plan)
108775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton{
108875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    uint32_t reg_kind = unwind_plan.GetRegisterKind();
108975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    uint32_t sp_reg_num = LLDB_INVALID_REGNUM;
109075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    uint32_t pc_reg_num = LLDB_INVALID_REGNUM;
109175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
109275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    switch (reg_kind)
109375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    {
109475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    case eRegisterKindDWARF:
109575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    case eRegisterKindGCC:
109675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton        sp_reg_num = gcc_dwarf_rsp;
109775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton        pc_reg_num = gcc_dwarf_rip;
109875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton        break;
109975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
110075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    case eRegisterKindGDB:
110175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton        sp_reg_num = gdb_rsp;
110275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton        pc_reg_num = gdb_rip;
110375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton        break;
110475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
110575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    case eRegisterKindGeneric:
110675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton        sp_reg_num = LLDB_REGNUM_GENERIC_SP;
110775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton        pc_reg_num = LLDB_REGNUM_GENERIC_PC;
110875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton        break;
110975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    }
111075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
111175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    if (sp_reg_num == LLDB_INVALID_REGNUM ||
111275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton        pc_reg_num == LLDB_INVALID_REGNUM)
111375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton        return false;
111475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
111568fa4ec4361d1ea5a78a8a7eba2b8015e3dd68f7Jason Molenda    UnwindPlan::RowSP row(new UnwindPlan::Row);
111668fa4ec4361d1ea5a78a8a7eba2b8015e3dd68f7Jason Molenda    row->SetCFARegister (sp_reg_num);
111768fa4ec4361d1ea5a78a8a7eba2b8015e3dd68f7Jason Molenda    row->SetCFAOffset (8);
111868fa4ec4361d1ea5a78a8a7eba2b8015e3dd68f7Jason Molenda    row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, -8, false);
111975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    unwind_plan.AppendRow (row);
1120819dd5e0990e8550d0185f65cc5cf4bc3d9d1058Jason Molenda    unwind_plan.SetSourceName ("x86_64 at-func-entry default");
112137816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda    unwind_plan.SetSourcedFromCompiler (eLazyBoolNo);
112275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    return true;
112375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton}
112475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
112575906e4ec98af3717e415727a8d663a4e246bb4fGreg Claytonbool
112675906e4ec98af3717e415727a8d663a4e246bb4fGreg ClaytonABISysV_x86_64::CreateDefaultUnwindPlan (UnwindPlan &unwind_plan)
112775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton{
112875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    uint32_t reg_kind = unwind_plan.GetRegisterKind();
112975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    uint32_t fp_reg_num = LLDB_INVALID_REGNUM;
113075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    uint32_t sp_reg_num = LLDB_INVALID_REGNUM;
113175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    uint32_t pc_reg_num = LLDB_INVALID_REGNUM;
113275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
113375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    switch (reg_kind)
113475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    {
113575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton        case eRegisterKindDWARF:
113675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton        case eRegisterKindGCC:
113775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton            fp_reg_num = gcc_dwarf_rbp;
113875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton            sp_reg_num = gcc_dwarf_rsp;
113975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton            pc_reg_num = gcc_dwarf_rip;
114075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton            break;
114175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
114275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton        case eRegisterKindGDB:
114375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton            fp_reg_num = gdb_rbp;
114475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton            sp_reg_num = gdb_rsp;
114575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton            pc_reg_num = gdb_rip;
114675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton            break;
114775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
114875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton        case eRegisterKindGeneric:
114975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton            fp_reg_num = LLDB_REGNUM_GENERIC_FP;
115075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton            sp_reg_num = LLDB_REGNUM_GENERIC_SP;
115175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton            pc_reg_num = LLDB_REGNUM_GENERIC_PC;
115275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton            break;
115375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    }
115475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
115575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    if (fp_reg_num == LLDB_INVALID_REGNUM ||
115675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton        sp_reg_num == LLDB_INVALID_REGNUM ||
115775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton        pc_reg_num == LLDB_INVALID_REGNUM)
115875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton        return false;
115975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
116068fa4ec4361d1ea5a78a8a7eba2b8015e3dd68f7Jason Molenda    UnwindPlan::RowSP row(new UnwindPlan::Row);
116175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
116275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    const int32_t ptr_size = 8;
116368fa4ec4361d1ea5a78a8a7eba2b8015e3dd68f7Jason Molenda    row->SetCFARegister (LLDB_REGNUM_GENERIC_FP);
116468fa4ec4361d1ea5a78a8a7eba2b8015e3dd68f7Jason Molenda    row->SetCFAOffset (2 * ptr_size);
116568fa4ec4361d1ea5a78a8a7eba2b8015e3dd68f7Jason Molenda    row->SetOffset (0);
116675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
116768fa4ec4361d1ea5a78a8a7eba2b8015e3dd68f7Jason Molenda    row->SetRegisterLocationToAtCFAPlusOffset(fp_reg_num, ptr_size * -2, true);
116868fa4ec4361d1ea5a78a8a7eba2b8015e3dd68f7Jason Molenda    row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, ptr_size * -1, true);
116968fa4ec4361d1ea5a78a8a7eba2b8015e3dd68f7Jason Molenda    row->SetRegisterLocationToAtCFAPlusOffset(sp_reg_num, ptr_size *  0, true);
117075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
117175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    unwind_plan.AppendRow (row);
117275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    unwind_plan.SetSourceName ("x86_64 default unwind plan");
117337816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda    unwind_plan.SetSourcedFromCompiler (eLazyBoolNo);
117437816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda    unwind_plan.SetUnwindPlanValidAtAllInstructions (eLazyBoolNo);
117575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    return true;
117675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton}
117775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
117875906e4ec98af3717e415727a8d663a4e246bb4fGreg Claytonbool
117975906e4ec98af3717e415727a8d663a4e246bb4fGreg ClaytonABISysV_x86_64::RegisterIsVolatile (const RegisterInfo *reg_info)
118075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton{
118175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    return !RegisterIsCalleeSaved (reg_info);
118275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton}
118375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
118437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton
118537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton
1186ce56890217a3eff259b1b4a0d7f2d4636d882a35Jason Molenda// See "Register Usage" in the
1187ce56890217a3eff259b1b4a0d7f2d4636d882a35Jason Molenda// "System V Application Binary Interface"
1188ce56890217a3eff259b1b4a0d7f2d4636d882a35Jason Molenda// "AMD64 Architecture Processor Supplement"
1189ce56890217a3eff259b1b4a0d7f2d4636d882a35Jason Molenda// (or "x86-64(tm) Architecture Processor Supplement" in earlier revisions)
11906855784d6c31c060c230d99f6107c52fa22f1b3fJason Molenda// (this doc is also commonly referred to as the x86-64/AMD64 psABI)
1191ce56890217a3eff259b1b4a0d7f2d4636d882a35Jason Molenda// Edited by Michael Matz, Jan Hubicka, Andreas Jaeger, and Mark Mitchell
119266a83563e11a4974362d71358f67e55effc13030Jason Molenda// current version is 0.99.6 released 2012-07-02 at http://refspecs.linuxfoundation.org/elf/x86-64-abi-0.99.pdf
119337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton
119475906e4ec98af3717e415727a8d663a4e246bb4fGreg Claytonbool
119575906e4ec98af3717e415727a8d663a4e246bb4fGreg ClaytonABISysV_x86_64::RegisterIsCalleeSaved (const RegisterInfo *reg_info)
119675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton{
119775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    if (reg_info)
119875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    {
1199ce56890217a3eff259b1b4a0d7f2d4636d882a35Jason Molenda        // Preserved registers are :
1200ce56890217a3eff259b1b4a0d7f2d4636d882a35Jason Molenda        //    rbx, rsp, rbp, r12, r13, r14, r15
1201ce56890217a3eff259b1b4a0d7f2d4636d882a35Jason Molenda        //    mxcsr (partially preserved)
1202ce56890217a3eff259b1b4a0d7f2d4636d882a35Jason Molenda        //    x87 control word
1203ce56890217a3eff259b1b4a0d7f2d4636d882a35Jason Molenda
120475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton        const char *name = reg_info->name;
120575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton        if (name[0] == 'r')
120675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton        {
120775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton            switch (name[1])
120875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton            {
120975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton            case '1': // r12, r13, r14, r15
121075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton                if (name[2] >= '2' && name[2] <= '5')
121175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton                    return name[3] == '\0';
121275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton                break;
121375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
1214ee3cb1e2f70c16d6013ee0d2d2ea248d78c1b458Jason Molenda            default:
1215ee3cb1e2f70c16d6013ee0d2d2ea248d78c1b458Jason Molenda                break;
1216ee3cb1e2f70c16d6013ee0d2d2ea248d78c1b458Jason Molenda            }
1217ee3cb1e2f70c16d6013ee0d2d2ea248d78c1b458Jason Molenda        }
1218ee3cb1e2f70c16d6013ee0d2d2ea248d78c1b458Jason Molenda
1219ee3cb1e2f70c16d6013ee0d2d2ea248d78c1b458Jason Molenda        // Accept shorter-variant versions, rbx/ebx, rip/ eip, etc.
1220ee3cb1e2f70c16d6013ee0d2d2ea248d78c1b458Jason Molenda        if (name[0] == 'r' || name[0] == 'e')
1221ee3cb1e2f70c16d6013ee0d2d2ea248d78c1b458Jason Molenda        {
1222ee3cb1e2f70c16d6013ee0d2d2ea248d78c1b458Jason Molenda            switch (name[1])
1223ee3cb1e2f70c16d6013ee0d2d2ea248d78c1b458Jason Molenda            {
122475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton            case 'b': // rbp, rbx
122575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton                if (name[2] == 'p' || name[2] == 'x')
122675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton                    return name[3] == '\0';
122775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton                break;
122875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
122975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton            case 'i': // rip
123075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton                if (name[2] == 'p')
123175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton                    return name[3] == '\0';
123275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton                break;
123375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
123475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton            case 's': // rsp
123575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton                if (name[2] == 'p')
123675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton                    return name[3] == '\0';
123775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton                break;
123875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
123975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton            }
124075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton        }
1241ce56890217a3eff259b1b4a0d7f2d4636d882a35Jason Molenda        if (name[0] == 's' && name[1] == 'p' && name[2] == '\0')   // sp
1242ce56890217a3eff259b1b4a0d7f2d4636d882a35Jason Molenda            return true;
1243ce56890217a3eff259b1b4a0d7f2d4636d882a35Jason Molenda        if (name[0] == 'f' && name[1] == 'p' && name[2] == '\0')   // fp
1244ce56890217a3eff259b1b4a0d7f2d4636d882a35Jason Molenda            return true;
1245ce56890217a3eff259b1b4a0d7f2d4636d882a35Jason Molenda        if (name[0] == 'p' && name[1] == 'c' && name[2] == '\0')   // pc
1246ce56890217a3eff259b1b4a0d7f2d4636d882a35Jason Molenda            return true;
124775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    }
124875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton    return false;
124975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton}
125075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
125175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
125275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
125324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
125424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerABISysV_x86_64::Initialize()
125524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
12560e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    PluginManager::RegisterPlugin (GetPluginNameStatic(),
12570e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton                                   "System V ABI for x86_64 targets",
125824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                   CreateInstance);
125924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
126024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
126124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
126224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerABISysV_x86_64::Terminate()
126324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
126424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PluginManager::UnregisterPlugin (CreateInstance);
126524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
126624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12670e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Claytonlldb_private::ConstString
12680e191607adcb0ea8ebd06c278be648a7f5c0097fGreg ClaytonABISysV_x86_64::GetPluginNameStatic()
12690e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton{
12700e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    static ConstString g_name("sysv-x86_64");
12710e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    return g_name;
12720e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton}
12730e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton
127424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
127524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// PluginInterface protocol
127624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
12770e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Claytonlldb_private::ConstString
127824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerABISysV_x86_64::GetPluginName()
127924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
12800e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    return GetPluginNameStatic();
128124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
128224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
128324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
128424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerABISysV_x86_64::GetPluginVersion()
128524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
128624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 1;
128724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
128824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1289