1 //===-- RegisterContextMacOSXFrameBackchain.cpp -----------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "RegisterContextMacOSXFrameBackchain.h"
14 // Other libraries and framework includes
15 #include "lldb/Core/DataBufferHeap.h"
16 #include "lldb/Core/DataExtractor.h"
17 #include "lldb/Core/RegisterValue.h"
18 #include "lldb/Core/Scalar.h"
19 #include "lldb/Core/StreamString.h"
20 #include "lldb/Target/Thread.h"
22 #include "Utility/StringExtractorGDBRemote.h"
25 using namespace lldb_private;
27 //----------------------------------------------------------------------
28 // RegisterContextMacOSXFrameBackchain constructor
29 //----------------------------------------------------------------------
30 RegisterContextMacOSXFrameBackchain::RegisterContextMacOSXFrameBackchain
33 uint32_t concrete_frame_idx,
34 const UnwindMacOSXFrameBackchain::Cursor &cursor
36 RegisterContext (thread, concrete_frame_idx),
38 m_cursor_is_valid (true)
42 //----------------------------------------------------------------------
44 //----------------------------------------------------------------------
45 RegisterContextMacOSXFrameBackchain::~RegisterContextMacOSXFrameBackchain()
50 RegisterContextMacOSXFrameBackchain::InvalidateAllRegisters ()
52 m_cursor_is_valid = false;
56 RegisterContextMacOSXFrameBackchain::GetRegisterCount ()
58 return m_thread.GetRegisterContext()->GetRegisterCount();
62 RegisterContextMacOSXFrameBackchain::GetRegisterInfoAtIndex (size_t reg)
64 return m_thread.GetRegisterContext()->GetRegisterInfoAtIndex(reg);
68 RegisterContextMacOSXFrameBackchain::GetRegisterSetCount ()
70 return m_thread.GetRegisterContext()->GetRegisterSetCount();
76 RegisterContextMacOSXFrameBackchain::GetRegisterSet (size_t reg_set)
78 return m_thread.GetRegisterContext()->GetRegisterSet (reg_set);
84 RegisterContextMacOSXFrameBackchain::ReadRegister (const RegisterInfo *reg_info,
87 if (!m_cursor_is_valid)
90 uint64_t reg_value = LLDB_INVALID_ADDRESS;
92 switch (reg_info->kinds[eRegisterKindGeneric])
94 case LLDB_REGNUM_GENERIC_PC:
95 if (m_cursor.pc == LLDB_INVALID_ADDRESS)
97 reg_value = m_cursor.pc;
100 case LLDB_REGNUM_GENERIC_FP:
101 if (m_cursor.fp == LLDB_INVALID_ADDRESS)
103 reg_value = m_cursor.fp;
110 switch (reg_info->encoding)
112 case eEncodingInvalid:
113 case eEncodingVector:
118 value.SetUInt(reg_value, reg_info->byte_size);
121 case eEncodingIEEE754:
122 switch (reg_info->byte_size)
125 if (sizeof (float) == sizeof(uint32_t))
127 value.SetUInt32(reg_value, RegisterValue::eTypeFloat);
130 else if (sizeof (float) == sizeof(uint64_t))
132 value.SetUInt64(reg_value, RegisterValue::eTypeFloat);
137 case sizeof (double):
138 if (sizeof (double) == sizeof(uint32_t))
140 value.SetUInt32(reg_value, RegisterValue::eTypeDouble);
143 else if (sizeof (double) == sizeof(uint64_t))
145 value.SetUInt64(reg_value, RegisterValue::eTypeDouble);
150 // TOOD: need a better way to detect when "long double" types are
151 // the same bytes size as "double"
152 #if !defined(__arm__)
153 case sizeof (long double):
154 if (sizeof (long double) == sizeof(uint32_t))
156 value.SetUInt32(reg_value, RegisterValue::eTypeLongDouble);
159 else if (sizeof (long double) == sizeof(uint64_t))
161 value.SetUInt64(reg_value, RegisterValue::eTypeLongDouble);
173 RegisterContextMacOSXFrameBackchain::WriteRegister (const RegisterInfo *reg_info,
174 const RegisterValue &value)
176 // Not supported yet. We could easily add support for this by remembering
177 // the address of each entry (it would need to be part of the cursor)
182 RegisterContextMacOSXFrameBackchain::ReadAllRegisterValues (lldb::DataBufferSP &data_sp)
184 // libunwind frames can't handle this it doesn't always have all register
185 // values. This call should only be called on frame zero anyway so there
186 // shouldn't be any problem
191 RegisterContextMacOSXFrameBackchain::WriteAllRegisterValues (const lldb::DataBufferSP &data_sp)
193 // Since this class doesn't respond to "ReadAllRegisterValues()", it must
194 // not have been the one that saved all the register values. So we just let
195 // the thread's register context (the register context for frame zero) do
197 return m_thread.GetRegisterContext()->WriteAllRegisterValues(data_sp);
202 RegisterContextMacOSXFrameBackchain::ConvertRegisterKindToRegisterNumber (uint32_t kind, uint32_t num)
204 return m_thread.GetRegisterContext()->ConvertRegisterKindToRegisterNumber (kind, num);