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 ¤t_argument_register, 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner addr_t ¤t_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