diff options
Diffstat (limited to 'source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.cpp')
-rw-r--r-- | source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.cpp | 47 |
1 files changed, 17 insertions, 30 deletions
diff --git a/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.cpp b/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.cpp index 4685c3e759e0..f27c294a4abd 100644 --- a/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.cpp +++ b/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.cpp @@ -580,32 +580,13 @@ ABIMacOSX_arm::SetReturnValueObject(lldb::StackFrameSP &frame_sp, lldb::ValueObj bool ABIMacOSX_arm::CreateFunctionEntryUnwindPlan (UnwindPlan &unwind_plan) { - uint32_t reg_kind = unwind_plan.GetRegisterKind(); - uint32_t lr_reg_num = LLDB_INVALID_REGNUM; - uint32_t sp_reg_num = LLDB_INVALID_REGNUM; - uint32_t pc_reg_num = LLDB_INVALID_REGNUM; - - switch (reg_kind) - { - case eRegisterKindDWARF: - case eRegisterKindGCC: - lr_reg_num = dwarf_lr; - sp_reg_num = dwarf_sp; - pc_reg_num = dwarf_pc; - break; - - case eRegisterKindGeneric: - lr_reg_num = LLDB_REGNUM_GENERIC_RA; - sp_reg_num = LLDB_REGNUM_GENERIC_SP; - pc_reg_num = LLDB_REGNUM_GENERIC_PC; - break; - } - - if (lr_reg_num == LLDB_INVALID_REGNUM || - sp_reg_num == LLDB_INVALID_REGNUM || - pc_reg_num == LLDB_INVALID_REGNUM) - return false; + unwind_plan.Clear(); + unwind_plan.SetRegisterKind (eRegisterKindDWARF); + uint32_t lr_reg_num = dwarf_lr; + uint32_t sp_reg_num = dwarf_sp; + uint32_t pc_reg_num = dwarf_pc; + UnwindPlan::RowSP row(new UnwindPlan::Row); // Our Call Frame Address is the stack pointer value @@ -626,14 +607,15 @@ ABIMacOSX_arm::CreateFunctionEntryUnwindPlan (UnwindPlan &unwind_plan) bool ABIMacOSX_arm::CreateDefaultUnwindPlan (UnwindPlan &unwind_plan) { - uint32_t fp_reg_num = dwarf_r7; // apple uses r7 for all frames. Normal arm uses r11; + unwind_plan.Clear (); + unwind_plan.SetRegisterKind (eRegisterKindDWARF); + + uint32_t fp_reg_num = dwarf_r7; // apple uses r7 for all frames. Normal arm uses r11 uint32_t pc_reg_num = dwarf_pc; UnwindPlan::RowSP row(new UnwindPlan::Row); const int32_t ptr_size = 4; - unwind_plan.Clear (); - unwind_plan.SetRegisterKind (eRegisterKindDWARF); row->SetCFARegister (fp_reg_num); row->SetCFAOffset (2 * ptr_size); row->SetOffset (0); @@ -649,6 +631,11 @@ ABIMacOSX_arm::CreateDefaultUnwindPlan (UnwindPlan &unwind_plan) return true; } +// cf. "ARMv6 Function Calling Conventions" +// https://developer.apple.com/library/ios/documentation/Xcode/Conceptual/iPhoneOSABIReference/Articles/ARMv6FunctionCallingConventions.html +// and "ARMv7 Function Calling Conventions" +// https://developer.apple.com/library/ios/documentation/Xcode/Conceptual/iPhoneOSABIReference/Articles/ARMv7FunctionCallingConventions.html + // ARMv7 on iOS general purpose reg rules: // r0-r3 not preserved (used for argument passing) // r4-r6 preserved @@ -672,7 +659,7 @@ ABIMacOSX_arm::RegisterIsVolatile (const RegisterInfo *reg_info) { if (reg_info) { - // Volatile registers include: r0, r1, r2, r3, r9, r12, r13 + // Volatile registers are: r0, r1, r2, r3, r9, r12, r13 (aka sp) const char *name = reg_info->name; if (name[0] == 'r') { @@ -686,7 +673,7 @@ ABIMacOSX_arm::RegisterIsVolatile (const RegisterInfo *reg_info) return true; // r1 case '2': case '3': - return name[2] == '\0'; // r12 - r13 + return name[3] == '\0'; // r12, r13 (sp) default: break; } |