summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/Process/FreeBSD/ProcessMonitor.cpp
diff options
context:
space:
mode:
authorJustin Hibbits <jrh29@alumni.cwru.edu>2014-11-12 15:14:08 +0000
committerJustin Hibbits <jrh29@alumni.cwru.edu>2014-11-12 15:14:08 +0000
commit89e6f3851efc15ef8b87f19d5e46c54332db684f (patch)
tree5863ab72625168a97d0fe08be8ba649548c291d5 /lldb/source/Plugins/Process/FreeBSD/ProcessMonitor.cpp
parent43bcdbde4a4e6f821e5749758d864c0da915462f (diff)
downloadbcm5719-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/FreeBSD/ProcessMonitor.cpp')
-rw-r--r--lldb/source/Plugins/Process/FreeBSD/ProcessMonitor.cpp11
1 files changed, 8 insertions, 3 deletions
diff --git a/lldb/source/Plugins/Process/FreeBSD/ProcessMonitor.cpp b/lldb/source/Plugins/Process/FreeBSD/ProcessMonitor.cpp
index bd96b6bfa45..dc30ebd4066 100644
--- a/lldb/source/Plugins/Process/FreeBSD/ProcessMonitor.cpp
+++ b/lldb/source/Plugins/Process/FreeBSD/ProcessMonitor.cpp
@@ -312,9 +312,14 @@ ReadRegOperation::Execute(ProcessMonitor *monitor)
if ((rc = PTRACE(PT_GETREGS, m_tid, (caddr_t)&regs, 0)) < 0) {
m_result = false;
} else {
- if (m_size == sizeof(uintptr_t))
- m_value = *(uintptr_t *)(((caddr_t)&regs) + m_offset);
- else
+ // 'struct reg' contains only 32- or 64-bit register values. Punt on
+ // others. Also, not all entries may be uintptr_t sized, such as 32-bit
+ // processes on powerpc64 (probably the same for i386 on amd64)
+ if (m_size == sizeof(uint32_t))
+ m_value = *(uint32_t *)(((caddr_t)&regs) + m_offset);
+ else if (m_size == sizeof(uint64_t))
+ m_value = *(uint64_t *)(((caddr_t)&regs) + m_offset);
+ else
memcpy(&m_value, (((caddr_t)&regs) + m_offset), m_size);
m_result = true;
}
OpenPOWER on IntegriCloud