[LLDB][MIPS] Adding call to IsMSAAvailable() while creating RegisterInfoInterface
authorSagar Thakur <sagar.thakur@imgtec.com>
Wed, 9 Dec 2015 12:31:01 +0000 (12:31 +0000)
committerSagar Thakur <sagar.thakur@imgtec.com>
Wed, 9 Dec 2015 12:31:01 +0000 (12:31 +0000)
This patch will fix the test case test_p_returns_correct_data_size_for_each_qRegisterInfo_attach_llgs_* of TestLldbGdbServer.py on mips. The test fails because we were sending RegisterInfo for msa registers to client even when msa registers are not available. With this commit server will send E45(end of resigters) response if msa registers are not available.

llvm-svn: 255108

lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_mips64.cpp
lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_mips64.h

index b0ef365..7aba9c1 100644 (file)
@@ -20,6 +20,7 @@
 #include "lldb/Core/Log.h"
 #include "lldb/Core/DataBufferHeap.h"
 #include "lldb/Host/HostInfo.h"
+#include "lldb/Host/Host.h"
 #include "lldb/Core/EmulateInstruction.h"
 #include "lldb/lldb-enumerations.h"
 #include "lldb/lldb-private-enumerations.h"
@@ -416,14 +417,14 @@ CreateRegisterInfoInterface(const ArchSpec& target_arch)
     if (HostInfo::GetArchitecture().GetAddressByteSize() == 4)
     {
         // 32-bit hosts run with a RegisterContextLinux_mips context.
-        return new RegisterContextLinux_mips(target_arch);
+        return new RegisterContextLinux_mips(target_arch, NativeRegisterContextLinux_mips64::IsMSAAvailable());
     }
     else
     {
         assert((HostInfo::GetArchitecture().GetAddressByteSize() == 8) &&
                "Register setting path assumes this is a 64-bit host");
         // mips64 hosts know how to work with 64-bit and 32-bit EXEs using the mips64 register context.
-        return new RegisterContextLinux_mips64 (target_arch);
+        return new RegisterContextLinux_mips64 (target_arch, NativeRegisterContextLinux_mips64::IsMSAAvailable());
     }
 }
 
@@ -1104,9 +1105,12 @@ NativeRegisterContextLinux_mips64::IsMSA(uint32_t reg_index) const
 bool
 NativeRegisterContextLinux_mips64::IsMSAAvailable()
 {
-    Error error = NativeRegisterContextLinux::ReadRegisterSet(&m_msa, sizeof(MSA_linux_mips), NT_MIPS_MSA);
+    MSA_linux_mips msa_buf;
+    unsigned int regset = NT_MIPS_MSA;
 
-    if (error.Success() && m_msa.mir)
+    Error error = NativeProcessLinux::PtraceWrapper(PTRACE_GETREGSET, Host::GetCurrentProcessID(), static_cast<void *>(&regset), &msa_buf, sizeof(MSA_linux_mips));
+
+    if (error.Success() && msa_buf.mir)
     {
         return true;
     }
index 9099618..9368645 100644 (file)
@@ -89,6 +89,9 @@ namespace process_linux {
         uint32_t
         NumSupportedHardwareWatchpoints () override;
 
+        static bool
+        IsMSAAvailable();
+
     protected:
         Error
         DoReadRegisterValue(uint32_t offset,
@@ -119,9 +122,6 @@ namespace process_linux {
         bool
         IsMSA(uint32_t reg_index) const;
 
-        bool
-        IsMSAAvailable();
-
         void*
         GetGPRBuffer() override { return &m_gpr; }