diff options
| author | Justin Hibbits <jrh29@alumni.cwru.edu> | 2014-11-12 15:14:08 +0000 |
|---|---|---|
| committer | Justin Hibbits <jrh29@alumni.cwru.edu> | 2014-11-12 15:14:08 +0000 |
| commit | 89e6f3851efc15ef8b87f19d5e46c54332db684f (patch) | |
| tree | 5863ab72625168a97d0fe08be8ba649548c291d5 /lldb/source/Plugins/Process/Utility | |
| parent | 43bcdbde4a4e6f821e5749758d864c0da915462f (diff) | |
| download | bcm5719-llvm-89e6f3851efc15ef8b87f19d5e46c54332db684f.tar.gz bcm5719-llvm-89e6f3851efc15ef8b87f19d5e46c54332db684f.zip | |
Improve PowerPC unwind support
Summary:
Taking advantage of the new 'CFAIsRegisterDereferenced' CFA register type, add
full stack unwind support to the PowerPC/PowerPC64 ABI. Also, add a new
register set for powerpc32-on-64, so the register sizes are correct. This also
requires modifying the ProcessMonitor to add support for non-uintptr_t-sized
register values.
Reviewers: jasonmolenda, emaste
Subscribers: emaste, lldb-commits
Differential Revision: http://reviews.llvm.org/D6183
llvm-svn: 221789
Diffstat (limited to 'lldb/source/Plugins/Process/Utility')
| -rw-r--r-- | lldb/source/Plugins/Process/Utility/RegisterContextFreeBSD_powerpc.cpp | 5 | ||||
| -rw-r--r-- | lldb/source/Plugins/Process/Utility/RegisterInfos_powerpc.h | 21 |
2 files changed, 23 insertions, 3 deletions
diff --git a/lldb/source/Plugins/Process/Utility/RegisterContextFreeBSD_powerpc.cpp b/lldb/source/Plugins/Process/Utility/RegisterContextFreeBSD_powerpc.cpp index 375f9b8f65c..5170e6d2acc 100644 --- a/lldb/source/Plugins/Process/Utility/RegisterContextFreeBSD_powerpc.cpp +++ b/lldb/source/Plugins/Process/Utility/RegisterContextFreeBSD_powerpc.cpp @@ -153,7 +153,8 @@ RegisterContextFreeBSD_powerpc::~RegisterContextFreeBSD_powerpc() size_t RegisterContextFreeBSD_powerpc::GetGPRSize() const { - return sizeof(GPR64); + // This is an 'abstract' base, so no GPR struct. + return 0; } const RegisterInfo * @@ -217,6 +218,8 @@ const RegisterInfo * RegisterContextFreeBSD_powerpc64::GetRegisterInfo() const { //assert (m_target_arch.GetCore() == ArchSpec::eCore_powerpc); + if (m_target_arch.GetMachine() == llvm::Triple::ppc) + return g_register_infos_powerpc64_32; return g_register_infos_powerpc64; } diff --git a/lldb/source/Plugins/Process/Utility/RegisterInfos_powerpc.h b/lldb/source/Plugins/Process/Utility/RegisterInfos_powerpc.h index 67dd4870539..04542664810 100644 --- a/lldb/source/Plugins/Process/Utility/RegisterInfos_powerpc.h +++ b/lldb/source/Plugins/Process/Utility/RegisterInfos_powerpc.h @@ -14,12 +14,14 @@ (offsetof(GPR, regname)) #define FPR_OFFSET(regname) \ (offsetof(FPR, regname)) +#define GPR_SIZE(regname) \ + (sizeof(((GPR*)NULL)->regname)) #ifdef DECLARE_REGISTER_INFOS_POWERPC_STRUCT // Note that the size and offset will be updated by platform-specific classes. #define DEFINE_GPR(reg, alt, lldb_kind) \ - { #reg, alt, sizeof(((GPR*)NULL)->reg), GPR_OFFSET(reg), eEncodingUint, \ + { #reg, alt, GPR_SIZE(reg), GPR_OFFSET(reg), eEncodingUint, \ eFormatHex, { gcc_dwarf_##reg##_powerpc, gcc_dwarf_##reg##_powerpc, lldb_kind, gdb_##reg##_powerpc, gpr_##reg##_powerpc }, NULL, NULL } #define DEFINE_FPR(reg, lldb_kind) \ { #reg, NULL, 8, FPR_OFFSET(reg), eEncodingIEEE754, \ @@ -97,7 +99,6 @@ DEFINE_FPR(f30, LLDB_INVALID_REGNUM), \ DEFINE_FPR(f31, LLDB_INVALID_REGNUM), \ { "fpscr", NULL, 8, FPR_OFFSET(fpscr), eEncodingUint, eFormatHex, { gcc_dwarf_fpscr_powerpc, gcc_dwarf_fpscr_powerpc, LLDB_INVALID_REGNUM, gdb_fpscr_powerpc, fpr_fpscr_powerpc }, NULL, NULL }, - //{ NULL, NULL, sizeof(((GPR*)NULL)->r0), 0, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_cfa_powerpc}, NULL, NULL} static RegisterInfo g_register_infos_powerpc64[] = { @@ -113,10 +114,26 @@ g_register_infos_powerpc32[] = POWERPC_REGS #undef GPR }; + +static RegisterInfo +g_register_infos_powerpc64_32[] = +{ +#define GPR GPR64 +#undef GPR_SIZE +#define GPR_SIZE(reg) (sizeof(uint32_t)) +#undef GPR_OFFSET +#define GPR_OFFSET(regname) \ + (offsetof(GPR, regname) + (sizeof(((GPR *)NULL)->regname) - GPR_SIZE(reg))) + POWERPC_REGS +#undef GPR +}; + static_assert((sizeof(g_register_infos_powerpc32) / sizeof(g_register_infos_powerpc32[0])) == k_num_registers_powerpc, "g_register_infos_powerpc32 has wrong number of register infos"); static_assert((sizeof(g_register_infos_powerpc64) / sizeof(g_register_infos_powerpc64[0])) == k_num_registers_powerpc, "g_register_infos_powerpc64 has wrong number of register infos"); +static_assert(sizeof(g_register_infos_powerpc64_32) == sizeof(g_register_infos_powerpc64), + "g_register_infos_powerpc64_32 doesn't match size of g_register_infos_powerpc64"); #undef DEFINE_FPR #undef DEFINE_GPR |

