[Lldb-commits] [lldb] r166604 - in /lldb/trunk: source/Plugins/Process/POSIX/RegisterContext_x86_64.cpp test/functionalities/register/TestRegisters.py test/lldbtest.py

Greg Clayton gclayton at apple.com
Wed Oct 24 11:24:15 PDT 2012


Author: gclayton
Date: Wed Oct 24 13:24:14 2012
New Revision: 166604

URL: http://llvm.org/viewvc/llvm-project?rev=166604&view=rev
Log:
Patch from Ashok Thirumurthi that enabled FPU registers for POSIX x86_64.


Modified:
    lldb/trunk/source/Plugins/Process/POSIX/RegisterContext_x86_64.cpp
    lldb/trunk/test/functionalities/register/TestRegisters.py
    lldb/trunk/test/lldbtest.py

Modified: lldb/trunk/source/Plugins/Process/POSIX/RegisterContext_x86_64.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/POSIX/RegisterContext_x86_64.cpp?rev=166604&r1=166603&r2=166604&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/POSIX/RegisterContext_x86_64.cpp (original)
+++ lldb/trunk/source/Plugins/Process/POSIX/RegisterContext_x86_64.cpp Wed Oct 24 13:24:14 2012
@@ -13,6 +13,7 @@
 
 #include "lldb/Core/DataBufferHeap.h"
 #include "lldb/Core/DataExtractor.h"
+#include "lldb/Core/RegisterValue.h"
 #include "lldb/Core/Scalar.h"
 #include "lldb/Target/Thread.h"
 #include "lldb/Host/Endian.h"
@@ -500,12 +501,66 @@
 }
 
 bool
-RegisterContext_x86_64::ReadRegister(const RegisterInfo *reg_info,
-                                          RegisterValue &value)
+RegisterContext_x86_64::ReadRegister(const RegisterInfo *reg_info, RegisterValue &value)
 {
     const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
-    ProcessMonitor &monitor = GetMonitor();
-    return monitor.ReadRegisterValue(GetRegOffset(reg), GetRegSize(reg), value);
+
+    if (reg >= k_first_fpr && reg <= k_last_fpr) {
+        if (!ReadFPR())
+            return false;
+    }
+    else {
+        ProcessMonitor &monitor = GetMonitor();
+        return monitor.ReadRegisterValue(GetRegOffset(reg),GetRegSize(reg), value);
+    }
+
+    if (reg_info->encoding == eEncodingVector) {
+        // Get the target process whose privileged thread was used for the register read.
+        Process *process = CalculateProcess().get();
+        if (process) {
+            if (reg >= fpu_stmm0 && reg <= fpu_stmm7) {
+               value.SetBytes(user.i387.stmm[reg - fpu_stmm0].bytes, reg_info->byte_size, process->GetByteOrder());
+               return value.GetType() == RegisterValue::eTypeBytes;
+            }
+            if (reg >= fpu_xmm0 && reg <= fpu_xmm15) {
+                value.SetBytes(user.i387.xmm[reg - fpu_xmm0].bytes, reg_info->byte_size, process->GetByteOrder());
+                return value.GetType() == RegisterValue::eTypeBytes;
+            }
+        }
+        return false;
+    }
+
+    // Note that lldb uses slightly different naming conventions from sys/user.h
+    switch (reg)
+    {
+    default:
+        return false;
+    case fpu_dp:
+        value = user.i387.dp;
+        break;
+    case fpu_fcw:
+        value = user.i387.fcw;
+        break;
+    case fpu_fsw:
+        value = user.i387.fsw;
+        break;
+    case fpu_ip:
+        value = user.i387.ip;
+        break;
+    case fpu_fop:
+        value = user.i387.fop;
+        break;
+    case fpu_ftw:
+        value = user.i387.ftw;
+        break;
+    case fpu_mxcsr:
+        value = user.i387.mxcsr;
+        break;
+    case fpu_mxcsrmask:
+        value = user.i387.mxcsrmask;
+        break;
+    }
+    return true;
 }
 
 bool

Modified: lldb/trunk/test/functionalities/register/TestRegisters.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/register/TestRegisters.py?rev=166604&r1=166603&r2=166604&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/register/TestRegisters.py (original)
+++ lldb/trunk/test/functionalities/register/TestRegisters.py Wed Oct 24 13:24:14 2012
@@ -50,7 +50,8 @@
 
         # Test some register-related commands.
 
-        self.runCmd("register read -a")
+        self.expect("register read -a", MISSING_EXPECTED_REGISTERS,
+            substrs = ['registers were unavailable'], matching = False)
         self.runCmd("register read xmm0")
 
         # rdar://problem/10611315

Modified: lldb/trunk/test/lldbtest.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lldbtest.py?rev=166604&r1=166603&r2=166604&view=diff
==============================================================================
--- lldb/trunk/test/lldbtest.py (original)
+++ lldb/trunk/test/lldbtest.py Wed Oct 24 13:24:14 2012
@@ -91,6 +91,8 @@
 
 BREAKPOINT_HIT_THRICE = "Breakpoint resolved with hit cout = 3"
 
+MISSING_EXPECTED_REGISTERS = "At least one expected register is unavailable."
+
 OBJECT_PRINTED_CORRECTLY = "Object printed correctly"
 
 SOURCE_DISPLAYED_CORRECTLY = "Source code displayed correctly"





More information about the lldb-commits mailing list