175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton//===-- ABIMacOSX_arm.cpp --------------------------------------*- C++ -*-===// 275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton// 375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton// The LLVM Compiler Infrastructure 475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton// 575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton// This file is distributed under the University of Illinois Open Source 675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton// License. See LICENSE.TXT for details. 775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton// 875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton//===----------------------------------------------------------------------===// 975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 1075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton#include "ABIMacOSX_arm.h" 1175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 1275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton#include "lldb/Core/ConstString.h" 1375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton#include "lldb/Core/Error.h" 1475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton#include "lldb/Core/Module.h" 1575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton#include "lldb/Core/PluginManager.h" 1661d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton#include "lldb/Core/RegisterValue.h" 1775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton#include "lldb/Core/Scalar.h" 1875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton#include "lldb/Core/Value.h" 19016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham#include "lldb/Core/ValueObjectConstResult.h" 2075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton#include "lldb/Symbol/ClangASTContext.h" 2175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton#include "lldb/Symbol/UnwindPlan.h" 2275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton#include "lldb/Target/Process.h" 2375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton#include "lldb/Target/RegisterContext.h" 2475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton#include "lldb/Target/Target.h" 2575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton#include "lldb/Target/Thread.h" 2675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 2775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton#include "llvm/ADT/Triple.h" 2875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 2975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton#include "Utility/ARM_DWARF_Registers.h" 3037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton#include "Utility/ARM_GCC_Registers.h" 31b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton#include "Plugins/Process/Utility/ARMDefines.h" 3275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 3375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton#include <vector> 3475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 3575906e4ec98af3717e415727a8d663a4e246bb4fGreg Claytonusing namespace lldb; 3675906e4ec98af3717e415727a8d663a4e246bb4fGreg Claytonusing namespace lldb_private; 3775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 380e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Claytonstatic RegisterInfo g_register_infos[] = 3937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton{ 40402607fe513617c06282d4ae479522e244a53b71Johnny Chen // NAME ALT SZ OFF ENCODING FORMAT COMPILER DWARF GENERIC GDB LLDB NATIVE VALUE REGS INVALIDATE REGS 41402607fe513617c06282d4ae479522e244a53b71Johnny Chen // ========== ======= == === ============= ============ ======================= =================== =========================== ======================= ====================== ========== =============== 42402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r0", "arg1", 4, 0, eEncodingUint , eFormatHex, { gcc_r0, dwarf_r0, LLDB_REGNUM_GENERIC_ARG1, gdb_arm_r0, LLDB_INVALID_REGNUM }, NULL, NULL}, 43402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r1", "arg2", 4, 0, eEncodingUint , eFormatHex, { gcc_r1, dwarf_r1, LLDB_REGNUM_GENERIC_ARG2, gdb_arm_r1, LLDB_INVALID_REGNUM }, NULL, NULL}, 44402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r2", "arg3", 4, 0, eEncodingUint , eFormatHex, { gcc_r2, dwarf_r2, LLDB_REGNUM_GENERIC_ARG3, gdb_arm_r2, LLDB_INVALID_REGNUM }, NULL, NULL}, 45402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r3", "arg4", 4, 0, eEncodingUint , eFormatHex, { gcc_r3, dwarf_r3, LLDB_REGNUM_GENERIC_ARG4, gdb_arm_r3, LLDB_INVALID_REGNUM }, NULL, NULL}, 46402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r4", NULL, 4, 0, eEncodingUint , eFormatHex, { gcc_r4, dwarf_r4, LLDB_INVALID_REGNUM, gdb_arm_r4, LLDB_INVALID_REGNUM }, NULL, NULL}, 47402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r5", NULL, 4, 0, eEncodingUint , eFormatHex, { gcc_r5, dwarf_r5, LLDB_INVALID_REGNUM, gdb_arm_r5, LLDB_INVALID_REGNUM }, NULL, NULL}, 48402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r6", NULL, 4, 0, eEncodingUint , eFormatHex, { gcc_r6, dwarf_r6, LLDB_INVALID_REGNUM, gdb_arm_r6, LLDB_INVALID_REGNUM }, NULL, NULL}, 49402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r7", NULL, 4, 0, eEncodingUint , eFormatHex, { gcc_r7, dwarf_r7, LLDB_REGNUM_GENERIC_FP, gdb_arm_r7, LLDB_INVALID_REGNUM }, NULL, NULL}, 50402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r8", NULL, 4, 0, eEncodingUint , eFormatHex, { gcc_r8, dwarf_r8, LLDB_INVALID_REGNUM, gdb_arm_r8, LLDB_INVALID_REGNUM }, NULL, NULL}, 51402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r9", NULL, 4, 0, eEncodingUint , eFormatHex, { gcc_r9, dwarf_r9, LLDB_INVALID_REGNUM, gdb_arm_r9, LLDB_INVALID_REGNUM }, NULL, NULL}, 52402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r10", NULL, 4, 0, eEncodingUint , eFormatHex, { gcc_r10, dwarf_r10, LLDB_INVALID_REGNUM, gdb_arm_r10, LLDB_INVALID_REGNUM }, NULL, NULL}, 53402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r11", NULL, 4, 0, eEncodingUint , eFormatHex, { gcc_r11, dwarf_r11, LLDB_INVALID_REGNUM, gdb_arm_r11, LLDB_INVALID_REGNUM }, NULL, NULL}, 54402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r12", NULL, 4, 0, eEncodingUint , eFormatHex, { gcc_r12, dwarf_r12, LLDB_INVALID_REGNUM, gdb_arm_r12, LLDB_INVALID_REGNUM }, NULL, NULL}, 55402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "sp", "r13", 4, 0, eEncodingUint , eFormatHex, { gcc_sp, dwarf_sp, LLDB_REGNUM_GENERIC_SP, gdb_arm_sp, LLDB_INVALID_REGNUM }, NULL, NULL}, 56402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "lr", "r14", 4, 0, eEncodingUint , eFormatHex, { gcc_lr, dwarf_lr, LLDB_REGNUM_GENERIC_RA, gdb_arm_lr, LLDB_INVALID_REGNUM }, NULL, NULL}, 57402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "pc", "r15", 4, 0, eEncodingUint , eFormatHex, { gcc_pc, dwarf_pc, LLDB_REGNUM_GENERIC_PC, gdb_arm_pc, LLDB_INVALID_REGNUM }, NULL, NULL}, 58402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "cpsr", "psr", 4, 0, eEncodingUint , eFormatHex, { gcc_cpsr, dwarf_cpsr, LLDB_REGNUM_GENERIC_FLAGS, gdb_arm_cpsr, LLDB_INVALID_REGNUM }, NULL, NULL}, 59402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s0", NULL, 4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s0, LLDB_INVALID_REGNUM, gdb_arm_s0, LLDB_INVALID_REGNUM }, NULL, NULL}, 60402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s1", NULL, 4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s1, LLDB_INVALID_REGNUM, gdb_arm_s1, LLDB_INVALID_REGNUM }, NULL, NULL}, 61402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s2", NULL, 4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s2, LLDB_INVALID_REGNUM, gdb_arm_s2, LLDB_INVALID_REGNUM }, NULL, NULL}, 62402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s3", NULL, 4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s3, LLDB_INVALID_REGNUM, gdb_arm_s3, LLDB_INVALID_REGNUM }, NULL, NULL}, 63402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s4", NULL, 4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s4, LLDB_INVALID_REGNUM, gdb_arm_s4, LLDB_INVALID_REGNUM }, NULL, NULL}, 64402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s5", NULL, 4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s5, LLDB_INVALID_REGNUM, gdb_arm_s5, LLDB_INVALID_REGNUM }, NULL, NULL}, 65402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s6", NULL, 4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s6, LLDB_INVALID_REGNUM, gdb_arm_s6, LLDB_INVALID_REGNUM }, NULL, NULL}, 66402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s7", NULL, 4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s7, LLDB_INVALID_REGNUM, gdb_arm_s7, LLDB_INVALID_REGNUM }, NULL, NULL}, 67402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s8", NULL, 4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s8, LLDB_INVALID_REGNUM, gdb_arm_s8, LLDB_INVALID_REGNUM }, NULL, NULL}, 68402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s9", NULL, 4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s9, LLDB_INVALID_REGNUM, gdb_arm_s9, LLDB_INVALID_REGNUM }, NULL, NULL}, 69402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s10", NULL, 4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s10, LLDB_INVALID_REGNUM, gdb_arm_s10, LLDB_INVALID_REGNUM }, NULL, NULL}, 70402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s11", NULL, 4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s11, LLDB_INVALID_REGNUM, gdb_arm_s11, LLDB_INVALID_REGNUM }, NULL, NULL}, 71402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s12", NULL, 4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s12, LLDB_INVALID_REGNUM, gdb_arm_s12, LLDB_INVALID_REGNUM }, NULL, NULL}, 72402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s13", NULL, 4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s13, LLDB_INVALID_REGNUM, gdb_arm_s13, LLDB_INVALID_REGNUM }, NULL, NULL}, 73402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s14", NULL, 4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s14, LLDB_INVALID_REGNUM, gdb_arm_s14, LLDB_INVALID_REGNUM }, NULL, NULL}, 74402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s15", NULL, 4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s15, LLDB_INVALID_REGNUM, gdb_arm_s15, LLDB_INVALID_REGNUM }, NULL, NULL}, 75402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s16", NULL, 4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s16, LLDB_INVALID_REGNUM, gdb_arm_s16, LLDB_INVALID_REGNUM }, NULL, NULL}, 76402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s17", NULL, 4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s17, LLDB_INVALID_REGNUM, gdb_arm_s17, LLDB_INVALID_REGNUM }, NULL, NULL}, 77402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s18", NULL, 4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s18, LLDB_INVALID_REGNUM, gdb_arm_s18, LLDB_INVALID_REGNUM }, NULL, NULL}, 78402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s19", NULL, 4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s19, LLDB_INVALID_REGNUM, gdb_arm_s19, LLDB_INVALID_REGNUM }, NULL, NULL}, 79402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s20", NULL, 4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s20, LLDB_INVALID_REGNUM, gdb_arm_s20, LLDB_INVALID_REGNUM }, NULL, NULL}, 80402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s21", NULL, 4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s21, LLDB_INVALID_REGNUM, gdb_arm_s21, LLDB_INVALID_REGNUM }, NULL, NULL}, 81402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s22", NULL, 4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s22, LLDB_INVALID_REGNUM, gdb_arm_s22, LLDB_INVALID_REGNUM }, NULL, NULL}, 82402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s23", NULL, 4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s23, LLDB_INVALID_REGNUM, gdb_arm_s23, LLDB_INVALID_REGNUM }, NULL, NULL}, 83402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s24", NULL, 4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s24, LLDB_INVALID_REGNUM, gdb_arm_s24, LLDB_INVALID_REGNUM }, NULL, NULL}, 84402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s25", NULL, 4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s25, LLDB_INVALID_REGNUM, gdb_arm_s25, LLDB_INVALID_REGNUM }, NULL, NULL}, 85402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s26", NULL, 4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s26, LLDB_INVALID_REGNUM, gdb_arm_s26, LLDB_INVALID_REGNUM }, NULL, NULL}, 86402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s27", NULL, 4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s27, LLDB_INVALID_REGNUM, gdb_arm_s27, LLDB_INVALID_REGNUM }, NULL, NULL}, 87402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s28", NULL, 4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s28, LLDB_INVALID_REGNUM, gdb_arm_s28, LLDB_INVALID_REGNUM }, NULL, NULL}, 88402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s29", NULL, 4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s29, LLDB_INVALID_REGNUM, gdb_arm_s29, LLDB_INVALID_REGNUM }, NULL, NULL}, 89402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s30", NULL, 4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s30, LLDB_INVALID_REGNUM, gdb_arm_s30, LLDB_INVALID_REGNUM }, NULL, NULL}, 90402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s31", NULL, 4, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s31, LLDB_INVALID_REGNUM, gdb_arm_s31, LLDB_INVALID_REGNUM }, NULL, NULL}, 91402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "fpscr", NULL, 4, 0, eEncodingUint , eFormatHex , { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,LLDB_INVALID_REGNUM, gdb_arm_fpscr, LLDB_INVALID_REGNUM }, NULL, NULL}, 92402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d0", NULL, 8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d0, LLDB_INVALID_REGNUM, gdb_arm_d0, LLDB_INVALID_REGNUM }, NULL, NULL}, 93402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d1", NULL, 8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d1, LLDB_INVALID_REGNUM, gdb_arm_d1, LLDB_INVALID_REGNUM }, NULL, NULL}, 94402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d2", NULL, 8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d2, LLDB_INVALID_REGNUM, gdb_arm_d2, LLDB_INVALID_REGNUM }, NULL, NULL}, 95402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d3", NULL, 8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d3, LLDB_INVALID_REGNUM, gdb_arm_d3, LLDB_INVALID_REGNUM }, NULL, NULL}, 96402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d4", NULL, 8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d4, LLDB_INVALID_REGNUM, gdb_arm_d4, LLDB_INVALID_REGNUM }, NULL, NULL}, 97402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d5", NULL, 8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d5, LLDB_INVALID_REGNUM, gdb_arm_d5, LLDB_INVALID_REGNUM }, NULL, NULL}, 98402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d6", NULL, 8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d6, LLDB_INVALID_REGNUM, gdb_arm_d6, LLDB_INVALID_REGNUM }, NULL, NULL}, 99402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d7", NULL, 8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d7, LLDB_INVALID_REGNUM, gdb_arm_d7, LLDB_INVALID_REGNUM }, NULL, NULL}, 100402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d8", NULL, 8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d8, LLDB_INVALID_REGNUM, gdb_arm_d8, LLDB_INVALID_REGNUM }, NULL, NULL}, 101402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d9", NULL, 8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d9, LLDB_INVALID_REGNUM, gdb_arm_d9, LLDB_INVALID_REGNUM }, NULL, NULL}, 102402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d10", NULL, 8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d10, LLDB_INVALID_REGNUM, gdb_arm_d10, LLDB_INVALID_REGNUM }, NULL, NULL}, 103402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d11", NULL, 8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d11, LLDB_INVALID_REGNUM, gdb_arm_d11, LLDB_INVALID_REGNUM }, NULL, NULL}, 104402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d12", NULL, 8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d12, LLDB_INVALID_REGNUM, gdb_arm_d12, LLDB_INVALID_REGNUM }, NULL, NULL}, 105402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d13", NULL, 8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d13, LLDB_INVALID_REGNUM, gdb_arm_d13, LLDB_INVALID_REGNUM }, NULL, NULL}, 106402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d14", NULL, 8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d14, LLDB_INVALID_REGNUM, gdb_arm_d14, LLDB_INVALID_REGNUM }, NULL, NULL}, 107402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d15", NULL, 8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d15, LLDB_INVALID_REGNUM, gdb_arm_d15, LLDB_INVALID_REGNUM }, NULL, NULL}, 108402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d16", NULL, 8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d16, LLDB_INVALID_REGNUM, gdb_arm_d16, LLDB_INVALID_REGNUM }, NULL, NULL}, 109402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d17", NULL, 8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d17, LLDB_INVALID_REGNUM, gdb_arm_d17, LLDB_INVALID_REGNUM }, NULL, NULL}, 110402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d18", NULL, 8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d18, LLDB_INVALID_REGNUM, gdb_arm_d18, LLDB_INVALID_REGNUM }, NULL, NULL}, 111402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d19", NULL, 8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d19, LLDB_INVALID_REGNUM, gdb_arm_d19, LLDB_INVALID_REGNUM }, NULL, NULL}, 112402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d20", NULL, 8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d20, LLDB_INVALID_REGNUM, gdb_arm_d20, LLDB_INVALID_REGNUM }, NULL, NULL}, 113402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d21", NULL, 8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d21, LLDB_INVALID_REGNUM, gdb_arm_d21, LLDB_INVALID_REGNUM }, NULL, NULL}, 114402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d22", NULL, 8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d22, LLDB_INVALID_REGNUM, gdb_arm_d22, LLDB_INVALID_REGNUM }, NULL, NULL}, 115402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d23", NULL, 8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d23, LLDB_INVALID_REGNUM, gdb_arm_d23, LLDB_INVALID_REGNUM }, NULL, NULL}, 116402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d24", NULL, 8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d24, LLDB_INVALID_REGNUM, gdb_arm_d24, LLDB_INVALID_REGNUM }, NULL, NULL}, 117402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d25", NULL, 8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d25, LLDB_INVALID_REGNUM, gdb_arm_d25, LLDB_INVALID_REGNUM }, NULL, NULL}, 118402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d26", NULL, 8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d26, LLDB_INVALID_REGNUM, gdb_arm_d26, LLDB_INVALID_REGNUM }, NULL, NULL}, 119402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d27", NULL, 8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d27, LLDB_INVALID_REGNUM, gdb_arm_d27, LLDB_INVALID_REGNUM }, NULL, NULL}, 120402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d28", NULL, 8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d28, LLDB_INVALID_REGNUM, gdb_arm_d28, LLDB_INVALID_REGNUM }, NULL, NULL}, 121402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d29", NULL, 8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d29, LLDB_INVALID_REGNUM, gdb_arm_d29, LLDB_INVALID_REGNUM }, NULL, NULL}, 122402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d30", NULL, 8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d30, LLDB_INVALID_REGNUM, gdb_arm_d30, LLDB_INVALID_REGNUM }, NULL, NULL}, 123402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d31", NULL, 8, 0, eEncodingIEEE754 , eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d31, LLDB_INVALID_REGNUM, gdb_arm_d31, LLDB_INVALID_REGNUM }, NULL, NULL}, 124402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r8_usr", NULL, 4, 0, eEncodingUint , eFormatHex, { LLDB_INVALID_REGNUM, dwarf_r8_usr, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM }, NULL, NULL}, 125402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r9_usr", NULL, 4, 0, eEncodingUint , eFormatHex, { LLDB_INVALID_REGNUM, dwarf_r9_usr, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM }, NULL, NULL}, 126402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r10_usr", NULL, 4, 0, eEncodingUint , eFormatHex, { LLDB_INVALID_REGNUM, dwarf_r10_usr, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM }, NULL, NULL}, 127402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r11_usr", NULL, 4, 0, eEncodingUint , eFormatHex, { LLDB_INVALID_REGNUM, dwarf_r11_usr, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM }, NULL, NULL}, 128402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r12_usr", NULL, 4, 0, eEncodingUint , eFormatHex, { LLDB_INVALID_REGNUM, dwarf_r12_usr, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM }, NULL, NULL}, 129402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r13_usr", "sp_usr", 4, 0, eEncodingUint , eFormatHex, { LLDB_INVALID_REGNUM, dwarf_r13_usr, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM }, NULL, NULL}, 130402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r14_usr", "lr_usr", 4, 0, eEncodingUint , eFormatHex, { LLDB_INVALID_REGNUM, dwarf_r14_usr, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM }, NULL, NULL}, 131402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r8_fiq", NULL, 4, 0, eEncodingUint , eFormatHex, { LLDB_INVALID_REGNUM, dwarf_r8_fiq, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM }, NULL, NULL}, 132402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r9_fiq", NULL, 4, 0, eEncodingUint , eFormatHex, { LLDB_INVALID_REGNUM, dwarf_r9_fiq, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM }, NULL, NULL}, 133402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r10_fiq", NULL, 4, 0, eEncodingUint , eFormatHex, { LLDB_INVALID_REGNUM, dwarf_r10_fiq, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM }, NULL, NULL}, 134402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r11_fiq", NULL, 4, 0, eEncodingUint , eFormatHex, { LLDB_INVALID_REGNUM, dwarf_r11_fiq, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM }, NULL, NULL}, 135402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r12_fiq", NULL, 4, 0, eEncodingUint , eFormatHex, { LLDB_INVALID_REGNUM, dwarf_r12_fiq, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM }, NULL, NULL}, 136402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r13_fiq", "sp_fiq", 4, 0, eEncodingUint , eFormatHex, { LLDB_INVALID_REGNUM, dwarf_r13_fiq, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM }, NULL, NULL}, 137402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r14_fiq", "lr_fiq", 4, 0, eEncodingUint , eFormatHex, { LLDB_INVALID_REGNUM, dwarf_r14_fiq, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM }, NULL, NULL}, 138402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r13_irq", "sp_irq", 4, 0, eEncodingUint , eFormatHex, { LLDB_INVALID_REGNUM, dwarf_r13_irq, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM }, NULL, NULL}, 139402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r14_irq", "lr_irq", 4, 0, eEncodingUint , eFormatHex, { LLDB_INVALID_REGNUM, dwarf_r14_irq, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM }, NULL, NULL}, 140402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r13_abt", "sp_abt", 4, 0, eEncodingUint , eFormatHex, { LLDB_INVALID_REGNUM, dwarf_r13_abt, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM }, NULL, NULL}, 141402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r14_abt", "lr_abt", 4, 0, eEncodingUint , eFormatHex, { LLDB_INVALID_REGNUM, dwarf_r14_abt, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM }, NULL, NULL}, 142402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r13_und", "sp_und", 4, 0, eEncodingUint , eFormatHex, { LLDB_INVALID_REGNUM, dwarf_r13_und, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM }, NULL, NULL}, 143402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r14_und", "lr_und", 4, 0, eEncodingUint , eFormatHex, { LLDB_INVALID_REGNUM, dwarf_r14_und, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM }, NULL, NULL}, 144402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r13_svc", "sp_svc", 4, 0, eEncodingUint , eFormatHex, { LLDB_INVALID_REGNUM, dwarf_r13_svc, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM }, NULL, NULL}, 145402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r14_svc", "lr_svc", 4, 0, eEncodingUint , eFormatHex, { LLDB_INVALID_REGNUM, dwarf_r14_svc, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM }, NULL, NULL} 14637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton}; 14737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Claytonstatic const uint32_t k_num_register_infos = sizeof(g_register_infos)/sizeof(RegisterInfo); 14837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Claytonstatic bool g_register_info_names_constified = false; 14937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton 15037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Claytonconst lldb_private::RegisterInfo * 15137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg ClaytonABIMacOSX_arm::GetRegisterInfoArray (uint32_t &count) 15237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton{ 15337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton // Make the C-string names and alt_names for the register infos into const 15437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton // C-string values by having the ConstString unique the names in the global 15537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton // constant C-string pool. 15637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton if (!g_register_info_names_constified) 15737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton { 15837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton g_register_info_names_constified = true; 15937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton for (uint32_t i=0; i<k_num_register_infos; ++i) 16037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton { 16137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton if (g_register_infos[i].name) 16237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton g_register_infos[i].name = ConstString(g_register_infos[i].name).GetCString(); 16337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton if (g_register_infos[i].alt_name) 16437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton g_register_infos[i].alt_name = ConstString(g_register_infos[i].alt_name).GetCString(); 16537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton } 16637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton } 16737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton count = k_num_register_infos; 16837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton return g_register_infos; 16937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton} 17037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton 17137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton 17275906e4ec98af3717e415727a8d663a4e246bb4fGreg Claytonsize_t 17375906e4ec98af3717e415727a8d663a4e246bb4fGreg ClaytonABIMacOSX_arm::GetRedZoneSize () const 17475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton{ 17575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton return 0; 17675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton} 17775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 17875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton//------------------------------------------------------------------ 17975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton// Static Functions 18075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton//------------------------------------------------------------------ 18175906e4ec98af3717e415727a8d663a4e246bb4fGreg ClaytonABISP 18275906e4ec98af3717e415727a8d663a4e246bb4fGreg ClaytonABIMacOSX_arm::CreateInstance (const ArchSpec &arch) 18375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton{ 18475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton static ABISP g_abi_sp; 18575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton const llvm::Triple::ArchType arch_type = arch.GetTriple().getArch(); 18675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton if ((arch_type == llvm::Triple::arm) || 18775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton (arch_type == llvm::Triple::thumb)) 18875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton { 18975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton if (!g_abi_sp) 19075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton g_abi_sp.reset (new ABIMacOSX_arm); 19175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton return g_abi_sp; 19275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton } 19375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton return ABISP(); 19475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton} 19575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 19675906e4ec98af3717e415727a8d663a4e246bb4fGreg Claytonbool 19775906e4ec98af3717e415727a8d663a4e246bb4fGreg ClaytonABIMacOSX_arm::PrepareTrivialCall (Thread &thread, 19875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton addr_t sp, 19961d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton addr_t function_addr, 20061d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton addr_t return_addr, 201989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton addr_t *arg1_ptr, 202989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton addr_t *arg2_ptr, 203989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton addr_t *arg3_ptr, 204989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton addr_t *arg4_ptr, 205989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton addr_t *arg5_ptr, 206989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton addr_t *arg6_ptr) const 20775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton{ 20861d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton RegisterContext *reg_ctx = thread.GetRegisterContext().get(); 20961d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton if (!reg_ctx) 21061d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton return false; 21175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 21261d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton const uint32_t pc_reg_num = reg_ctx->ConvertRegisterKindToRegisterNumber (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC); 21361d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton const uint32_t sp_reg_num = reg_ctx->ConvertRegisterKindToRegisterNumber (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP); 21461d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton const uint32_t ra_reg_num = reg_ctx->ConvertRegisterKindToRegisterNumber (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_RA); 21561d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton 21661d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton RegisterValue reg_value; 21761d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton 21861d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton if (arg1_ptr) 21961d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton { 22061d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton reg_value.SetUInt32(*arg1_ptr); 22161d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton if (!reg_ctx->WriteRegister (reg_ctx->GetRegisterInfoByName("r0"), reg_value)) 22261d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton return false; 22361d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton 224989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton if (arg2_ptr) 225989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton { 226989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton reg_value.SetUInt32(*arg2_ptr); 227989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton if (!reg_ctx->WriteRegister (reg_ctx->GetRegisterInfoByName("r1"), reg_value)) 228989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton return false; 229989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton 230989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton if (arg3_ptr) 231989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton { 232989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton reg_value.SetUInt32(*arg3_ptr); 233989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton if (!reg_ctx->WriteRegister (reg_ctx->GetRegisterInfoByName("r2"), reg_value)) 234989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton return false; 235989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton if (arg4_ptr) 236989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton { 237989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton reg_value.SetUInt32(*arg4_ptr); 238989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoByName("r3"); 239989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton if (!reg_ctx->WriteRegister (reg_info, reg_value)) 240989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton return false; 241989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton if (arg5_ptr) 242989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton { 243b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton // Keep the stack 8 byte aligned, not that we need to 244b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton sp -= 8; 245b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton sp &= ~(8ull-1ull); 246989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton reg_value.SetUInt32(*arg5_ptr); 247989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton if (reg_ctx->WriteRegisterValueToMemory (reg_info, sp, reg_info->byte_size, reg_value).Fail()) 248989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton return false; 249989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton if (arg6_ptr) 250989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton { 251989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton reg_value.SetUInt32(*arg6_ptr); 252d45c3d7d55439692aa3215a709046944353b5917Greg Clayton if (reg_ctx->WriteRegisterValueToMemory (reg_info, sp + 4, reg_info->byte_size, reg_value).Fail()) 253989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton return false; 254989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton } 255989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton } 256989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton } 257989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton } 258989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton } 25961d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton } 260b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton 261b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton 262f4124deeb9532044a38c0774ced872f2709347daGreg Clayton TargetSP target_sp (thread.CalculateTarget()); 263b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton Address so_addr; 264da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton 265da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton // Figure out if our return address is ARM or Thumb by using the 266da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton // Address::GetCallableLoadAddress(Target*) which will figure out the ARM 267da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton // thumb-ness and set the correct address bits for us. 268f4124deeb9532044a38c0774ced872f2709347daGreg Clayton so_addr.SetLoadAddress (return_addr, target_sp.get()); 269f4124deeb9532044a38c0774ced872f2709347daGreg Clayton return_addr = so_addr.GetCallableLoadAddress (target_sp.get()); 270da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton 271b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton // Set "lr" to the return address 27261d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton if (!reg_ctx->WriteRegisterFromUnsigned (ra_reg_num, return_addr)) 27361d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton return false; 27461d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton 27561d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton // Set "sp" to the requested value 27661d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton if (!reg_ctx->WriteRegisterFromUnsigned (sp_reg_num, sp)) 27761d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton return false; 27861d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton 279b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton // If bit zero or 1 is set, this must be a thumb function, no need to figure 280b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton // this out from the symbols. 281f4124deeb9532044a38c0774ced872f2709347daGreg Clayton so_addr.SetLoadAddress (function_addr, target_sp.get()); 282f4124deeb9532044a38c0774ced872f2709347daGreg Clayton function_addr = so_addr.GetCallableLoadAddress (target_sp.get()); 283b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton 284b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton const RegisterInfo *cpsr_reg_info = reg_ctx->GetRegisterInfoByName("cpsr"); 285b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton const uint32_t curr_cpsr = reg_ctx->ReadRegisterAsUnsigned(cpsr_reg_info, 0); 286b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton 287b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton // Make a new CPSR and mask out any Thumb IT (if/then) bits 288b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton uint32_t new_cpsr = curr_cpsr & ~MASK_CPSR_IT_MASK; 289b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton // If bit zero or 1 is set, this must be thumb... 290da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton if (function_addr & 1ull) 291b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton new_cpsr |= MASK_CPSR_T; // Set T bit in CPSR 292b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton else 293b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton new_cpsr &= ~MASK_CPSR_T; // Clear T bit in CPSR 294b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton 295b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton if (new_cpsr != curr_cpsr) 296b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { 297b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton if (!reg_ctx->WriteRegisterFromUnsigned (cpsr_reg_info, new_cpsr)) 298b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton return false; 299b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton } 300b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton 301da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton function_addr &= ~1ull; // clear bit zero since the CPSR will take care of the mode for us 302b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton 30361d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton // Set "pc" to the address requested 30461d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton if (!reg_ctx->WriteRegisterFromUnsigned (pc_reg_num, function_addr)) 30561d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton return false; 306b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton 30761d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton return true; 30875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton} 30975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 31075906e4ec98af3717e415727a8d663a4e246bb4fGreg Claytonbool 31175906e4ec98af3717e415727a8d663a4e246bb4fGreg ClaytonABIMacOSX_arm::GetArgumentValues (Thread &thread, 31275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton ValueList &values) const 31375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton{ 3145fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton uint32_t num_values = values.GetSize(); 3155fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton 3165fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton 317f4124deeb9532044a38c0774ced872f2709347daGreg Clayton ExecutionContext exe_ctx (thread.shared_from_this()); 3185fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton // For now, assume that the types in the AST values come from the Target's 3195fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton // scratch AST. 3205fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton 3215fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton // Extract the register context so we can read arguments from registers 3225fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton 3235fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton RegisterContext *reg_ctx = thread.GetRegisterContext().get(); 3245fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton 3255fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton if (!reg_ctx) 3265fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton return false; 3275fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton 32828d0b698ab8b28c91c8311a01c950ff0e82957d0Greg Clayton addr_t sp = 0; 3295fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton 3305fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton for (uint32_t value_idx = 0; value_idx < num_values; ++value_idx) 3315fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton { 3325fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton // We currently only support extracting values with Clang QualTypes. 3335fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton // Do we care about others? 3345fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton Value *value = values.GetValueAtIndex(value_idx); 3355fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton 3365fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton if (!value) 3375fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton return false; 3385fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton 33952f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType clang_type = value->GetClangType(); 34052f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (clang_type) 3415fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton { 3425fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton bool is_signed = false; 3435fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton size_t bit_width = 0; 34452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (clang_type.IsIntegerType (is_signed)) 3455fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton { 34652f792329be5db8e38961350589e97e8f2823acdGreg Clayton bit_width = clang_type.GetBitSize(); 3475fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton } 34852f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (clang_type.IsPointerOrReferenceType ()) 3495fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton { 35052f792329be5db8e38961350589e97e8f2823acdGreg Clayton bit_width = clang_type.GetBitSize(); 3515fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton } 3525fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton else 3535fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton { 3545fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton // We only handle integer, pointer and reference types currently... 3555fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton return false; 3565fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton } 3575fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton 358f4124deeb9532044a38c0774ced872f2709347daGreg Clayton if (bit_width <= (exe_ctx.GetProcessRef().GetAddressByteSize() * 8)) 3595fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton { 3605a26910ed231503d2a7a71365a44e379a994f4e6Greg Clayton if (value_idx < 4) 3615fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton { 3625a26910ed231503d2a7a71365a44e379a994f4e6Greg Clayton // Arguments 1-4 are in r0-r3... 3635a26910ed231503d2a7a71365a44e379a994f4e6Greg Clayton const RegisterInfo *arg_reg_info = NULL; 3645a26910ed231503d2a7a71365a44e379a994f4e6Greg Clayton // Search by generic ID first, then fall back to by name 3655fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton uint32_t arg_reg_num = reg_ctx->ConvertRegisterKindToRegisterNumber (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG1 + value_idx); 3665a26910ed231503d2a7a71365a44e379a994f4e6Greg Clayton if (arg_reg_num != LLDB_INVALID_REGNUM) 3675fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton { 3685a26910ed231503d2a7a71365a44e379a994f4e6Greg Clayton arg_reg_info = reg_ctx->GetRegisterInfoAtIndex(arg_reg_num); 3695fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton } 3705fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton else 3715fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton { 3725a26910ed231503d2a7a71365a44e379a994f4e6Greg Clayton switch (value_idx) 3735a26910ed231503d2a7a71365a44e379a994f4e6Greg Clayton { 3745a26910ed231503d2a7a71365a44e379a994f4e6Greg Clayton case 0: arg_reg_info = reg_ctx->GetRegisterInfoByName("r0"); break; 3755a26910ed231503d2a7a71365a44e379a994f4e6Greg Clayton case 1: arg_reg_info = reg_ctx->GetRegisterInfoByName("r1"); break; 3765a26910ed231503d2a7a71365a44e379a994f4e6Greg Clayton case 2: arg_reg_info = reg_ctx->GetRegisterInfoByName("r2"); break; 3775a26910ed231503d2a7a71365a44e379a994f4e6Greg Clayton case 3: arg_reg_info = reg_ctx->GetRegisterInfoByName("r3"); break; 3785a26910ed231503d2a7a71365a44e379a994f4e6Greg Clayton } 3795a26910ed231503d2a7a71365a44e379a994f4e6Greg Clayton } 3805a26910ed231503d2a7a71365a44e379a994f4e6Greg Clayton 3815a26910ed231503d2a7a71365a44e379a994f4e6Greg Clayton if (arg_reg_info) 3825a26910ed231503d2a7a71365a44e379a994f4e6Greg Clayton { 3835fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton RegisterValue reg_value; 3845fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton 3855fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton if (reg_ctx->ReadRegister(arg_reg_info, reg_value)) 3865fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton { 3875fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton if (is_signed) 3885fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton reg_value.SignExtend(bit_width); 3895fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton if (!reg_value.GetScalarValue(value->GetScalar())) 3905fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton return false; 3915fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton continue; 3925fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton } 3935fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton } 3945a26910ed231503d2a7a71365a44e379a994f4e6Greg Clayton return false; 3955fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton } 3965a26910ed231503d2a7a71365a44e379a994f4e6Greg Clayton else 3975fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton { 39828d0b698ab8b28c91c8311a01c950ff0e82957d0Greg Clayton if (sp == 0) 39928d0b698ab8b28c91c8311a01c950ff0e82957d0Greg Clayton { 40028d0b698ab8b28c91c8311a01c950ff0e82957d0Greg Clayton // Read the stack pointer if it already hasn't been read 40128d0b698ab8b28c91c8311a01c950ff0e82957d0Greg Clayton sp = reg_ctx->GetSP(0); 40228d0b698ab8b28c91c8311a01c950ff0e82957d0Greg Clayton if (sp == 0) 40328d0b698ab8b28c91c8311a01c950ff0e82957d0Greg Clayton return false; 40428d0b698ab8b28c91c8311a01c950ff0e82957d0Greg Clayton } 40528d0b698ab8b28c91c8311a01c950ff0e82957d0Greg Clayton 4065a26910ed231503d2a7a71365a44e379a994f4e6Greg Clayton // Arguments 5 on up are on the stack 4075a26910ed231503d2a7a71365a44e379a994f4e6Greg Clayton const uint32_t arg_byte_size = (bit_width + (8-1)) / 8; 408c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Error error; 409f4124deeb9532044a38c0774ced872f2709347daGreg Clayton if (!exe_ctx.GetProcessRef().ReadScalarIntegerFromMemory(sp, arg_byte_size, is_signed, value->GetScalar(), error)) 410c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton return false; 4115fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton 412c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton sp += arg_byte_size; 4135fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton } 4145fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton } 4155fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton } 4165fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton } 4175fba9eec8d79109bf44d5b0a59dda377c65544c5Greg Clayton return true; 41875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton} 41975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 420016ef8886cd429f8a53bff967e601f831e409eaaJim InghamValueObjectSP 421016ef8886cd429f8a53bff967e601f831e409eaaJim InghamABIMacOSX_arm::GetReturnValueObjectImpl (Thread &thread, 42252f792329be5db8e38961350589e97e8f2823acdGreg Clayton lldb_private::ClangASTType &clang_type) const 42375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton{ 424016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham Value value; 425016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham ValueObjectSP return_valobj_sp; 426016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham 42752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!clang_type) 428016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham return return_valobj_sp; 429016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham 43052f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang::ASTContext *ast_context = clang_type.GetASTContext(); 431016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham if (!ast_context) 432016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham return return_valobj_sp; 433016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham 43452f792329be5db8e38961350589e97e8f2823acdGreg Clayton //value.SetContext (Value::eContextTypeClangType, clang_type.GetOpaqueQualType()); 43552f792329be5db8e38961350589e97e8f2823acdGreg Clayton value.SetClangType (clang_type); 436016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham 437016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham RegisterContext *reg_ctx = thread.GetRegisterContext().get(); 438016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham if (!reg_ctx) 439016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham return return_valobj_sp; 440016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham 441016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham bool is_signed; 442016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham 443016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham // Get the pointer to the first stack argument so we have a place to start 444016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham // when reading data 445016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham 446016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham const RegisterInfo *r0_reg_info = reg_ctx->GetRegisterInfoByName("r0", 0); 44752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (clang_type.IsIntegerType (is_signed)) 448d45c3d7d55439692aa3215a709046944353b5917Greg Clayton { 44952f792329be5db8e38961350589e97e8f2823acdGreg Clayton size_t bit_width = clang_type.GetBitSize(); 450016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham 451016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham switch (bit_width) 452d45c3d7d55439692aa3215a709046944353b5917Greg Clayton { 453016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham default: 454016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham return return_valobj_sp; 455016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham case 64: 456d45c3d7d55439692aa3215a709046944353b5917Greg Clayton { 457016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham const RegisterInfo *r1_reg_info = reg_ctx->GetRegisterInfoByName("r1", 0); 458016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham uint64_t raw_value; 459016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham raw_value = reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT32_MAX; 460016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham raw_value |= ((uint64_t)(reg_ctx->ReadRegisterAsUnsigned(r1_reg_info, 0) & UINT32_MAX)) << 32; 461016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham if (is_signed) 462016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham value.GetScalar() = (int64_t)raw_value; 463016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham else 464016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham value.GetScalar() = (uint64_t)raw_value; 465d45c3d7d55439692aa3215a709046944353b5917Greg Clayton } 466016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham break; 467016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham case 32: 468016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham if (is_signed) 469016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham value.GetScalar() = (int32_t)(reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT32_MAX); 470016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham else 471016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham value.GetScalar() = (uint32_t)(reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT32_MAX); 472016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham break; 473016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham case 16: 474016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham if (is_signed) 475016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham value.GetScalar() = (int16_t)(reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT16_MAX); 476016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham else 477016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham value.GetScalar() = (uint16_t)(reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT16_MAX); 478016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham break; 479016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham case 8: 480016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham if (is_signed) 481016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham value.GetScalar() = (int8_t)(reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT8_MAX); 482016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham else 483016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham value.GetScalar() = (uint8_t)(reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT8_MAX); 484016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham break; 485d45c3d7d55439692aa3215a709046944353b5917Greg Clayton } 486016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham } 48752f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (clang_type.IsPointerType ()) 488016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham { 489016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham uint32_t ptr = thread.GetRegisterContext()->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT32_MAX; 490016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham value.GetScalar() = ptr; 491016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham } 492016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham else 493016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham { 494016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham // not handled yet 495016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham return return_valobj_sp; 496d45c3d7d55439692aa3215a709046944353b5917Greg Clayton } 497d45c3d7d55439692aa3215a709046944353b5917Greg Clayton 498016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham // If we get here, we have a valid Value, so make our ValueObject out of it: 499016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham 50052f792329be5db8e38961350589e97e8f2823acdGreg Clayton return_valobj_sp = ValueObjectConstResult::Create(thread.GetStackFrameAtIndex(0).get(), 50152f792329be5db8e38961350589e97e8f2823acdGreg Clayton value, 50252f792329be5db8e38961350589e97e8f2823acdGreg Clayton ConstString("")); 503016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham return return_valobj_sp; 50475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton} 50575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 506a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim InghamError 507466574555e98bc093d443d88492ce9db6ef3015fJim InghamABIMacOSX_arm::SetReturnValueObject(lldb::StackFrameSP &frame_sp, lldb::ValueObjectSP &new_value_sp) 508a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham{ 509466574555e98bc093d443d88492ce9db6ef3015fJim Ingham Error error; 510466574555e98bc093d443d88492ce9db6ef3015fJim Ingham if (!new_value_sp) 511466574555e98bc093d443d88492ce9db6ef3015fJim Ingham { 512466574555e98bc093d443d88492ce9db6ef3015fJim Ingham error.SetErrorString("Empty value object for return value."); 513466574555e98bc093d443d88492ce9db6ef3015fJim Ingham return error; 514466574555e98bc093d443d88492ce9db6ef3015fJim Ingham } 515466574555e98bc093d443d88492ce9db6ef3015fJim Ingham 51652f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType clang_type = new_value_sp->GetClangType(); 51752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!clang_type) 518466574555e98bc093d443d88492ce9db6ef3015fJim Ingham { 519466574555e98bc093d443d88492ce9db6ef3015fJim Ingham error.SetErrorString ("Null clang type for return value."); 520466574555e98bc093d443d88492ce9db6ef3015fJim Ingham return error; 521466574555e98bc093d443d88492ce9db6ef3015fJim Ingham } 522466574555e98bc093d443d88492ce9db6ef3015fJim Ingham 523466574555e98bc093d443d88492ce9db6ef3015fJim Ingham Thread *thread = frame_sp->GetThread().get(); 524466574555e98bc093d443d88492ce9db6ef3015fJim Ingham 525466574555e98bc093d443d88492ce9db6ef3015fJim Ingham bool is_signed; 526466574555e98bc093d443d88492ce9db6ef3015fJim Ingham uint32_t count; 527466574555e98bc093d443d88492ce9db6ef3015fJim Ingham bool is_complex; 528466574555e98bc093d443d88492ce9db6ef3015fJim Ingham 529466574555e98bc093d443d88492ce9db6ef3015fJim Ingham RegisterContext *reg_ctx = thread->GetRegisterContext().get(); 530466574555e98bc093d443d88492ce9db6ef3015fJim Ingham 531466574555e98bc093d443d88492ce9db6ef3015fJim Ingham bool set_it_simple = false; 53252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (clang_type.IsIntegerType (is_signed) || clang_type.IsPointerType()) 533466574555e98bc093d443d88492ce9db6ef3015fJim Ingham { 534466574555e98bc093d443d88492ce9db6ef3015fJim Ingham DataExtractor data; 535466574555e98bc093d443d88492ce9db6ef3015fJim Ingham size_t num_bytes = new_value_sp->GetData(data); 53636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t offset = 0; 537466574555e98bc093d443d88492ce9db6ef3015fJim Ingham if (num_bytes <= 8) 538466574555e98bc093d443d88492ce9db6ef3015fJim Ingham { 539466574555e98bc093d443d88492ce9db6ef3015fJim Ingham const RegisterInfo *r0_info = reg_ctx->GetRegisterInfoByName("r0", 0); 540466574555e98bc093d443d88492ce9db6ef3015fJim Ingham if (num_bytes <= 4) 541466574555e98bc093d443d88492ce9db6ef3015fJim Ingham { 542466574555e98bc093d443d88492ce9db6ef3015fJim Ingham uint32_t raw_value = data.GetMaxU32(&offset, num_bytes); 543466574555e98bc093d443d88492ce9db6ef3015fJim Ingham 544466574555e98bc093d443d88492ce9db6ef3015fJim Ingham if (reg_ctx->WriteRegisterFromUnsigned (r0_info, raw_value)) 545466574555e98bc093d443d88492ce9db6ef3015fJim Ingham set_it_simple = true; 546466574555e98bc093d443d88492ce9db6ef3015fJim Ingham } 547466574555e98bc093d443d88492ce9db6ef3015fJim Ingham else 548466574555e98bc093d443d88492ce9db6ef3015fJim Ingham { 549466574555e98bc093d443d88492ce9db6ef3015fJim Ingham uint32_t raw_value = data.GetMaxU32(&offset, 4); 550466574555e98bc093d443d88492ce9db6ef3015fJim Ingham 551466574555e98bc093d443d88492ce9db6ef3015fJim Ingham if (reg_ctx->WriteRegisterFromUnsigned (r0_info, raw_value)) 552466574555e98bc093d443d88492ce9db6ef3015fJim Ingham { 553466574555e98bc093d443d88492ce9db6ef3015fJim Ingham const RegisterInfo *r1_info = reg_ctx->GetRegisterInfoByName("r1", 0); 554466574555e98bc093d443d88492ce9db6ef3015fJim Ingham uint32_t raw_value = data.GetMaxU32(&offset, num_bytes - offset); 555466574555e98bc093d443d88492ce9db6ef3015fJim Ingham 556466574555e98bc093d443d88492ce9db6ef3015fJim Ingham if (reg_ctx->WriteRegisterFromUnsigned (r1_info, raw_value)) 557466574555e98bc093d443d88492ce9db6ef3015fJim Ingham set_it_simple = true; 558466574555e98bc093d443d88492ce9db6ef3015fJim Ingham } 559466574555e98bc093d443d88492ce9db6ef3015fJim Ingham } 560466574555e98bc093d443d88492ce9db6ef3015fJim Ingham } 561466574555e98bc093d443d88492ce9db6ef3015fJim Ingham else 562466574555e98bc093d443d88492ce9db6ef3015fJim Ingham { 563466574555e98bc093d443d88492ce9db6ef3015fJim Ingham error.SetErrorString("We don't support returning longer than 64 bit integer values at present."); 564466574555e98bc093d443d88492ce9db6ef3015fJim Ingham } 565466574555e98bc093d443d88492ce9db6ef3015fJim Ingham } 56652f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (clang_type.IsFloatingPointType (count, is_complex)) 567466574555e98bc093d443d88492ce9db6ef3015fJim Ingham { 568466574555e98bc093d443d88492ce9db6ef3015fJim Ingham if (is_complex) 569466574555e98bc093d443d88492ce9db6ef3015fJim Ingham error.SetErrorString ("We don't support returning complex values at present"); 570466574555e98bc093d443d88492ce9db6ef3015fJim Ingham else 571466574555e98bc093d443d88492ce9db6ef3015fJim Ingham error.SetErrorString ("We don't support returning float values at present"); 572466574555e98bc093d443d88492ce9db6ef3015fJim Ingham } 573466574555e98bc093d443d88492ce9db6ef3015fJim Ingham 574466574555e98bc093d443d88492ce9db6ef3015fJim Ingham if (!set_it_simple) 575466574555e98bc093d443d88492ce9db6ef3015fJim Ingham error.SetErrorString ("We only support setting simple integer return types at present."); 576466574555e98bc093d443d88492ce9db6ef3015fJim Ingham 577466574555e98bc093d443d88492ce9db6ef3015fJim Ingham return error; 578a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham} 579a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham 58075906e4ec98af3717e415727a8d663a4e246bb4fGreg Claytonbool 58175906e4ec98af3717e415727a8d663a4e246bb4fGreg ClaytonABIMacOSX_arm::CreateFunctionEntryUnwindPlan (UnwindPlan &unwind_plan) 58275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton{ 58375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton uint32_t reg_kind = unwind_plan.GetRegisterKind(); 58475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton uint32_t lr_reg_num = LLDB_INVALID_REGNUM; 58575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton uint32_t sp_reg_num = LLDB_INVALID_REGNUM; 58675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton uint32_t pc_reg_num = LLDB_INVALID_REGNUM; 58775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 58875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton switch (reg_kind) 58975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton { 59075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case eRegisterKindDWARF: 59175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case eRegisterKindGCC: 59275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton lr_reg_num = dwarf_lr; 59375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton sp_reg_num = dwarf_sp; 59475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton pc_reg_num = dwarf_pc; 59575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton break; 59675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 59775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case eRegisterKindGeneric: 59875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton lr_reg_num = LLDB_REGNUM_GENERIC_RA; 59975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton sp_reg_num = LLDB_REGNUM_GENERIC_SP; 60075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton pc_reg_num = LLDB_REGNUM_GENERIC_PC; 60175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton break; 60275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton } 60375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 60475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton if (lr_reg_num == LLDB_INVALID_REGNUM || 60575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton sp_reg_num == LLDB_INVALID_REGNUM || 60675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton pc_reg_num == LLDB_INVALID_REGNUM) 60775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton return false; 60875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 60968fa4ec4361d1ea5a78a8a7eba2b8015e3dd68f7Jason Molenda UnwindPlan::RowSP row(new UnwindPlan::Row); 61075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 6117fad24a9fd7226016b28fef78930501a1bef898cJason Molenda // Our Call Frame Address is the stack pointer value 61268fa4ec4361d1ea5a78a8a7eba2b8015e3dd68f7Jason Molenda row->SetCFARegister (sp_reg_num); 61375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 6147fad24a9fd7226016b28fef78930501a1bef898cJason Molenda // The previous PC is in the LR 61568fa4ec4361d1ea5a78a8a7eba2b8015e3dd68f7Jason Molenda row->SetRegisterLocationToRegister(pc_reg_num, lr_reg_num, true); 61675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton unwind_plan.AppendRow (row); 61775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 61875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton // All other registers are the same. 61975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 620819dd5e0990e8550d0185f65cc5cf4bc3d9d1058Jason Molenda unwind_plan.SetSourceName ("arm at-func-entry default"); 62137816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda unwind_plan.SetSourcedFromCompiler (eLazyBoolNo); 62237816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda 62375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton return true; 62475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton} 62575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 62675906e4ec98af3717e415727a8d663a4e246bb4fGreg Claytonbool 62775906e4ec98af3717e415727a8d663a4e246bb4fGreg ClaytonABIMacOSX_arm::CreateDefaultUnwindPlan (UnwindPlan &unwind_plan) 62875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton{ 6297fad24a9fd7226016b28fef78930501a1bef898cJason Molenda uint32_t fp_reg_num = dwarf_r7; // apple uses r7 for all frames. Normal arm uses r11; 6307fad24a9fd7226016b28fef78930501a1bef898cJason Molenda uint32_t pc_reg_num = dwarf_pc; 63175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 63268fa4ec4361d1ea5a78a8a7eba2b8015e3dd68f7Jason Molenda UnwindPlan::RowSP row(new UnwindPlan::Row); 6336561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton const int32_t ptr_size = 4; 63475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 6357fad24a9fd7226016b28fef78930501a1bef898cJason Molenda unwind_plan.Clear (); 6367fad24a9fd7226016b28fef78930501a1bef898cJason Molenda unwind_plan.SetRegisterKind (eRegisterKindDWARF); 63768fa4ec4361d1ea5a78a8a7eba2b8015e3dd68f7Jason Molenda row->SetCFARegister (fp_reg_num); 63868fa4ec4361d1ea5a78a8a7eba2b8015e3dd68f7Jason Molenda row->SetCFAOffset (2 * ptr_size); 63968fa4ec4361d1ea5a78a8a7eba2b8015e3dd68f7Jason Molenda row->SetOffset (0); 64075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 64168fa4ec4361d1ea5a78a8a7eba2b8015e3dd68f7Jason Molenda row->SetRegisterLocationToAtCFAPlusOffset(fp_reg_num, ptr_size * -2, true); 64268fa4ec4361d1ea5a78a8a7eba2b8015e3dd68f7Jason Molenda row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, ptr_size * -1, true); 64375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 64475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton unwind_plan.AppendRow (row); 645b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton unwind_plan.SetSourceName ("arm-apple-ios default unwind plan"); 64637816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda unwind_plan.SetSourcedFromCompiler (eLazyBoolNo); 64737816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda unwind_plan.SetUnwindPlanValidAtAllInstructions (eLazyBoolNo); 64837816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda 64975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton return true; 65075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton} 65175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 65237816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda// ARMv7 on iOS general purpose reg rules: 65337816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda// r0-r3 not preserved (used for argument passing) 65437816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda// r4-r6 preserved 65537816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda// r7 preserved (frame pointer) 65637816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda// r8 preserved 65737816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda// r9 not preserved (usable as volatile scratch register with iOS 3.x and later) 65837816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda// r10-r11 preserved 65937816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda// r12 not presrved 66037816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda// r13 preserved (stack pointer) 66137816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda// r14 not preserved (link register) 66237816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda// r15 preserved (pc) 66337816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda// cpsr not preserved (different rules for different bits) 66437816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda 66537816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda// ARMv7 on iOS floating point rules: 66637816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda// d0-d7 not preserved (aka s0-s15, q0-q3) 66737816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda// d8-d15 preserved (aka s16-s31, q4-q7) 66837816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda// d16-d31 not preserved (aka q8-q15) 66937816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda 67075906e4ec98af3717e415727a8d663a4e246bb4fGreg Claytonbool 67175906e4ec98af3717e415727a8d663a4e246bb4fGreg ClaytonABIMacOSX_arm::RegisterIsVolatile (const RegisterInfo *reg_info) 67275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton{ 67375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton if (reg_info) 67475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton { 6757fad24a9fd7226016b28fef78930501a1bef898cJason Molenda // Volatile registers include: r0, r1, r2, r3, r9, r12, r13 67675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton const char *name = reg_info->name; 67775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton if (name[0] == 'r') 67875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton { 67975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton switch (name[1]) 68075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton { 68175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '0': return name[2] == '\0'; // r0 68275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '1': 68375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton switch (name[2]) 68475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton { 68575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '\0': 68675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton return true; // r1 68775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '2': 68875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '3': 68975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton return name[2] == '\0'; // r12 - r13 69075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton default: 69175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton break; 69275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton } 69375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton break; 69475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 69575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '2': return name[2] == '\0'; // r2 69675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '3': return name[2] == '\0'; // r3 697b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case '9': return name[2] == '\0'; // r9 (apple-ios only...) 69875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 69975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton break; 70075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton } 70175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton } 70275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton else if (name[0] == 'd') 70375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton { 70475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton switch (name[1]) 70575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton { 70675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '0': 70737816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda return name[2] == '\0'; // d0 is volatile 70875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 70975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '1': 71075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton switch (name[2]) 71175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton { 71275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '\0': 71337816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda return true; // d1 is volatile 71475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '6': 71575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '7': 71675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '8': 71775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '9': 71837816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda return name[3] == '\0'; // d16 - d19 are volatile 71975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton default: 72075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton break; 72175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton } 72275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton break; 72337816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda 72475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '2': 72575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton switch (name[2]) 72675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton { 72775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '\0': 72837816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda return true; // d2 is volatile 72975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '0': 73075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '1': 73175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '2': 73275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '3': 73375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '4': 73475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '5': 73575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '6': 73675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '7': 73775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '8': 73875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '9': 73937816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda return name[3] == '\0'; // d20 - d29 are volatile 74075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton default: 74175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton break; 74275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton } 74375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton break; 74475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 74575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '3': 74675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton switch (name[2]) 74775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton { 74875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '\0': 74937816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda return true; // d3 is volatile 75037816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda case '0': 75137816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda case '1': 75237816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda return name[3] == '\0'; // d30 - d31 are volatile 75337816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda default: 75437816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda break; 75537816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda } 75637816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda case '4': 75737816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda case '5': 75837816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda case '6': 75937816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda case '7': 76037816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda return name[2] == '\0'; // d4 - d7 are volatile 76137816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda 76237816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda default: 76337816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda break; 76437816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda } 76537816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda } 76637816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda else if (name[0] == 's') 76737816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda { 76837816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda switch (name[1]) 76937816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda { 77037816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda case '0': 77137816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda return name[2] == '\0'; // s0 is volatile 77237816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda 77337816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda case '1': 77437816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda switch (name[2]) 77537816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda { 77637816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda case '\0': 77737816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda return true; // s1 is volatile 77875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '0': 77975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '1': 78037816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda case '2': 78137816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda case '3': 78237816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda case '4': 78337816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda case '5': 78437816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda return name[3] == '\0'; // s10 - s15 are volatile 78537816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda default: 78637816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda break; 78737816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda } 78837816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda break; 78937816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda 79037816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda case '2': 79137816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda switch (name[2]) 79237816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda { 79337816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda case '\0': 79437816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda return true; // s2 is volatile 79537816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda default: 79637816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda break; 79737816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda } 79837816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda break; 79937816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda 80037816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda case '3': 80137816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda switch (name[2]) 80237816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda { 80337816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda case '\0': 80437816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda return true; // s3 is volatile 80575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton default: 80675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton break; 80775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton } 80875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '4': 80975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '5': 81075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '6': 81175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton case '7': 81237816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda case '8': 81337816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda case '9': 81437816a3429a075e19b74f64fd642d5a5d7ec6f2fJason Molenda return name[2] == '\0'; // s4 - s9 are volatile 81575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 81675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton default: 81775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton break; 81875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton } 81975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton } 82075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton else if (name[0] == 's' && name[1] == 'p' && name[2] == '\0') 82175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton return true; 82275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton } 82375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton return false; 82475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton} 82575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 82675906e4ec98af3717e415727a8d663a4e246bb4fGreg Claytonvoid 82775906e4ec98af3717e415727a8d663a4e246bb4fGreg ClaytonABIMacOSX_arm::Initialize() 82875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton{ 8290e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton PluginManager::RegisterPlugin (GetPluginNameStatic(), 8300e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton "Mac OS X ABI for arm targets", 83175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton CreateInstance); 83275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton} 83375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 83475906e4ec98af3717e415727a8d663a4e246bb4fGreg Claytonvoid 83575906e4ec98af3717e415727a8d663a4e246bb4fGreg ClaytonABIMacOSX_arm::Terminate() 83675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton{ 83775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton PluginManager::UnregisterPlugin (CreateInstance); 83875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton} 83975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 8400e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Claytonlldb_private::ConstString 8410e191607adcb0ea8ebd06c278be648a7f5c0097fGreg ClaytonABIMacOSX_arm::GetPluginNameStatic() 8420e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton{ 8430e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton static ConstString g_name("macosx-arm"); 8440e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton return g_name; 8450e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton} 8460e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton 84775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton//------------------------------------------------------------------ 84875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton// PluginInterface protocol 84975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton//------------------------------------------------------------------ 8500e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Claytonlldb_private::ConstString 85175906e4ec98af3717e415727a8d663a4e246bb4fGreg ClaytonABIMacOSX_arm::GetPluginName() 85275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton{ 8530e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton return GetPluginNameStatic(); 85475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton} 85575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 85675906e4ec98af3717e415727a8d663a4e246bb4fGreg Claytonuint32_t 85775906e4ec98af3717e415727a8d663a4e246bb4fGreg ClaytonABIMacOSX_arm::GetPluginVersion() 85875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton{ 85975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton return 1; 86075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton} 86175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 862