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