summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/Process/MacOSX-User
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2011-05-09 20:18:18 +0000
committerGreg Clayton <gclayton@apple.com>2011-05-09 20:18:18 +0000
commit7349bd90786bb6f738d775a5044181f6111eb614 (patch)
treecac83b5e20bfe6cf8053948566c567fd9daf5d69 /lldb/source/Plugins/Process/MacOSX-User
parent112a2de78cfa8a32965f1c87243fe601941809f0 (diff)
downloadbcm5719-llvm-7349bd90786bb6f738d775a5044181f6111eb614.tar.gz
bcm5719-llvm-7349bd90786bb6f738d775a5044181f6111eb614.zip
While implementing unwind information using UnwindAssemblyInstEmulation I ran
into some cleanup I have been wanting to do when reading/writing registers. Previously all RegisterContext subclasses would need to implement: virtual bool ReadRegisterBytes (uint32_t reg, DataExtractor &data); virtual bool WriteRegisterBytes (uint32_t reg, DataExtractor &data, uint32_t data_offset = 0); There is now a new class specifically designed to hold register values: lldb_private::RegisterValue The new register context calls that subclasses must implement are: virtual bool ReadRegister (const RegisterInfo *reg_info, RegisterValue &reg_value) = 0; virtual bool WriteRegister (const RegisterInfo *reg_info, const RegisterValue &reg_value) = 0; The RegisterValue class must be big enough to handle any register value. The class contains an enumeration for the value type, and then a union for the data value. Any integer/float values are stored directly in an appropriate host integer/float. Anything bigger is stored in a byte buffer that has a length and byte order. The RegisterValue class also knows how to copy register value bytes into in a buffer with a specified byte order which can be used to write the register value down into memory, and this does the right thing when not all bytes from the register values are needed (getting a uint8 from a uint32 register value..). All RegiterContext and other sources have been switched over to using the new regiter value class. llvm-svn: 131096
Diffstat (limited to 'lldb/source/Plugins/Process/MacOSX-User')
-rw-r--r--lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_arm.cpp222
-rw-r--r--lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_arm.h16
-rw-r--r--lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_i386.cpp276
-rw-r--r--lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_i386.h12
-rw-r--r--lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_x86_64.cpp320
-rw-r--r--lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_x86_64.h12
6 files changed, 81 insertions, 777 deletions
diff --git a/lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_arm.cpp b/lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_arm.cpp
index 35805b52d7e..4f3fe1a53b2 100644
--- a/lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_arm.cpp
+++ b/lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_arm.cpp
@@ -17,6 +17,7 @@
// Other libraries and framework includes
#include "lldb/Core/DataBufferHeap.h"
#include "lldb/Core/DataExtractor.h"
+#include "lldb/Core/RegisterValue.h"
#include "lldb/Core/Scalar.h"
#include "lldb/Host/Endian.h"
@@ -627,8 +628,9 @@ RegisterContextMach_arm::LogDBGRegisters (Log *log, const DBG& dbg)
bool
-RegisterContextMach_arm::ReadRegisterValue (uint32_t reg, Scalar &value)
+RegisterContextMach_arm::ReadRegister (const RegisterInfo *reg_info, RegisterValue &value)
{
+ const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
int set = RegisterContextMach_arm::GetSetForNativeRegNum (reg);
if (set == -1)
@@ -656,7 +658,7 @@ RegisterContextMach_arm::ReadRegisterValue (uint32_t reg, Scalar &value)
case gpr_lr:
case gpr_pc:
case gpr_cpsr:
- value = gpr.r[reg - gpr_r0];
+ value.SetUInt32 (gpr.r[reg - gpr_r0]);
break;
case fpu_s0:
@@ -691,24 +693,25 @@ RegisterContextMach_arm::ReadRegisterValue (uint32_t reg, Scalar &value)
case fpu_s29:
case fpu_s30:
case fpu_s31:
- value = fpu.floats.s[reg];
+ value.SetUInt32 (fpu.floats.s[reg], RegisterValue::eTypeFloat);
break;
case fpu_fpscr:
- value = fpu.fpscr;
+ value.SetUInt32 (fpu.fpscr);
break;
case exc_exception:
- value = exc.exception;
+ value.SetUInt32 (exc.exception);
break;
case exc_fsr:
- value = exc.fsr;
+ value.SetUInt32 (exc.fsr);
break;
case exc_far:
- value = exc.far;
+ value.SetUInt32 (exc.far);
break;
default:
+ value.SetValueToInvalid();
return false;
}
@@ -717,8 +720,10 @@ RegisterContextMach_arm::ReadRegisterValue (uint32_t reg, Scalar &value)
bool
-RegisterContextMach_arm::WriteRegisterValue (uint32_t reg, const Scalar &value)
+RegisterContextMach_arm::WriteRegister (const RegisterInfo *reg_info,
+ const RegisterValue &value)
{
+ const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
int set = GetSetForNativeRegNum (reg);
if (set == -1)
@@ -746,7 +751,7 @@ RegisterContextMach_arm::WriteRegisterValue (uint32_t reg, const Scalar &value)
case gpr_lr:
case gpr_pc:
case gpr_cpsr:
- gpr.r[reg - gpr_r0] = value.UInt(0);
+ gpr.r[reg - gpr_r0] = value.GetAsUInt32();
break;
case fpu_s0:
@@ -781,21 +786,21 @@ RegisterContextMach_arm::WriteRegisterValue (uint32_t reg, const Scalar &value)
case fpu_s29:
case fpu_s30:
case fpu_s31:
- fpu.floats.s[reg] = value.UInt(0);
+ fpu.floats.s[reg] = value.GetAsUInt32();
break;
case fpu_fpscr:
- fpu.fpscr = value.UInt(0);
+ fpu.fpscr = value.GetAsUInt32();
break;
case exc_exception:
- exc.exception = value.UInt(0);
+ exc.exception = value.GetAsUInt32();
break;
case exc_fsr:
- exc.fsr = value.UInt(0);
+ exc.fsr = value.GetAsUInt32();
break;
case exc_far:
- exc.far = value.UInt(0);
+ exc.far = value.GetAsUInt32();
break;
default:
@@ -806,195 +811,6 @@ RegisterContextMach_arm::WriteRegisterValue (uint32_t reg, const Scalar &value)
}
bool
-RegisterContextMach_arm::ReadRegisterBytes (uint32_t reg, DataExtractor &data)
-{
- int set = RegisterContextMach_arm::GetSetForNativeRegNum (reg);
- if (set == -1)
- return false;
-
- if (ReadRegisterSet(set, false) != KERN_SUCCESS)
- return false;
-
- const RegisterInfo * reg_info = GetRegisterInfoAtIndex (reg);
- if (reg_info == NULL)
- return false;
-
- switch (reg)
- {
- case gpr_r0:
- case gpr_r1:
- case gpr_r2:
- case gpr_r3:
- case gpr_r4:
- case gpr_r5:
- case gpr_r6:
- case gpr_r7:
- case gpr_r8:
- case gpr_r9:
- case gpr_r10:
- case gpr_r11:
- case gpr_r12:
- case gpr_sp:
- case gpr_lr:
- case gpr_pc:
- case gpr_cpsr:
- data.SetData(&gpr.r[reg - gpr_r0], reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case fpu_s0:
- case fpu_s1:
- case fpu_s2:
- case fpu_s3:
- case fpu_s4:
- case fpu_s5:
- case fpu_s6:
- case fpu_s7:
- case fpu_s8:
- case fpu_s9:
- case fpu_s10:
- case fpu_s11:
- case fpu_s12:
- case fpu_s13:
- case fpu_s14:
- case fpu_s15:
- case fpu_s16:
- case fpu_s17:
- case fpu_s18:
- case fpu_s19:
- case fpu_s20:
- case fpu_s21:
- case fpu_s22:
- case fpu_s23:
- case fpu_s24:
- case fpu_s25:
- case fpu_s26:
- case fpu_s27:
- case fpu_s28:
- case fpu_s29:
- case fpu_s30:
- case fpu_s31:
- data.SetData(&fpu.floats.s[reg - fpu_s0], reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case fpu_fpscr:
- data.SetData(&fpu.fpscr, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case exc_exception:
- data.SetData(&exc.exception, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case exc_fsr:
- data.SetData(&exc.fsr, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case exc_far:
- data.SetData(&exc.far, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- default:
- return false;
- }
- return true;
-}
-
-bool
-RegisterContextMach_arm::WriteRegisterBytes (uint32_t reg, DataExtractor &data, uint32_t data_offset)
-{
- int set = GetSetForNativeRegNum (reg);
-
- if (set == -1)
- return false;
-
- if (ReadRegisterSet(set, false) != KERN_SUCCESS)
- return false;
-
-
- const RegisterInfo * reg_info = GetRegisterInfoAtIndex (reg);
- if (reg_info == NULL && data.ValidOffsetForDataOfSize(data_offset, reg_info->byte_size))
- return false;
-
- uint32_t offset = data_offset;
- switch (reg)
- {
- case gpr_r0:
- case gpr_r1:
- case gpr_r2:
- case gpr_r3:
- case gpr_r4:
- case gpr_r5:
- case gpr_r6:
- case gpr_r7:
- case gpr_r8:
- case gpr_r9:
- case gpr_r10:
- case gpr_r11:
- case gpr_r12:
- case gpr_sp:
- case gpr_lr:
- case gpr_pc:
- case gpr_cpsr:
- gpr.r[reg - gpr_r0] = data.GetU32 (&offset);
- break;
-
- case fpu_s0:
- case fpu_s1:
- case fpu_s2:
- case fpu_s3:
- case fpu_s4:
- case fpu_s5:
- case fpu_s6:
- case fpu_s7:
- case fpu_s8:
- case fpu_s9:
- case fpu_s10:
- case fpu_s11:
- case fpu_s12:
- case fpu_s13:
- case fpu_s14:
- case fpu_s15:
- case fpu_s16:
- case fpu_s17:
- case fpu_s18:
- case fpu_s19:
- case fpu_s20:
- case fpu_s21:
- case fpu_s22:
- case fpu_s23:
- case fpu_s24:
- case fpu_s25:
- case fpu_s26:
- case fpu_s27:
- case fpu_s28:
- case fpu_s29:
- case fpu_s30:
- case fpu_s31:
- fpu.floats.s[reg - fpu_s0] = data.GetU32 (&offset);
- break;
-
- case fpu_fpscr:
- fpu.fpscr = data.GetU32 (&offset);
- break;
-
- case exc_exception:
- fpu.fpscr = data.GetU32 (&offset);
- break;
-
- case exc_fsr:
- exc.fsr = data.GetU32 (&offset);
- break;
-
- case exc_far:
- exc.far = data.GetU32 (&offset);
- break;
-
- default:
- return false;
- }
- return WriteRegisterSet(set) == KERN_SUCCESS;
-}
-
-bool
RegisterContextMach_arm::ReadAllRegisterValues (lldb::DataBufferSP &data_sp)
{
data_sp.reset (new DataBufferHeap (REG_CONTEXT_SIZE, 0));
diff --git a/lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_arm.h b/lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_arm.h
index ef4b7af4e82..23fd08e656c 100644
--- a/lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_arm.h
+++ b/lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_arm.h
@@ -75,21 +75,17 @@ public:
GetRegisterSet (uint32_t set);
virtual bool
- ReadRegisterValue (uint32_t reg, lldb_private::Scalar &value);
-
+ ReadRegister (const lldb_private::RegisterInfo *reg_info,
+ lldb_private::RegisterValue &reg_value);
+
virtual bool
- ReadRegisterBytes (uint32_t reg, lldb_private::DataExtractor &data);
-
+ WriteRegister (const lldb_private::RegisterInfo *reg_info,
+ const lldb_private::RegisterValue &reg_value);
+
virtual bool
ReadAllRegisterValues (lldb::DataBufferSP &data_sp);
virtual bool
- WriteRegisterValue (uint32_t reg, const lldb_private::Scalar &value);
-
- virtual bool
- WriteRegisterBytes (uint32_t reg, lldb_private::DataExtractor &data, uint32_t data_offset = 0);
-
- virtual bool
WriteAllRegisterValues (const lldb::DataBufferSP &data_sp);
virtual uint32_t
diff --git a/lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_i386.cpp b/lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_i386.cpp
index 6bf4dec3691..be1a10f5df2 100644
--- a/lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_i386.cpp
+++ b/lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_i386.cpp
@@ -15,6 +15,7 @@
// Other libraries and framework includes
#include "lldb/Core/DataBufferHeap.h"
#include "lldb/Core/DataExtractor.h"
+#include "lldb/Core/RegisterValue.h"
#include "lldb/Core/Scalar.h"
#include "lldb/Host/Endian.h"
@@ -553,8 +554,10 @@ RegisterContextMach_i386::WriteRegisterSet (uint32_t set)
}
bool
-RegisterContextMach_i386::ReadRegisterValue (uint32_t reg, Scalar &value)
+RegisterContextMach_i386::ReadRegister (const RegisterInfo *reg_info,
+ RegisterValue &value)
{
+ const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
int set = RegisterContextMach_i386::GetSetForNativeRegNum (reg);
if (set == -1)
@@ -671,8 +674,10 @@ RegisterContextMach_i386::ReadRegisterValue (uint32_t reg, Scalar &value)
bool
-RegisterContextMach_i386::WriteRegisterValue (uint32_t reg, const Scalar &value)
+RegisterContextMach_i386::WriteRegister (const RegisterInfo *reg_info,
+ const RegisterValue &value)
{
+ const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
int set = GetSetForNativeRegNum (reg);
if (set == -1)
@@ -699,47 +704,47 @@ RegisterContextMach_i386::WriteRegisterValue (uint32_t reg, const Scalar &value)
case gpr_es:
case gpr_fs:
case gpr_gs:
- (&gpr.eax)[reg - gpr_eax] = value.UInt(0);
+ (&gpr.eax)[reg - gpr_eax] = value.GetAsUInt32();
break;
case fpu_fcw:
- fpu.fcw = value.UInt(0);
+ fpu.fcw = value.GetAsUInt16();
break;
case fpu_fsw:
- fpu.fsw = value.UInt(0);
+ fpu.fsw = value.GetAsUInt16();
break;
case fpu_ftw:
- fpu.ftw = value.UInt(0);
+ fpu.ftw = value.GetAsUInt8();
break;
case fpu_fop:
- fpu.fop = value.UInt(0);
+ fpu.fop = value.GetAsUInt16();
break;
case fpu_ip:
- fpu.ip = value.UInt(0);
+ fpu.ip = value.GetAsUInt32();
break;
case fpu_cs:
- fpu.cs = value.UInt(0);
+ fpu.cs = value.GetAsUInt16();
break;
case fpu_dp:
- fpu.dp = value.UInt(0);
+ fpu.dp = value.GetAsUInt32();
break;
case fpu_ds:
- fpu.ds = value.UInt(0);
+ fpu.ds = value.GetAsUInt16();
break;
case fpu_mxcsr:
- fpu.mxcsr = value.UInt(0);
+ fpu.mxcsr = value.GetAsUInt32();
break;
case fpu_mxcsrmask:
- fpu.mxcsrmask = value.UInt(0);
+ fpu.mxcsrmask = value.GetAsUInt32();
break;
case fpu_stmm0:
@@ -752,7 +757,7 @@ RegisterContextMach_i386::WriteRegisterValue (uint32_t reg, const Scalar &value)
case fpu_stmm7:
// These values don't fit into scalar types, RegisterContext::ReadRegisterBytes()
// must be used for these registers
- //::memcpy (fpu.stmm[reg - fpu_stmm0].bytes, reg_value.value.vector.uint8, 10);
+ ::memcpy (fpu.stmm[reg - fpu_stmm0].bytes, value.GetBytes(), value.GetByteSize());
return false;
case fpu_xmm0:
@@ -765,254 +770,19 @@ RegisterContextMach_i386::WriteRegisterValue (uint32_t reg, const Scalar &value)
case fpu_xmm7:
// These values don't fit into scalar types, RegisterContext::ReadRegisterBytes()
// must be used for these registers
- //::memcpy (fpu.xmm[reg - fpu_xmm0].bytes, reg_value.value.vector.uint8, 16);
+ ::memcpy (fpu.xmm[reg - fpu_xmm0].bytes, value.GetBytes(), value.GetByteSize());
return false;
case exc_trapno:
- exc.trapno = value.UInt(0);
+ exc.trapno = value.GetAsUInt32();
break;
case exc_err:
- exc.err = value.UInt(0);
+ exc.err = value.GetAsUInt32();
break;
case exc_faultvaddr:
- exc.faultvaddr = value.UInt(0);
- break;
-
- default:
- return false;
- }
- return WriteRegisterSet(set) == KERN_SUCCESS;
-}
-
-bool
-RegisterContextMach_i386::ReadRegisterBytes (uint32_t reg, DataExtractor &data)
-{
- int set = RegisterContextMach_i386::GetSetForNativeRegNum (reg);
- if (set == -1)
- return false;
-
- if (ReadRegisterSet(set, false) != KERN_SUCCESS)
- return false;
-
- const RegisterInfo * reg_info = GetRegisterInfoAtIndex (reg);
- if (reg_info == NULL)
- return false;
-
- switch (reg)
- {
- case gpr_eax:
- case gpr_ebx:
- case gpr_ecx:
- case gpr_edx:
- case gpr_edi:
- case gpr_esi:
- case gpr_ebp:
- case gpr_esp:
- case gpr_ss:
- case gpr_eflags:
- case gpr_eip:
- case gpr_cs:
- case gpr_ds:
- case gpr_es:
- case gpr_fs:
- case gpr_gs:
- data.SetData(&gpr.eax + reg - gpr_eax, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case fpu_fcw:
- data.SetData(&fpu.fcw, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case fpu_fsw:
- data.SetData(&fpu.fsw, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case fpu_ftw:
- data.SetData(&fpu.ftw, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case fpu_fop:
- data.SetData(&fpu.fop, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case fpu_ip:
- data.SetData(&fpu.ip, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case fpu_cs:
- data.SetData(&fpu.cs, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case fpu_dp:
- data.SetData(&fpu.dp, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case fpu_ds:
- data.SetData(&fpu.ds, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case fpu_mxcsr:
- data.SetData(&fpu.mxcsr, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case fpu_mxcsrmask:
- data.SetData(&fpu.mxcsrmask, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case fpu_stmm0:
- case fpu_stmm1:
- case fpu_stmm2:
- case fpu_stmm3:
- case fpu_stmm4:
- case fpu_stmm5:
- case fpu_stmm6:
- case fpu_stmm7:
- data.SetData(fpu.stmm[reg - fpu_stmm0].bytes, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case fpu_xmm0:
- case fpu_xmm1:
- case fpu_xmm2:
- case fpu_xmm3:
- case fpu_xmm4:
- case fpu_xmm5:
- case fpu_xmm6:
- case fpu_xmm7:
- data.SetData(fpu.xmm[reg - fpu_xmm0].bytes, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case exc_trapno:
- data.SetData(&exc.trapno, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case exc_err:
- data.SetData(&exc.err, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case exc_faultvaddr:
- data.SetData(&exc.faultvaddr, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- default:
- return false;
- }
- return true;
-}
-
-bool
-RegisterContextMach_i386::WriteRegisterBytes (uint32_t reg, DataExtractor &data, uint32_t data_offset)
-{
- int set = GetSetForNativeRegNum (reg);
-
- if (set == -1)
- return false;
-
- if (ReadRegisterSet(set, false) != KERN_SUCCESS)
- return false;
-
-
- const RegisterInfo * reg_info = GetRegisterInfoAtIndex (reg);
- if (reg_info == NULL && data.ValidOffsetForDataOfSize(data_offset, reg_info->byte_size))
- return false;
-
- uint32_t offset = data_offset;
- switch (reg)
- {
- case gpr_eax:
- case gpr_ebx:
- case gpr_ecx:
- case gpr_edx:
- case gpr_edi:
- case gpr_esi:
- case gpr_ebp:
- case gpr_esp:
- case gpr_ss:
- case gpr_eflags:
- case gpr_eip:
- case gpr_cs:
- case gpr_ds:
- case gpr_es:
- case gpr_fs:
- case gpr_gs:
- (&gpr.eax)[reg - gpr_eax] = data.GetU32 (&offset);
- break;
-
- case fpu_fcw:
- fpu.fcw = data.GetU16(&offset);
- break;
-
- case fpu_fsw:
- fpu.fsw = data.GetU16(&offset);
- break;
-
- case fpu_ftw:
- fpu.ftw = data.GetU8(&offset);
- break;
-
- case fpu_fop:
- fpu.fop = data.GetU16(&offset);
- break;
-
- case fpu_ip:
- fpu.ip = data.GetU32(&offset);
- break;
-
- case fpu_cs:
- fpu.cs = data.GetU16(&offset);
- break;
-
- case fpu_dp:
- fpu.dp = data.GetU32(&offset);
- break;
-
- case fpu_ds:
- fpu.ds = data.GetU16(&offset);
- break;
-
- case fpu_mxcsr:
- fpu.mxcsr = data.GetU32(&offset);
- break;
-
- case fpu_mxcsrmask:
- fpu.mxcsrmask = data.GetU32(&offset);
- break;
-
- case fpu_stmm0:
- case fpu_stmm1:
- case fpu_stmm2:
- case fpu_stmm3:
- case fpu_stmm4:
- case fpu_stmm5:
- case fpu_stmm6:
- case fpu_stmm7:
- ::memcpy (fpu.stmm[reg - fpu_stmm0].bytes, data.PeekData(offset, reg_info->byte_size), reg_info->byte_size);
- return false;
-
- case fpu_xmm0:
- case fpu_xmm1:
- case fpu_xmm2:
- case fpu_xmm3:
- case fpu_xmm4:
- case fpu_xmm5:
- case fpu_xmm6:
- case fpu_xmm7:
- // These values don't fit into scalar types, RegisterContext::ReadRegisterBytes()
- // must be used for these registers
- ::memcpy (fpu.xmm[reg - fpu_xmm0].bytes, data.PeekData(offset, reg_info->byte_size), reg_info->byte_size);
- return false;
-
- case exc_trapno:
- exc.trapno = data.GetU32 (&offset);
- break;
-
- case exc_err:
- exc.err = data.GetU32 (&offset);
- break;
-
- case exc_faultvaddr:
- exc.faultvaddr = data.GetU32 (&offset);
+ exc.faultvaddr = value.GetAsUInt32();
break;
default:
diff --git a/lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_i386.h b/lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_i386.h
index 969fa9a1417..c066107d78c 100644
--- a/lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_i386.h
+++ b/lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_i386.h
@@ -43,21 +43,15 @@ public:
GetRegisterSet (uint32_t set);
virtual bool
- ReadRegisterValue (uint32_t reg, lldb_private::Scalar &value);
+ ReadRegister (const lldb_private::RegisterInfo *reg_info, lldb_private::RegisterValue &value);
virtual bool
- ReadRegisterBytes (uint32_t reg, lldb_private::DataExtractor &data);
-
+ WriteRegister (const lldb_private::RegisterInfo *reg_info, const lldb_private::RegisterValue &value);
+
virtual bool
ReadAllRegisterValues (lldb::DataBufferSP &data_sp);
virtual bool
- WriteRegisterValue (uint32_t reg, const lldb_private::Scalar &value);
-
- virtual bool
- WriteRegisterBytes (uint32_t reg, lldb_private::DataExtractor &data, uint32_t data_offset = 0);
-
- virtual bool
WriteAllRegisterValues (const lldb::DataBufferSP &data_sp);
virtual uint32_t
diff --git a/lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_x86_64.cpp b/lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_x86_64.cpp
index 098a168ed38..7cdcbbb3975 100644
--- a/lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_x86_64.cpp
+++ b/lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_x86_64.cpp
@@ -15,6 +15,7 @@
// Other libraries and framework includes
#include "lldb/Core/DataBufferHeap.h"
#include "lldb/Core/DataExtractor.h"
+#include "lldb/Core/RegisterValue.h"
#include "lldb/Core/Scalar.h"
#include "lldb/Host/Endian.h"
@@ -600,10 +601,11 @@ RegisterContextMach_x86_64::WriteRegisterSet(uint32_t set)
bool
-RegisterContextMach_x86_64::ReadRegisterValue (uint32_t reg, Scalar &value)
+RegisterContextMach_x86_64::ReadRegister (const RegisterInfo *reg_info,
+ RegisterValue &value)
{
+ const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
int set = RegisterContextMach_x86_64::GetSetForNativeRegNum (reg);
-
if (set == -1)
return false;
@@ -684,11 +686,8 @@ RegisterContextMach_x86_64::ReadRegisterValue (uint32_t reg, Scalar &value)
case fpu_stmm5:
case fpu_stmm6:
case fpu_stmm7:
- // These values don't fit into scalar types,
- // RegisterContext::ReadRegisterBytes() must be used for these
- // registers
- //::memcpy (reg_value.value.vector.uint8, fpu.stmm[reg - fpu_stmm0].bytes, 10);
- return false;
+ value.SetBytes(fpu.stmm[reg - fpu_stmm0].bytes, reg_info->byte_size, lldb::endian::InlHostByteOrder());
+ break;
case fpu_xmm0:
case fpu_xmm1:
@@ -706,10 +705,8 @@ RegisterContextMach_x86_64::ReadRegisterValue (uint32_t reg, Scalar &value)
case fpu_xmm13:
case fpu_xmm14:
case fpu_xmm15:
- // These values don't fit into scalar types, RegisterContext::ReadRegisterBytes()
- // must be used for these registers
- //::memcpy (reg_value.value.vector.uint8, fpu.xmm[reg - fpu_xmm0].bytes, 16);
- return false;
+ value.SetBytes(fpu.xmm[reg - fpu_xmm0].bytes, reg_info->byte_size, lldb::endian::InlHostByteOrder());
+ break;
case exc_trapno:
value = exc.trapno;
@@ -731,8 +728,10 @@ RegisterContextMach_x86_64::ReadRegisterValue (uint32_t reg, Scalar &value)
bool
-RegisterContextMach_x86_64::WriteRegisterValue (uint32_t reg, const Scalar &value)
+RegisterContextMach_x86_64::WriteRegister (const RegisterInfo *reg_info,
+ const RegisterValue &value)
{
+ const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
int set = RegisterContextMach_x86_64::GetSetForNativeRegNum (reg);
if (set == -1)
@@ -764,47 +763,47 @@ RegisterContextMach_x86_64::WriteRegisterValue (uint32_t reg, const Scalar &valu
case gpr_cs:
case gpr_fs:
case gpr_gs:
- (&gpr.rax)[reg - gpr_rax] = value.ULongLong(0);
+ (&gpr.rax)[reg - gpr_rax] = value.GetAsUInt64();
break;
case fpu_fcw:
- fpu.fcw = value.UInt(0);
+ fpu.fcw = value.GetAsUInt16();
break;
case fpu_fsw:
- fpu.fsw = value.UInt(0);
+ fpu.fsw = value.GetAsUInt16();
break;
case fpu_ftw:
- fpu.ftw = value.UInt(0);
+ fpu.ftw = value.GetAsUInt8();
break;
case fpu_fop:
- fpu.fop = value.UInt(0);
+ fpu.fop = value.GetAsUInt16();
break;
case fpu_ip:
- fpu.ip = value.UInt(0);
+ fpu.ip = value.GetAsUInt32();
break;
case fpu_cs:
- fpu.cs = value.UInt(0);
+ fpu.cs = value.GetAsUInt16();
break;
case fpu_dp:
- fpu.dp = value.UInt(0);
+ fpu.dp = value.GetAsUInt32();
break;
case fpu_ds:
- fpu.ds = value.UInt(0);
+ fpu.ds = value.GetAsUInt16();
break;
case fpu_mxcsr:
- fpu.mxcsr = value.UInt(0);
+ fpu.mxcsr = value.GetAsUInt32();
break;
case fpu_mxcsrmask:
- fpu.mxcsrmask = value.UInt(0);
+ fpu.mxcsrmask = value.GetAsUInt32();
break;
case fpu_stmm0:
@@ -815,272 +814,9 @@ RegisterContextMach_x86_64::WriteRegisterValue (uint32_t reg, const Scalar &valu
case fpu_stmm5:
case fpu_stmm6:
case fpu_stmm7:
- // These values don't fit into scalar types, RegisterContext::ReadRegisterBytes()
- // must be used for these registers
- //::memcpy (fpu.stmm[reg - fpu_stmm0].bytes, reg_value.value.vector.uint8, 10);
- return false;
-
- case fpu_xmm0:
- case fpu_xmm1:
- case fpu_xmm2:
- case fpu_xmm3:
- case fpu_xmm4:
- case fpu_xmm5:
- case fpu_xmm6:
- case fpu_xmm7:
- case fpu_xmm8:
- case fpu_xmm9:
- case fpu_xmm10:
- case fpu_xmm11:
- case fpu_xmm12:
- case fpu_xmm13:
- case fpu_xmm14:
- case fpu_xmm15:
- // These values don't fit into scalar types, RegisterContext::ReadRegisterBytes()
- // must be used for these registers
- //::memcpy (fpu.xmm[reg - fpu_xmm0].bytes, reg_value.value.vector.uint8, 16);
- return false;
-
- case exc_trapno:
- exc.trapno = value.UInt(0);
- break;
-
- case exc_err:
- exc.err = value.UInt(0);
+ ::memcpy (fpu.stmm[reg - fpu_stmm0].bytes, value.GetBytes(), value.GetByteSize());
break;
- case exc_faultvaddr:
- exc.faultvaddr = value.UInt(0);
- break;
-
- default:
- return false;
- }
- return WriteRegisterSet(set) == KERN_SUCCESS;
-}
-
-bool
-RegisterContextMach_x86_64::ReadRegisterBytes (uint32_t reg, DataExtractor &data)
-{
- int set = RegisterContextMach_x86_64::GetSetForNativeRegNum (reg);
- if (set == -1)
- return false;
-
- if (ReadRegisterSet(set, false) != KERN_SUCCESS)
- return false;
-
- const RegisterInfo * reg_info = GetRegisterInfoAtIndex (reg);
- if (reg_info == NULL)
- return false;
-
- switch (reg)
- {
- case gpr_rax:
- case gpr_rbx:
- case gpr_rcx:
- case gpr_rdx:
- case gpr_rdi:
- case gpr_rsi:
- case gpr_rbp:
- case gpr_rsp:
- case gpr_r8:
- case gpr_r9:
- case gpr_r10:
- case gpr_r11:
- case gpr_r12:
- case gpr_r13:
- case gpr_r14:
- case gpr_r15:
- case gpr_rip:
- case gpr_rflags:
- case gpr_cs:
- case gpr_fs:
- case gpr_gs:
- data.SetData(&gpr.rax + reg - gpr_rax, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case fpu_fcw:
- data.SetData(&fpu.fcw, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case fpu_fsw:
- data.SetData(&fpu.fsw, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case fpu_ftw:
- data.SetData(&fpu.ftw, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case fpu_fop:
- data.SetData(&fpu.fop, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case fpu_ip:
- data.SetData(&fpu.ip, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case fpu_cs:
- data.SetData(&fpu.cs, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case fpu_dp:
- data.SetData(&fpu.dp, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case fpu_ds:
- data.SetData(&fpu.ds, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case fpu_mxcsr:
- data.SetData(&fpu.mxcsr, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case fpu_mxcsrmask:
- data.SetData(&fpu.mxcsrmask, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case fpu_stmm0:
- case fpu_stmm1:
- case fpu_stmm2:
- case fpu_stmm3:
- case fpu_stmm4:
- case fpu_stmm5:
- case fpu_stmm6:
- case fpu_stmm7:
- data.SetData(fpu.stmm[reg - fpu_stmm0].bytes, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case fpu_xmm0:
- case fpu_xmm1:
- case fpu_xmm2:
- case fpu_xmm3:
- case fpu_xmm4:
- case fpu_xmm5:
- case fpu_xmm6:
- case fpu_xmm7:
- case fpu_xmm8:
- case fpu_xmm9:
- case fpu_xmm10:
- case fpu_xmm11:
- case fpu_xmm12:
- case fpu_xmm13:
- case fpu_xmm14:
- case fpu_xmm15:
- data.SetData(fpu.xmm[reg - fpu_xmm0].bytes, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case exc_trapno:
- data.SetData(&exc.trapno, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case exc_err:
- data.SetData(&exc.err, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- case exc_faultvaddr:
- data.SetData(&exc.faultvaddr, reg_info->byte_size, lldb::endian::InlHostByteOrder());
- break;
-
- default:
- return false;
- }
- return true;
-}
-
-bool
-RegisterContextMach_x86_64::WriteRegisterBytes (uint32_t reg, DataExtractor &data, uint32_t data_offset)
-{
- int set = RegisterContextMach_x86_64::GetSetForNativeRegNum (reg);
-
- if (set == -1)
- return false;
-
- if (ReadRegisterSet(set, false) != KERN_SUCCESS)
- return false;
-
-
- const RegisterInfo * reg_info = GetRegisterInfoAtIndex (reg);
- if (reg_info == NULL && data.ValidOffsetForDataOfSize(data_offset, reg_info->byte_size))
- return false;
-
- uint32_t offset = data_offset;
- switch (reg)
- {
- case gpr_rax:
- case gpr_rbx:
- case gpr_rcx:
- case gpr_rdx:
- case gpr_rdi:
- case gpr_rsi:
- case gpr_rbp:
- case gpr_rsp:
- case gpr_r8:
- case gpr_r9:
- case gpr_r10:
- case gpr_r11:
- case gpr_r12:
- case gpr_r13:
- case gpr_r14:
- case gpr_r15:
- case gpr_rip:
- case gpr_rflags:
- case gpr_cs:
- case gpr_fs:
- case gpr_gs:
- (&gpr.rax)[reg - gpr_rax] = data.GetU32 (&offset);
- break;
-
- case fpu_fcw:
- fpu.fcw = data.GetU16(&offset);
- break;
-
- case fpu_fsw:
- fpu.fsw = data.GetU16(&offset);
- break;
-
- case fpu_ftw:
- fpu.ftw = data.GetU8(&offset);
- break;
-
- case fpu_fop:
- fpu.fop = data.GetU16(&offset);
- break;
-
- case fpu_ip:
- fpu.ip = data.GetU32(&offset);
- break;
-
- case fpu_cs:
- fpu.cs = data.GetU16(&offset);
- break;
-
- case fpu_dp:
- fpu.dp = data.GetU32(&offset);
- break;
-
- case fpu_ds:
- fpu.ds = data.GetU16(&offset);
- break;
-
- case fpu_mxcsr:
- fpu.mxcsr = data.GetU32(&offset);
- break;
-
- case fpu_mxcsrmask:
- fpu.mxcsrmask = data.GetU32(&offset);
- break;
-
- case fpu_stmm0:
- case fpu_stmm1:
- case fpu_stmm2:
- case fpu_stmm3:
- case fpu_stmm4:
- case fpu_stmm5:
- case fpu_stmm6:
- case fpu_stmm7:
- ::memcpy (fpu.stmm[reg - fpu_stmm0].bytes, data.PeekData(offset, reg_info->byte_size), reg_info->byte_size);
- return false;
-
case fpu_xmm0:
case fpu_xmm1:
case fpu_xmm2:
@@ -1097,21 +833,19 @@ RegisterContextMach_x86_64::WriteRegisterBytes (uint32_t reg, DataExtractor &dat
case fpu_xmm13:
case fpu_xmm14:
case fpu_xmm15:
- // These values don't fit into scalar types, RegisterContext::ReadRegisterBytes()
- // must be used for these registers
- ::memcpy (fpu.xmm[reg - fpu_xmm0].bytes, data.PeekData(offset, reg_info->byte_size), reg_info->byte_size);
+ ::memcpy (fpu.xmm[reg - fpu_xmm0].bytes, value.GetBytes(), value.GetByteSize());
return false;
case exc_trapno:
- exc.trapno = data.GetU32 (&offset);
+ exc.trapno = value.GetAsUInt32();
break;
case exc_err:
- exc.err = data.GetU32 (&offset);
+ exc.err = value.GetAsUInt32();
break;
case exc_faultvaddr:
- exc.faultvaddr = data.GetU32 (&offset);
+ exc.faultvaddr = value.GetAsUInt64();
break;
default:
diff --git a/lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_x86_64.h b/lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_x86_64.h
index 5b0bdc7ed31..e8217222da1 100644
--- a/lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_x86_64.h
+++ b/lldb/source/Plugins/Process/MacOSX-User/source/RegisterContextMach_x86_64.h
@@ -42,21 +42,15 @@ public:
GetRegisterSet (uint32_t set);
virtual bool
- ReadRegisterValue (uint32_t reg, lldb_private::Scalar &value);
+ ReadRegister (const lldb_private::RegisterInfo *reg_info, lldb_private::RegisterValue &value);
virtual bool
- ReadRegisterBytes (uint32_t reg, lldb_private::DataExtractor &data);
-
+ WriteRegister (const lldb_private::RegisterInfo *reg_info, const lldb_private::RegisterValue &value);
+
virtual bool
ReadAllRegisterValues (lldb::DataBufferSP &data_sp);
virtual bool
- WriteRegisterValue (uint32_t reg, const lldb_private::Scalar &value);
-
- virtual bool
- WriteRegisterBytes (uint32_t reg, lldb_private::DataExtractor &data, uint32_t data_offset = 0);
-
- virtual bool
WriteAllRegisterValues (const lldb::DataBufferSP &data_sp);
virtual uint32_t
OpenPOWER on IntegriCloud