[Lldb-commits] [lldb] r192263 - Clean up RegisterContextPOSIX i386 code.

Michael Sartain mikesart at valvesoftware.com
Tue Oct 8 18:28:58 PDT 2013


Author: mikesart
Date: Tue Oct  8 20:28:57 2013
New Revision: 192263

URL: http://llvm.org/viewvc/llvm-project?rev=192263&view=rev
Log:
Clean up RegisterContextPOSIX i386 code.
Use 32-bit register enums without gaps on 64-bit hosts.
Don't show 64-bit registers when debugging 32-bit targets.
Add psuedo gpr registers (ax, ah, al, etc.)
Add mmx registers.
Fix TestRegisters.py to not read ymm15 register on 32-bit targets.
Fill out and move gcc/dwarf/gdb register enums to RegisterContext_x86.h


Added:
    lldb/trunk/source/Plugins/Process/POSIX/RegisterContextFreeBSD_i386.cpp
    lldb/trunk/source/Plugins/Process/POSIX/RegisterContextFreeBSD_i386.h
    lldb/trunk/source/Plugins/Process/POSIX/RegisterContextLinux_i386.cpp
    lldb/trunk/source/Plugins/Process/POSIX/RegisterContextLinux_i386.h
    lldb/trunk/source/Plugins/Process/POSIX/RegisterInfos_i386.h
    lldb/trunk/source/Plugins/Process/POSIX/RegisterInfos_x86_64.h
Modified:
    lldb/trunk/source/Plugins/Process/Linux/ProcessMonitor.cpp
    lldb/trunk/source/Plugins/Process/POSIX/CMakeLists.txt
    lldb/trunk/source/Plugins/Process/POSIX/POSIXThread.cpp
    lldb/trunk/source/Plugins/Process/POSIX/RegisterContextFreeBSD_x86_64.cpp
    lldb/trunk/source/Plugins/Process/POSIX/RegisterContextFreeBSD_x86_64.h
    lldb/trunk/source/Plugins/Process/POSIX/RegisterContextLinux_x86_64.cpp
    lldb/trunk/source/Plugins/Process/POSIX/RegisterContextLinux_x86_64.h
    lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIX.h
    lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIXProcessMonitor_i386.cpp
    lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIXProcessMonitor_i386.h
    lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIXProcessMonitor_x86_64.cpp
    lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIX_i386.cpp
    lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIX_i386.h
    lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIX_x86_64.cpp
    lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIX_x86_64.h
    lldb/trunk/source/Plugins/Process/POSIX/RegisterContext_x86.h
    lldb/trunk/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_x86_64.cpp
    lldb/trunk/source/Plugins/Process/elf-core/ThreadElfCore.cpp
    lldb/trunk/test/functionalities/register/TestRegisters.py

Modified: lldb/trunk/source/Plugins/Process/Linux/ProcessMonitor.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Linux/ProcessMonitor.cpp?rev=192263&r1=192262&r2=192263&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Linux/ProcessMonitor.cpp (original)
+++ lldb/trunk/source/Plugins/Process/Linux/ProcessMonitor.cpp Tue Oct  8 20:28:57 2013
@@ -1983,7 +1983,8 @@ ProcessMonitor::ServeOperation(Operation
     // parent thread and start serving operations on the inferior.
     sem_post(&args->m_semaphore);
 
-    for(;;) {
+    for(;;)
+    {
         // wait for next pending operation
         sem_wait(&monitor->m_operation_pending);
 

Modified: lldb/trunk/source/Plugins/Process/POSIX/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/POSIX/CMakeLists.txt?rev=192263&r1=192262&r2=192263&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/POSIX/CMakeLists.txt (original)
+++ lldb/trunk/source/Plugins/Process/POSIX/CMakeLists.txt Tue Oct  8 20:28:57 2013
@@ -12,7 +12,9 @@ add_lldb_library(lldbPluginProcessPOSIX
   ProcessPOSIXLog.cpp
   RegisterContextPOSIX_i386.cpp
   RegisterContextPOSIX_x86_64.cpp
+  RegisterContextFreeBSD_i386.cpp
   RegisterContextFreeBSD_x86_64.cpp
+  RegisterContextLinux_i386.cpp
   RegisterContextLinux_x86_64.cpp
   RegisterContextPOSIXProcessMonitor_i386.cpp
   RegisterContextPOSIXProcessMonitor_x86_64.cpp

Modified: lldb/trunk/source/Plugins/Process/POSIX/POSIXThread.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/POSIX/POSIXThread.cpp?rev=192263&r1=192262&r2=192263&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/POSIX/POSIXThread.cpp (original)
+++ lldb/trunk/source/Plugins/Process/POSIX/POSIXThread.cpp Tue Oct  8 20:28:57 2013
@@ -32,7 +32,9 @@
 #include "RegisterContextPOSIX_i386.h"
 #include "RegisterContextPOSIXProcessMonitor_i386.h"
 #include "RegisterContextPOSIXProcessMonitor_x86_64.h"
+#include "RegisterContextLinux_i386.h"
 #include "RegisterContextLinux_x86_64.h"
+#include "RegisterContextFreeBSD_i386.h"
 #include "RegisterContextFreeBSD_x86_64.h"
 
 #include "UnwindLLDB.h"
@@ -141,8 +143,9 @@ POSIXThread::GetRegisterContext()
     {
         m_posix_thread = NULL;
 
-        ArchSpec arch = Host::GetArchitecture();
-        switch (arch.GetCore())
+        const ArchSpec &target_arch = GetProcess()->GetTarget().GetArchitecture();
+        const ArchSpec &host_arch = Host::GetArchitecture();
+        switch (host_arch.GetCore())
         {
         default:
             assert(false && "CPU type not supported!");
@@ -152,9 +155,27 @@ POSIXThread::GetRegisterContext()
         case ArchSpec::eCore_x86_32_i486:
         case ArchSpec::eCore_x86_32_i486sx:
         {
-            RegisterContextPOSIXProcessMonitor_i386 *reg_ctx = new RegisterContextPOSIXProcessMonitor_i386(*this, 0);
-            m_posix_thread = reg_ctx;
-            m_reg_context_sp.reset(reg_ctx);
+            RegisterInfoInterface *reg_interface = NULL;
+
+            switch (target_arch.GetTriple().getOS())
+            {
+                case llvm::Triple::FreeBSD:
+                    reg_interface = new RegisterContextFreeBSD_i386(target_arch);
+                    break;
+                case llvm::Triple::Linux:
+                    reg_interface = new RegisterContextLinux_i386(target_arch);
+                    break;
+                default:
+                    assert(false && "OS not supported");
+                    break;
+            }
+
+            if (reg_interface)
+            {
+                RegisterContextPOSIXProcessMonitor_i386 *reg_ctx = new RegisterContextPOSIXProcessMonitor_i386(*this, 0, reg_interface);
+                m_posix_thread = reg_ctx;
+                m_reg_context_sp.reset(reg_ctx);
+            }
             break;
         }
 
@@ -162,13 +183,13 @@ POSIXThread::GetRegisterContext()
         {
             RegisterInfoInterface *reg_interface = NULL;
 
-            switch (arch.GetTriple().getOS())
+            switch (target_arch.GetTriple().getOS())
             {
                 case llvm::Triple::FreeBSD:
-                    reg_interface = new RegisterContextFreeBSD_x86_64();
+                    reg_interface = new RegisterContextFreeBSD_x86_64(target_arch);
                     break;
                 case llvm::Triple::Linux:
-                    reg_interface = new RegisterContextLinux_x86_64();
+                    reg_interface = new RegisterContextLinux_x86_64(target_arch);
                     break;
                 default:
                     assert(false && "OS not supported");

Added: lldb/trunk/source/Plugins/Process/POSIX/RegisterContextFreeBSD_i386.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/POSIX/RegisterContextFreeBSD_i386.cpp?rev=192263&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/Process/POSIX/RegisterContextFreeBSD_i386.cpp (added)
+++ lldb/trunk/source/Plugins/Process/POSIX/RegisterContextFreeBSD_i386.cpp Tue Oct  8 20:28:57 2013
@@ -0,0 +1,78 @@
+//===-- RegisterContextFreeBSD_i386.h ----------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===---------------------------------------------------------------------===//
+
+#include "RegisterContextPOSIX_i386.h"
+#include "RegisterContextFreeBSD_i386.h"
+
+using namespace lldb_private;
+using namespace lldb;
+
+// http://svnweb.freebsd.org/base/head/sys/x86/include/reg.h
+struct GPR
+{
+    uint32_t fs;
+    uint32_t es;
+    uint32_t ds;
+    uint32_t edi;
+    uint32_t esi;
+    uint32_t ebp;
+    uint32_t isp;
+    uint32_t ebx;
+    uint32_t edx;
+    uint32_t ecx;
+    uint32_t eax;
+    uint32_t trapno;
+    uint32_t err;
+    uint32_t eip;
+    uint32_t cs;
+    uint32_t eflags;
+    uint32_t esp;
+    uint32_t ss;
+    uint32_t gs;
+};
+
+#define DR_SIZE 0
+#define DR_OFFSET(reg_index) 0
+
+//---------------------------------------------------------------------------
+// Include RegisterInfos_i386 to declare our g_register_infos_i386 structure.
+//---------------------------------------------------------------------------
+#define DECLARE_REGISTER_INFOS_I386_STRUCT
+#include "RegisterInfos_i386.h"
+#undef DECLARE_REGISTER_INFOS_I386_STRUCT
+
+RegisterContextFreeBSD_i386::RegisterContextFreeBSD_i386(const ArchSpec &target_arch) :
+    RegisterInfoInterface(target_arch)
+{
+}
+
+RegisterContextFreeBSD_i386::~RegisterContextFreeBSD_i386()
+{
+}
+
+size_t
+RegisterContextFreeBSD_i386::GetGPRSize()
+{
+    return sizeof(GPR);
+}
+
+const RegisterInfo *
+RegisterContextFreeBSD_i386::GetRegisterInfo()
+{
+    switch (m_target_arch.GetCore())
+    {
+        case ArchSpec::eCore_x86_32_i386:
+        case ArchSpec::eCore_x86_32_i486:
+        case ArchSpec::eCore_x86_32_i486sx:
+            return g_register_infos_i386;
+        default:
+            assert(false && "Unhandled target architecture.");
+            return NULL;
+    }
+}

Added: lldb/trunk/source/Plugins/Process/POSIX/RegisterContextFreeBSD_i386.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/POSIX/RegisterContextFreeBSD_i386.h?rev=192263&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/Process/POSIX/RegisterContextFreeBSD_i386.h (added)
+++ lldb/trunk/source/Plugins/Process/POSIX/RegisterContextFreeBSD_i386.h Tue Oct  8 20:28:57 2013
@@ -0,0 +1,29 @@
+//===-- RegisterContextFreeBSD_i386.h -----------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef liblldb_RegisterContextFreeBSD_i386_H_
+#define liblldb_RegisterContextFreeBSD_i386_H_
+
+#include "RegisterContextPOSIX.h"
+
+class RegisterContextFreeBSD_i386
+  : public RegisterInfoInterface
+{
+public:
+    RegisterContextFreeBSD_i386(const lldb_private::ArchSpec &target_arch);
+    virtual ~RegisterContextFreeBSD_i386();
+
+    size_t
+    GetGPRSize();
+
+    const lldb_private::RegisterInfo *
+    GetRegisterInfo();
+};
+
+#endif

Modified: lldb/trunk/source/Plugins/Process/POSIX/RegisterContextFreeBSD_x86_64.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/POSIX/RegisterContextFreeBSD_x86_64.cpp?rev=192263&r1=192262&r2=192263&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/POSIX/RegisterContextFreeBSD_x86_64.cpp (original)
+++ lldb/trunk/source/Plugins/Process/POSIX/RegisterContextFreeBSD_x86_64.cpp Tue Oct  8 20:28:57 2013
@@ -7,27 +7,16 @@
 //
 //===---------------------------------------------------------------------===//
 
+#include <vector>
+#include "RegisterContextPOSIX_i386.h"
 #include "RegisterContextPOSIX_x86_64.h"
+#include "RegisterContextFreeBSD_i386.h"
 #include "RegisterContextFreeBSD_x86_64.h"
 
 using namespace lldb_private;
+using namespace lldb;
 
-// Computes the offset of the given GPR in the user data area.
-#define GPR_OFFSET(regname)                                                 \
-    (offsetof(GPR, regname))
-
-// Update the FreeBSD specific information (offset and size).
-#define UPDATE_GPR_INFO(reg)                                                \
-do {                                                                        \
-    m_register_infos[gpr_##reg].byte_size = sizeof(GPR::reg);               \
-    m_register_infos[gpr_##reg].byte_offset = GPR_OFFSET(reg);              \
-} while(false);
-
-#define UPDATE_I386_GPR_INFO(i386_reg, reg)                                 \
-do {                                                                        \
-    m_register_infos[gpr_##i386_reg].byte_offset = GPR_OFFSET(reg);         \
-} while(false);
-
+// http://svnweb.freebsd.org/base/head/sys/x86/include/reg.h
 typedef struct _GPR
 {
     uint64_t r15;
@@ -58,7 +47,43 @@ typedef struct _GPR
     uint64_t ss;
 } GPR;
 
-RegisterContextFreeBSD_x86_64::RegisterContextFreeBSD_x86_64()
+#define DR_SIZE 0
+#define DR_OFFSET(reg_index) 0
+
+//---------------------------------------------------------------------------
+// Include RegisterInfos_x86_64 to declare our g_register_infos_x86_64 structure.
+//---------------------------------------------------------------------------
+#define DECLARE_REGISTER_INFOS_X86_64_STRUCT
+#include "RegisterInfos_x86_64.h"
+#undef DECLARE_REGISTER_INFOS_X86_64_STRUCT
+
+static const RegisterInfo *
+GetRegisterInfo_i386(const lldb_private::ArchSpec& arch)
+{
+    static std::vector<lldb_private::RegisterInfo> g_register_infos;
+
+    // Allocate RegisterInfo only once
+    if (g_register_infos.empty())
+    {
+        // Copy the register information from base class
+        std::unique_ptr<RegisterContextFreeBSD_i386> reg_interface(new RegisterContextFreeBSD_i386 (arch));
+        const RegisterInfo *base_info = reg_interface->GetRegisterInfo();
+        g_register_infos.insert(g_register_infos.end(), &base_info[0], &base_info[k_num_registers_i386]);
+
+        //---------------------------------------------------------------------------
+        // Include RegisterInfos_x86_64 to update the g_register_infos structure
+        //  with x86_64 offsets.
+        //---------------------------------------------------------------------------
+        #define UPDATE_REGISTER_INFOS_I386_STRUCT_WITH_X86_64_OFFSETS
+        #include "RegisterInfos_x86_64.h"
+        #undef UPDATE_REGISTER_INFOS_I386_STRUCT_WITH_X86_64_OFFSETS
+    }
+
+    return &g_register_infos[0];
+}
+
+RegisterContextFreeBSD_x86_64::RegisterContextFreeBSD_x86_64(const ArchSpec &target_arch) :
+    RegisterInfoInterface(target_arch)
 {
 }
 
@@ -73,56 +98,19 @@ RegisterContextFreeBSD_x86_64::GetGPRSiz
 }
 
 const RegisterInfo *
-RegisterContextFreeBSD_x86_64::GetRegisterInfo(const RegisterInfo *base_info)
+RegisterContextFreeBSD_x86_64::GetRegisterInfo()
 {
-    // Allocate RegisterInfo only once
-    if (m_register_infos.empty())
+    switch (m_target_arch.GetCore())
     {
-        // Copy the register information from base class
-        m_register_infos.insert(m_register_infos.end(), &base_info[0], &base_info[k_num_registers]);
-        // Update the FreeBSD specific register information (offset and size).
-        UpdateRegisterInfo();
+        case ArchSpec::eCore_x86_32_i386:
+        case ArchSpec::eCore_x86_32_i486:
+        case ArchSpec::eCore_x86_32_i486sx:
+            return GetRegisterInfo_i386 (m_target_arch);
+        case ArchSpec::eCore_x86_64_x86_64:
+            return g_register_infos_x86_64;
+        default:
+            assert(false && "Unhandled target architecture.");
+            return NULL;
     }
-    return &m_register_infos[0];
-}
-
-void
-RegisterContextFreeBSD_x86_64::UpdateRegisterInfo()
-{
-    UPDATE_GPR_INFO(rax);
-    UPDATE_GPR_INFO(rbx);
-    UPDATE_GPR_INFO(rcx);
-    UPDATE_GPR_INFO(rdx);
-    UPDATE_GPR_INFO(rdi);
-    UPDATE_GPR_INFO(rsi);
-    UPDATE_GPR_INFO(rbp);
-    UPDATE_GPR_INFO(rsp);
-    UPDATE_GPR_INFO(r8);
-    UPDATE_GPR_INFO(r9);
-    UPDATE_GPR_INFO(r10);
-    UPDATE_GPR_INFO(r11);
-    UPDATE_GPR_INFO(r12);
-    UPDATE_GPR_INFO(r13);
-    UPDATE_GPR_INFO(r14);
-    UPDATE_GPR_INFO(r15);
-    UPDATE_GPR_INFO(rip);
-    UPDATE_GPR_INFO(rflags);
-    UPDATE_GPR_INFO(cs);
-    UPDATE_GPR_INFO(fs);
-    UPDATE_GPR_INFO(gs);
-    UPDATE_GPR_INFO(ss);
-    UPDATE_GPR_INFO(ds);
-    UPDATE_GPR_INFO(es);
-
-    UPDATE_I386_GPR_INFO(eax, rax);
-    UPDATE_I386_GPR_INFO(ebx, rbx);
-    UPDATE_I386_GPR_INFO(ecx, rcx);
-    UPDATE_I386_GPR_INFO(edx, rdx);
-    UPDATE_I386_GPR_INFO(edi, rdi);
-    UPDATE_I386_GPR_INFO(esi, rsi);
-    UPDATE_I386_GPR_INFO(ebp, rbp);
-    UPDATE_I386_GPR_INFO(esp, rsp);
-    UPDATE_I386_GPR_INFO(eip, rip);
-    UPDATE_I386_GPR_INFO(eflags, rflags);
 }
 

Modified: lldb/trunk/source/Plugins/Process/POSIX/RegisterContextFreeBSD_x86_64.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/POSIX/RegisterContextFreeBSD_x86_64.h?rev=192263&r1=192262&r2=192263&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/POSIX/RegisterContextFreeBSD_x86_64.h (original)
+++ lldb/trunk/source/Plugins/Process/POSIX/RegisterContextFreeBSD_x86_64.h Tue Oct  8 20:28:57 2013
@@ -10,27 +10,20 @@
 #ifndef liblldb_RegisterContextFreeBSD_x86_64_H_
 #define liblldb_RegisterContextFreeBSD_x86_64_H_
 
-#include <vector>
 #include "RegisterContextPOSIX.h"
 
 class RegisterContextFreeBSD_x86_64:
     public RegisterInfoInterface
 {
 public:
-    RegisterContextFreeBSD_x86_64();
+    RegisterContextFreeBSD_x86_64(const lldb_private::ArchSpec &target_arch);
     virtual ~RegisterContextFreeBSD_x86_64();
 
     size_t
     GetGPRSize();
 
     const lldb_private::RegisterInfo *
-    GetRegisterInfo(const lldb_private::RegisterInfo *base_info);
-
-protected:
-    void
-    UpdateRegisterInfo();
-
-    std::vector<lldb_private::RegisterInfo> m_register_infos;
+    GetRegisterInfo();
 };
 
 #endif

Added: lldb/trunk/source/Plugins/Process/POSIX/RegisterContextLinux_i386.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/POSIX/RegisterContextLinux_i386.cpp?rev=192263&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/Process/POSIX/RegisterContextLinux_i386.cpp (added)
+++ lldb/trunk/source/Plugins/Process/POSIX/RegisterContextLinux_i386.cpp Tue Oct  8 20:28:57 2013
@@ -0,0 +1,96 @@
+//===-- RegisterContextLinux_i386.h ----------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===---------------------------------------------------------------------===//
+
+#include "RegisterContextPOSIX_i386.h"
+#include "RegisterContextLinux_i386.h"
+
+using namespace lldb_private;
+using namespace lldb;
+
+struct GPR
+{
+    uint32_t ebx;
+    uint32_t ecx;
+    uint32_t edx;
+    uint32_t esi;
+    uint32_t edi;
+    uint32_t ebp;
+    uint32_t eax;
+    uint32_t ds;
+    uint32_t es;
+    uint32_t fs;
+    uint32_t gs;
+    uint32_t orig_ax;
+    uint32_t eip;
+    uint32_t cs;
+    uint32_t eflags;
+    uint32_t esp;
+    uint32_t ss;
+};
+
+struct UserArea
+{
+    GPR      regs;          // General purpose registers.
+    int32_t  fpvalid;       // True if FPU is being used.
+    FXSAVE   i387;          // FPU registers.
+    uint32_t tsize;         // Text segment size.
+    uint32_t dsize;         // Data segment size.
+    uint32_t ssize;         // Stack segment size.
+    uint32_t start_code;    // VM address of text.
+    uint32_t start_stack;   // VM address of stack bottom (top in rsp).
+    int32_t  signal;        // Signal causing core dump.
+    int32_t  reserved;      // Unused.
+    uint32_t ar0;           // Location of GPR's.
+    uint32_t fpstate;       // Location of FPR's. Should be a FXSTATE *, but this
+	                        //  has to be 32-bits even on 64-bit systems.
+    uint32_t magic;         // Identifier for core dumps.
+    char     u_comm[32];    // Command causing core dump.
+    uint32_t u_debugreg[8]; // Debug registers (DR0 - DR7).
+};
+
+#define DR_SIZE sizeof(UserArea::u_debugreg[0])
+#define DR_OFFSET(reg_index) \
+    (LLVM_EXTENSION offsetof(UserArea, u_debugreg[reg_index]))
+
+//---------------------------------------------------------------------------
+// Include RegisterInfos_i386 to declare our g_register_infos_i386 structure.
+//---------------------------------------------------------------------------
+#define DECLARE_REGISTER_INFOS_I386_STRUCT
+#include "RegisterInfos_i386.h"
+#undef DECLARE_REGISTER_INFOS_I386_STRUCT
+
+RegisterContextLinux_i386::RegisterContextLinux_i386(const ArchSpec &target_arch) :
+    RegisterInfoInterface(target_arch)
+{
+}
+
+RegisterContextLinux_i386::~RegisterContextLinux_i386()
+{
+}
+
+size_t
+RegisterContextLinux_i386::GetGPRSize()
+{
+    return sizeof(GPR);
+}
+
+const RegisterInfo *
+RegisterContextLinux_i386::GetRegisterInfo()
+{
+    switch (m_target_arch.GetCore())
+    {
+        case ArchSpec::eCore_x86_32_i386:
+        case ArchSpec::eCore_x86_32_i486:
+        case ArchSpec::eCore_x86_32_i486sx:
+            return g_register_infos_i386;
+        default:
+            assert(false && "Unhandled target architecture.");
+            return NULL;
+    }
+}

Added: lldb/trunk/source/Plugins/Process/POSIX/RegisterContextLinux_i386.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/POSIX/RegisterContextLinux_i386.h?rev=192263&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/Process/POSIX/RegisterContextLinux_i386.h (added)
+++ lldb/trunk/source/Plugins/Process/POSIX/RegisterContextLinux_i386.h Tue Oct  8 20:28:57 2013
@@ -0,0 +1,29 @@
+//===-- RegisterContextLinux_i386.h -----------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef liblldb_RegisterContextLinux_i386_H_
+#define liblldb_RegisterContextLinux_i386_H_
+
+#include "RegisterContextPOSIX.h"
+
+class RegisterContextLinux_i386
+  : public RegisterInfoInterface
+{
+public:
+    RegisterContextLinux_i386(const lldb_private::ArchSpec &target_arch);
+    virtual ~RegisterContextLinux_i386();
+
+    size_t
+    GetGPRSize();
+
+    const lldb_private::RegisterInfo *
+    GetRegisterInfo();
+};
+
+#endif

Modified: lldb/trunk/source/Plugins/Process/POSIX/RegisterContextLinux_x86_64.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/POSIX/RegisterContextLinux_x86_64.cpp?rev=192263&r1=192262&r2=192263&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/POSIX/RegisterContextLinux_x86_64.cpp (original)
+++ lldb/trunk/source/Plugins/Process/POSIX/RegisterContextLinux_x86_64.cpp Tue Oct  8 20:28:57 2013
@@ -7,36 +7,14 @@
 //
 //===---------------------------------------------------------------------===//
 
-#include "llvm/Support/Compiler.h"
+#include <vector>
+#include "RegisterContextPOSIX_i386.h"
 #include "RegisterContextPOSIX_x86_64.h"
+#include "RegisterContextLinux_i386.h"
 #include "RegisterContextLinux_x86_64.h"
 
 using namespace lldb_private;
-
-// Computes the offset of the given GPR in the user data area.
-#define GPR_OFFSET(regname)                                                 \
-    (offsetof(GPR, regname))
-
-// Update the Linux specific information (offset and size).
-#define UPDATE_GPR_INFO(reg)                                                \
-do {                                                                        \
-    m_register_infos[gpr_##reg].byte_size = sizeof(GPR::reg);               \
-    m_register_infos[gpr_##reg].byte_offset = GPR_OFFSET(reg);              \
-} while(false);
-
-#define UPDATE_I386_GPR_INFO(i386_reg, reg)                                 \
-do {                                                                        \
-    m_register_infos[gpr_##i386_reg].byte_offset = GPR_OFFSET(reg);         \
-} while(false);
-
-#define DR_OFFSET(reg_index)                                                \
-    (LLVM_EXTENSION offsetof(UserArea, u_debugreg[reg_index]))
-
-#define UPDATE_DR_INFO(reg_index)                                                \
-do {                                                                             \
-    m_register_infos[dr##reg_index].byte_size = sizeof(UserArea::u_debugreg[0]); \
-    m_register_infos[dr##reg_index].byte_offset = DR_OFFSET(reg_index);          \
-} while(false);
+using namespace lldb;
 
 typedef struct _GPR
 {
@@ -69,8 +47,6 @@ typedef struct _GPR
     uint64_t gs;
 } GPR;
 
-typedef RegisterContextPOSIX_x86_64::FXSAVE FXSAVE;
-
 struct UserArea
 {
     GPR      gpr;           // General purpose registers.
@@ -94,7 +70,44 @@ struct UserArea
     uint64_t fault_address; // Control register CR3.
 };
 
-RegisterContextLinux_x86_64::RegisterContextLinux_x86_64()
+#define DR_SIZE sizeof(UserArea::u_debugreg[0])
+#define DR_OFFSET(reg_index) \
+    (LLVM_EXTENSION offsetof(UserArea, u_debugreg[reg_index]))
+
+//---------------------------------------------------------------------------
+// Include RegisterInfos_x86_64 to declare our g_register_infos_x86_64 structure.
+//---------------------------------------------------------------------------
+#define DECLARE_REGISTER_INFOS_X86_64_STRUCT
+#include "RegisterInfos_x86_64.h"
+#undef DECLARE_REGISTER_INFOS_X86_64_STRUCT
+
+static const RegisterInfo *
+GetRegisterInfo_i386(const lldb_private::ArchSpec &arch)
+{
+    static std::vector<lldb_private::RegisterInfo> g_register_infos;
+
+    // Allocate RegisterInfo only once
+    if (g_register_infos.empty())
+    {
+        // Copy the register information from base class
+        std::unique_ptr<RegisterContextLinux_i386> reg_interface(new RegisterContextLinux_i386 (arch));
+        const RegisterInfo *base_info = reg_interface->GetRegisterInfo();
+        g_register_infos.insert(g_register_infos.end(), &base_info[0], &base_info[k_num_registers_i386]);
+
+        //---------------------------------------------------------------------------
+        // Include RegisterInfos_x86_64 to update the g_register_infos structure
+        //  with x86_64 offsets.
+        //---------------------------------------------------------------------------
+        #define UPDATE_REGISTER_INFOS_I386_STRUCT_WITH_X86_64_OFFSETS
+        #include "RegisterInfos_x86_64.h"
+        #undef UPDATE_REGISTER_INFOS_I386_STRUCT_WITH_X86_64_OFFSETS
+    }
+
+    return &g_register_infos[0];
+}
+
+RegisterContextLinux_x86_64::RegisterContextLinux_x86_64(const ArchSpec &target_arch) :
+    RegisterInfoInterface(target_arch)
 {
 }
 
@@ -109,65 +122,19 @@ RegisterContextLinux_x86_64::GetGPRSize(
 }
 
 const RegisterInfo *
-RegisterContextLinux_x86_64::GetRegisterInfo(const RegisterInfo *base_info)
+RegisterContextLinux_x86_64::GetRegisterInfo()
 {
-    // Allocate RegisterInfo only once
-    if (m_register_infos.empty())
+    switch (m_target_arch.GetCore())
     {
-        // Copy the register information from base class
-        m_register_infos.insert(m_register_infos.end(), &base_info[0], &base_info[k_num_registers]);
-        // Update the Linux specific register information (offset and size).
-        UpdateRegisterInfo();
+        case ArchSpec::eCore_x86_32_i386:
+        case ArchSpec::eCore_x86_32_i486:
+        case ArchSpec::eCore_x86_32_i486sx:
+            return GetRegisterInfo_i386 (m_target_arch);
+        case ArchSpec::eCore_x86_64_x86_64:
+            return g_register_infos_x86_64;
+        default:
+            assert(false && "Unhandled target architecture.");
+            return NULL;
     }
-    return &m_register_infos[0];
-}
-
-void
-RegisterContextLinux_x86_64::UpdateRegisterInfo()
-{
-    UPDATE_GPR_INFO(rax);
-    UPDATE_GPR_INFO(rbx);
-    UPDATE_GPR_INFO(rcx);
-    UPDATE_GPR_INFO(rdx);
-    UPDATE_GPR_INFO(rdi);
-    UPDATE_GPR_INFO(rsi);
-    UPDATE_GPR_INFO(rbp);
-    UPDATE_GPR_INFO(rsp);
-    UPDATE_GPR_INFO(r8);
-    UPDATE_GPR_INFO(r9);
-    UPDATE_GPR_INFO(r10);
-    UPDATE_GPR_INFO(r11);
-    UPDATE_GPR_INFO(r12);
-    UPDATE_GPR_INFO(r13);
-    UPDATE_GPR_INFO(r14);
-    UPDATE_GPR_INFO(r15);
-    UPDATE_GPR_INFO(rip);
-    UPDATE_GPR_INFO(rflags);
-    UPDATE_GPR_INFO(cs);
-    UPDATE_GPR_INFO(fs);
-    UPDATE_GPR_INFO(gs);
-    UPDATE_GPR_INFO(ss);
-    UPDATE_GPR_INFO(ds);
-    UPDATE_GPR_INFO(es);
-
-    UPDATE_I386_GPR_INFO(eax, rax);
-    UPDATE_I386_GPR_INFO(ebx, rbx);
-    UPDATE_I386_GPR_INFO(ecx, rcx);
-    UPDATE_I386_GPR_INFO(edx, rdx);
-    UPDATE_I386_GPR_INFO(edi, rdi);
-    UPDATE_I386_GPR_INFO(esi, rsi);
-    UPDATE_I386_GPR_INFO(ebp, rbp);
-    UPDATE_I386_GPR_INFO(esp, rsp);
-    UPDATE_I386_GPR_INFO(eip, rip);
-    UPDATE_I386_GPR_INFO(eflags, rflags);
-
-    UPDATE_DR_INFO(0);
-    UPDATE_DR_INFO(1);
-    UPDATE_DR_INFO(2);
-    UPDATE_DR_INFO(3);
-    UPDATE_DR_INFO(4);
-    UPDATE_DR_INFO(5);
-    UPDATE_DR_INFO(6);
-    UPDATE_DR_INFO(7);
 }
 

Modified: lldb/trunk/source/Plugins/Process/POSIX/RegisterContextLinux_x86_64.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/POSIX/RegisterContextLinux_x86_64.h?rev=192263&r1=192262&r2=192263&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/POSIX/RegisterContextLinux_x86_64.h (original)
+++ lldb/trunk/source/Plugins/Process/POSIX/RegisterContextLinux_x86_64.h Tue Oct  8 20:28:57 2013
@@ -10,27 +10,20 @@
 #ifndef liblldb_RegisterContextLinux_x86_64_H_
 #define liblldb_RegisterContextLinux_x86_64_H_
 
-#include <vector>
 #include "RegisterContextPOSIX.h"
 
 class RegisterContextLinux_x86_64
   : public RegisterInfoInterface
 {
 public:
-    RegisterContextLinux_x86_64();
+    RegisterContextLinux_x86_64(const lldb_private::ArchSpec &target_arch);
     virtual ~RegisterContextLinux_x86_64();
 
     size_t
     GetGPRSize();
 
     const lldb_private::RegisterInfo *
-    GetRegisterInfo(const lldb_private::RegisterInfo *base_info);
-
-protected:
-    void
-    UpdateRegisterInfo();
-
-    std::vector<lldb_private::RegisterInfo> m_register_infos;
+    GetRegisterInfo();
 };
 
 #endif

Modified: lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIX.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIX.h?rev=192263&r1=192262&r2=192263&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIX.h (original)
+++ lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIX.h Tue Oct  8 20:28:57 2013
@@ -13,6 +13,7 @@
 // C Includes
 // C++ Includes
 // Other libraries and framework includes
+#include "lldb/Core/ArchSpec.h"
 #include "lldb/Target/RegisterContext.h"
 
 //------------------------------------------------------------------------------
@@ -76,13 +77,17 @@ protected:
 class RegisterInfoInterface
 {
 public:
-    virtual ~RegisterInfoInterface() {}
+    RegisterInfoInterface(const lldb_private::ArchSpec& target_arch) : m_target_arch(target_arch) {}
+    virtual ~RegisterInfoInterface () {}
 
     virtual size_t
-    GetGPRSize() = 0;
+    GetGPRSize () = 0;
 
     virtual const lldb_private::RegisterInfo *
-    GetRegisterInfo(const lldb_private::RegisterInfo *base_info) = 0;
+    GetRegisterInfo () = 0;
+
+public:
+    lldb_private::ArchSpec m_target_arch;
 };
 
 #endif // #ifndef liblldb_RegisterContextPOSIX_H_

Modified: lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIXProcessMonitor_i386.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIXProcessMonitor_i386.cpp?rev=192263&r1=192262&r2=192263&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIXProcessMonitor_i386.cpp (original)
+++ lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIXProcessMonitor_i386.cpp Tue Oct  8 20:28:57 2013
@@ -17,8 +17,9 @@ using namespace lldb_private;
 using namespace lldb;
 
 RegisterContextPOSIXProcessMonitor_i386::RegisterContextPOSIXProcessMonitor_i386(Thread &thread,
-                                                                                 uint32_t concrete_frame_idx)
-    : RegisterContextPOSIX_i386(thread, concrete_frame_idx)
+                                                                                 uint32_t concrete_frame_idx,
+                                                                                 RegisterInfoInterface *register_info)
+    : RegisterContextPOSIX_i386(thread, concrete_frame_idx, register_info)
 {
 }
 
@@ -33,30 +34,28 @@ RegisterContextPOSIXProcessMonitor_i386:
 bool
 RegisterContextPOSIXProcessMonitor_i386::ReadGPR()
 {
-    bool result;
-
-    ProcessMonitor &monitor = GetMonitor();
-    result = monitor.ReadGPR(m_thread.GetID(), &m_user.regs, sizeof(m_user.regs));
-    LogGPR("RegisterContextPOSIXProcessMonitor_i386::ReadGPR()");
-    return result;
+    assert(false);
+    return false;
 }
 
 bool
 RegisterContextPOSIXProcessMonitor_i386::ReadFPR()
 {
-    ProcessMonitor &monitor = GetMonitor();
-    return monitor.ReadFPR(m_thread.GetID(), &m_user.i387, sizeof(m_user.i387));
+    assert(false);
+    return false;
 }
 
 bool
 RegisterContextPOSIXProcessMonitor_i386::WriteGPR()
 {
+    assert(false);
     return false;
 }
 
 bool
 RegisterContextPOSIXProcessMonitor_i386::WriteFPR()
 {
+    assert(false);
     return false;
 }
 
@@ -64,17 +63,13 @@ bool
 RegisterContextPOSIXProcessMonitor_i386::ReadRegister(const RegisterInfo *reg_info,
                                                       RegisterValue &value)
 {
-    const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
-    ProcessMonitor &monitor = GetMonitor();
-    return monitor.ReadRegisterValue(m_thread.GetID(), GetRegOffset(reg),
-                                     GetRegisterName(reg), GetRegSize(reg), value);
+    assert(false);
+    return false;
 }
 
 bool RegisterContextPOSIXProcessMonitor_i386::WriteRegister(const RegisterInfo *reg_info,
                                                             const RegisterValue &value)
 {
-    const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
-    ProcessMonitor &monitor = GetMonitor();
-    return monitor.WriteRegisterValue(m_thread.GetID(), GetRegOffset(reg),
-                                      GetRegisterName(reg), value);
+    assert(false);
+    return false;        
 }

Modified: lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIXProcessMonitor_i386.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIXProcessMonitor_i386.h?rev=192263&r1=192262&r2=192263&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIXProcessMonitor_i386.h (original)
+++ lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIXProcessMonitor_i386.h Tue Oct  8 20:28:57 2013
@@ -18,7 +18,8 @@ class RegisterContextPOSIXProcessMonitor
 {
 public:
     RegisterContextPOSIXProcessMonitor_i386(lldb_private::Thread &thread,
-                                            uint32_t concrete_frame_idx);
+                                            uint32_t concrete_frame_idx,
+                                            RegisterInfoInterface *register_info);
 
 protected:
     bool

Modified: lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIXProcessMonitor_x86_64.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIXProcessMonitor_x86_64.cpp?rev=192263&r1=192262&r2=192263&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIXProcessMonitor_x86_64.cpp (original)
+++ lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIXProcessMonitor_x86_64.cpp Tue Oct  8 20:28:57 2013
@@ -10,6 +10,7 @@
 #include "lldb/Target/Thread.h"
 #include "lldb/Core/RegisterValue.h"
 
+#include "RegisterContextPOSIX_i386.h"
 #include "ProcessPOSIX.h"
 #include "RegisterContextPOSIXProcessMonitor_x86_64.h"
 #include "ProcessMonitor.h"
@@ -22,12 +23,13 @@ using namespace lldb;
   #define NT_X86_XSTATE 0x202
 #endif
 
-#define REG_CONTEXT_SIZE (GetGPRSize() + sizeof(RegisterContextPOSIX_x86_64::FPR))
+#define REG_CONTEXT_SIZE (GetGPRSize() + sizeof(FPR))
 
 static uint32_t
 size_and_rw_bits(size_t size, bool read, bool write)
 {
     uint32_t rw;
+
     if (read)
         rw = 0x3; // READ or READ/WRITE
     else if (write)
@@ -69,17 +71,17 @@ bool
 RegisterContextPOSIXProcessMonitor_x86_64::ReadGPR()
 {
      ProcessMonitor &monitor = GetMonitor();
-     return monitor.ReadGPR(m_thread.GetID(), &m_gpr, GetGPRSize());
+     return monitor.ReadGPR(m_thread.GetID(), &m_gpr_x86_64, GetGPRSize());
 }
 
 bool
 RegisterContextPOSIXProcessMonitor_x86_64::ReadFPR()
 {
     ProcessMonitor &monitor = GetMonitor();
-    if (m_fpr_type == eFXSAVE)
+    if (GetFPRType() == eFXSAVE)
         return monitor.ReadFPR(m_thread.GetID(), &m_fpr.xstate.fxsave, sizeof(m_fpr.xstate.fxsave));
 
-    if (m_fpr_type == eXSAVE)
+    if (GetFPRType() == eXSAVE)
         return monitor.ReadRegisterSet(m_thread.GetID(), &m_iovec, sizeof(m_fpr.xstate.xsave), NT_X86_XSTATE);
     return false;
 }
@@ -88,17 +90,17 @@ bool
 RegisterContextPOSIXProcessMonitor_x86_64::WriteGPR()
 {
     ProcessMonitor &monitor = GetMonitor();
-    return monitor.WriteGPR(m_thread.GetID(), &m_gpr, GetGPRSize());
+    return monitor.WriteGPR(m_thread.GetID(), &m_gpr_x86_64, GetGPRSize());
 }
 
 bool
 RegisterContextPOSIXProcessMonitor_x86_64::WriteFPR()
 {
     ProcessMonitor &monitor = GetMonitor();
-    if (m_fpr_type == eFXSAVE)
+    if (GetFPRType() == eFXSAVE)
         return monitor.WriteFPR(m_thread.GetID(), &m_fpr.xstate.fxsave, sizeof(m_fpr.xstate.fxsave));
 
-    if (m_fpr_type == eXSAVE)
+    if (GetFPRType() == eXSAVE)
         return monitor.WriteRegisterSet(m_thread.GetID(), &m_iovec, sizeof(m_fpr.xstate.xsave), NT_X86_XSTATE);
     return false;
 }
@@ -119,11 +121,54 @@ bool
 RegisterContextPOSIXProcessMonitor_x86_64::WriteRegister(const unsigned reg,
                                                          const RegisterValue &value)
 {
+    unsigned reg_to_write = reg;
+    RegisterValue value_to_write = value;
+
+    // Check if this is a subregister of a full register.
+    const RegisterInfo *reg_info = GetRegisterInfoAtIndex(reg);
+    if (reg_info->invalidate_regs && (reg_info->invalidate_regs[0] != LLDB_INVALID_REGNUM))
+    {
+        RegisterValue full_value;
+        uint32_t full_reg = reg_info->invalidate_regs[0];
+        const RegisterInfo *full_reg_info = GetRegisterInfoAtIndex(full_reg);
+
+        // Read the full register.
+        if (ReadRegister(full_reg_info, full_value))
+        {
+            Error error;
+            ByteOrder byte_order = GetByteOrder();
+            uint8_t dst[RegisterValue::kMaxRegisterByteSize];
+
+            // Get the bytes for the full register.
+            const uint32_t dest_size = full_value.GetAsMemoryData (full_reg_info, 
+                                                                   dst, 
+                                                                   sizeof(dst), 
+                                                                   byte_order, 
+                                                                   error);
+            if (error.Success() && dest_size)
+            {
+                uint8_t src[RegisterValue::kMaxRegisterByteSize];
+
+                // Get the bytes for the source data.
+                const uint32_t src_size = value.GetAsMemoryData (reg_info, src, sizeof(src), byte_order, error);
+                if (error.Success() && src_size && (src_size < dest_size))
+                {
+                    // Copy the src bytes to the destination.
+                    memcpy (dst + (reg_info->byte_offset & 0x1), src, src_size);
+                    // Set this full register as the value to write.
+                    value_to_write.SetBytes(dst, full_value.GetByteSize(), byte_order);
+                    value_to_write.SetType(full_reg_info);
+                    reg_to_write = full_reg;
+                }
+            }
+        }
+    }
+
     ProcessMonitor &monitor = GetMonitor();
     return monitor.WriteRegisterValue(m_thread.GetID(),
-                                      GetRegisterOffset(reg),
-                                      GetRegisterName(reg),
-                                      value);
+                                      GetRegisterOffset(reg_to_write),
+                                      GetRegisterName(reg_to_write),
+                                      value_to_write);
 }
 
 bool
@@ -141,12 +186,28 @@ RegisterContextPOSIXProcessMonitor_x86_6
     }
     else
     {
-        bool success = ReadRegister(reg, value);
+        uint32_t full_reg = reg;
+        bool is_subreg = reg_info->invalidate_regs && (reg_info->invalidate_regs[0] != LLDB_INVALID_REGNUM);
+
+        if (is_subreg)
+        {
+            // Read the full aligned 64-bit register.
+            full_reg = reg_info->invalidate_regs[0];
+        }
 
-        // If an i386 register should be parsed from an x86_64 register...
-        if (success && reg >= k_first_i386 && reg <= k_last_i386)
+        bool success = ReadRegister(full_reg, value);
+
+        if (success)
+        {
+            // If our read was not aligned (for ah,bh,ch,dh), shift our returned value one byte to the right.
+            if (is_subreg && (reg_info->byte_offset & 0x1))
+                value.SetUInt64(value.GetAsUInt64() >> 8);
+
+            // If our return byte size was greater than the return value reg size, then
+            // use the type specified by reg_info rather than the uint64_t default
             if (value.GetByteSize() > reg_info->byte_size)
-                value.SetType(reg_info); // ...use the type specified by reg_info rather than the uint64_t default
+                value.SetType(reg_info);
+        }
         return success; 
     }
 
@@ -156,15 +217,17 @@ RegisterContextPOSIXProcessMonitor_x86_6
 
         if (byte_order != ByteOrder::eByteOrderInvalid)
         {
-            if (reg >= fpu_stmm0 && reg <= fpu_stmm7)
-               value.SetBytes(m_fpr.xstate.fxsave.stmm[reg - fpu_stmm0].bytes, reg_info->byte_size, byte_order);
-            if (reg >= fpu_xmm0 && reg <= fpu_xmm15)
-                value.SetBytes(m_fpr.xstate.fxsave.xmm[reg - fpu_xmm0].bytes, reg_info->byte_size, byte_order);
-            if (reg >= fpu_ymm0 && reg <= fpu_ymm15)
+            if (reg >= m_reg_info.first_st && reg <= m_reg_info.last_st)
+               value.SetBytes(m_fpr.xstate.fxsave.stmm[reg - m_reg_info.first_st].bytes, reg_info->byte_size, byte_order);
+            if (reg >= m_reg_info.first_mm && reg <= m_reg_info.last_mm)
+               value.SetBytes(m_fpr.xstate.fxsave.stmm[reg - m_reg_info.first_mm].bytes, reg_info->byte_size, byte_order);
+            if (reg >= m_reg_info.first_xmm && reg <= m_reg_info.last_xmm)
+                value.SetBytes(m_fpr.xstate.fxsave.xmm[reg - m_reg_info.first_xmm].bytes, reg_info->byte_size, byte_order);
+            if (reg >= m_reg_info.first_ymm && reg <= m_reg_info.last_ymm)
             {
                 // Concatenate ymm using the register halves in xmm.bytes and ymmh.bytes
                 if (GetFPRType() == eXSAVE && CopyXSTATEtoYMM(reg, byte_order))
-                    value.SetBytes(m_ymm_set.ymm[reg - fpu_ymm0].bytes, reg_info->byte_size, byte_order);
+                    value.SetBytes(m_ymm_set.ymm[reg - m_reg_info.first_ymm].bytes, reg_info->byte_size, byte_order);
                 else
                     return false;
             }
@@ -173,95 +236,80 @@ RegisterContextPOSIXProcessMonitor_x86_6
         return false;
     }
 
-    // Note that lldb uses slightly different naming conventions from sys/user.h
-    switch (reg)
+    // Get pointer to m_fpr.xstate.fxsave variable and set the data from it.
+    assert (reg_info->byte_offset < sizeof(m_fpr));
+    uint8_t *src = (uint8_t *)&m_fpr + reg_info->byte_offset; 
+    switch (reg_info->byte_size)
     {
-    default:
-        return false;
-    case fpu_dp:
-        value = m_fpr.xstate.fxsave.dp;
-        break;
-    case fpu_fcw:
-        value = m_fpr.xstate.fxsave.fcw;
-        break;
-    case fpu_fsw:
-        value = m_fpr.xstate.fxsave.fsw;
-        break;
-    case fpu_ip:
-        value = m_fpr.xstate.fxsave.ip;
-        break;
-    case fpu_fop:
-        value = m_fpr.xstate.fxsave.fop;
-        break;
-    case fpu_ftw:
-        value = m_fpr.xstate.fxsave.ftw;
-        break;
-    case fpu_mxcsr:
-        value = m_fpr.xstate.fxsave.mxcsr;
-        break;
-    case fpu_mxcsrmask:
-        value = m_fpr.xstate.fxsave.mxcsrmask;
-        break;
+        case 2:
+            value.SetUInt16(*(uint16_t *)src);
+            return true;
+        case 4:
+            value.SetUInt32(*(uint32_t *)src);
+            return true;
+        case 8:
+            value.SetUInt64(*(uint64_t *)src);
+            return true;
+        default:
+            assert(false && "Unhandled data size.");
+            return false;
     }
-    return true;
 }
 
 bool
 RegisterContextPOSIXProcessMonitor_x86_64::WriteRegister(const RegisterInfo *reg_info, const RegisterValue &value)
 {
     const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
+
     if (IsGPR(reg))
         return WriteRegister(reg, value);
 
     if (IsFPR(reg, GetFPRType()))
     {
-        switch (reg)
+        if (reg_info->encoding == eEncodingVector)
         {
-        default:
-            if (reg_info->encoding != eEncodingVector)
-                return false;
+            if (reg >= m_reg_info.first_st && reg <= m_reg_info.last_st)
+               ::memcpy (m_fpr.xstate.fxsave.stmm[reg - m_reg_info.first_st].bytes, value.GetBytes(), value.GetByteSize());
 
-            if (reg >= fpu_stmm0 && reg <= fpu_stmm7)
-               ::memcpy (m_fpr.xstate.fxsave.stmm[reg - fpu_stmm0].bytes, value.GetBytes(), value.GetByteSize());
-            
-            if (reg >= fpu_xmm0 && reg <= fpu_xmm15)
-               ::memcpy (m_fpr.xstate.fxsave.xmm[reg - fpu_xmm0].bytes, value.GetBytes(), value.GetByteSize());
+            if (reg >= m_reg_info.first_mm && reg <= m_reg_info.last_mm)
+               ::memcpy (m_fpr.xstate.fxsave.stmm[reg - m_reg_info.first_mm].bytes, value.GetBytes(), value.GetByteSize());
+ 
+            if (reg >= m_reg_info.first_xmm && reg <= m_reg_info.last_xmm)
+               ::memcpy (m_fpr.xstate.fxsave.xmm[reg - m_reg_info.first_xmm].bytes, value.GetBytes(), value.GetByteSize());
             
-            if (reg >= fpu_ymm0 && reg <= fpu_ymm15) {
+            if (reg >= m_reg_info.first_ymm && reg <= m_reg_info.last_ymm)
+            {
                if (GetFPRType() != eXSAVE)
                    return false; // the target processor does not support AVX
 
                // Store ymm register content, and split into the register halves in xmm.bytes and ymmh.bytes
-               ::memcpy (m_ymm_set.ymm[reg - fpu_ymm0].bytes, value.GetBytes(), value.GetByteSize());
+               ::memcpy (m_ymm_set.ymm[reg - m_reg_info.first_ymm].bytes, value.GetBytes(), value.GetByteSize());
                if (false == CopyYMMtoXSTATE(reg, GetByteOrder()))
                    return false;
             }
-            break;
-        case fpu_dp:
-            m_fpr.xstate.fxsave.dp = value.GetAsUInt64();
-            break;
-        case fpu_fcw:
-            m_fpr.xstate.fxsave.fcw = value.GetAsUInt16();
-            break;
-        case fpu_fsw:
-            m_fpr.xstate.fxsave.fsw = value.GetAsUInt16();
-            break;
-        case fpu_ip:
-            m_fpr.xstate.fxsave.ip = value.GetAsUInt64();
-            break;
-        case fpu_fop:
-            m_fpr.xstate.fxsave.fop = value.GetAsUInt16();
-            break;
-        case fpu_ftw:
-            m_fpr.xstate.fxsave.ftw = value.GetAsUInt16();
-            break;
-        case fpu_mxcsr:
-            m_fpr.xstate.fxsave.mxcsr = value.GetAsUInt32();
-            break;
-        case fpu_mxcsrmask:
-            m_fpr.xstate.fxsave.mxcsrmask = value.GetAsUInt32();
-            break;
         }
+        else
+        {
+            // Get pointer to m_fpr.xstate.fxsave variable and set the data to it.
+            assert (reg_info->byte_offset < sizeof(m_fpr));
+            uint8_t *dst = (uint8_t *)&m_fpr + reg_info->byte_offset; 
+            switch (reg_info->byte_size)
+            {
+                case 2:
+                    *(uint16_t *)dst = value.GetAsUInt16();
+                    break;
+                case 4:
+                    *(uint32_t *)dst = value.GetAsUInt32();
+                    break;
+                case 8:
+                    *(uint64_t *)dst = value.GetAsUInt64();
+                    break;
+                default:
+                    assert(false && "Unhandled data size.");
+                    return false;
+            }
+        }
+
         if (WriteFPR())
         {
             if (IsAVX(reg))
@@ -284,20 +332,22 @@ RegisterContextPOSIXProcessMonitor_x86_6
 
         if (success)
         {
-            ::memcpy (dst, &m_gpr, GetGPRSize());
+            ::memcpy (dst, &m_gpr_x86_64, GetGPRSize());
             dst += GetGPRSize();
         }
         if (GetFPRType() == eFXSAVE)
             ::memcpy (dst, &m_fpr.xstate.fxsave, sizeof(m_fpr.xstate.fxsave));
         
-        if (GetFPRType() == eXSAVE) {
+        if (GetFPRType() == eXSAVE)
+        {
             ByteOrder byte_order = GetByteOrder();
 
             // Assemble the YMM register content from the register halves.
-            for (uint32_t reg = fpu_ymm0; success && reg <= fpu_ymm15; ++reg)
+            for (uint32_t reg  = m_reg_info.first_ymm; success && reg <= m_reg_info.last_ymm; ++reg)
                 success = CopyXSTATEtoYMM(reg, byte_order);
 
-            if (success) {
+            if (success)
+            {
                 // Copy the extended register state including the assembled ymm registers.
                 ::memcpy (dst, &m_fpr, sizeof(m_fpr));
             }
@@ -315,7 +365,7 @@ RegisterContextPOSIXProcessMonitor_x86_6
         uint8_t *src = data_sp->GetBytes();
         if (src)
         {
-            ::memcpy (&m_gpr, src, GetGPRSize());
+            ::memcpy (&m_gpr_x86_64, src, GetGPRSize());
 
             if (WriteGPR())
             {
@@ -335,7 +385,7 @@ RegisterContextPOSIXProcessMonitor_x86_6
                         ByteOrder byte_order = GetByteOrder();
 
                         // Parse the YMM register content from the register halves.
-                        for (uint32_t reg = fpu_ymm0; success && reg <= fpu_ymm15; ++reg)
+                        for (uint32_t reg = m_reg_info.first_ymm; success && reg <= m_reg_info.last_ymm; ++reg)
                             success = CopyYMMtoXSTATE(reg, byte_order);
                     }
                 }
@@ -370,11 +420,11 @@ RegisterContextPOSIXProcessMonitor_x86_6
     {
         RegisterValue current_dr7_bits;
 
-        if (ReadRegister(dr7, current_dr7_bits))
+        if (ReadRegister(m_reg_info.first_dr + 7, current_dr7_bits))
         {
             uint64_t new_dr7_bits = current_dr7_bits.GetAsUInt64() & ~(3 << (2*hw_index));
 
-            if (WriteRegister(dr7, RegisterValue(new_dr7_bits)))
+            if (WriteRegister(m_reg_info.first_dr + 7, RegisterValue(new_dr7_bits)))
                 return true;
         }
     }
@@ -388,7 +438,7 @@ RegisterContextPOSIXProcessMonitor_x86_6
     enum { TRACE_BIT = 0x100 };
     uint64_t rflags;
 
-    if ((rflags = ReadRegisterAsUnsigned(gpr_rflags, -1UL)) == -1UL)
+    if ((rflags = ReadRegisterAsUnsigned(m_reg_info.gpr_flags, -1UL)) == -1UL)
         return false;
     
     if (enable)
@@ -406,7 +456,7 @@ RegisterContextPOSIXProcessMonitor_x86_6
         rflags &= ~TRACE_BIT;
     }
 
-    return WriteRegisterFromUnsigned(gpr_rflags, rflags);
+    return WriteRegisterFromUnsigned(m_reg_info.gpr_flags, rflags);
 }
 
 bool
@@ -426,12 +476,12 @@ unsigned
 RegisterContextPOSIXProcessMonitor_x86_64::GetRegisterIndexFromOffset(unsigned offset)
 {
     unsigned reg;
-    for (reg = 0; reg < k_num_registers; reg++)
+    for (reg = 0; reg < m_reg_info.num_registers; reg++)
     {
         if (GetRegisterInfo()[reg].byte_offset == offset)
             break;
     }
-    assert(reg < k_num_registers && "Invalid register offset.");
+    assert(reg < m_reg_info.num_registers && "Invalid register offset.");
     return reg;
 }
 
@@ -444,7 +494,7 @@ RegisterContextPOSIXProcessMonitor_x86_6
     {    
         // Reset the debug status and debug control registers
         RegisterValue zero_bits = RegisterValue(uint64_t(0));
-        if (!WriteRegister(dr6, zero_bits) || !WriteRegister(dr7, zero_bits))
+        if (!WriteRegister(m_reg_info.first_dr + 6, zero_bits) || !WriteRegister(m_reg_info.first_dr + 7, zero_bits))
             assert(false && "Could not initialize watchpoint registers");
         m_watchpoints_initialized = true;
     }    
@@ -453,7 +503,7 @@ RegisterContextPOSIXProcessMonitor_x86_6
     {    
         RegisterValue value;
 
-        if (ReadRegister(dr6, value))
+        if (ReadRegister(m_reg_info.first_dr + 6, value))
         {    
             uint64_t val = value.GetAsUInt64();
             is_hit = val & (1 << hw_index);
@@ -466,7 +516,7 @@ RegisterContextPOSIXProcessMonitor_x86_6
 bool
 RegisterContextPOSIXProcessMonitor_x86_64::ClearWatchpointHits()
 {
-    return WriteRegister(dr6, RegisterValue((uint64_t)0));
+    return WriteRegister(m_reg_info.first_dr + 6, RegisterValue((uint64_t)0));
 }
 
 addr_t
@@ -480,7 +530,7 @@ RegisterContextPOSIXProcessMonitor_x86_6
         {
             RegisterValue value;
 
-            if (ReadRegister(dr0 + hw_index, value))
+            if (ReadRegister(m_reg_info.first_dr + hw_index, value))
                 wp_monitor_addr = value.GetAsUInt64();
         }
     }
@@ -500,12 +550,12 @@ RegisterContextPOSIXProcessMonitor_x86_6
     {
         // Reset the debug status and debug control registers
         RegisterValue zero_bits = RegisterValue(uint64_t(0));
-        if (!WriteRegister(dr6, zero_bits) || !WriteRegister(dr7, zero_bits))
+        if (!WriteRegister(m_reg_info.first_dr + 6, zero_bits) || !WriteRegister(m_reg_info.first_dr + 7, zero_bits))
             assert(false && "Could not initialize watchpoint registers");
         m_watchpoints_initialized = true;
     }
 
-    if (ReadRegister(dr7, value))
+    if (ReadRegister(m_reg_info.first_dr + 7, value))
     {
         uint64_t val = value.GetAsUInt64();
         is_vacant = (val & (3 << 2*hw_index)) == 0;
@@ -535,7 +585,7 @@ RegisterContextPOSIXProcessMonitor_x86_6
 
     // Set both dr7 (debug control register) and dri (debug address register).
 
-    // dr7{7-0} encodes the local/gloabl enable bits:
+    // dr7{7-0} encodes the local/global enable bits:
     //  global enable --. .-- local enable
     //                  | |
     //                  v v
@@ -560,15 +610,15 @@ RegisterContextPOSIXProcessMonitor_x86_6
     {
         RegisterValue current_dr7_bits;
 
-        if (ReadRegister(dr7, current_dr7_bits))
+        if (ReadRegister(m_reg_info.first_dr + 7, current_dr7_bits))
         {
             uint64_t new_dr7_bits = current_dr7_bits.GetAsUInt64() |
                                     (1 << (2*hw_index) |
                                     size_and_rw_bits(size, read, write) <<
                                     (16+4*hw_index));
 
-            if (WriteRegister(dr0 + hw_index, RegisterValue(addr)) &&
-                WriteRegister(dr7, RegisterValue(new_dr7_bits)))
+            if (WriteRegister(m_reg_info.first_dr + hw_index, RegisterValue(addr)) &&
+                WriteRegister(m_reg_info.first_dr + 7, RegisterValue(new_dr7_bits)))
                 return true;
         }
     }
@@ -582,3 +632,4 @@ RegisterContextPOSIXProcessMonitor_x86_6
     // Available debug address registers: dr0, dr1, dr2, dr3
     return 4;
 }
+

Modified: lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIX_i386.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIX_i386.cpp?rev=192263&r1=192262&r2=192263&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIX_i386.cpp (original)
+++ lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIX_i386.cpp Tue Oct  8 20:28:57 2013
@@ -21,274 +21,203 @@
 using namespace lldb_private;
 using namespace lldb;
 
-enum
+const uint32_t
+RegisterContextPOSIX_i386::g_gpr_regnums[] =
 {
-    k_first_gpr,
-    gpr_eax = k_first_gpr,
-    gpr_ebx,
-    gpr_ecx,
-    gpr_edx,
-    gpr_edi,
-    gpr_esi,
-    gpr_ebp,
-    gpr_esp,
-    gpr_ss,
-    gpr_eflags,
-#ifdef __FreeBSD__
-    gpr_orig_ax,
-#endif
-    gpr_eip,
-    gpr_cs,
-    gpr_ds,
-    gpr_es,
-    gpr_fs,
-    gpr_gs,
-    k_last_gpr = gpr_gs,
-
-    k_first_fpr,
-    fpu_fcw = k_first_fpr,
-    fpu_fsw,
-    fpu_ftw,
-    fpu_fop,
-    fpu_ip,
-    fpu_cs,
-    fpu_foo,
-    fpu_fos,
-    fpu_mxcsr,
-    fpu_stmm0,
-    fpu_stmm1,
-    fpu_stmm2,
-    fpu_stmm3,
-    fpu_stmm4,
-    fpu_stmm5,
-    fpu_stmm6,
-    fpu_stmm7,
-    fpu_xmm0,
-    fpu_xmm1,
-    fpu_xmm2,
-    fpu_xmm3,
-    fpu_xmm4,
-    fpu_xmm5,
-    fpu_xmm6,
-    fpu_xmm7,
-    k_last_fpr = fpu_xmm7,
-
-    k_num_registers,
-    k_num_gpr_registers = k_last_gpr - k_first_gpr + 1,
-    k_num_fpu_registers = k_last_fpr - k_first_fpr + 1
+    gpr_eax_i386,
+    gpr_ebx_i386,
+    gpr_ecx_i386,
+    gpr_edx_i386,
+    gpr_edi_i386,
+    gpr_esi_i386,
+    gpr_ebp_i386,
+    gpr_esp_i386,
+    gpr_eip_i386,
+    gpr_eflags_i386,
+    gpr_cs_i386,
+    gpr_fs_i386,
+    gpr_gs_i386,
+    gpr_ss_i386,
+    gpr_ds_i386,
+    gpr_es_i386,
+    gpr_ax_i386,
+    gpr_bx_i386,
+    gpr_cx_i386,
+    gpr_dx_i386,
+    gpr_di_i386,
+    gpr_si_i386,
+    gpr_bp_i386,
+    gpr_sp_i386,
+    gpr_ah_i386,
+    gpr_bh_i386,
+    gpr_ch_i386,
+    gpr_dh_i386,
+    gpr_al_i386,
+    gpr_bl_i386,
+    gpr_cl_i386,
+    gpr_dl_i386
 };
+static_assert((sizeof(RegisterContextPOSIX_i386::g_gpr_regnums) / sizeof(RegisterContextPOSIX_i386::g_gpr_regnums[0])) == k_num_gpr_registers_i386,
+    "g_gpr_regnums has wrong number of register infos");
 
-// Number of register sets provided by this context.
-enum
+const uint32_t
+RegisterContextPOSIX_i386::g_fpu_regnums[] =
 {
-    k_num_register_sets = 2
+    fpu_fctrl_i386,
+    fpu_fstat_i386,
+    fpu_ftag_i386,
+    fpu_fop_i386,
+    fpu_fiseg_i386,
+    fpu_fioff_i386,
+    fpu_foseg_i386,
+    fpu_fooff_i386,
+    fpu_mxcsr_i386,
+    fpu_mxcsrmask_i386,
+    fpu_st0_i386,
+    fpu_st1_i386,
+    fpu_st2_i386,
+    fpu_st3_i386,
+    fpu_st4_i386,
+    fpu_st5_i386,
+    fpu_st6_i386,
+    fpu_st7_i386,
+    fpu_mm0_i386,
+    fpu_mm1_i386,
+    fpu_mm2_i386,
+    fpu_mm3_i386,
+    fpu_mm4_i386,
+    fpu_mm5_i386,
+    fpu_mm6_i386,
+    fpu_mm7_i386,
+    fpu_xmm0_i386,
+    fpu_xmm1_i386,
+    fpu_xmm2_i386,
+    fpu_xmm3_i386,
+    fpu_xmm4_i386,
+    fpu_xmm5_i386,
+    fpu_xmm6_i386,
+    fpu_xmm7_i386
 };
+static_assert((sizeof(RegisterContextPOSIX_i386::g_fpu_regnums) / sizeof(RegisterContextPOSIX_i386::g_fpu_regnums[0])) == k_num_fpr_registers_i386,
+    "g_gpr_regnums has wrong number of register infos");
 
-static const
-uint32_t g_gpr_regnums[k_num_gpr_registers] =
+const uint32_t
+RegisterContextPOSIX_i386::g_avx_regnums[] =
 {
-    gpr_eax,
-    gpr_ebx,
-    gpr_ecx,
-    gpr_edx,
-    gpr_edi,
-    gpr_esi,
-    gpr_ebp,
-    gpr_esp,
-    gpr_ss,
-    gpr_eflags,
-#ifdef __FreeBSD__
-    gpr_orig_ax,
-#endif
-    gpr_eip,
-    gpr_cs,
-    gpr_ds,
-    gpr_es,
-    gpr_fs,
-    gpr_gs,
+    fpu_ymm0_i386,
+    fpu_ymm1_i386,
+    fpu_ymm2_i386,
+    fpu_ymm3_i386,
+    fpu_ymm4_i386,
+    fpu_ymm5_i386,
+    fpu_ymm6_i386,
+    fpu_ymm7_i386
 };
+static_assert((sizeof(RegisterContextPOSIX_i386::g_avx_regnums) / sizeof(RegisterContextPOSIX_i386::g_avx_regnums[0])) == k_num_avx_registers_i386,
+    "g_gpr_regnums has wrong number of register infos");
+
+uint32_t RegisterContextPOSIX_i386::g_contained_eax[] = { gpr_eax_i386, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_i386::g_contained_ebx[] = { gpr_ebx_i386, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_i386::g_contained_ecx[] = { gpr_ecx_i386, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_i386::g_contained_edx[] = { gpr_edx_i386, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_i386::g_contained_edi[] = { gpr_edi_i386, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_i386::g_contained_esi[] = { gpr_esi_i386, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_i386::g_contained_ebp[] = { gpr_ebp_i386, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_i386::g_contained_esp[] = { gpr_esp_i386, LLDB_INVALID_REGNUM };
+
+uint32_t RegisterContextPOSIX_i386::g_invalidate_eax[] = { gpr_eax_i386, gpr_ax_i386, gpr_ah_i386,  gpr_al_i386, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_i386::g_invalidate_ebx[] = { gpr_ebx_i386, gpr_bx_i386, gpr_bh_i386,  gpr_bl_i386, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_i386::g_invalidate_ecx[] = { gpr_ecx_i386, gpr_cx_i386, gpr_ch_i386,  gpr_cl_i386, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_i386::g_invalidate_edx[] = { gpr_edx_i386, gpr_dx_i386, gpr_dh_i386,  gpr_dl_i386, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_i386::g_invalidate_edi[] = { gpr_edi_i386, gpr_di_i386, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_i386::g_invalidate_esi[] = { gpr_esi_i386, gpr_si_i386, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_i386::g_invalidate_ebp[] = { gpr_ebp_i386, gpr_bp_i386, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_i386::g_invalidate_esp[] = { gpr_esp_i386, gpr_sp_i386, LLDB_INVALID_REGNUM };
 
-static const uint32_t
-g_fpu_regnums[k_num_fpu_registers] =
+// Number of register sets provided by this context.
+enum
 {
-    fpu_fcw,
-    fpu_fsw,
-    fpu_ftw,
-    fpu_fop,
-    fpu_ip,
-    fpu_cs,
-    fpu_foo,
-    fpu_fos,
-    fpu_mxcsr,
-    fpu_stmm0,
-    fpu_stmm1,
-    fpu_stmm2,
-    fpu_stmm3,
-    fpu_stmm4,
-    fpu_stmm5,
-    fpu_stmm6,
-    fpu_stmm7,
-    fpu_xmm0,
-    fpu_xmm1,
-    fpu_xmm2,
-    fpu_xmm3,
-    fpu_xmm4,
-    fpu_xmm5,
-    fpu_xmm6,
-    fpu_xmm7,
+    k_num_extended_register_sets = 1,
+    k_num_register_sets = 3
 };
 
 static const RegisterSet
 g_reg_sets[k_num_register_sets] =
 {
-    { "General Purpose Registers", "gpr", k_num_gpr_registers, g_gpr_regnums },
-    { "Floating Point Registers",  "fpu", k_num_fpu_registers, g_fpu_regnums }
+    { "General Purpose Registers",  "gpr", k_num_gpr_registers_i386, RegisterContextPOSIX_i386::g_gpr_regnums },
+    { "Floating Point Registers",   "fpu", k_num_fpr_registers_i386, RegisterContextPOSIX_i386::g_fpu_regnums },
+    { "Advanced Vector Extensions", "avx", k_num_avx_registers_i386, RegisterContextPOSIX_i386::g_avx_regnums }
 };
 
-// Computes the offset of the given GPR in the user data area.
-#define GPR_OFFSET(regname) \
-    (offsetof(RegisterContextPOSIX_i386::UserArea, regs) + \
-     offsetof(RegisterContextPOSIX_i386::GPR, regname))
-
-// Computes the offset of the given FPR in the user data area.
-#define FPR_OFFSET(regname) \
-    (offsetof(RegisterContextPOSIX_i386::UserArea, i387) + \
-     offsetof(RegisterContextPOSIX_i386::FPU, regname))
-
-// Number of bytes needed to represent a GPR.
-#define GPR_SIZE(reg) sizeof(((RegisterContextPOSIX_i386::GPR*)NULL)->reg)
-
-// Number of bytes needed to represent a FPR.
-#define FPR_SIZE(reg) sizeof(((RegisterContextPOSIX_i386::FPU*)NULL)->reg)
-
-// Number of bytes needed to represent the i'th FP register.
-#define FP_SIZE sizeof(((RegisterContextPOSIX_i386::MMSReg*)NULL)->bytes)
-
-// Number of bytes needed to represent an XMM register.
-#define XMM_SIZE sizeof(RegisterContextPOSIX_i386::XMMReg)
-
-#define DEFINE_GPR(reg, alt, kind1, kind2, kind3, kind4)        \
-    { #reg, alt, GPR_SIZE(reg), GPR_OFFSET(reg), eEncodingUint, \
-      eFormatHex, { kind1, kind2, kind3, kind4, gpr_##reg }, NULL, NULL }
-
-#define DEFINE_FPR(reg, kind1, kind2, kind3, kind4)              \
-    { #reg, NULL, FPR_SIZE(reg), FPR_OFFSET(reg), eEncodingUint, \
-      eFormatHex, { kind1, kind2, kind3, kind4, fpu_##reg }, NULL, NULL }
-
-#define DEFINE_FP(reg, i)                                          \
-    { #reg#i, NULL, FP_SIZE, LLVM_EXTENSION FPR_OFFSET(reg[i]),    \
-      eEncodingVector, eFormatVectorOfUInt8,                       \
-      { dwarf_##reg##i, dwarf_##reg##i,                            \
-        LLDB_INVALID_REGNUM, gdb_##reg##i, fpu_##reg##i }, NULL, NULL }
-
-#define DEFINE_XMM(reg, i)                                         \
-    { #reg#i, NULL, XMM_SIZE, LLVM_EXTENSION FPR_OFFSET(reg[i]),   \
-       eEncodingVector, eFormatVectorOfUInt8,                      \
-      { dwarf_##reg##i, dwarf_##reg##i,                            \
-        LLDB_INVALID_REGNUM, gdb_##reg##i, fpu_##reg##i }, NULL, NULL }
-
-static RegisterInfo
-g_register_infos[k_num_registers] =
-{
-    // General purpose registers.
-    DEFINE_GPR(eax,    NULL,    gcc_eax,    dwarf_eax,    LLDB_INVALID_REGNUM,    gdb_eax),
-    DEFINE_GPR(ebx,    NULL,    gcc_ebx,    dwarf_ebx,    LLDB_INVALID_REGNUM,    gdb_ebx),
-    DEFINE_GPR(ecx,    NULL,    gcc_ecx,    dwarf_ecx,    LLDB_INVALID_REGNUM,    gdb_ecx),
-    DEFINE_GPR(edx,    NULL,    gcc_edx,    dwarf_edx,    LLDB_INVALID_REGNUM,    gdb_edx),
-    DEFINE_GPR(edi,    NULL,    gcc_edi,    dwarf_edi,    LLDB_INVALID_REGNUM,    gdb_edi),
-    DEFINE_GPR(esi,    NULL,    gcc_esi,    dwarf_esi,    LLDB_INVALID_REGNUM,    gdb_esi),
-    DEFINE_GPR(ebp,    "fp",    gcc_ebp,    dwarf_ebp,    LLDB_INVALID_REGNUM,    gdb_ebp),
-    DEFINE_GPR(esp,    "sp",    gcc_esp,    dwarf_esp,    LLDB_INVALID_REGNUM,    gdb_esp),
-    DEFINE_GPR(ss,     NULL,    LLDB_INVALID_REGNUM,     LLDB_INVALID_REGNUM,     LLDB_INVALID_REGNUM,    gdb_ss),
-    DEFINE_GPR(eflags, "flags", gcc_eflags, dwarf_eflags, LLDB_INVALID_REGNUM,    gdb_eflags),
-    DEFINE_GPR(eip,    "pc",    gcc_eip,    dwarf_eip,    LLDB_INVALID_REGNUM,    gdb_eip),
-    DEFINE_GPR(cs,     NULL,    LLDB_INVALID_REGNUM,     LLDB_INVALID_REGNUM,     LLDB_INVALID_REGNUM,    gdb_cs),
-    DEFINE_GPR(ds,     NULL,    LLDB_INVALID_REGNUM,     LLDB_INVALID_REGNUM,     LLDB_INVALID_REGNUM,    gdb_ds),
-    DEFINE_GPR(es,     NULL,    LLDB_INVALID_REGNUM,     LLDB_INVALID_REGNUM,     LLDB_INVALID_REGNUM,    gdb_es),
-    DEFINE_GPR(fs,     NULL,    LLDB_INVALID_REGNUM,     LLDB_INVALID_REGNUM,     LLDB_INVALID_REGNUM,    gdb_fs),
-    DEFINE_GPR(gs,     NULL,    LLDB_INVALID_REGNUM,     LLDB_INVALID_REGNUM,     LLDB_INVALID_REGNUM,    gdb_gs),
-
-    // Floating point registers.
-    DEFINE_FPR(fcw,       LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_fcw),
-    DEFINE_FPR(fsw,       LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_fsw),
-    DEFINE_FPR(ftw,       LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_ftw),
-    DEFINE_FPR(fop,       LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_fop),
-    DEFINE_FPR(ip,        LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_ip),
-    DEFINE_FPR(cs,        LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_fpu_cs),
-    DEFINE_FPR(foo,       LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_dp),
-    DEFINE_FPR(fos,       LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_fpu_ds),
-    DEFINE_FPR(mxcsr,     LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_mxcsr),
-
-    DEFINE_FP(stmm, 0),
-    DEFINE_FP(stmm, 1),
-    DEFINE_FP(stmm, 2),
-    DEFINE_FP(stmm, 3),
-    DEFINE_FP(stmm, 4),
-    DEFINE_FP(stmm, 5),
-    DEFINE_FP(stmm, 6),
-    DEFINE_FP(stmm, 7),
-
-    // XMM registers
-    DEFINE_XMM(xmm, 0),
-    DEFINE_XMM(xmm, 1),
-    DEFINE_XMM(xmm, 2),
-    DEFINE_XMM(xmm, 3),
-    DEFINE_XMM(xmm, 4),
-    DEFINE_XMM(xmm, 5),
-    DEFINE_XMM(xmm, 6),
-    DEFINE_XMM(xmm, 7),
 
-};
+RegisterContextPOSIX_i386::RegisterContextPOSIX_i386(Thread &thread,
+                                                     uint32_t concrete_frame_idx,
+                                                     RegisterInfoInterface *register_info)
+    : RegisterContext(thread, concrete_frame_idx)
+{
+    m_register_info_ap.reset(register_info);
+}
 
-#ifndef NDEBUG
-static size_t k_num_register_infos = (sizeof(g_register_infos)/sizeof(RegisterInfo));
-#endif
+RegisterContextPOSIX_i386::~RegisterContextPOSIX_i386()
+{
+}
 
-unsigned RegisterContextPOSIX_i386::GetRegOffset(unsigned reg)
+RegisterContextPOSIX_i386::FPRType RegisterContextPOSIX_i386::GetFPRType()
 {
-    assert(reg < k_num_registers && "Invalid register number.");
-    return g_register_infos[reg].byte_offset;
+    if (m_fpr_type == eNotValid)
+    {
+        // TODO: Use assembly to call cpuid on the inferior and query ebx or ecx
+        m_fpr_type = eXSAVE; // extended floating-point registers, if available
+        if (false == ReadFPR())
+            m_fpr_type = eFXSAVE; // assume generic floating-point registers
+    }
+    return m_fpr_type;
 }
 
-unsigned RegisterContextPOSIX_i386::GetRegSize(unsigned reg)
+void
+RegisterContextPOSIX_i386::Invalidate()
 {
-    assert(reg < k_num_registers && "Invalid register number.");
-    return g_register_infos[reg].byte_size;
 }
 
-RegisterContextPOSIX_i386::RegisterContextPOSIX_i386(Thread &thread,
-                                                     uint32_t concrete_frame_idx)
-    : RegisterContext(thread, concrete_frame_idx)
+void
+RegisterContextPOSIX_i386::InvalidateAllRegisters()
 {
 }
 
-RegisterContextPOSIX_i386::~RegisterContextPOSIX_i386()
+unsigned RegisterContextPOSIX_i386::GetRegisterOffset(unsigned reg)
 {
+    assert(reg < k_num_registers_i386 && "Invalid register number.");
+    return GetRegisterInfo()[reg].byte_offset;
 }
 
-void
-RegisterContextPOSIX_i386::Invalidate()
+unsigned RegisterContextPOSIX_i386::GetRegisterSize(unsigned reg)
 {
+    assert(reg < k_num_registers_i386 && "Invalid register number.");
+    return GetRegisterInfo()[reg].byte_size;
 }
 
-void
-RegisterContextPOSIX_i386::InvalidateAllRegisters()
+const RegisterInfo *
+RegisterContextPOSIX_i386::GetRegisterInfo()
 {
+    // Commonly, this method is overridden and g_register_infos is copied and specialized.
+    // So, use GetRegisterInfo() rather than g_register_infos in this scope.
+    return m_register_info_ap->GetRegisterInfo ();
 }
 
 size_t
 RegisterContextPOSIX_i386::GetRegisterCount()
 {
-    assert(k_num_register_infos == k_num_registers);
-    return k_num_registers;
+    size_t num_registers = k_num_gpr_registers_i386 + k_num_fpr_registers_i386;
+    if (GetFPRType() == eXSAVE)
+      return num_registers + k_num_avx_registers_i386;
+    return num_registers;
 }
 
 const RegisterInfo *
 RegisterContextPOSIX_i386::GetRegisterInfoAtIndex(size_t reg)
 {
-    assert(k_num_register_infos == k_num_registers);
-    if (reg < k_num_registers)
-        return &g_register_infos[reg];
+    if (reg < k_num_registers_i386)
+        return &GetRegisterInfo()[reg];
     else
         return NULL;
 }
@@ -308,24 +237,11 @@ RegisterContextPOSIX_i386::GetRegisterSe
         return NULL;
 }
 
-unsigned
-RegisterContextPOSIX_i386::GetRegisterIndexFromOffset(unsigned offset)
-{
-    unsigned reg;
-    for (reg = 0; reg < k_num_registers; reg++)
-    {
-        if (g_register_infos[reg].byte_offset == offset)
-            break;
-    }
-    assert(reg < k_num_registers && "Invalid register offset.");
-    return reg;
-}
-
 const char *
 RegisterContextPOSIX_i386::GetRegisterName(unsigned reg)
 {
-    assert(reg < k_num_registers && "Invalid register offset.");
-    return g_register_infos[reg].name;
+    assert(reg < k_num_registers_i386 && "Invalid register offset.");
+    return GetRegisterInfo()[reg].name;
 }
 
 bool
@@ -357,150 +273,23 @@ uint32_t
 RegisterContextPOSIX_i386::ConvertRegisterKindToRegisterNumber(uint32_t kind,
                                                                uint32_t num)
 {
-    if (kind == eRegisterKindGeneric)
-    {
-        switch (num)
-        {
-        case LLDB_REGNUM_GENERIC_PC:    return gpr_eip;
-        case LLDB_REGNUM_GENERIC_SP:    return gpr_esp;
-        case LLDB_REGNUM_GENERIC_FP:    return gpr_ebp;
-        case LLDB_REGNUM_GENERIC_FLAGS: return gpr_eflags;
-        case LLDB_REGNUM_GENERIC_RA:
-        default:
-            return LLDB_INVALID_REGNUM;
-        }
-    }
+    const uint32_t num_regs = GetRegisterCount();
 
-    if (kind == eRegisterKindGCC || kind == eRegisterKindDWARF)
+    assert (kind < kNumRegisterKinds);
+    for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx)
     {
-        switch (num)
-        {
-        case dwarf_eax:  return gpr_eax;
-        case dwarf_edx:  return gpr_edx;
-        case dwarf_ecx:  return gpr_ecx;
-        case dwarf_ebx:  return gpr_ebx;
-        case dwarf_esi:  return gpr_esi;
-        case dwarf_edi:  return gpr_edi;
-        case dwarf_ebp:  return gpr_ebp;
-        case dwarf_esp:  return gpr_esp;
-        case dwarf_eip:  return gpr_eip;
-        case dwarf_xmm0: return fpu_xmm0;
-        case dwarf_xmm1: return fpu_xmm1;
-        case dwarf_xmm2: return fpu_xmm2;
-        case dwarf_xmm3: return fpu_xmm3;
-        case dwarf_xmm4: return fpu_xmm4;
-        case dwarf_xmm5: return fpu_xmm5;
-        case dwarf_xmm6: return fpu_xmm6;
-        case dwarf_xmm7: return fpu_xmm7;
-        case dwarf_stmm0: return fpu_stmm0;
-        case dwarf_stmm1: return fpu_stmm1;
-        case dwarf_stmm2: return fpu_stmm2;
-        case dwarf_stmm3: return fpu_stmm3;
-        case dwarf_stmm4: return fpu_stmm4;
-        case dwarf_stmm5: return fpu_stmm5;
-        case dwarf_stmm6: return fpu_stmm6;
-        case dwarf_stmm7: return fpu_stmm7;
-        default:
-            return LLDB_INVALID_REGNUM;
-        }
-    }
+        const RegisterInfo *reg_info = GetRegisterInfoAtIndex (reg_idx);
 
-    if (kind == eRegisterKindGDB)
-    {
-        switch (num)
-        {
-        case gdb_eax     : return gpr_eax;
-        case gdb_ebx     : return gpr_ebx;
-        case gdb_ecx     : return gpr_ecx;
-        case gdb_edx     : return gpr_edx;
-        case gdb_esi     : return gpr_esi;
-        case gdb_edi     : return gpr_edi;
-        case gdb_ebp     : return gpr_ebp;
-        case gdb_esp     : return gpr_esp;
-        case gdb_eip     : return gpr_eip;
-        case gdb_eflags  : return gpr_eflags;
-        case gdb_cs      : return gpr_cs;
-        case gdb_ss      : return gpr_ss;
-        case gdb_ds      : return gpr_ds;
-        case gdb_es      : return gpr_es;
-        case gdb_fs      : return gpr_fs;
-        case gdb_gs      : return gpr_gs;
-        case gdb_stmm0   : return fpu_stmm0;
-        case gdb_stmm1   : return fpu_stmm1;
-        case gdb_stmm2   : return fpu_stmm2;
-        case gdb_stmm3   : return fpu_stmm3;
-        case gdb_stmm4   : return fpu_stmm4;
-        case gdb_stmm5   : return fpu_stmm5;
-        case gdb_stmm6   : return fpu_stmm6;
-        case gdb_stmm7   : return fpu_stmm7;
-        case gdb_fcw     : return fpu_fcw;
-        case gdb_fsw     : return fpu_fsw;
-        case gdb_ftw     : return fpu_ftw;
-        case gdb_fpu_cs  : return fpu_cs;
-        case gdb_ip      : return fpu_ip;
-        case gdb_fpu_ds  : return fpu_fos;
-        case gdb_dp      : return fpu_foo;
-        case gdb_fop     : return fpu_fop;
-        case gdb_xmm0    : return fpu_xmm0;
-        case gdb_xmm1    : return fpu_xmm1;
-        case gdb_xmm2    : return fpu_xmm2;
-        case gdb_xmm3    : return fpu_xmm3;
-        case gdb_xmm4    : return fpu_xmm4;
-        case gdb_xmm5    : return fpu_xmm5;
-        case gdb_xmm6    : return fpu_xmm6;
-        case gdb_xmm7    : return fpu_xmm7;
-        case gdb_mxcsr   : return fpu_mxcsr;
-        default:
-            return LLDB_INVALID_REGNUM;
-        }
-    }
-    else if (kind == eRegisterKindLLDB)
-    {
-        return num;
+        if (reg_info->kinds[kind] == num)
+            return reg_idx;
     }
 
     return LLDB_INVALID_REGNUM;
+
 }
 
 bool
 RegisterContextPOSIX_i386::HardwareSingleStep(bool enable)
 {
-    enum { TRACE_BIT = 0x100 };
-    uint64_t eflags;
-
-    if ((eflags = ReadRegisterAsUnsigned(gpr_eflags, -1UL)) == -1UL)
-        return false;
-
-    if (enable)
-    {
-        if (eflags & TRACE_BIT)
-            return true;
-
-        eflags |= TRACE_BIT;
-    }
-    else
-    {
-        if (!(eflags & TRACE_BIT))
-            return false;
-
-        eflags &= ~TRACE_BIT;
-    }
-
-    return WriteRegisterFromUnsigned(gpr_eflags, eflags);
-}
-
-void
-RegisterContextPOSIX_i386::LogGPR(const char *title)
-{
-    Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_REGISTERS));
-    if (log)
-    {
-        if (title)
-            log->Printf ("%s", title);
-        for (uint32_t i=0; i<k_num_gpr_registers; i++)
-        {
-            uint32_t reg = gpr_eax + i;
-            log->Printf("%12s = 0x%8.8" PRIx64, g_register_infos[reg].name, ((uint64_t*)&m_user.regs)[reg]);
-        }
-    }
+    return false;
 }

Modified: lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIX_i386.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIX_i386.h?rev=192263&r1=192262&r2=192263&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIX_i386.h (original)
+++ lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIX_i386.h Tue Oct  8 20:28:57 2013
@@ -16,13 +16,122 @@
 // Project includes
 #include "lldb/Core/Log.h"
 #include "RegisterContextPOSIX.h"
+#include "RegisterContext_x86.h"
+
+//---------------------------------------------------------------------------
+// Internal codes for all i386 registers.
+//---------------------------------------------------------------------------
+enum
+{
+    k_first_gpr_i386,
+    gpr_eax_i386 = k_first_gpr_i386,
+    gpr_ebx_i386,
+    gpr_ecx_i386,
+    gpr_edx_i386,
+    gpr_edi_i386,
+    gpr_esi_i386,
+    gpr_ebp_i386,
+    gpr_esp_i386,
+    gpr_eip_i386,
+    gpr_eflags_i386,
+    gpr_cs_i386,
+    gpr_fs_i386,
+    gpr_gs_i386,
+    gpr_ss_i386,
+    gpr_ds_i386,
+    gpr_es_i386,
+
+    k_first_alias_i386,
+    gpr_ax_i386 = k_first_alias_i386,
+    gpr_bx_i386,
+    gpr_cx_i386,
+    gpr_dx_i386,
+    gpr_di_i386,
+    gpr_si_i386,
+    gpr_bp_i386,
+    gpr_sp_i386,
+    gpr_ah_i386,
+    gpr_bh_i386,
+    gpr_ch_i386,
+    gpr_dh_i386,
+    gpr_al_i386,
+    gpr_bl_i386,
+    gpr_cl_i386,
+    gpr_dl_i386,
+    k_last_alias_i386 = gpr_dl_i386,
+
+    k_last_gpr_i386 = k_last_alias_i386,
+
+    k_first_fpr_i386,
+    fpu_fctrl_i386 = k_first_fpr_i386,
+    fpu_fstat_i386,
+    fpu_ftag_i386,
+    fpu_fop_i386,
+    fpu_fiseg_i386,
+    fpu_fioff_i386,
+    fpu_foseg_i386,
+    fpu_fooff_i386,
+    fpu_mxcsr_i386,
+    fpu_mxcsrmask_i386,
+    fpu_st0_i386,
+    fpu_st1_i386,
+    fpu_st2_i386,
+    fpu_st3_i386,
+    fpu_st4_i386,
+    fpu_st5_i386,
+    fpu_st6_i386,
+    fpu_st7_i386,
+    fpu_mm0_i386,
+    fpu_mm1_i386,
+    fpu_mm2_i386,
+    fpu_mm3_i386,
+    fpu_mm4_i386,
+    fpu_mm5_i386,
+    fpu_mm6_i386,
+    fpu_mm7_i386,
+    fpu_xmm0_i386,
+    fpu_xmm1_i386,
+    fpu_xmm2_i386,
+    fpu_xmm3_i386,
+    fpu_xmm4_i386,
+    fpu_xmm5_i386,
+    fpu_xmm6_i386,
+    fpu_xmm7_i386,
+    k_last_fpr_i386 = fpu_xmm7_i386,
+
+    k_first_avx_i386,
+    fpu_ymm0_i386 = k_first_avx_i386,
+    fpu_ymm1_i386,
+    fpu_ymm2_i386,
+    fpu_ymm3_i386,
+    fpu_ymm4_i386,
+    fpu_ymm5_i386,
+    fpu_ymm6_i386,
+    fpu_ymm7_i386,
+    k_last_avx_i386 = fpu_ymm7_i386,
+
+    dr0_i386,
+    dr1_i386,
+    dr2_i386,
+    dr3_i386,
+    dr4_i386,
+    dr5_i386,
+    dr6_i386,
+    dr7_i386,
+
+    k_num_registers_i386,
+    k_num_gpr_registers_i386 = k_last_gpr_i386 - k_first_gpr_i386 + 1,
+    k_num_fpr_registers_i386 = k_last_fpr_i386 - k_first_fpr_i386 + 1,
+    k_num_avx_registers_i386 = k_last_avx_i386 - k_first_avx_i386 + 1
+};
 
 class RegisterContextPOSIX_i386 :
     public lldb_private::RegisterContext
 {
 public:
     RegisterContextPOSIX_i386(lldb_private::Thread &thread,
-                              uint32_t concreate_frame_idx);
+                              uint32_t concreate_frame_idx,
+                              RegisterInfoInterface *register_info);
 
     ~RegisterContextPOSIX_i386();
 
@@ -35,6 +144,12 @@ public:
     size_t
     GetRegisterCount();
 
+    virtual unsigned
+    GetRegisterSize(unsigned reg);
+
+    virtual unsigned
+    GetRegisterOffset(unsigned reg);
+
     const lldb_private::RegisterInfo *
     GetRegisterInfoAtIndex(size_t reg);
 
@@ -44,9 +159,6 @@ public:
     const lldb_private::RegisterSet *
     GetRegisterSet(size_t set);
 
-    unsigned
-    GetRegisterIndexFromOffset(unsigned offset);
-
     const char *
     GetRegisterName(unsigned reg);
 
@@ -86,84 +198,48 @@ public:
     bool
     UpdateAfterBreakpoint();
 
-    struct GPR
+    //---------------------------------------------------------------------------
+    // Note: prefer kernel definitions over user-land
+    //---------------------------------------------------------------------------
+    enum FPRType
     {
-        uint32_t ebx;
-        uint32_t ecx;
-        uint32_t edx;
-        uint32_t esi;
-        uint32_t edi;
-        uint32_t ebp;
-        uint32_t eax;
-        uint32_t ds;
-        uint32_t es;
-        uint32_t fs;
-        uint32_t gs;
-        uint32_t orig_ax;
-        uint32_t eip;
-        uint32_t cs;
-        uint32_t eflags;
-        uint32_t esp;
-        uint32_t ss;
+        eNotValid = 0,
+        eFSAVE,  // TODO
+        eFXSAVE,
+        eSOFT,   // TODO
+        eXSAVE
     };
 
-    struct MMSReg
-    {
-        uint8_t bytes[8];
-    };
-
-    struct XMMReg
-    {
-        uint8_t bytes[16];
-    };
-
-    struct FPU
-    {
-        uint16_t    fcw;
-        uint16_t    fsw;
-        uint16_t    ftw;
-        uint16_t    fop;
-        uint32_t    ip;
-        uint32_t    cs;
-        uint32_t    foo;
-        uint32_t    fos;
-        uint32_t    mxcsr;
-        uint32_t    reserved;
-        MMSReg      stmm[8];
-        XMMReg      xmm[8];
-        uint32_t    pad[56];
-    };
-
-    // A user area like this no longer exists on FreeBSD
-    // making this a Linux artifact. Nonetheless, it is safe
-    // leaving it here while the code is being cleaned up and generalized.
-
-    struct UserArea
-    {
-        GPR      regs;          // General purpose registers.
-        int32_t  fpvalid;       // True if FPU is being used.
-        FPU      i387;          // FPU registers.
-        uint32_t tsize;         // Text segment size.
-        uint32_t dsize;         // Data segment size.
-        uint32_t ssize;         // Stack segment size.
-        uint32_t start_code;    // VM address of text.
-        uint32_t start_stack;   // VM address of stack bottom (top in rsp).
-        int32_t  signal;        // Signal causing core dump.
-        int32_t  reserved;      // Unused.
-        uint32_t ar0;           // Location of GPR's.
-        FPU*     fpstate;       // Location of FPR's.
-        uint32_t magic;         // Identifier for core dumps.
-        char     u_comm[32];    // Command causing core dump.
-        uint32_t u_debugreg[8]; // Debug registers (DR0 - DR7).
-    };
+    static uint32_t g_contained_eax[];
+    static uint32_t g_contained_ebx[];
+    static uint32_t g_contained_ecx[];
+    static uint32_t g_contained_edx[];
+    static uint32_t g_contained_edi[];
+    static uint32_t g_contained_esi[];
+    static uint32_t g_contained_ebp[];
+    static uint32_t g_contained_esp[];
+
+    static uint32_t g_invalidate_eax[];
+    static uint32_t g_invalidate_ebx[];
+    static uint32_t g_invalidate_ecx[];
+    static uint32_t g_invalidate_edx[];
+    static uint32_t g_invalidate_edi[];
+    static uint32_t g_invalidate_esi[];
+    static uint32_t g_invalidate_ebp[];
+    static uint32_t g_invalidate_esp[];
+
+    static const uint32_t g_gpr_regnums[]; // k_num_gpr_registers_i386 
+    static const uint32_t g_fpu_regnums[]; // k_num_fpr_registers_i386 
+    static const uint32_t g_avx_regnums[]; // k_num_avx_registers_i386 
 
 protected:
-    UserArea m_user;
+    virtual const lldb_private::RegisterInfo *
+    GetRegisterInfo();
 
-    static unsigned GetRegOffset(unsigned reg);
-    static unsigned GetRegSize(unsigned reg);
+    FPRType m_fpr_type;                                        // determines the type of data stored by union FPR, if any.
+    std::unique_ptr<RegisterInfoInterface> m_register_info_ap; // Register Info Interface (FreeBSD or Linux)
 
-    void LogGPR(const char *title);
+    FPRType GetFPRType();
 
     virtual bool ReadGPR() = 0;
     virtual bool ReadFPR() = 0;

Modified: lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIX_x86_64.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIX_x86_64.cpp?rev=192263&r1=192262&r2=192263&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIX_x86_64.cpp (original)
+++ lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIX_x86_64.cpp Tue Oct  8 20:28:57 2013
@@ -29,242 +29,194 @@
 using namespace lldb_private;
 using namespace lldb;
 
-enum
-{
-    gcc_dwarf_gpr_rax = 0,
-    gcc_dwarf_gpr_rdx,
-    gcc_dwarf_gpr_rcx,
-    gcc_dwarf_gpr_rbx,
-    gcc_dwarf_gpr_rsi,
-    gcc_dwarf_gpr_rdi,
-    gcc_dwarf_gpr_rbp,
-    gcc_dwarf_gpr_rsp,
-    gcc_dwarf_gpr_r8,
-    gcc_dwarf_gpr_r9,
-    gcc_dwarf_gpr_r10,
-    gcc_dwarf_gpr_r11,
-    gcc_dwarf_gpr_r12,
-    gcc_dwarf_gpr_r13,
-    gcc_dwarf_gpr_r14,
-    gcc_dwarf_gpr_r15,
-    gcc_dwarf_gpr_rip,
-    gcc_dwarf_fpu_xmm0,
-    gcc_dwarf_fpu_xmm1,
-    gcc_dwarf_fpu_xmm2,
-    gcc_dwarf_fpu_xmm3,
-    gcc_dwarf_fpu_xmm4,
-    gcc_dwarf_fpu_xmm5,
-    gcc_dwarf_fpu_xmm6,
-    gcc_dwarf_fpu_xmm7,
-    gcc_dwarf_fpu_xmm8,
-    gcc_dwarf_fpu_xmm9,
-    gcc_dwarf_fpu_xmm10,
-    gcc_dwarf_fpu_xmm11,
-    gcc_dwarf_fpu_xmm12,
-    gcc_dwarf_fpu_xmm13,
-    gcc_dwarf_fpu_xmm14,
-    gcc_dwarf_fpu_xmm15,
-    gcc_dwarf_fpu_stmm0,
-    gcc_dwarf_fpu_stmm1,
-    gcc_dwarf_fpu_stmm2,
-    gcc_dwarf_fpu_stmm3,
-    gcc_dwarf_fpu_stmm4,
-    gcc_dwarf_fpu_stmm5,
-    gcc_dwarf_fpu_stmm6,
-    gcc_dwarf_fpu_stmm7,
-    gcc_dwarf_fpu_ymm0,
-    gcc_dwarf_fpu_ymm1,
-    gcc_dwarf_fpu_ymm2,
-    gcc_dwarf_fpu_ymm3,
-    gcc_dwarf_fpu_ymm4,
-    gcc_dwarf_fpu_ymm5,
-    gcc_dwarf_fpu_ymm6,
-    gcc_dwarf_fpu_ymm7,
-    gcc_dwarf_fpu_ymm8,
-    gcc_dwarf_fpu_ymm9,
-    gcc_dwarf_fpu_ymm10,
-    gcc_dwarf_fpu_ymm11,
-    gcc_dwarf_fpu_ymm12,
-    gcc_dwarf_fpu_ymm13,
-    gcc_dwarf_fpu_ymm14,
-    gcc_dwarf_fpu_ymm15
-};
-
-enum
-{
-    gdb_gpr_rax     =   0,
-    gdb_gpr_rbx     =   1,
-    gdb_gpr_rcx     =   2,
-    gdb_gpr_rdx     =   3,
-    gdb_gpr_rsi     =   4,
-    gdb_gpr_rdi     =   5,
-    gdb_gpr_rbp     =   6,
-    gdb_gpr_rsp     =   7,
-    gdb_gpr_r8      =   8,
-    gdb_gpr_r9      =   9,
-    gdb_gpr_r10     =  10,
-    gdb_gpr_r11     =  11,
-    gdb_gpr_r12     =  12,
-    gdb_gpr_r13     =  13,
-    gdb_gpr_r14     =  14,
-    gdb_gpr_r15     =  15,
-    gdb_gpr_rip     =  16,
-    gdb_gpr_rflags  =  17,
-    gdb_gpr_cs      =  18,
-    gdb_gpr_ss      =  19,
-    gdb_gpr_ds      =  20,
-    gdb_gpr_es      =  21,
-    gdb_gpr_fs      =  22,
-    gdb_gpr_gs      =  23,
-    gdb_fpu_stmm0   =  24,
-    gdb_fpu_stmm1   =  25,
-    gdb_fpu_stmm2   =  26,
-    gdb_fpu_stmm3   =  27,
-    gdb_fpu_stmm4   =  28,
-    gdb_fpu_stmm5   =  29,
-    gdb_fpu_stmm6   =  30,
-    gdb_fpu_stmm7   =  31,
-    gdb_fpu_fcw     =  32,
-    gdb_fpu_fsw     =  33,
-    gdb_fpu_ftw     =  34,
-    gdb_fpu_cs_64   =  35,
-    gdb_fpu_ip      =  36,
-    gdb_fpu_ds_64   =  37,
-    gdb_fpu_dp      =  38,
-    gdb_fpu_fop     =  39,
-    gdb_fpu_xmm0    =  40,
-    gdb_fpu_xmm1    =  41,
-    gdb_fpu_xmm2    =  42,
-    gdb_fpu_xmm3    =  43,
-    gdb_fpu_xmm4    =  44,
-    gdb_fpu_xmm5    =  45,
-    gdb_fpu_xmm6    =  46,
-    gdb_fpu_xmm7    =  47,
-    gdb_fpu_xmm8    =  48,
-    gdb_fpu_xmm9    =  49,
-    gdb_fpu_xmm10   =  50,
-    gdb_fpu_xmm11   =  51,
-    gdb_fpu_xmm12   =  52,
-    gdb_fpu_xmm13   =  53,
-    gdb_fpu_xmm14   =  54,
-    gdb_fpu_xmm15   =  55,
-    gdb_fpu_mxcsr   =  56,
-    gdb_fpu_ymm0    =  57,
-    gdb_fpu_ymm1    =  58,
-    gdb_fpu_ymm2    =  59,
-    gdb_fpu_ymm3    =  60,
-    gdb_fpu_ymm4    =  61,
-    gdb_fpu_ymm5    =  62,
-    gdb_fpu_ymm6    =  63,
-    gdb_fpu_ymm7    =  64,
-    gdb_fpu_ymm8    =  65,
-    gdb_fpu_ymm9    =  66,
-    gdb_fpu_ymm10   =  67,
-    gdb_fpu_ymm11   =  68,
-    gdb_fpu_ymm12   =  69,
-    gdb_fpu_ymm13   =  70,
-    gdb_fpu_ymm14   =  71,
-    gdb_fpu_ymm15   =  72
-};
-
 static const
-uint32_t g_gpr_regnums[k_num_gpr_registers] =
+uint32_t g_gpr_regnums[] =
 {
-    gpr_rax,
-    gpr_rbx,
-    gpr_rcx,
-    gpr_rdx,
-    gpr_rdi,
-    gpr_rsi,
-    gpr_rbp,
-    gpr_rsp,
-    gpr_r8,
-    gpr_r9,
-    gpr_r10,
-    gpr_r11,
-    gpr_r12,
-    gpr_r13,
-    gpr_r14,
-    gpr_r15,
-    gpr_rip,
-    gpr_rflags,
-    gpr_cs,
-    gpr_fs,
-    gpr_gs,
-    gpr_ss,
-    gpr_ds,
-    gpr_es,
-    gpr_eax,
-    gpr_ebx,
-    gpr_ecx,
-    gpr_edx,
-    gpr_edi,
-    gpr_esi,
-    gpr_ebp,
-    gpr_esp,
-    gpr_eip,
-    gpr_eflags
+    gpr_rax_x86_64,
+    gpr_rbx_x86_64,
+    gpr_rcx_x86_64,
+    gpr_rdx_x86_64,
+    gpr_rdi_x86_64,
+    gpr_rsi_x86_64,
+    gpr_rbp_x86_64,
+    gpr_rsp_x86_64,
+    gpr_r8_x86_64,
+    gpr_r9_x86_64,
+    gpr_r10_x86_64,
+    gpr_r11_x86_64,
+    gpr_r12_x86_64,
+    gpr_r13_x86_64,
+    gpr_r14_x86_64,
+    gpr_r15_x86_64,
+    gpr_rip_x86_64,
+    gpr_rflags_x86_64,
+    gpr_cs_x86_64,
+    gpr_fs_x86_64,
+    gpr_gs_x86_64,
+    gpr_ss_x86_64,
+    gpr_ds_x86_64,
+    gpr_es_x86_64,
+    gpr_eax_x86_64,
+    gpr_ebx_x86_64,
+    gpr_ecx_x86_64,
+    gpr_edx_x86_64,
+    gpr_edi_x86_64,
+    gpr_esi_x86_64,
+    gpr_ebp_x86_64,
+    gpr_esp_x86_64,
+    gpr_r8d_x86_64,    // Low 32 bits or r8
+    gpr_r9d_x86_64,    // Low 32 bits or r9
+    gpr_r10d_x86_64,   // Low 32 bits or r10
+    gpr_r11d_x86_64,   // Low 32 bits or r11
+    gpr_r12d_x86_64,   // Low 32 bits or r12
+    gpr_r13d_x86_64,   // Low 32 bits or r13
+    gpr_r14d_x86_64,   // Low 32 bits or r14
+    gpr_r15d_x86_64,   // Low 32 bits or r15
+    gpr_ax_x86_64,
+    gpr_bx_x86_64,
+    gpr_cx_x86_64,
+    gpr_dx_x86_64,
+    gpr_di_x86_64,
+    gpr_si_x86_64,
+    gpr_bp_x86_64,
+    gpr_sp_x86_64,
+    gpr_r8w_x86_64,    // Low 16 bits or r8
+    gpr_r9w_x86_64,    // Low 16 bits or r9
+    gpr_r10w_x86_64,   // Low 16 bits or r10
+    gpr_r11w_x86_64,   // Low 16 bits or r11
+    gpr_r12w_x86_64,   // Low 16 bits or r12
+    gpr_r13w_x86_64,   // Low 16 bits or r13
+    gpr_r14w_x86_64,   // Low 16 bits or r14
+    gpr_r15w_x86_64,   // Low 16 bits or r15
+    gpr_ah_x86_64,
+    gpr_bh_x86_64,
+    gpr_ch_x86_64,
+    gpr_dh_x86_64,
+    gpr_al_x86_64,
+    gpr_bl_x86_64,
+    gpr_cl_x86_64,
+    gpr_dl_x86_64,
+    gpr_dil_x86_64,
+    gpr_sil_x86_64,
+    gpr_bpl_x86_64,
+    gpr_spl_x86_64,
+    gpr_r8l_x86_64,    // Low 8 bits or r8
+    gpr_r9l_x86_64,    // Low 8 bits or r9
+    gpr_r10l_x86_64,   // Low 8 bits or r10
+    gpr_r11l_x86_64,   // Low 8 bits or r11
+    gpr_r12l_x86_64,   // Low 8 bits or r12
+    gpr_r13l_x86_64,   // Low 8 bits or r13
+    gpr_r14l_x86_64,   // Low 8 bits or r14
+    gpr_r15l_x86_64,   // Low 8 bits or r15
 };
+static_assert((sizeof(g_gpr_regnums) / sizeof(g_gpr_regnums[0])) == k_num_gpr_registers_x86_64,
+    "g_gpr_regnums has wrong number of register infos");
 
 static const uint32_t
-g_fpu_regnums[k_num_fpr_registers] =
+g_fpu_regnums[] =
 {
-    fpu_fcw,
-    fpu_fsw,
-    fpu_ftw,
-    fpu_fop,
-    fpu_ip,
-    fpu_cs,
-    fpu_dp,
-    fpu_ds,
-    fpu_mxcsr,
-    fpu_mxcsrmask,
-    fpu_stmm0,
-    fpu_stmm1,
-    fpu_stmm2,
-    fpu_stmm3,
-    fpu_stmm4,
-    fpu_stmm5,
-    fpu_stmm6,
-    fpu_stmm7,
-    fpu_xmm0,
-    fpu_xmm1,
-    fpu_xmm2,
-    fpu_xmm3,
-    fpu_xmm4,
-    fpu_xmm5,
-    fpu_xmm6,
-    fpu_xmm7,
-    fpu_xmm8,
-    fpu_xmm9,
-    fpu_xmm10,
-    fpu_xmm11,
-    fpu_xmm12,
-    fpu_xmm13,
-    fpu_xmm14,
-    fpu_xmm15
+    fpu_fctrl_x86_64,
+    fpu_fstat_x86_64,
+    fpu_ftag_x86_64,
+    fpu_fop_x86_64,
+    fpu_fiseg_x86_64,
+    fpu_fioff_x86_64,
+    fpu_foseg_x86_64,
+    fpu_fooff_x86_64,
+    fpu_mxcsr_x86_64,
+    fpu_mxcsrmask_x86_64,
+    fpu_st0_x86_64,
+    fpu_st1_x86_64,
+    fpu_st2_x86_64,
+    fpu_st3_x86_64,
+    fpu_st4_x86_64,
+    fpu_st5_x86_64,
+    fpu_st6_x86_64,
+    fpu_st7_x86_64,
+    fpu_mm0_x86_64,
+    fpu_mm1_x86_64,
+    fpu_mm2_x86_64,
+    fpu_mm3_x86_64,
+    fpu_mm4_x86_64,
+    fpu_mm5_x86_64,
+    fpu_mm6_x86_64,
+    fpu_mm7_x86_64,
+    fpu_xmm0_x86_64,
+    fpu_xmm1_x86_64,
+    fpu_xmm2_x86_64,
+    fpu_xmm3_x86_64,
+    fpu_xmm4_x86_64,
+    fpu_xmm5_x86_64,
+    fpu_xmm6_x86_64,
+    fpu_xmm7_x86_64,
+    fpu_xmm8_x86_64,
+    fpu_xmm9_x86_64,
+    fpu_xmm10_x86_64,
+    fpu_xmm11_x86_64,
+    fpu_xmm12_x86_64,
+    fpu_xmm13_x86_64,
+    fpu_xmm14_x86_64,
+    fpu_xmm15_x86_64
 };
+static_assert((sizeof(g_fpu_regnums) / sizeof(g_fpu_regnums[0])) == k_num_fpr_registers_x86_64,
+    "g_gpr_regnums has wrong number of register infos");
 
 static const uint32_t
-g_avx_regnums[k_num_avx_registers] =
+g_avx_regnums[] =
 {
-    fpu_ymm0,
-    fpu_ymm1,
-    fpu_ymm2,
-    fpu_ymm3,
-    fpu_ymm4,
-    fpu_ymm5,
-    fpu_ymm6,
-    fpu_ymm7,
-    fpu_ymm8,
-    fpu_ymm9,
-    fpu_ymm10,
-    fpu_ymm11,
-    fpu_ymm12,
-    fpu_ymm13,
-    fpu_ymm14,
-    fpu_ymm15
+    fpu_ymm0_x86_64,
+    fpu_ymm1_x86_64,
+    fpu_ymm2_x86_64,
+    fpu_ymm3_x86_64,
+    fpu_ymm4_x86_64,
+    fpu_ymm5_x86_64,
+    fpu_ymm6_x86_64,
+    fpu_ymm7_x86_64,
+    fpu_ymm8_x86_64,
+    fpu_ymm9_x86_64,
+    fpu_ymm10_x86_64,
+    fpu_ymm11_x86_64,
+    fpu_ymm12_x86_64,
+    fpu_ymm13_x86_64,
+    fpu_ymm14_x86_64,
+    fpu_ymm15_x86_64
 };
+static_assert((sizeof(g_avx_regnums) / sizeof(g_gpr_regnums[0])) == k_num_avx_registers_x86_64,
+    "g_gpr_regnums has wrong number of register infos");
+
+uint32_t RegisterContextPOSIX_x86_64::g_contained_rax[] = { gpr_rax_x86_64, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_x86_64::g_contained_rbx[] = { gpr_rbx_x86_64, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_x86_64::g_contained_rcx[] = { gpr_rcx_x86_64, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_x86_64::g_contained_rdx[] = { gpr_rdx_x86_64, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_x86_64::g_contained_rdi[] = { gpr_rdi_x86_64, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_x86_64::g_contained_rsi[] = { gpr_rsi_x86_64, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_x86_64::g_contained_rbp[] = { gpr_rbp_x86_64, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_x86_64::g_contained_rsp[] = { gpr_rsp_x86_64, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_x86_64::g_contained_r8[]  = { gpr_r8_x86_64,  LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_x86_64::g_contained_r9[]  = { gpr_r9_x86_64,  LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_x86_64::g_contained_r10[] = { gpr_r10_x86_64, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_x86_64::g_contained_r11[] = { gpr_r11_x86_64, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_x86_64::g_contained_r12[] = { gpr_r12_x86_64, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_x86_64::g_contained_r13[] = { gpr_r13_x86_64, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_x86_64::g_contained_r14[] = { gpr_r14_x86_64, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_x86_64::g_contained_r15[] = { gpr_r15_x86_64, LLDB_INVALID_REGNUM };
+
+uint32_t RegisterContextPOSIX_x86_64::g_invalidate_rax[] = { gpr_rax_x86_64, gpr_eax_x86_64,  gpr_ax_x86_64,   gpr_ah_x86_64,   gpr_al_x86_64, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_x86_64::g_invalidate_rbx[] = { gpr_rbx_x86_64, gpr_ebx_x86_64,  gpr_bx_x86_64,   gpr_bh_x86_64,   gpr_bl_x86_64, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_x86_64::g_invalidate_rcx[] = { gpr_rcx_x86_64, gpr_ecx_x86_64,  gpr_cx_x86_64,   gpr_ch_x86_64,   gpr_cl_x86_64, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_x86_64::g_invalidate_rdx[] = { gpr_rdx_x86_64, gpr_edx_x86_64,  gpr_dx_x86_64,   gpr_dh_x86_64,   gpr_dl_x86_64, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_x86_64::g_invalidate_rdi[] = { gpr_rdi_x86_64, gpr_edi_x86_64,  gpr_di_x86_64,   gpr_dil_x86_64,  LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_x86_64::g_invalidate_rsi[] = { gpr_rsi_x86_64, gpr_esi_x86_64,  gpr_si_x86_64,   gpr_sil_x86_64,  LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_x86_64::g_invalidate_rbp[] = { gpr_rbp_x86_64, gpr_ebp_x86_64,  gpr_bp_x86_64,   gpr_bpl_x86_64,  LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_x86_64::g_invalidate_rsp[] = { gpr_rsp_x86_64, gpr_esp_x86_64,  gpr_sp_x86_64,   gpr_spl_x86_64,  LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_x86_64::g_invalidate_r8[]  = { gpr_r8_x86_64,  gpr_r8d_x86_64,  gpr_r8w_x86_64,  gpr_r8l_x86_64,  LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_x86_64::g_invalidate_r9[]  = { gpr_r9_x86_64,  gpr_r9d_x86_64,  gpr_r9w_x86_64,  gpr_r9l_x86_64,  LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_x86_64::g_invalidate_r10[] = { gpr_r10_x86_64, gpr_r10d_x86_64, gpr_r10w_x86_64, gpr_r10l_x86_64, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_x86_64::g_invalidate_r11[] = { gpr_r11_x86_64, gpr_r11d_x86_64, gpr_r11w_x86_64, gpr_r11l_x86_64, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_x86_64::g_invalidate_r12[] = { gpr_r12_x86_64, gpr_r12d_x86_64, gpr_r12w_x86_64, gpr_r12l_x86_64, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_x86_64::g_invalidate_r13[] = { gpr_r13_x86_64, gpr_r13d_x86_64, gpr_r13w_x86_64, gpr_r13l_x86_64, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_x86_64::g_invalidate_r14[] = { gpr_r14_x86_64, gpr_r14d_x86_64, gpr_r14w_x86_64, gpr_r14l_x86_64, LLDB_INVALID_REGNUM };
+uint32_t RegisterContextPOSIX_x86_64::g_invalidate_r15[] = { gpr_r15_x86_64, gpr_r15d_x86_64, gpr_r15w_x86_64, gpr_r15l_x86_64, LLDB_INVALID_REGNUM };
 
 // Number of register sets provided by this context.
 enum
@@ -274,209 +226,42 @@ enum
 };
 
 static const RegisterSet
-g_reg_sets[k_num_register_sets] =
+g_reg_sets_x86_64[k_num_register_sets] =
 {
-    { "General Purpose Registers",  "gpr", k_num_gpr_registers, g_gpr_regnums },
-    { "Floating Point Registers",   "fpu", k_num_fpr_registers, g_fpu_regnums },
-    { "Advanced Vector Extensions", "avx", k_num_avx_registers, g_avx_regnums }
+    { "General Purpose Registers",  "gpr", k_num_gpr_registers_x86_64, g_gpr_regnums },
+    { "Floating Point Registers",   "fpu", k_num_fpr_registers_x86_64, g_fpu_regnums },
+    { "Advanced Vector Extensions", "avx", k_num_avx_registers_x86_64, g_avx_regnums }
 };
 
-// Computes the offset of the given FPR in the extended data area.
-#define FPR_OFFSET(regname) \
-    (offsetof(RegisterContextPOSIX_x86_64::FPR, xstate) + \
-     offsetof(RegisterContextPOSIX_x86_64::FXSAVE, regname))
-
-// Computes the offset of the YMM register assembled from register halves.
-#define YMM_OFFSET(regname) \
-    (offsetof(RegisterContextPOSIX_x86_64::YMM, regname))
-
-// Number of bytes needed to represent a i386 GPR
-#define GPR_i386_SIZE(reg) sizeof(((RegisterContextPOSIX_i386::GPR*)NULL)->reg)
-
-// Number of bytes needed to represent a FPR.
-#define FPR_SIZE(reg) sizeof(((RegisterContextPOSIX_x86_64::FXSAVE*)NULL)->reg)
-
-// Number of bytes needed to represent the i'th FP register.
-#define FP_SIZE sizeof(((RegisterContextPOSIX_x86_64::MMSReg*)NULL)->bytes)
-
-// Number of bytes needed to represent an XMM register.
-#define XMM_SIZE sizeof(RegisterContextPOSIX_x86_64::XMMReg)
-
-// Number of bytes needed to represent a YMM register.
-#define YMM_SIZE sizeof(RegisterContextPOSIX_x86_64::YMMReg)
-
-// Note that the size and offset will be updated by platform-specific classes.
-#define DEFINE_GPR(reg, alt, kind1, kind2, kind3, kind4)           \
-    { #reg, alt, 0, 0, eEncodingUint,                              \
-      eFormatHex, { kind1, kind2, kind3, kind4, gpr_##reg }, NULL, NULL }
-
-// Dummy data for RegisterInfo::value_regs as expected by DumpRegisterSet. 
-static uint32_t value_regs = LLDB_INVALID_REGNUM;
-
-#define DEFINE_GPR_i386(reg_i386, reg_x86_64, alt, kind1, kind2, kind3, kind4) \
-    { #reg_i386, alt, GPR_i386_SIZE(reg_i386), 0, eEncodingUint,   \
-      eFormatHex, { kind1, kind2, kind3, kind4, gpr_##reg_i386 }, &value_regs, NULL }
-
-#define DEFINE_FPR(reg, kind1, kind2, kind3, kind4)                \
-    { #reg, NULL, FPR_SIZE(reg), FPR_OFFSET(reg), eEncodingUint,   \
-      eFormatHex, { kind1, kind2, kind3, kind4, fpu_##reg }, NULL, NULL }
-
-#define DEFINE_FP(reg, i)                                          \
-    { #reg#i, NULL, FP_SIZE, LLVM_EXTENSION FPR_OFFSET(reg[i]),    \
-      eEncodingVector, eFormatVectorOfUInt8,                       \
-      { gcc_dwarf_fpu_##reg##i, gcc_dwarf_fpu_##reg##i,            \
-        LLDB_INVALID_REGNUM, gdb_fpu_##reg##i, fpu_##reg##i }, NULL, NULL }
-
-#define DEFINE_XMM(reg, i)                                         \
-    { #reg#i, NULL, XMM_SIZE, LLVM_EXTENSION FPR_OFFSET(reg[i]),   \
-      eEncodingVector, eFormatVectorOfUInt8,                       \
-      { gcc_dwarf_fpu_##reg##i, gcc_dwarf_fpu_##reg##i,            \
-        LLDB_INVALID_REGNUM, gdb_fpu_##reg##i, fpu_##reg##i }, NULL, NULL }
-
-#define DEFINE_YMM(reg, i)                                         \
-    { #reg#i, NULL, YMM_SIZE, LLVM_EXTENSION YMM_OFFSET(reg[i]),   \
-      eEncodingVector, eFormatVectorOfUInt8,                       \
-      { gcc_dwarf_fpu_##reg##i, gcc_dwarf_fpu_##reg##i,            \
-        LLDB_INVALID_REGNUM, gdb_fpu_##reg##i, fpu_##reg##i }, NULL, NULL }
-
-#define DEFINE_DR(reg, i)                                              \
-    { #reg#i, NULL, 0, 0, eEncodingUint, eFormatHex,                   \
-      { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, \
-      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM }, NULL, NULL }
-
-#define REG_CONTEXT_SIZE (GetGPRSize() + sizeof(RegisterContextPOSIX_x86_64::FPR))
-
-static RegisterInfo
-g_register_infos[k_num_registers] =
-{
-    // General purpose registers.
-    DEFINE_GPR(rax,    NULL,    gcc_dwarf_gpr_rax,   gcc_dwarf_gpr_rax,   LLDB_INVALID_REGNUM,       gdb_gpr_rax),
-    DEFINE_GPR(rbx,    NULL,    gcc_dwarf_gpr_rbx,   gcc_dwarf_gpr_rbx,   LLDB_INVALID_REGNUM,       gdb_gpr_rbx),
-    DEFINE_GPR(rcx,    NULL,    gcc_dwarf_gpr_rcx,   gcc_dwarf_gpr_rcx,   LLDB_INVALID_REGNUM,       gdb_gpr_rcx),
-    DEFINE_GPR(rdx,    NULL,    gcc_dwarf_gpr_rdx,   gcc_dwarf_gpr_rdx,   LLDB_INVALID_REGNUM,       gdb_gpr_rdx),
-    DEFINE_GPR(rdi,    NULL,    gcc_dwarf_gpr_rdi,   gcc_dwarf_gpr_rdi,   LLDB_INVALID_REGNUM,       gdb_gpr_rdi),
-    DEFINE_GPR(rsi,    NULL,    gcc_dwarf_gpr_rsi,   gcc_dwarf_gpr_rsi,   LLDB_INVALID_REGNUM,       gdb_gpr_rsi),
-    DEFINE_GPR(rbp,    "fp",    gcc_dwarf_gpr_rbp,   gcc_dwarf_gpr_rbp,   LLDB_REGNUM_GENERIC_FP,    gdb_gpr_rbp),
-    DEFINE_GPR(rsp,    "sp",    gcc_dwarf_gpr_rsp,   gcc_dwarf_gpr_rsp,   LLDB_REGNUM_GENERIC_SP,    gdb_gpr_rsp),
-    DEFINE_GPR(r8,     NULL,    gcc_dwarf_gpr_r8,    gcc_dwarf_gpr_r8,    LLDB_INVALID_REGNUM,       gdb_gpr_r8),
-    DEFINE_GPR(r9,     NULL,    gcc_dwarf_gpr_r9,    gcc_dwarf_gpr_r9,    LLDB_INVALID_REGNUM,       gdb_gpr_r9),
-    DEFINE_GPR(r10,    NULL,    gcc_dwarf_gpr_r10,   gcc_dwarf_gpr_r10,   LLDB_INVALID_REGNUM,       gdb_gpr_r10),
-    DEFINE_GPR(r11,    NULL,    gcc_dwarf_gpr_r11,   gcc_dwarf_gpr_r11,   LLDB_INVALID_REGNUM,       gdb_gpr_r11),
-    DEFINE_GPR(r12,    NULL,    gcc_dwarf_gpr_r12,   gcc_dwarf_gpr_r12,   LLDB_INVALID_REGNUM,       gdb_gpr_r12),
-    DEFINE_GPR(r13,    NULL,    gcc_dwarf_gpr_r13,   gcc_dwarf_gpr_r13,   LLDB_INVALID_REGNUM,       gdb_gpr_r13),
-    DEFINE_GPR(r14,    NULL,    gcc_dwarf_gpr_r14,   gcc_dwarf_gpr_r14,   LLDB_INVALID_REGNUM,       gdb_gpr_r14),
-    DEFINE_GPR(r15,    NULL,    gcc_dwarf_gpr_r15,   gcc_dwarf_gpr_r15,   LLDB_INVALID_REGNUM,       gdb_gpr_r15),
-    DEFINE_GPR(rip,    "pc",    gcc_dwarf_gpr_rip,   gcc_dwarf_gpr_rip,   LLDB_REGNUM_GENERIC_PC,    gdb_gpr_rip),
-    DEFINE_GPR(rflags, "flags", LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_REGNUM_GENERIC_FLAGS, gdb_gpr_rflags),
-    DEFINE_GPR(cs,     NULL,    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,       gdb_gpr_cs),
-    DEFINE_GPR(fs,     NULL,    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,       gdb_gpr_fs),
-    DEFINE_GPR(gs,     NULL,    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,       gdb_gpr_gs),
-    DEFINE_GPR(ss,     NULL,    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,       gdb_gpr_ss),
-    DEFINE_GPR(ds,     NULL,    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,       gdb_gpr_ds),
-    DEFINE_GPR(es,     NULL,    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,       gdb_gpr_es),
-    // i386 registers
-    DEFINE_GPR_i386(eax,    rax,    NULL,    gcc_eax,    dwarf_eax,    LLDB_INVALID_REGNUM,       gdb_eax),
-    DEFINE_GPR_i386(ebx,    rbx,    NULL,    gcc_ebx,    dwarf_ebx,    LLDB_INVALID_REGNUM,       gdb_ebx),
-    DEFINE_GPR_i386(ecx,    rcx,    NULL,    gcc_ecx,    dwarf_ecx,    LLDB_INVALID_REGNUM,       gdb_ecx),
-    DEFINE_GPR_i386(edx,    rdx,    NULL,    gcc_edx,    dwarf_edx,    LLDB_INVALID_REGNUM,       gdb_edx),
-    DEFINE_GPR_i386(edi,    rdi,    NULL,    gcc_edi,    dwarf_edi,    LLDB_INVALID_REGNUM,       gdb_edi),
-    DEFINE_GPR_i386(esi,    rsi,    NULL,    gcc_esi,    dwarf_esi,    LLDB_INVALID_REGNUM,       gdb_esi),
-    DEFINE_GPR_i386(ebp,    rbp,    "fp",    gcc_ebp,    dwarf_ebp,    LLDB_REGNUM_GENERIC_FP,    gdb_ebp),
-    DEFINE_GPR_i386(esp,    rsp,    "sp",    gcc_esp,    dwarf_esp,    LLDB_REGNUM_GENERIC_SP,    gdb_esp),
-    DEFINE_GPR_i386(eip,    rip,    "pc",    gcc_eip,    dwarf_eip,    LLDB_REGNUM_GENERIC_PC,    gdb_eip),
-    DEFINE_GPR_i386(eflags, rflags, "flags", gcc_eflags, dwarf_eflags, LLDB_REGNUM_GENERIC_FLAGS, gdb_eflags),
-    // i387 Floating point registers.
-    DEFINE_FPR(fcw,       LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_fpu_fcw),
-    DEFINE_FPR(fsw,       LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_fpu_fsw),
-    DEFINE_FPR(ftw,       LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_fpu_ftw),
-    DEFINE_FPR(fop,       LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_fpu_fop),
-    DEFINE_FPR(ip,        LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_fpu_ip),
-    // FIXME: Extract segment from ip.
-    DEFINE_FPR(ip,        LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_fpu_cs_64),
-    DEFINE_FPR(dp,        LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_fpu_dp),
-    // FIXME: Extract segment from dp.
-    DEFINE_FPR(dp,        LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_fpu_ds_64),
-    DEFINE_FPR(mxcsr,     LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_fpu_mxcsr),
-    DEFINE_FPR(mxcsrmask, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM),
-
-    // FP registers.
-    DEFINE_FP(stmm, 0),
-    DEFINE_FP(stmm, 1),
-    DEFINE_FP(stmm, 2),
-    DEFINE_FP(stmm, 3),
-    DEFINE_FP(stmm, 4),
-    DEFINE_FP(stmm, 5),
-    DEFINE_FP(stmm, 6),
-    DEFINE_FP(stmm, 7),
-
-    // XMM registers
-    DEFINE_XMM(xmm, 0),
-    DEFINE_XMM(xmm, 1),
-    DEFINE_XMM(xmm, 2),
-    DEFINE_XMM(xmm, 3),
-    DEFINE_XMM(xmm, 4),
-    DEFINE_XMM(xmm, 5),
-    DEFINE_XMM(xmm, 6),
-    DEFINE_XMM(xmm, 7),
-    DEFINE_XMM(xmm, 8),
-    DEFINE_XMM(xmm, 9),
-    DEFINE_XMM(xmm, 10),
-    DEFINE_XMM(xmm, 11),
-    DEFINE_XMM(xmm, 12),
-    DEFINE_XMM(xmm, 13),
-    DEFINE_XMM(xmm, 14),
-    DEFINE_XMM(xmm, 15),
-
-    // Copy of YMM registers assembled from xmm and ymmh
-    DEFINE_YMM(ymm, 0),
-    DEFINE_YMM(ymm, 1),
-    DEFINE_YMM(ymm, 2),
-    DEFINE_YMM(ymm, 3),
-    DEFINE_YMM(ymm, 4),
-    DEFINE_YMM(ymm, 5),
-    DEFINE_YMM(ymm, 6),
-    DEFINE_YMM(ymm, 7),
-    DEFINE_YMM(ymm, 8),
-    DEFINE_YMM(ymm, 9),
-    DEFINE_YMM(ymm, 10),
-    DEFINE_YMM(ymm, 11),
-    DEFINE_YMM(ymm, 12),
-    DEFINE_YMM(ymm, 13),
-    DEFINE_YMM(ymm, 14),
-    DEFINE_YMM(ymm, 15),
-
-    // Debug registers for lldb internal use
-    DEFINE_DR(dr, 0),
-    DEFINE_DR(dr, 1),
-    DEFINE_DR(dr, 2),
-    DEFINE_DR(dr, 3),
-    DEFINE_DR(dr, 4),
-    DEFINE_DR(dr, 5),
-    DEFINE_DR(dr, 6),
-    DEFINE_DR(dr, 7)
+static const RegisterSet
+g_reg_sets_i386[k_num_register_sets] =
+{
+    { "General Purpose Registers",  "gpr", k_num_gpr_registers_i386, RegisterContextPOSIX_i386::g_gpr_regnums },
+    { "Floating Point Registers",   "fpu", k_num_fpr_registers_i386, RegisterContextPOSIX_i386::g_fpu_regnums },
+    { "Advanced Vector Extensions", "avx", k_num_avx_registers_i386, RegisterContextPOSIX_i386::g_avx_regnums }
 };
 
 bool RegisterContextPOSIX_x86_64::IsGPR(unsigned reg)
 {
-    return reg <= k_last_gpr;   // GPR's come first.
+    return reg <= m_reg_info.last_gpr;   // GPR's come first.
 }
 
-bool RegisterContextPOSIX_x86_64::IsAVX(unsigned reg)
+bool RegisterContextPOSIX_x86_64::IsFPR(unsigned reg)
 {
-    return (k_first_avx <= reg && reg <= k_last_avx);
+    return (m_reg_info.first_fpr <= reg && reg <= m_reg_info.last_fpr);
 }
 
-bool RegisterContextPOSIX_x86_64::IsFPR(unsigned reg)
+bool RegisterContextPOSIX_x86_64::IsAVX(unsigned reg)
 {
-    return (k_first_fpr <= reg && reg <= k_last_fpr);
+    return (m_reg_info.first_ymm <= reg && reg <= m_reg_info.last_ymm);
 }
 
 bool RegisterContextPOSIX_x86_64::IsFPR(unsigned reg, FPRType fpr_type)
 {
     bool generic_fpr = IsFPR(reg);
-    if (fpr_type == eXSAVE)
-      return generic_fpr || IsAVX(reg);
 
+    if (fpr_type == eXSAVE)
+        return generic_fpr || IsAVX(reg);
     return generic_fpr;
 }
 
@@ -487,13 +272,60 @@ RegisterContextPOSIX_x86_64::RegisterCon
 {
     m_register_info_ap.reset(register_info);
 
+    switch (register_info->m_target_arch.GetCore())
+    {
+        case ArchSpec::eCore_x86_32_i386:
+        case ArchSpec::eCore_x86_32_i486:
+        case ArchSpec::eCore_x86_32_i486sx:
+            m_reg_info.num_registers        = k_num_registers_i386;
+            m_reg_info.num_gpr_registers    = k_num_gpr_registers_i386;
+            m_reg_info.num_fpr_registers    = k_num_fpr_registers_i386;
+            m_reg_info.num_avx_registers    = k_num_avx_registers_i386;
+            m_reg_info.last_gpr             = k_last_gpr_i386;
+            m_reg_info.first_fpr            = k_first_fpr_i386;
+            m_reg_info.last_fpr             = k_last_fpr_i386;
+            m_reg_info.first_st             = fpu_st0_i386;
+            m_reg_info.last_st              = fpu_st7_i386;
+            m_reg_info.first_mm             = fpu_mm0_i386;
+            m_reg_info.last_mm              = fpu_mm7_i386;
+            m_reg_info.first_xmm            = fpu_xmm0_i386;
+            m_reg_info.last_xmm             = fpu_xmm7_i386;
+            m_reg_info.first_ymm            = fpu_ymm0_i386;
+            m_reg_info.last_ymm             = fpu_ymm7_i386;
+            m_reg_info.first_dr             = dr0_i386;
+            m_reg_info.gpr_flags            = gpr_eflags_i386;
+            break;
+        case ArchSpec::eCore_x86_64_x86_64:
+            m_reg_info.num_registers        = k_num_registers_x86_64;
+            m_reg_info.num_gpr_registers    = k_num_gpr_registers_x86_64;
+            m_reg_info.num_fpr_registers    = k_num_fpr_registers_x86_64;
+            m_reg_info.num_avx_registers    = k_num_avx_registers_x86_64;
+            m_reg_info.last_gpr             = k_last_gpr_x86_64;
+            m_reg_info.first_fpr            = k_first_fpr_x86_64;
+            m_reg_info.last_fpr             = k_last_fpr_x86_64;
+            m_reg_info.first_st             = fpu_st0_x86_64;
+            m_reg_info.last_st              = fpu_st7_x86_64;
+            m_reg_info.first_mm             = fpu_mm0_x86_64;
+            m_reg_info.last_mm              = fpu_mm7_x86_64;
+            m_reg_info.first_xmm            = fpu_xmm0_x86_64;
+            m_reg_info.last_xmm             = fpu_xmm15_x86_64;
+            m_reg_info.first_ymm            = fpu_ymm0_x86_64;
+            m_reg_info.last_ymm             = fpu_ymm15_x86_64;
+            m_reg_info.first_dr             = dr0_x86_64;
+            m_reg_info.gpr_flags            = gpr_rflags_x86_64;
+            break;
+        default:
+            assert(false && "Unhandled target architecture.");
+            break;
+    }
+
     // Initialize m_iovec to point to the buffer and buffer size
     // using the conventions of Berkeley style UIO structures, as required
     // by PTRACE extensions.
     m_iovec.iov_base = &m_fpr.xstate.xsave;
     m_iovec.iov_len = sizeof(m_fpr.xstate.xsave);
 
-    ::memset(&m_fpr, 0, sizeof(RegisterContextPOSIX_x86_64::FPR));
+    ::memset(&m_fpr, 0, sizeof(FPR));
 
     // elf-core yet to support ReadFPR()
     ProcessSP base = CalculateProcess();
@@ -532,30 +364,30 @@ RegisterContextPOSIX_x86_64::InvalidateA
 unsigned
 RegisterContextPOSIX_x86_64::GetRegisterOffset(unsigned reg)
 {
-    assert(reg < k_num_registers && "Invalid register number.");
+    assert(reg < m_reg_info.num_registers && "Invalid register number.");
     return GetRegisterInfo()[reg].byte_offset;
 }
 
 unsigned
 RegisterContextPOSIX_x86_64::GetRegisterSize(unsigned reg)
 {
-    assert(reg < k_num_registers && "Invalid register number.");
+    assert(reg < m_reg_info.num_registers && "Invalid register number.");
     return GetRegisterInfo()[reg].byte_size;
 }
 
 size_t
 RegisterContextPOSIX_x86_64::GetRegisterCount()
 {
-    size_t num_registers = k_num_gpr_registers + k_num_fpr_registers;
+    size_t num_registers = m_reg_info.num_gpr_registers + m_reg_info.num_fpr_registers;
     if (GetFPRType() == eXSAVE)
-      return num_registers + k_num_avx_registers;
+      return num_registers + m_reg_info.num_avx_registers;
     return num_registers;
 }
 
 size_t
 RegisterContextPOSIX_x86_64::GetGPRSize()
 {
-    return m_register_info_ap->GetGPRSize();
+    return m_register_info_ap->GetGPRSize ();
 }
 
 const RegisterInfo *
@@ -563,13 +395,13 @@ RegisterContextPOSIX_x86_64::GetRegister
 {
     // Commonly, this method is overridden and g_register_infos is copied and specialized.
     // So, use GetRegisterInfo() rather than g_register_infos in this scope.
-    return m_register_info_ap->GetRegisterInfo(g_register_infos);
+    return m_register_info_ap->GetRegisterInfo ();
 }
 
 const RegisterInfo *
 RegisterContextPOSIX_x86_64::GetRegisterInfoAtIndex(size_t reg)
 {
-    if (reg < k_num_registers)
+    if (reg < m_reg_info.num_registers)
         return &GetRegisterInfo()[reg];
     else
         return NULL;
@@ -580,8 +412,10 @@ RegisterContextPOSIX_x86_64::GetRegister
 {
     size_t sets = 0;
     for (size_t set = 0; set < k_num_register_sets; ++set)
+    {
         if (IsRegisterSetAvailable(set))
             ++sets;
+    }
 
     return sets;
 }
@@ -590,15 +424,27 @@ const RegisterSet *
 RegisterContextPOSIX_x86_64::GetRegisterSet(size_t set)
 {
     if (IsRegisterSetAvailable(set))
-        return &g_reg_sets[set];
-    else
-        return NULL;
+    {
+        switch (m_register_info_ap->m_target_arch.GetCore())
+        {
+            case ArchSpec::eCore_x86_32_i386:
+            case ArchSpec::eCore_x86_32_i486:
+            case ArchSpec::eCore_x86_32_i486sx:
+                return &g_reg_sets_i386[set];
+            case ArchSpec::eCore_x86_64_x86_64:
+                return &g_reg_sets_x86_64[set];
+            default:
+                assert(false && "Unhandled target architecture.");
+                return NULL;
+        }
+    }
+    return NULL;
 }
 
 const char *
 RegisterContextPOSIX_x86_64::GetRegisterName(unsigned reg)
 {
-    assert(reg < k_num_registers && "Invalid register offset.");
+    assert(reg < m_reg_info.num_registers && "Invalid register offset.");
     return GetRegisterInfo()[reg].name;
 }
 
@@ -622,24 +468,24 @@ bool RegisterContextPOSIX_x86_64::CopyYM
 
     if (byte_order == eByteOrderLittle)
     {
-      ::memcpy(m_fpr.xstate.fxsave.xmm[reg - fpu_ymm0].bytes,
-               m_ymm_set.ymm[reg - fpu_ymm0].bytes,
-               sizeof(RegisterContextPOSIX_x86_64::XMMReg));
-      ::memcpy(m_fpr.xstate.xsave.ymmh[reg - fpu_ymm0].bytes,
-               m_ymm_set.ymm[reg - fpu_ymm0].bytes + sizeof(RegisterContextPOSIX_x86_64::XMMReg),
-               sizeof(RegisterContextPOSIX_x86_64::YMMHReg));
-      return true;
+        ::memcpy(m_fpr.xstate.fxsave.xmm[reg - m_reg_info.first_ymm].bytes,
+                 m_ymm_set.ymm[reg - m_reg_info.first_ymm].bytes,
+                 sizeof(XMMReg));
+        ::memcpy(m_fpr.xstate.xsave.ymmh[reg - m_reg_info.first_ymm].bytes,
+                 m_ymm_set.ymm[reg - m_reg_info.first_ymm].bytes + sizeof(XMMReg),
+                 sizeof(YMMHReg));
+        return true;
     }
 
     if (byte_order == eByteOrderBig)
     {
-      ::memcpy(m_fpr.xstate.fxsave.xmm[reg - fpu_ymm0].bytes,
-               m_ymm_set.ymm[reg - fpu_ymm0].bytes + sizeof(RegisterContextPOSIX_x86_64::XMMReg),
-               sizeof(RegisterContextPOSIX_x86_64::XMMReg));
-      ::memcpy(m_fpr.xstate.xsave.ymmh[reg - fpu_ymm0].bytes,
-               m_ymm_set.ymm[reg - fpu_ymm0].bytes,
-               sizeof(RegisterContextPOSIX_x86_64::YMMHReg));
-      return true;
+        ::memcpy(m_fpr.xstate.fxsave.xmm[reg - m_reg_info.first_ymm].bytes,
+                 m_ymm_set.ymm[reg - m_reg_info.first_ymm].bytes + sizeof(XMMReg),
+                 sizeof(XMMReg));
+        ::memcpy(m_fpr.xstate.xsave.ymmh[reg - m_reg_info.first_ymm].bytes,
+                 m_ymm_set.ymm[reg - m_reg_info.first_ymm].bytes,
+                 sizeof(YMMHReg));
+        return true;
     }
     return false; // unsupported or invalid byte order
 }
@@ -652,23 +498,24 @@ bool RegisterContextPOSIX_x86_64::CopyXS
 
     if (byte_order == eByteOrderLittle)
     {
-      ::memcpy(m_ymm_set.ymm[reg - fpu_ymm0].bytes,
-               m_fpr.xstate.fxsave.xmm[reg - fpu_ymm0].bytes,
-               sizeof(RegisterContextPOSIX_x86_64::XMMReg));
-      ::memcpy(m_ymm_set.ymm[reg - fpu_ymm0].bytes + sizeof(RegisterContextPOSIX_x86_64::XMMReg),
-               m_fpr.xstate.xsave.ymmh[reg - fpu_ymm0].bytes,
-               sizeof(RegisterContextPOSIX_x86_64::YMMHReg));
-      return true;
+        ::memcpy(m_ymm_set.ymm[reg - m_reg_info.first_ymm].bytes,
+                 m_fpr.xstate.fxsave.xmm[reg - m_reg_info.first_ymm].bytes,
+                 sizeof(XMMReg));
+        ::memcpy(m_ymm_set.ymm[reg - m_reg_info.first_ymm].bytes + sizeof(XMMReg),
+                 m_fpr.xstate.xsave.ymmh[reg - m_reg_info.first_ymm].bytes,
+                 sizeof(YMMHReg));
+        return true;
     }
+
     if (byte_order == eByteOrderBig)
     {
-      ::memcpy(m_ymm_set.ymm[reg - fpu_ymm0].bytes + sizeof(RegisterContextPOSIX_x86_64::XMMReg),
-               m_fpr.xstate.fxsave.xmm[reg - fpu_ymm0].bytes,
-               sizeof(RegisterContextPOSIX_x86_64::XMMReg));
-      ::memcpy(m_ymm_set.ymm[reg - fpu_ymm0].bytes,
-               m_fpr.xstate.xsave.ymmh[reg - fpu_ymm0].bytes,
-               sizeof(RegisterContextPOSIX_x86_64::YMMHReg));
-      return true;
+        ::memcpy(m_ymm_set.ymm[reg - m_reg_info.first_ymm].bytes + sizeof(XMMReg),
+                 m_fpr.xstate.fxsave.xmm[reg - m_reg_info.first_ymm].bytes,
+                 sizeof(XMMReg));
+        ::memcpy(m_ymm_set.ymm[reg - m_reg_info.first_ymm].bytes,
+                 m_fpr.xstate.xsave.ymmh[reg - m_reg_info.first_ymm].bytes,
+                 sizeof(YMMHReg));
+        return true;
     }
     return false; // unsupported or invalid byte order
 }
@@ -678,304 +525,28 @@ RegisterContextPOSIX_x86_64::IsRegisterS
 {
     // Note: Extended register sets are assumed to be at the end of g_reg_sets...
     size_t num_sets = k_num_register_sets - k_num_extended_register_sets;
+
     if (GetFPRType() == eXSAVE) // ...and to start with AVX registers.
         ++num_sets;
-
     return (set_index < num_sets);
-}   
+}
+
 
+// Used when parsing DWARF and EH frame information and any other
+// object file sections that contain register numbers in them. 
 uint32_t
 RegisterContextPOSIX_x86_64::ConvertRegisterKindToRegisterNumber(uint32_t kind,
                                                                  uint32_t num)
 {
-    const Process *process = CalculateProcess().get();
-    if (process)
-    {
-        const ArchSpec arch = process->GetTarget().GetArchitecture();;
-        switch (arch.GetCore())
-        {
-        default:
-            assert(false && "CPU type not supported!");
-            break;
-
-        case ArchSpec::eCore_x86_32_i386:
-        case ArchSpec::eCore_x86_32_i486:
-        case ArchSpec::eCore_x86_32_i486sx:
-        {
-            if (kind == eRegisterKindGeneric)
-            {
-                switch (num)
-                {
-                case LLDB_REGNUM_GENERIC_PC:    return gpr_eip;
-                case LLDB_REGNUM_GENERIC_SP:    return gpr_esp;
-                case LLDB_REGNUM_GENERIC_FP:    return gpr_ebp;
-                case LLDB_REGNUM_GENERIC_FLAGS: return gpr_eflags;
-                case LLDB_REGNUM_GENERIC_RA:
-                default:
-                    return LLDB_INVALID_REGNUM;
-                }
-            }
-
-            if (kind == eRegisterKindGCC || kind == eRegisterKindDWARF)
-            {
-                switch (num)
-                {
-                case dwarf_eax:  return gpr_eax;
-                case dwarf_edx:  return gpr_edx;
-                case dwarf_ecx:  return gpr_ecx;
-                case dwarf_ebx:  return gpr_ebx;
-                case dwarf_esi:  return gpr_esi;
-                case dwarf_edi:  return gpr_edi;
-                case dwarf_ebp:  return gpr_ebp;
-                case dwarf_esp:  return gpr_esp;
-                case dwarf_eip:  return gpr_eip;
-                case dwarf_xmm0: return fpu_xmm0;
-                case dwarf_xmm1: return fpu_xmm1;
-                case dwarf_xmm2: return fpu_xmm2;
-                case dwarf_xmm3: return fpu_xmm3;
-                case dwarf_xmm4: return fpu_xmm4;
-                case dwarf_xmm5: return fpu_xmm5;
-                case dwarf_xmm6: return fpu_xmm6;
-                case dwarf_xmm7: return fpu_xmm7;
-                case dwarf_stmm0: return fpu_stmm0;
-                case dwarf_stmm1: return fpu_stmm1;
-                case dwarf_stmm2: return fpu_stmm2;
-                case dwarf_stmm3: return fpu_stmm3;
-                case dwarf_stmm4: return fpu_stmm4;
-                case dwarf_stmm5: return fpu_stmm5;
-                case dwarf_stmm6: return fpu_stmm6;
-                case dwarf_stmm7: return fpu_stmm7;
-                default:
-                    return LLDB_INVALID_REGNUM;
-                }
-            }
-
-            if (kind == eRegisterKindGDB)
-            {
-                switch (num)
-                {
-                case gdb_eax     : return gpr_eax;
-                case gdb_ebx     : return gpr_ebx;
-                case gdb_ecx     : return gpr_ecx;
-                case gdb_edx     : return gpr_edx;
-                case gdb_esi     : return gpr_esi;
-                case gdb_edi     : return gpr_edi;
-                case gdb_ebp     : return gpr_ebp;
-                case gdb_esp     : return gpr_esp;
-                case gdb_eip     : return gpr_eip;
-                case gdb_eflags  : return gpr_eflags;
-                case gdb_cs      : return gpr_cs;
-                case gdb_ss      : return gpr_ss;
-                case gdb_ds      : return gpr_ds;
-                case gdb_es      : return gpr_es;
-                case gdb_fs      : return gpr_fs;
-                case gdb_gs      : return gpr_gs;
-                case gdb_stmm0   : return fpu_stmm0;
-                case gdb_stmm1   : return fpu_stmm1;
-                case gdb_stmm2   : return fpu_stmm2;
-                case gdb_stmm3   : return fpu_stmm3;
-                case gdb_stmm4   : return fpu_stmm4;
-                case gdb_stmm5   : return fpu_stmm5;
-                case gdb_stmm6   : return fpu_stmm6;
-                case gdb_stmm7   : return fpu_stmm7;
-                case gdb_fcw     : return fpu_fcw;
-                case gdb_fsw     : return fpu_fsw;
-                case gdb_ftw     : return fpu_ftw;
-                case gdb_fpu_cs  : return fpu_cs;
-                case gdb_ip      : return fpu_ip;
-                case gdb_fpu_ds  : return fpu_ds; //fpu_fos
-                case gdb_dp      : return fpu_dp; //fpu_foo
-                case gdb_fop     : return fpu_fop;
-                case gdb_xmm0    : return fpu_xmm0;
-                case gdb_xmm1    : return fpu_xmm1;
-                case gdb_xmm2    : return fpu_xmm2;
-                case gdb_xmm3    : return fpu_xmm3;
-                case gdb_xmm4    : return fpu_xmm4;
-                case gdb_xmm5    : return fpu_xmm5;
-                case gdb_xmm6    : return fpu_xmm6;
-                case gdb_xmm7    : return fpu_xmm7;
-                case gdb_mxcsr   : return fpu_mxcsr;
-                default:
-                    return LLDB_INVALID_REGNUM;
-                }
-            }
-            else if (kind == eRegisterKindLLDB)
-            {
-                return num;
-            }
+    const uint32_t num_regs = GetRegisterCount();
 
-            break;
-        }
+    assert (kind < kNumRegisterKinds);
+    for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx)
+    {
+        const RegisterInfo *reg_info = GetRegisterInfoAtIndex (reg_idx);
 
-        case ArchSpec::eCore_x86_64_x86_64:
-        {
-            if (kind == eRegisterKindGeneric)
-            {
-                switch (num)
-                {
-                case LLDB_REGNUM_GENERIC_PC:    return gpr_rip;
-                case LLDB_REGNUM_GENERIC_SP:    return gpr_rsp;
-                case LLDB_REGNUM_GENERIC_FP:    return gpr_rbp;
-                case LLDB_REGNUM_GENERIC_FLAGS: return gpr_rflags;
-                case LLDB_REGNUM_GENERIC_RA:
-                default:
-                    return LLDB_INVALID_REGNUM;
-                }
-            }
-
-            if (kind == eRegisterKindGCC || kind == eRegisterKindDWARF)
-            {
-                switch (num)
-                {
-                case gcc_dwarf_gpr_rax:  return gpr_rax;
-                case gcc_dwarf_gpr_rdx:  return gpr_rdx;
-                case gcc_dwarf_gpr_rcx:  return gpr_rcx;
-                case gcc_dwarf_gpr_rbx:  return gpr_rbx;
-                case gcc_dwarf_gpr_rsi:  return gpr_rsi;
-                case gcc_dwarf_gpr_rdi:  return gpr_rdi;
-                case gcc_dwarf_gpr_rbp:  return gpr_rbp;
-                case gcc_dwarf_gpr_rsp:  return gpr_rsp;
-                case gcc_dwarf_gpr_r8:   return gpr_r8;
-                case gcc_dwarf_gpr_r9:   return gpr_r9;
-                case gcc_dwarf_gpr_r10:  return gpr_r10;
-                case gcc_dwarf_gpr_r11:  return gpr_r11;
-                case gcc_dwarf_gpr_r12:  return gpr_r12;
-                case gcc_dwarf_gpr_r13:  return gpr_r13;
-                case gcc_dwarf_gpr_r14:  return gpr_r14;
-                case gcc_dwarf_gpr_r15:  return gpr_r15;
-                case gcc_dwarf_gpr_rip:  return gpr_rip;
-                case gcc_dwarf_fpu_xmm0: return fpu_xmm0;
-                case gcc_dwarf_fpu_xmm1: return fpu_xmm1;
-                case gcc_dwarf_fpu_xmm2: return fpu_xmm2;
-                case gcc_dwarf_fpu_xmm3: return fpu_xmm3;
-                case gcc_dwarf_fpu_xmm4: return fpu_xmm4;
-                case gcc_dwarf_fpu_xmm5: return fpu_xmm5;
-                case gcc_dwarf_fpu_xmm6: return fpu_xmm6;
-                case gcc_dwarf_fpu_xmm7: return fpu_xmm7;
-                case gcc_dwarf_fpu_xmm8: return fpu_xmm8;
-                case gcc_dwarf_fpu_xmm9: return fpu_xmm9;
-                case gcc_dwarf_fpu_xmm10: return fpu_xmm10;
-                case gcc_dwarf_fpu_xmm11: return fpu_xmm11;
-                case gcc_dwarf_fpu_xmm12: return fpu_xmm12;
-                case gcc_dwarf_fpu_xmm13: return fpu_xmm13;
-                case gcc_dwarf_fpu_xmm14: return fpu_xmm14;
-                case gcc_dwarf_fpu_xmm15: return fpu_xmm15;
-                case gcc_dwarf_fpu_stmm0: return fpu_stmm0;
-                case gcc_dwarf_fpu_stmm1: return fpu_stmm1;
-                case gcc_dwarf_fpu_stmm2: return fpu_stmm2;
-                case gcc_dwarf_fpu_stmm3: return fpu_stmm3;
-                case gcc_dwarf_fpu_stmm4: return fpu_stmm4;
-                case gcc_dwarf_fpu_stmm5: return fpu_stmm5;
-                case gcc_dwarf_fpu_stmm6: return fpu_stmm6;
-                case gcc_dwarf_fpu_stmm7: return fpu_stmm7;
-                case gcc_dwarf_fpu_ymm0: return fpu_ymm0;
-                case gcc_dwarf_fpu_ymm1: return fpu_ymm1;
-                case gcc_dwarf_fpu_ymm2: return fpu_ymm2;
-                case gcc_dwarf_fpu_ymm3: return fpu_ymm3;
-                case gcc_dwarf_fpu_ymm4: return fpu_ymm4;
-                case gcc_dwarf_fpu_ymm5: return fpu_ymm5;
-                case gcc_dwarf_fpu_ymm6: return fpu_ymm6;
-                case gcc_dwarf_fpu_ymm7: return fpu_ymm7;
-                case gcc_dwarf_fpu_ymm8: return fpu_ymm8;
-                case gcc_dwarf_fpu_ymm9: return fpu_ymm9;
-                case gcc_dwarf_fpu_ymm10: return fpu_ymm10;
-                case gcc_dwarf_fpu_ymm11: return fpu_ymm11;
-                case gcc_dwarf_fpu_ymm12: return fpu_ymm12;
-                case gcc_dwarf_fpu_ymm13: return fpu_ymm13;
-                case gcc_dwarf_fpu_ymm14: return fpu_ymm14;
-                case gcc_dwarf_fpu_ymm15: return fpu_ymm15;
-                default:
-                    return LLDB_INVALID_REGNUM;
-                }
-            }
-
-            if (kind == eRegisterKindGDB)
-            {
-                switch (num)
-                {
-                case gdb_gpr_rax     : return gpr_rax;
-                case gdb_gpr_rbx     : return gpr_rbx;
-                case gdb_gpr_rcx     : return gpr_rcx;
-                case gdb_gpr_rdx     : return gpr_rdx;
-                case gdb_gpr_rsi     : return gpr_rsi;
-                case gdb_gpr_rdi     : return gpr_rdi;
-                case gdb_gpr_rbp     : return gpr_rbp;
-                case gdb_gpr_rsp     : return gpr_rsp;
-                case gdb_gpr_r8      : return gpr_r8;
-                case gdb_gpr_r9      : return gpr_r9;
-                case gdb_gpr_r10     : return gpr_r10;
-                case gdb_gpr_r11     : return gpr_r11;
-                case gdb_gpr_r12     : return gpr_r12;
-                case gdb_gpr_r13     : return gpr_r13;
-                case gdb_gpr_r14     : return gpr_r14;
-                case gdb_gpr_r15     : return gpr_r15;
-                case gdb_gpr_rip     : return gpr_rip;
-                case gdb_gpr_rflags  : return gpr_rflags;
-                case gdb_gpr_cs      : return gpr_cs;
-                case gdb_gpr_ss      : return gpr_ss;
-                case gdb_gpr_ds      : return gpr_ds;
-                case gdb_gpr_es      : return gpr_es;
-                case gdb_gpr_fs      : return gpr_fs;
-                case gdb_gpr_gs      : return gpr_gs;
-                case gdb_fpu_stmm0   : return fpu_stmm0;
-                case gdb_fpu_stmm1   : return fpu_stmm1;
-                case gdb_fpu_stmm2   : return fpu_stmm2;
-                case gdb_fpu_stmm3   : return fpu_stmm3;
-                case gdb_fpu_stmm4   : return fpu_stmm4;
-                case gdb_fpu_stmm5   : return fpu_stmm5;
-                case gdb_fpu_stmm6   : return fpu_stmm6;
-                case gdb_fpu_stmm7   : return fpu_stmm7;
-                case gdb_fpu_fcw     : return fpu_fcw;
-                case gdb_fpu_fsw     : return fpu_fsw;
-                case gdb_fpu_ftw     : return fpu_ftw;
-                case gdb_fpu_cs_64   : return fpu_cs;
-                case gdb_fpu_ip      : return fpu_ip;
-                case gdb_fpu_ds_64   : return fpu_ds;
-                case gdb_fpu_dp      : return fpu_dp;
-                case gdb_fpu_fop     : return fpu_fop;
-                case gdb_fpu_xmm0    : return fpu_xmm0;
-                case gdb_fpu_xmm1    : return fpu_xmm1;
-                case gdb_fpu_xmm2    : return fpu_xmm2;
-                case gdb_fpu_xmm3    : return fpu_xmm3;
-                case gdb_fpu_xmm4    : return fpu_xmm4;
-                case gdb_fpu_xmm5    : return fpu_xmm5;
-                case gdb_fpu_xmm6    : return fpu_xmm6;
-                case gdb_fpu_xmm7    : return fpu_xmm7;
-                case gdb_fpu_xmm8    : return fpu_xmm8;
-                case gdb_fpu_xmm9    : return fpu_xmm9;
-                case gdb_fpu_xmm10   : return fpu_xmm10;
-                case gdb_fpu_xmm11   : return fpu_xmm11;
-                case gdb_fpu_xmm12   : return fpu_xmm12;
-                case gdb_fpu_xmm13   : return fpu_xmm13;
-                case gdb_fpu_xmm14   : return fpu_xmm14;
-                case gdb_fpu_xmm15   : return fpu_xmm15;
-                case gdb_fpu_mxcsr   : return fpu_mxcsr;
-                case gdb_fpu_ymm0    : return fpu_ymm0;
-                case gdb_fpu_ymm1    : return fpu_ymm1;
-                case gdb_fpu_ymm2    : return fpu_ymm2;
-                case gdb_fpu_ymm3    : return fpu_ymm3;
-                case gdb_fpu_ymm4    : return fpu_ymm4;
-                case gdb_fpu_ymm5    : return fpu_ymm5;
-                case gdb_fpu_ymm6    : return fpu_ymm6;
-                case gdb_fpu_ymm7    : return fpu_ymm7;
-                case gdb_fpu_ymm8    : return fpu_ymm8;
-                case gdb_fpu_ymm9    : return fpu_ymm9;
-                case gdb_fpu_ymm10   : return fpu_ymm10;
-                case gdb_fpu_ymm11   : return fpu_ymm11;
-                case gdb_fpu_ymm12   : return fpu_ymm12;
-                case gdb_fpu_ymm13   : return fpu_ymm13;
-                case gdb_fpu_ymm14   : return fpu_ymm14;
-                case gdb_fpu_ymm15   : return fpu_ymm15;
-                default:
-                    return LLDB_INVALID_REGNUM;
-                }
-            }
-            else if (kind == eRegisterKindLLDB)
-            {
-                return num;
-            }
-        }
-        }
+        if (reg_info->kinds[kind] == num)
+            return reg_idx;
     }
 
     return LLDB_INVALID_REGNUM;

Modified: lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIX_x86_64.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIX_x86_64.h?rev=192263&r1=192262&r2=192263&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIX_x86_64.h (original)
+++ lldb/trunk/source/Plugins/Process/POSIX/RegisterContextPOSIX_x86_64.h Tue Oct  8 20:28:57 2013
@@ -12,119 +12,175 @@
 
 #include "lldb/Core/Log.h"
 #include "RegisterContextPOSIX.h"
+#include "RegisterContext_x86.h"
 
 class ProcessMonitor;
 
+//---------------------------------------------------------------------------
 // Internal codes for all x86_64 registers.
+//---------------------------------------------------------------------------
 enum
 {
-    k_first_gpr,
-    gpr_rax = k_first_gpr,
-    gpr_rbx,
-    gpr_rcx,
-    gpr_rdx,
-    gpr_rdi,
-    gpr_rsi,
-    gpr_rbp,
-    gpr_rsp,
-    gpr_r8,
-    gpr_r9,
-    gpr_r10,
-    gpr_r11,
-    gpr_r12,
-    gpr_r13,
-    gpr_r14,
-    gpr_r15,
-    gpr_rip,
-    gpr_rflags,
-    gpr_cs,
-    gpr_fs,
-    gpr_gs,
-    gpr_ss,
-    gpr_ds,
-    gpr_es,
-    k_first_i386,
-    gpr_eax = k_first_i386,
-    gpr_ebx,
-    gpr_ecx,
-    gpr_edx,
-    gpr_edi,
-    gpr_esi,
-    gpr_ebp,
-    gpr_esp,
-    gpr_eip,
-    gpr_eflags, // eRegisterKindLLDB == 33
-    k_last_i386 = gpr_eflags,
-    k_last_gpr = gpr_eflags,
-
-    k_first_fpr,
-    fpu_fcw = k_first_fpr,
-    fpu_fsw,
-    fpu_ftw,
-    fpu_fop,
-    fpu_ip,
-    fpu_cs,
-    fpu_dp,
-    fpu_ds,
-    fpu_mxcsr,
-    fpu_mxcsrmask,
-    fpu_stmm0,
-    fpu_stmm1,
-    fpu_stmm2,
-    fpu_stmm3,
-    fpu_stmm4,
-    fpu_stmm5,
-    fpu_stmm6,
-    fpu_stmm7,
-    fpu_xmm0,
-    fpu_xmm1,
-    fpu_xmm2,
-    fpu_xmm3,
-    fpu_xmm4,
-    fpu_xmm5,
-    fpu_xmm6,
-    fpu_xmm7,
-    fpu_xmm8,
-    fpu_xmm9,
-    fpu_xmm10,
-    fpu_xmm11,
-    fpu_xmm12,
-    fpu_xmm13,
-    fpu_xmm14,
-    fpu_xmm15,
-    k_last_fpr = fpu_xmm15,
-    k_first_avx,
-    fpu_ymm0 = k_first_avx,
-    fpu_ymm1,
-    fpu_ymm2,
-    fpu_ymm3,
-    fpu_ymm4,
-    fpu_ymm5,
-    fpu_ymm6,
-    fpu_ymm7,
-    fpu_ymm8,
-    fpu_ymm9,
-    fpu_ymm10,
-    fpu_ymm11,
-    fpu_ymm12,
-    fpu_ymm13,
-    fpu_ymm14,
-    fpu_ymm15,
-    k_last_avx = fpu_ymm15,
-
-    dr0,
-    dr1,
-    dr2,
-    dr3,
-    dr4,
-    dr5,
-    dr6,
-    dr7,
-
-    k_num_registers,
-    k_num_gpr_registers = k_last_gpr - k_first_gpr + 1,
-    k_num_fpr_registers = k_last_fpr - k_first_fpr + 1,
-    k_num_avx_registers = k_last_avx - k_first_avx + 1
+    k_first_gpr_x86_64,
+    gpr_rax_x86_64 = k_first_gpr_x86_64,
+    gpr_rbx_x86_64,
+    gpr_rcx_x86_64,
+    gpr_rdx_x86_64,
+    gpr_rdi_x86_64,
+    gpr_rsi_x86_64,
+    gpr_rbp_x86_64,
+    gpr_rsp_x86_64,
+    gpr_r8_x86_64,
+    gpr_r9_x86_64,
+    gpr_r10_x86_64,
+    gpr_r11_x86_64,
+    gpr_r12_x86_64,
+    gpr_r13_x86_64,
+    gpr_r14_x86_64,
+    gpr_r15_x86_64,
+    gpr_rip_x86_64,
+    gpr_rflags_x86_64,
+    gpr_cs_x86_64,
+    gpr_fs_x86_64,
+    gpr_gs_x86_64,
+    gpr_ss_x86_64,
+    gpr_ds_x86_64,
+    gpr_es_x86_64,
+
+    k_first_alias_x86_64,
+    gpr_eax_x86_64 = k_first_alias_x86_64,
+    gpr_ebx_x86_64,
+    gpr_ecx_x86_64,
+    gpr_edx_x86_64,
+    gpr_edi_x86_64,
+    gpr_esi_x86_64,
+    gpr_ebp_x86_64,
+    gpr_esp_x86_64,
+    gpr_r8d_x86_64,    // Low 32 bits of r8
+    gpr_r9d_x86_64,    // Low 32 bits of r9
+    gpr_r10d_x86_64,   // Low 32 bits of r10
+    gpr_r11d_x86_64,   // Low 32 bits of r11
+    gpr_r12d_x86_64,   // Low 32 bits of r12
+    gpr_r13d_x86_64,   // Low 32 bits of r13
+    gpr_r14d_x86_64,   // Low 32 bits of r14
+    gpr_r15d_x86_64,   // Low 32 bits of r15
+    gpr_ax_x86_64,
+    gpr_bx_x86_64,
+    gpr_cx_x86_64,
+    gpr_dx_x86_64,
+    gpr_di_x86_64,
+    gpr_si_x86_64,
+    gpr_bp_x86_64,
+    gpr_sp_x86_64,
+    gpr_r8w_x86_64,    // Low 16 bits of r8
+    gpr_r9w_x86_64,    // Low 16 bits of r9
+    gpr_r10w_x86_64,   // Low 16 bits of r10
+    gpr_r11w_x86_64,   // Low 16 bits of r11
+    gpr_r12w_x86_64,   // Low 16 bits of r12
+    gpr_r13w_x86_64,   // Low 16 bits of r13
+    gpr_r14w_x86_64,   // Low 16 bits of r14
+    gpr_r15w_x86_64,   // Low 16 bits of r15
+    gpr_ah_x86_64,
+    gpr_bh_x86_64,
+    gpr_ch_x86_64,
+    gpr_dh_x86_64,
+    gpr_al_x86_64,
+    gpr_bl_x86_64,
+    gpr_cl_x86_64,
+    gpr_dl_x86_64,
+    gpr_dil_x86_64,
+    gpr_sil_x86_64,
+    gpr_bpl_x86_64,
+    gpr_spl_x86_64,
+    gpr_r8l_x86_64,    // Low 8 bits of r8
+    gpr_r9l_x86_64,    // Low 8 bits of r9
+    gpr_r10l_x86_64,   // Low 8 bits of r10
+    gpr_r11l_x86_64,   // Low 8 bits of r11
+    gpr_r12l_x86_64,   // Low 8 bits of r12
+    gpr_r13l_x86_64,   // Low 8 bits of r13
+    gpr_r14l_x86_64,   // Low 8 bits of r14
+    gpr_r15l_x86_64,   // Low 8 bits of r15
+    k_last_alias_x86_64 = gpr_r15l_x86_64,
+
+    k_last_gpr_x86_64 = k_last_alias_x86_64,
+
+    k_first_fpr_x86_64,
+    fpu_fctrl_x86_64 = k_first_fpr_x86_64,
+    fpu_fstat_x86_64,
+    fpu_ftag_x86_64,
+    fpu_fop_x86_64,
+    fpu_fiseg_x86_64,
+    fpu_fioff_x86_64,
+    fpu_foseg_x86_64,
+    fpu_fooff_x86_64,
+    fpu_mxcsr_x86_64,
+    fpu_mxcsrmask_x86_64,
+    fpu_st0_x86_64,
+    fpu_st1_x86_64,
+    fpu_st2_x86_64,
+    fpu_st3_x86_64,
+    fpu_st4_x86_64,
+    fpu_st5_x86_64,
+    fpu_st6_x86_64,
+    fpu_st7_x86_64,
+    fpu_mm0_x86_64,
+    fpu_mm1_x86_64,
+    fpu_mm2_x86_64,
+    fpu_mm3_x86_64,
+    fpu_mm4_x86_64,
+    fpu_mm5_x86_64,
+    fpu_mm6_x86_64,
+    fpu_mm7_x86_64,
+    fpu_xmm0_x86_64,
+    fpu_xmm1_x86_64,
+    fpu_xmm2_x86_64,
+    fpu_xmm3_x86_64,
+    fpu_xmm4_x86_64,
+    fpu_xmm5_x86_64,
+    fpu_xmm6_x86_64,
+    fpu_xmm7_x86_64,
+    fpu_xmm8_x86_64,
+    fpu_xmm9_x86_64,
+    fpu_xmm10_x86_64,
+    fpu_xmm11_x86_64,
+    fpu_xmm12_x86_64,
+    fpu_xmm13_x86_64,
+    fpu_xmm14_x86_64,
+    fpu_xmm15_x86_64,
+    k_last_fpr_x86_64 = fpu_xmm15_x86_64,
+
+    k_first_avx_x86_64,
+    fpu_ymm0_x86_64 = k_first_avx_x86_64,
+    fpu_ymm1_x86_64,
+    fpu_ymm2_x86_64,
+    fpu_ymm3_x86_64,
+    fpu_ymm4_x86_64,
+    fpu_ymm5_x86_64,
+    fpu_ymm6_x86_64,
+    fpu_ymm7_x86_64,
+    fpu_ymm8_x86_64,
+    fpu_ymm9_x86_64,
+    fpu_ymm10_x86_64,
+    fpu_ymm11_x86_64,
+    fpu_ymm12_x86_64,
+    fpu_ymm13_x86_64,
+    fpu_ymm14_x86_64,
+    fpu_ymm15_x86_64,
+    k_last_avx_x86_64 = fpu_ymm15_x86_64,
+
+    dr0_x86_64,
+    dr1_x86_64,
+    dr2_x86_64,
+    dr3_x86_64,
+    dr4_x86_64,
+    dr5_x86_64,
+    dr6_x86_64,
+    dr7_x86_64,
+
+    k_num_registers_x86_64,
+    k_num_gpr_registers_x86_64 = k_last_gpr_x86_64 - k_first_gpr_x86_64 + 1,
+    k_num_fpr_registers_x86_64 = k_last_fpr_x86_64 - k_first_fpr_x86_64 + 1,
+    k_num_avx_registers_x86_64 = k_last_avx_x86_64 - k_first_avx_x86_64 + 1
 };
 
 class RegisterContextPOSIX_x86_64
@@ -171,76 +227,6 @@ public:
     ConvertRegisterKindToRegisterNumber(uint32_t kind, uint32_t num);
 
     //---------------------------------------------------------------------------
-    // Generic floating-point registers
-    //---------------------------------------------------------------------------
-
-    struct MMSReg
-    {
-        uint8_t bytes[10];
-        uint8_t pad[6];
-    };
-
-    struct XMMReg
-    {
-        uint8_t bytes[16]; // 128-bits for each XMM register
-    };
-
-    struct FXSAVE
-    {
-        uint16_t fcw;
-        uint16_t fsw;
-        uint16_t ftw;
-        uint16_t fop;
-        uint64_t ip;
-        uint64_t dp;
-        uint32_t mxcsr;
-        uint32_t mxcsrmask;
-        MMSReg   stmm[8];
-        XMMReg   xmm[16];
-        uint32_t padding[24];
-    };
-
-    //---------------------------------------------------------------------------
-    // Extended floating-point registers
-    //---------------------------------------------------------------------------
-    struct YMMHReg
-    {
-        uint8_t  bytes[16];     // 16 * 8 bits for the high bytes of each YMM register
-    };
-
-    struct YMMReg
-    {
-        uint8_t  bytes[32];     // 16 * 16 bits for each YMM register
-    };
-
-    struct YMM
-    {
-        YMMReg   ymm[16];       // assembled from ymmh and xmm registers
-    };
-
-    struct XSAVE_HDR
-    {
-        uint64_t  xstate_bv;    // OS enabled xstate mask to determine the extended states supported by the processor
-        uint64_t  reserved1[2];
-        uint64_t  reserved2[5];
-    } __attribute__((packed));
-
-    // x86 extensions to FXSAVE (i.e. for AVX processors) 
-    struct XSAVE 
-    {
-        FXSAVE    i387;         // floating point registers typical in i387_fxsave_struct
-        XSAVE_HDR header;       // The xsave_hdr_struct can be used to determine if the following extensions are usable
-        YMMHReg   ymmh[16];     // High 16 bytes of each of 16 YMM registers (the low bytes are in FXSAVE.xmm for compatibility with SSE)
-        // Slot any extensions to the register file here
-    } __attribute__((packed, aligned (64)));
-
-    struct IOVEC
-    {
-        void    *iov_base;      // pointer to XSAVE
-        size_t   iov_len;       // sizeof(XSAVE)
-    };
-
-    //---------------------------------------------------------------------------
     // Note: prefer kernel definitions over user-land
     //---------------------------------------------------------------------------
     enum FPRType
@@ -252,18 +238,73 @@ public:
         eXSAVE
     };
 
-    // Floating-point registers
-    struct FPR
+    static uint32_t g_contained_rax[];
+    static uint32_t g_contained_rbx[];
+    static uint32_t g_contained_rcx[];
+    static uint32_t g_contained_rdx[];
+    static uint32_t g_contained_rdi[];
+    static uint32_t g_contained_rsi[];
+    static uint32_t g_contained_rbp[];
+    static uint32_t g_contained_rsp[];
+    static uint32_t g_contained_r8[];
+    static uint32_t g_contained_r9[];
+    static uint32_t g_contained_r10[];
+    static uint32_t g_contained_r11[];
+    static uint32_t g_contained_r12[];
+    static uint32_t g_contained_r13[];
+    static uint32_t g_contained_r14[];
+    static uint32_t g_contained_r15[];
+
+    static uint32_t g_invalidate_rax[];
+    static uint32_t g_invalidate_rbx[];
+    static uint32_t g_invalidate_rcx[];
+    static uint32_t g_invalidate_rdx[];
+    static uint32_t g_invalidate_rdi[];
+    static uint32_t g_invalidate_rsi[];
+    static uint32_t g_invalidate_rbp[];
+    static uint32_t g_invalidate_rsp[];
+    static uint32_t g_invalidate_r8[];
+    static uint32_t g_invalidate_r9[];
+    static uint32_t g_invalidate_r10[];
+    static uint32_t g_invalidate_r11[];
+    static uint32_t g_invalidate_r12[];
+    static uint32_t g_invalidate_r13[];
+    static uint32_t g_invalidate_r14[];
+    static uint32_t g_invalidate_r15[];
+
+protected:
+    struct RegInfo
     {
-        // Thread state for the floating-point unit of the processor read by ptrace.
-        union XSTATE
-        {
-            FXSAVE   fxsave;    // Generic floating-point registers.
-            XSAVE    xsave;     // x86 extended processor state.
-        } xstate;
+        uint32_t num_registers;
+        uint32_t num_gpr_registers;
+        uint32_t num_fpr_registers;
+        uint32_t num_avx_registers;
+
+        uint32_t last_gpr;
+        uint32_t first_fpr;
+        uint32_t last_fpr;
+
+        uint32_t first_st;
+        uint32_t last_st;
+        uint32_t first_mm;
+        uint32_t last_mm;
+        uint32_t first_xmm;
+        uint32_t last_xmm;
+        uint32_t first_ymm;
+        uint32_t last_ymm;
+
+        uint32_t first_dr;
+        uint32_t gpr_flags;
     };
 
-protected:
+    uint64_t m_gpr_x86_64[k_num_gpr_registers_x86_64];    // 64-bitgeneral purpose registers.
+    RegInfo  m_reg_info;
+    FPRType  m_fpr_type;                                       // determines the type of data stored by union FPR, if any.
+    FPR      m_fpr;                                            // floating-point registers including extended register sets.
+    IOVEC    m_iovec;                                          // wrapper for xsave.
+    YMM      m_ymm_set;                                        // copy of ymmh and xmm register halves.
+    std::unique_ptr<RegisterInfoInterface> m_register_info_ap; // Register Info Interface (FreeBSD or Linux)
+
     // Determines if an extended register set is supported on the processor running the inferior process.
     virtual bool
     IsRegisterSetAvailable(size_t set_index);
@@ -271,22 +312,15 @@ protected:
     virtual const lldb_private::RegisterInfo *
     GetRegisterInfo();
 
-    static bool
+    bool
     IsGPR(unsigned reg);
 
-    static bool
+    bool
     IsFPR(unsigned reg);
 
-    static bool
+    bool
     IsAVX(unsigned reg);
 
-    uint64_t m_gpr[k_num_gpr_registers];                       // general purpose registers.
-    FPRType  m_fpr_type;                                       // determines the type of data stored by union FPR, if any.
-    FPR      m_fpr;                                            // floating-point registers including extended register sets.
-    IOVEC    m_iovec;                                          // wrapper for xsave.
-    YMM      m_ymm_set;                                        // copy of ymmh and xmm register halves.
-    std::unique_ptr<RegisterInfoInterface> m_register_info_ap; // Register Info Interface (FreeBSD or Linux)
-
     lldb::ByteOrder GetByteOrder();
 
     bool CopyXSTATEtoYMM(uint32_t reg, lldb::ByteOrder byte_order);

Modified: lldb/trunk/source/Plugins/Process/POSIX/RegisterContext_x86.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/POSIX/RegisterContext_x86.h?rev=192263&r1=192262&r2=192263&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/POSIX/RegisterContext_x86.h (original)
+++ lldb/trunk/source/Plugins/Process/POSIX/RegisterContext_x86.h Tue Oct  8 20:28:57 2013
@@ -1,4 +1,4 @@
-//===-- RegisterContext_x86.h ---------------------------*- C++ -*-===//
+//===-- RegisterContext_x86.h -----------------------------------*- C++ -*-===//
 //
 //                     The LLVM Compiler Infrastructure
 //
@@ -10,101 +10,470 @@
 #ifndef liblldb_RegisterContext_x86_H_
 #define liblldb_RegisterContext_x86_H_
 
+//---------------------------------------------------------------------------
+// i386 gcc, dwarf, gdb enums
+//---------------------------------------------------------------------------
+
+// Register numbers seen in eh_frame (eRegisterKindGCC)
+//
+// From Jason Molenda: "gcc registers" is the register numbering used in the eh_frame
+// CFI.  The only registers that are described in eh_frame CFI are those that are
+// preserved across function calls aka callee-saved aka non-volatile.  And none
+// of the floating point registers on x86 are preserved across function calls.
+//
+// The only reason there is a "gcc register" and a "dwarf register" is because of a
+// mistake years and years ago with i386 where they got esp and ebp
+// backwards when they emitted the eh_frame instructions.  Once there were
+// binaries In The Wild using the reversed numbering, we had to stick with it
+// forever.
+enum
+{
+    // 2nd parameter in DwarfRegNum() is regnum for exception handling on x86-32.
+    // See http://llvm.org/docs/WritingAnLLVMBackend.html#defining-a-register
+    gcc_eax_i386 = 0,
+    gcc_ecx_i386,
+    gcc_edx_i386,
+    gcc_ebx_i386,
+    gcc_ebp_i386, // Warning: these are switched from dwarf values
+    gcc_esp_i386, //
+    gcc_esi_i386,
+    gcc_edi_i386,
+    gcc_eip_i386,
+    gcc_eflags_i386,
+    gcc_st0_i386 = 12,
+    gcc_st1_i386,
+    gcc_st2_i386,
+    gcc_st3_i386,
+    gcc_st4_i386,
+    gcc_st5_i386,
+    gcc_st6_i386,
+    gcc_st7_i386,
+    gcc_xmm0_i386 = 21,
+    gcc_xmm1_i386,
+    gcc_xmm2_i386,
+    gcc_xmm3_i386,
+    gcc_xmm4_i386,
+    gcc_xmm5_i386,
+    gcc_xmm6_i386,
+    gcc_xmm7_i386,
+    gcc_mm0_i386 = 29,
+    gcc_mm1_i386,
+    gcc_mm2_i386,
+    gcc_mm3_i386,
+    gcc_mm4_i386,
+    gcc_mm5_i386,
+    gcc_mm6_i386,
+    gcc_mm7_i386,
+};
+
+// DWARF register numbers (eRegisterKindDWARF)
+// Intel's x86 or IA-32
 enum
 {
-    gcc_eax = 0,
-    gcc_ecx,
-    gcc_edx,
-    gcc_ebx,
-    gcc_ebp,
-    gcc_esp,
-    gcc_esi,
-    gcc_edi,
-    gcc_eip,
-    gcc_eflags
+    // General Purpose Registers.
+    dwarf_eax_i386 = 0,
+    dwarf_ecx_i386,
+    dwarf_edx_i386,
+    dwarf_ebx_i386,
+    dwarf_esp_i386,
+    dwarf_ebp_i386,
+    dwarf_esi_i386,
+    dwarf_edi_i386,
+    dwarf_eip_i386,
+    dwarf_eflags_i386,
+    // Floating Point Registers
+    dwarf_st0_i386 = 11,
+    dwarf_st1_i386,
+    dwarf_st2_i386,
+    dwarf_st3_i386,
+    dwarf_st4_i386,
+    dwarf_st5_i386,
+    dwarf_st6_i386,
+    dwarf_st7_i386,
+    // SSE Registers
+    dwarf_xmm0_i386 = 21,
+    dwarf_xmm1_i386,
+    dwarf_xmm2_i386,
+    dwarf_xmm3_i386,
+    dwarf_xmm4_i386,
+    dwarf_xmm5_i386,
+    dwarf_xmm6_i386,
+    dwarf_xmm7_i386,
+    // MMX Registers
+    dwarf_mm0_i386 = 29,
+    dwarf_mm1_i386,
+    dwarf_mm2_i386,
+    dwarf_mm3_i386,
+    dwarf_mm4_i386,
+    dwarf_mm5_i386,
+    dwarf_mm6_i386,
+    dwarf_mm7_i386,
+    dwarf_fctrl_i386 = 37, // x87 control word
+    dwarf_fstat_i386 = 38, // x87 status word
+    dwarf_mxcsr_i386 = 39,
+    dwarf_es_i386 = 40,
+    dwarf_cs_i386 = 41,
+    dwarf_ss_i386 = 42,
+    dwarf_ds_i386 = 43,
+    dwarf_fs_i386 = 44,
+    dwarf_gs_i386 = 45
+
+    // I believe the ymm registers use the dwarf_xmm%_i386 register numbers and
+    //  then differentiate based on size of the register.
 };
 
+// Register numbers GDB uses (eRegisterKindGDB)
+//
+// From Jason Molenda: The "gdb numbers" are what you would see in the stabs debug format.
 enum
 {
-    dwarf_eax = 0,
-    dwarf_ecx,
-    dwarf_edx,
-    dwarf_ebx,
-    dwarf_esp,
-    dwarf_ebp,
-    dwarf_esi,
-    dwarf_edi,
-    dwarf_eip,
-    dwarf_eflags,
-    dwarf_stmm0 = 11,
-    dwarf_stmm1,
-    dwarf_stmm2,
-    dwarf_stmm3,
-    dwarf_stmm4,
-    dwarf_stmm5,
-    dwarf_stmm6,
-    dwarf_stmm7,
-    dwarf_xmm0 = 21,
-    dwarf_xmm1,
-    dwarf_xmm2,
-    dwarf_xmm3,
-    dwarf_xmm4,
-    dwarf_xmm5,
-    dwarf_xmm6,
-    dwarf_xmm7
+    gdb_eax_i386,
+    gdb_ecx_i386,
+    gdb_edx_i386,
+    gdb_ebx_i386,
+    gdb_esp_i386,
+    gdb_ebp_i386,
+    gdb_esi_i386,
+    gdb_edi_i386,
+    gdb_eip_i386,
+    gdb_eflags_i386,
+    gdb_cs_i386,
+    gdb_ss_i386,
+    gdb_ds_i386,
+    gdb_es_i386,
+    gdb_fs_i386,
+    gdb_gs_i386,
+    gdb_st0_i386 = 16,
+    gdb_st1_i386,
+    gdb_st2_i386,
+    gdb_st3_i386,
+    gdb_st4_i386,
+    gdb_st5_i386,
+    gdb_st6_i386,
+    gdb_st7_i386,
+    gdb_fctrl_i386, // FPU Control Word
+    gdb_fstat_i386, // FPU Status Word
+    gdb_ftag_i386,  // FPU Tag Word
+    gdb_fiseg_i386, // FPU IP Selector 
+    gdb_fioff_i386, // FPU IP Offset
+    gdb_foseg_i386, // FPU Operand Pointer Selector
+    gdb_fooff_i386, // FPU Operand Pointer Offset
+    gdb_fop_i386,   // Last Instruction Opcode
+    gdb_xmm0_i386 = 32,
+    gdb_xmm1_i386,
+    gdb_xmm2_i386,
+    gdb_xmm3_i386,
+    gdb_xmm4_i386,
+    gdb_xmm5_i386,
+    gdb_xmm6_i386,
+    gdb_xmm7_i386,
+    gdb_mxcsr_i386 = 40,
+    gdb_ymm0h_i386,
+    gdb_ymm1h_i386,
+    gdb_ymm2h_i386,
+    gdb_ymm3h_i386,
+    gdb_ymm4h_i386,
+    gdb_ymm5h_i386,
+    gdb_ymm6h_i386,
+    gdb_ymm7h_i386,
+    gdb_mm0_i386,
+    gdb_mm1_i386,
+    gdb_mm2_i386,
+    gdb_mm3_i386,
+    gdb_mm4_i386,
+    gdb_mm5_i386,
+    gdb_mm6_i386,
+    gdb_mm7_i386,
 };
 
+//---------------------------------------------------------------------------
+// AMD x86_64, AMD64, Intel EM64T, or Intel 64 gcc, dwarf, gdb enums
+//---------------------------------------------------------------------------
+
+// GCC and DWARF Register numbers (eRegisterKindGCC & eRegisterKindDWARF)
+//  This is the spec I used (as opposed to x86-64-abi-0.99.pdf):
+//  http://software.intel.com/sites/default/files/article/402129/mpx-linux64-abi.pdf
 enum
 {
-    gdb_eax        =  0,
-    gdb_ecx        =  1,
-    gdb_edx        =  2,
-    gdb_ebx        =  3,
-    gdb_esp        =  4,
-    gdb_ebp        =  5,
-    gdb_esi        =  6,
-    gdb_edi        =  7,
-    gdb_eip        =  8,
-    gdb_eflags     =  9,
-    gdb_cs         = 10,
-    gdb_ss         = 11,
-    gdb_ds         = 12,
-    gdb_es         = 13,
-    gdb_fs         = 14,
-    gdb_gs         = 15,
-    gdb_stmm0      = 16,
-    gdb_stmm1      = 17,
-    gdb_stmm2      = 18,
-    gdb_stmm3      = 19,
-    gdb_stmm4      = 20,
-    gdb_stmm5      = 21,
-    gdb_stmm6      = 22,
-    gdb_stmm7      = 23,
-    gdb_fcw        = 24,
-    gdb_fsw        = 25,
-    gdb_ftw        = 26,
-    gdb_fpu_cs     = 27,
-    gdb_ip         = 28,
-    gdb_fpu_ds     = 29,
-    gdb_dp         = 30,
-    gdb_fop        = 31,
-    gdb_xmm0       = 32,
-    gdb_xmm1       = 33,
-    gdb_xmm2       = 34,
-    gdb_xmm3       = 35,
-    gdb_xmm4       = 36,
-    gdb_xmm5       = 37,
-    gdb_xmm6       = 38,
-    gdb_xmm7       = 39,
-    gdb_mxcsr      = 40,
-    gdb_mm0        = 41,
-    gdb_mm1        = 42,
-    gdb_mm2        = 43,
-    gdb_mm3        = 44,
-    gdb_mm4        = 45,
-    gdb_mm5        = 46,
-    gdb_mm6        = 47,
-    gdb_mm7        = 48
+    // GP Registers
+    gcc_dwarf_rax_x86_64 = 0,
+    gcc_dwarf_rdx_x86_64,
+    gcc_dwarf_rcx_x86_64,
+    gcc_dwarf_rbx_x86_64,
+    gcc_dwarf_rsi_x86_64,
+    gcc_dwarf_rdi_x86_64,
+    gcc_dwarf_rbp_x86_64,
+    gcc_dwarf_rsp_x86_64,
+    // Extended GP Registers
+    gcc_dwarf_r8_x86_64 = 8,
+    gcc_dwarf_r9_x86_64,
+    gcc_dwarf_r10_x86_64,
+    gcc_dwarf_r11_x86_64,
+    gcc_dwarf_r12_x86_64,
+    gcc_dwarf_r13_x86_64,
+    gcc_dwarf_r14_x86_64,
+    gcc_dwarf_r15_x86_64,
+    // Return Address (RA) mapped to RIP
+    gcc_dwarf_rip_x86_64 = 16,
+    // SSE Vector Registers
+    gcc_dwarf_xmm0_x86_64 = 17,
+    gcc_dwarf_xmm1_x86_64,
+    gcc_dwarf_xmm2_x86_64,
+    gcc_dwarf_xmm3_x86_64,
+    gcc_dwarf_xmm4_x86_64,
+    gcc_dwarf_xmm5_x86_64,
+    gcc_dwarf_xmm6_x86_64,
+    gcc_dwarf_xmm7_x86_64,
+    gcc_dwarf_xmm8_x86_64,
+    gcc_dwarf_xmm9_x86_64,
+    gcc_dwarf_xmm10_x86_64,
+    gcc_dwarf_xmm11_x86_64,
+    gcc_dwarf_xmm12_x86_64,
+    gcc_dwarf_xmm13_x86_64,
+    gcc_dwarf_xmm14_x86_64,
+    gcc_dwarf_xmm15_x86_64,
+    // Floating Point Registers
+    gcc_dwarf_st0_x86_64 = 33,
+    gcc_dwarf_st1_x86_64,
+    gcc_dwarf_st2_x86_64,
+    gcc_dwarf_st3_x86_64,
+    gcc_dwarf_st4_x86_64,
+    gcc_dwarf_st5_x86_64,
+    gcc_dwarf_st6_x86_64,
+    gcc_dwarf_st7_x86_64,
+    // MMX Registers
+    gcc_dwarf_mm0_x86_64 = 41,
+    gcc_dwarf_mm1_x86_64,
+    gcc_dwarf_mm2_x86_64,
+    gcc_dwarf_mm3_x86_64,
+    gcc_dwarf_mm4_x86_64,
+    gcc_dwarf_mm5_x86_64,
+    gcc_dwarf_mm6_x86_64,
+    gcc_dwarf_mm7_x86_64,
+    // Control and Status Flags Register
+    gcc_dwarf_rflags_x86_64 = 49,
+    //  selector registers
+    gcc_dwarf_es_x86_64 = 50,
+    gcc_dwarf_cs_x86_64,
+    gcc_dwarf_ss_x86_64,
+    gcc_dwarf_ds_x86_64,
+    gcc_dwarf_fs_x86_64,
+    gcc_dwarf_gs_x86_64,
+    // Floating point control registers
+    gcc_dwarf_mxcsr_x86_64 = 64, // Media Control and Status
+    gcc_dwarf_fctrl_x86_64,      // x87 control word
+    gcc_dwarf_fstat_x86_64,      // x87 status word
+    // Upper Vector Registers    
+    gcc_dwarf_ymm0h_x86_64 = 67,
+    gcc_dwarf_ymm1h_x86_64,
+    gcc_dwarf_ymm2h_x86_64,
+    gcc_dwarf_ymm3h_x86_64,
+    gcc_dwarf_ymm4h_x86_64,
+    gcc_dwarf_ymm5h_x86_64,
+    gcc_dwarf_ymm6h_x86_64,
+    gcc_dwarf_ymm7h_x86_64,
+    gcc_dwarf_ymm8h_x86_64,
+    gcc_dwarf_ymm9h_x86_64,
+    gcc_dwarf_ymm10h_x86_64,
+    gcc_dwarf_ymm11h_x86_64,
+    gcc_dwarf_ymm12h_x86_64,
+    gcc_dwarf_ymm13h_x86_64,
+    gcc_dwarf_ymm14h_x86_64,
+    gcc_dwarf_ymm15h_x86_64,
+    // AVX2 Vector Mask Registers
+    // gcc_dwarf_k0_x86_64 = 118,
+    // gcc_dwarf_k1_x86_64,
+    // gcc_dwarf_k2_x86_64,
+    // gcc_dwarf_k3_x86_64,
+    // gcc_dwarf_k4_x86_64,
+    // gcc_dwarf_k5_x86_64,
+    // gcc_dwarf_k6_x86_64,
+    // gcc_dwarf_k7_x86_64,
+};
+
+// GDB Register numbers (eRegisterKindGDB)
+enum
+{
+    // GP Registers
+    gdb_rax_x86_64 = 0,
+    gdb_rbx_x86_64,
+    gdb_rcx_x86_64,
+    gdb_rdx_x86_64,
+    gdb_rsi_x86_64,
+    gdb_rdi_x86_64,
+    gdb_rbp_x86_64,
+    gdb_rsp_x86_64,
+    // Extended GP Registers
+    gdb_r8_x86_64,
+    gdb_r9_x86_64,
+    gdb_r10_x86_64,
+    gdb_r11_x86_64,
+    gdb_r12_x86_64,
+    gdb_r13_x86_64,
+    gdb_r14_x86_64,
+    gdb_r15_x86_64,
+    // Return Address (RA) mapped to RIP
+    gdb_rip_x86_64,
+    // Control and Status Flags Register
+    gdb_rflags_x86_64,
+    gdb_cs_x86_64,
+    gdb_ss_x86_64,
+    gdb_ds_x86_64,
+    gdb_es_x86_64,
+    gdb_fs_x86_64,
+    gdb_gs_x86_64,
+    // Floating Point Registers
+    gdb_st0_x86_64,
+    gdb_st1_x86_64,
+    gdb_st2_x86_64,
+    gdb_st3_x86_64,
+    gdb_st4_x86_64,
+    gdb_st5_x86_64,
+    gdb_st6_x86_64,
+    gdb_st7_x86_64,
+    gdb_fctrl_x86_64,
+    gdb_fstat_x86_64,
+    gdb_ftag_x86_64,
+    gdb_fiseg_x86_64,
+    gdb_fioff_x86_64,
+    gdb_foseg_x86_64,
+    gdb_fooff_x86_64,
+    gdb_fop_x86_64,
+    // SSE Vector Registers
+    gdb_xmm0_x86_64 = 40,
+    gdb_xmm1_x86_64,
+    gdb_xmm2_x86_64,
+    gdb_xmm3_x86_64,
+    gdb_xmm4_x86_64,
+    gdb_xmm5_x86_64,
+    gdb_xmm6_x86_64,
+    gdb_xmm7_x86_64,
+    gdb_xmm8_x86_64,
+    gdb_xmm9_x86_64,
+    gdb_xmm10_x86_64,
+    gdb_xmm11_x86_64,
+    gdb_xmm12_x86_64,
+    gdb_xmm13_x86_64,
+    gdb_xmm14_x86_64,
+    gdb_xmm15_x86_64,
+    // Floating point control registers
+    gdb_mxcsr_x86_64 = 56,
+    gdb_ymm0h_x86_64,
+    gdb_ymm1h_x86_64,
+    gdb_ymm2h_x86_64,
+    gdb_ymm3h_x86_64,
+    gdb_ymm4h_x86_64,
+    gdb_ymm5h_x86_64,
+    gdb_ymm6h_x86_64,
+    gdb_ymm7h_x86_64,
+    gdb_ymm8h_x86_64,
+    gdb_ymm9h_x86_64,
+    gdb_ymm10h_x86_64,
+    gdb_ymm11h_x86_64,
+    gdb_ymm12h_x86_64,
+    gdb_ymm13h_x86_64,
+    gdb_ymm14h_x86_64,
+    gdb_ymm15h_x86_64
+};
+
+//---------------------------------------------------------------------------
+// Generic floating-point registers
+//---------------------------------------------------------------------------
+
+struct MMSReg
+{
+    uint8_t bytes[10];
+    uint8_t pad[6];
+};
+
+struct XMMReg
+{
+    uint8_t bytes[16];      // 128-bits for each XMM register
+};
+
+// i387_fxsave_struct
+struct FXSAVE
+{
+    uint16_t fctrl;         // FPU Control Word (fcw)
+    uint16_t fstat;         // FPU Status Word (fsw)
+    uint16_t ftag;          // FPU Tag Word (ftw)
+    uint16_t fop;           // Last Instruction Opcode (fop)
+    union
+    {
+        struct
+        {
+            uint64_t fip;   // Instruction Pointer
+            uint64_t fdp;   // Data Pointer
+        } x86_64;
+        struct
+        {
+            uint32_t fioff;   // FPU IP Offset (fip)
+            uint32_t fiseg;   // FPU IP Selector (fcs)
+            uint32_t fooff;   // FPU Operand Pointer Offset (foo)
+            uint32_t foseg;   // FPU Operand Pointer Selector (fos)
+        } i386;
+    } ptr;
+    uint32_t mxcsr;         // MXCSR Register State
+    uint32_t mxcsrmask;     // MXCSR Mask 
+    MMSReg   stmm[8];       // 8*16 bytes for each FP-reg = 128 bytes
+    XMMReg   xmm[16];       // 16*16 bytes for each XMM-reg = 256 bytes
+    uint32_t padding[24];
+};
+
+//---------------------------------------------------------------------------
+// Extended floating-point registers
+//---------------------------------------------------------------------------
+
+struct YMMHReg
+{
+    uint8_t  bytes[16];     // 16 * 8 bits for the high bytes of each YMM register
+};
+
+struct YMMReg
+{
+    uint8_t  bytes[32];     // 16 * 16 bits for each YMM register
+};
+
+struct YMM
+{
+    YMMReg   ymm[16];       // assembled from ymmh and xmm registers
+};
+
+struct XSAVE_HDR
+{
+    uint64_t  xstate_bv;    // OS enabled xstate mask to determine the extended states supported by the processor
+    uint64_t  reserved1[2];
+    uint64_t  reserved2[5];
+} __attribute__((packed));
+
+// x86 extensions to FXSAVE (i.e. for AVX processors) 
+struct XSAVE 
+{
+    FXSAVE    i387;         // floating point registers typical in i387_fxsave_struct
+    XSAVE_HDR header;       // The xsave_hdr_struct can be used to determine if the following extensions are usable
+    YMMHReg   ymmh[16];     // High 16 bytes of each of 16 YMM registers (the low bytes are in FXSAVE.xmm for compatibility with SSE)
+    // Slot any extensions to the register file here
+} __attribute__((packed, aligned (64)));
+
+// Floating-point registers
+struct FPR
+{
+    // Thread state for the floating-point unit of the processor read by ptrace.
+    union XSTATE
+    {
+        FXSAVE   fxsave;    // Generic floating-point registers.
+        XSAVE    xsave;     // x86 extended processor state.
+    } xstate;
+};
+
+//---------------------------------------------------------------------------
+// ptrace PTRACE_GETREGSET, PTRACE_SETREGSET structure
+//---------------------------------------------------------------------------
+
+struct IOVEC
+{
+    void    *iov_base;      // pointer to XSAVE
+    size_t   iov_len;       // sizeof(XSAVE)
 };
 
 #endif

Added: lldb/trunk/source/Plugins/Process/POSIX/RegisterInfos_i386.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/POSIX/RegisterInfos_i386.h?rev=192263&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/Process/POSIX/RegisterInfos_i386.h (added)
+++ lldb/trunk/source/Plugins/Process/POSIX/RegisterInfos_i386.h Tue Oct  8 20:28:57 2013
@@ -0,0 +1,206 @@
+//===-- RegisterInfos_i386.h -----------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===---------------------------------------------------------------------===//
+
+#ifdef DECLARE_REGISTER_INFOS_I386_STRUCT
+
+// Computes the offset of the given GPR in the user data area.
+#define GPR_OFFSET(regname) \
+    (offsetof(GPR, regname))
+
+// Computes the offset of the given FPR in the extended data area.
+#define FPR_OFFSET(regname)  \
+    (offsetof(FPR, xstate) + \
+     offsetof(FXSAVE, regname))
+
+// Computes the offset of the YMM register assembled from register halves.
+#define YMM_OFFSET(regname) \
+    (offsetof(YMM, regname))
+
+// Number of bytes needed to represent a FPR.
+#define FPR_SIZE(reg) sizeof(((FXSAVE*)NULL)->reg)
+
+// Number of bytes needed to represent the i'th FP register.
+#define FP_SIZE sizeof(((MMSReg*)NULL)->bytes)
+
+// Number of bytes needed to represent an XMM register.
+#define XMM_SIZE sizeof(XMMReg)
+
+// Number of bytes needed to represent a YMM register.
+#define YMM_SIZE sizeof(YMMReg)
+
+// Note that the size and offset will be updated by platform-specific classes.
+#define DEFINE_GPR(reg, alt, kind1, kind2, kind3, kind4)            \
+    { #reg, alt, sizeof(GPR::reg), GPR_OFFSET(reg), eEncodingUint,  \
+      eFormatHex, { kind1, kind2, kind3, kind4, gpr_##reg##_i386 }, NULL, NULL }
+
+#define DEFINE_FPR(name, reg, kind1, kind2, kind3, kind4)           \
+    { #name, NULL, FPR_SIZE(reg), FPR_OFFSET(reg), eEncodingUint,   \
+      eFormatHex, { kind1, kind2, kind3, kind4, fpu_##name##_i386 }, NULL, NULL }
+
+// RegisterKind: GCC, DWARF, Generic, GDB, LLDB
+
+#define DEFINE_FP_ST(reg, i)                                       \
+    { #reg#i, NULL, FP_SIZE, LLVM_EXTENSION FPR_OFFSET(stmm[i]),    \
+      eEncodingVector, eFormatVectorOfUInt8,                       \
+      { gcc_st##i##_i386, dwarf_st##i##_i386, LLDB_INVALID_REGNUM, gdb_st##i##_i386, fpu_st##i##_i386 }, \
+      NULL, NULL }
+
+#define DEFINE_FP_MM(reg, i)                                                \
+    { #reg#i, NULL, sizeof(uint64_t), LLVM_EXTENSION FPR_OFFSET(stmm[i]),   \
+      eEncodingUint, eFormatHex,                                            \
+      { gcc_mm##i##_i386, dwarf_mm##i##_i386, LLDB_INVALID_REGNUM, gdb_mm##i##_i386, fpu_mm##i##_i386 }, \
+      NULL, NULL }
+
+#define DEFINE_XMM(reg, i)                                         \
+    { #reg#i, NULL, XMM_SIZE, LLVM_EXTENSION FPR_OFFSET(reg[i]),   \
+      eEncodingVector, eFormatVectorOfUInt8,                       \
+      { gcc_##reg##i##_i386, dwarf_##reg##i##_i386, LLDB_INVALID_REGNUM, gdb_##reg##i##_i386, fpu_##reg##i##_i386}, \
+      NULL, NULL }
+
+// I believe the YMM registers use dwarf_xmm_%_i386 register numbers and then differentiate based on register size.
+#define DEFINE_YMM(reg, i)                                         \
+    { #reg#i, NULL, YMM_SIZE, LLVM_EXTENSION YMM_OFFSET(reg[i]),   \
+      eEncodingVector, eFormatVectorOfUInt8,                       \
+      { LLDB_INVALID_REGNUM, dwarf_xmm##i##_i386, LLDB_INVALID_REGNUM, gdb_##reg##i##h_i386, fpu_##reg##i##_i386 }, \
+      NULL, NULL }
+
+#define DEFINE_DR(reg, i)                                               \
+    { #reg#i, NULL, DR_SIZE, DR_OFFSET(i), eEncodingUint, eFormatHex,   \
+      { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,  \
+        LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM }, NULL, NULL }
+
+#define DEFINE_GPR_PSEUDO_16(reg16, reg32)                  \
+    { #reg16, NULL, 2, GPR_OFFSET(reg32), eEncodingUint,    \
+      eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_##reg16##_i386 }, RegisterContextPOSIX_i386::g_contained_##reg32, RegisterContextPOSIX_i386::g_invalidate_##reg32 }
+#define DEFINE_GPR_PSEUDO_8H(reg8, reg32)                   \
+    { #reg8, NULL, 1, GPR_OFFSET(reg32)+1, eEncodingUint,   \
+      eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_##reg8##_i386 }, RegisterContextPOSIX_i386::g_contained_##reg32, RegisterContextPOSIX_i386::g_invalidate_##reg32 }
+#define DEFINE_GPR_PSEUDO_8L(reg8, reg32)                   \
+    { #reg8, NULL, 1, GPR_OFFSET(reg32), eEncodingUint,     \
+      eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_##reg8##_i386 }, RegisterContextPOSIX_i386::g_contained_##reg32, RegisterContextPOSIX_i386::g_invalidate_##reg32 }
+ 
+static RegisterInfo
+g_register_infos_i386[] =
+{
+    // General purpose registers.
+    DEFINE_GPR(eax,    NULL,    gcc_eax_i386,        dwarf_eax_i386,      LLDB_INVALID_REGNUM,       gdb_eax_i386),
+    DEFINE_GPR(ebx,    NULL,    gcc_ebx_i386,        dwarf_ebx_i386,      LLDB_INVALID_REGNUM,       gdb_ebx_i386),
+    DEFINE_GPR(ecx,    NULL,    gcc_ecx_i386,        dwarf_ecx_i386,      LLDB_INVALID_REGNUM,       gdb_ecx_i386),
+    DEFINE_GPR(edx,    NULL,    gcc_edx_i386,        dwarf_edx_i386,      LLDB_INVALID_REGNUM,       gdb_edx_i386),
+    DEFINE_GPR(edi,    NULL,    gcc_edi_i386,        dwarf_edi_i386,      LLDB_INVALID_REGNUM,       gdb_edi_i386),
+    DEFINE_GPR(esi,    NULL,    gcc_esi_i386,        dwarf_esi_i386,      LLDB_INVALID_REGNUM,       gdb_esi_i386),
+    DEFINE_GPR(ebp,    "fp",    gcc_ebp_i386,        dwarf_ebp_i386,      LLDB_REGNUM_GENERIC_FP,    gdb_ebp_i386),
+    DEFINE_GPR(esp,    "sp",    gcc_esp_i386,        dwarf_esp_i386,      LLDB_REGNUM_GENERIC_SP,    gdb_esp_i386),
+    DEFINE_GPR(eip,    "pc",    gcc_eip_i386,        dwarf_eip_i386,      LLDB_REGNUM_GENERIC_PC,    gdb_eip_i386),
+    DEFINE_GPR(eflags, "flags", gcc_eflags_i386,     dwarf_eflags_i386,   LLDB_REGNUM_GENERIC_FLAGS, gdb_eflags_i386),
+    DEFINE_GPR(cs,     NULL,    LLDB_INVALID_REGNUM, dwarf_cs_i386,       LLDB_INVALID_REGNUM,       gdb_cs_i386),
+    DEFINE_GPR(fs,     NULL,    LLDB_INVALID_REGNUM, dwarf_fs_i386,       LLDB_INVALID_REGNUM,       gdb_fs_i386),
+    DEFINE_GPR(gs,     NULL,    LLDB_INVALID_REGNUM, dwarf_gs_i386,       LLDB_INVALID_REGNUM,       gdb_gs_i386),
+    DEFINE_GPR(ss,     NULL,    LLDB_INVALID_REGNUM, dwarf_ss_i386,       LLDB_INVALID_REGNUM,       gdb_ss_i386),
+    DEFINE_GPR(ds,     NULL,    LLDB_INVALID_REGNUM, dwarf_ds_i386,       LLDB_INVALID_REGNUM,       gdb_ds_i386),
+    DEFINE_GPR(es,     NULL,    LLDB_INVALID_REGNUM, dwarf_es_i386,       LLDB_INVALID_REGNUM,       gdb_es_i386),
+
+    DEFINE_GPR_PSEUDO_16(ax,  eax),
+    DEFINE_GPR_PSEUDO_16(bx,  ebx),
+    DEFINE_GPR_PSEUDO_16(cx,  ecx),
+    DEFINE_GPR_PSEUDO_16(dx,  edx),
+    DEFINE_GPR_PSEUDO_16(di,  edi),
+    DEFINE_GPR_PSEUDO_16(si,  esi),
+    DEFINE_GPR_PSEUDO_16(bp,  ebp),
+    DEFINE_GPR_PSEUDO_16(sp,  esp),
+    DEFINE_GPR_PSEUDO_8H(ah,  eax),
+    DEFINE_GPR_PSEUDO_8H(bh,  ebx),
+    DEFINE_GPR_PSEUDO_8H(ch,  ecx),
+    DEFINE_GPR_PSEUDO_8H(dh,  edx),
+    DEFINE_GPR_PSEUDO_8L(al,  eax),
+    DEFINE_GPR_PSEUDO_8L(bl,  ebx),
+    DEFINE_GPR_PSEUDO_8L(cl,  ecx),
+    DEFINE_GPR_PSEUDO_8L(dl,  edx),
+
+    // i387 Floating point registers.
+    DEFINE_FPR(fctrl,     fctrl,          LLDB_INVALID_REGNUM, dwarf_fctrl_i386,    LLDB_INVALID_REGNUM, gdb_fctrl_i386),
+    DEFINE_FPR(fstat,     fstat,          LLDB_INVALID_REGNUM, dwarf_fstat_i386,    LLDB_INVALID_REGNUM, gdb_fstat_i386),
+    DEFINE_FPR(ftag,      ftag,           LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_ftag_i386),
+    DEFINE_FPR(fop,       fop,            LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_fop_i386),
+    DEFINE_FPR(fiseg,     ptr.i386.fiseg, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_fiseg_i386),
+    DEFINE_FPR(fioff,     ptr.i386.fioff, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_fioff_i386),
+    DEFINE_FPR(foseg,     ptr.i386.foseg, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_foseg_i386),
+    DEFINE_FPR(fooff,     ptr.i386.fooff, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gdb_fooff_i386),
+    DEFINE_FPR(mxcsr,     mxcsr,          LLDB_INVALID_REGNUM, dwarf_mxcsr_i386,    LLDB_INVALID_REGNUM, gdb_mxcsr_i386),
+    DEFINE_FPR(mxcsrmask, mxcsrmask,      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM),
+
+    // FP registers.
+    DEFINE_FP_ST(st, 0),
+    DEFINE_FP_ST(st, 1),
+    DEFINE_FP_ST(st, 2),
+    DEFINE_FP_ST(st, 3),
+    DEFINE_FP_ST(st, 4),
+    DEFINE_FP_ST(st, 5),
+    DEFINE_FP_ST(st, 6),
+    DEFINE_FP_ST(st, 7),
+    DEFINE_FP_MM(mm, 0),
+    DEFINE_FP_MM(mm, 1),
+    DEFINE_FP_MM(mm, 2),
+    DEFINE_FP_MM(mm, 3),
+    DEFINE_FP_MM(mm, 4),
+    DEFINE_FP_MM(mm, 5),
+    DEFINE_FP_MM(mm, 6),
+    DEFINE_FP_MM(mm, 7),
+
+    // XMM registers
+    DEFINE_XMM(xmm, 0),
+    DEFINE_XMM(xmm, 1),
+    DEFINE_XMM(xmm, 2),
+    DEFINE_XMM(xmm, 3),
+    DEFINE_XMM(xmm, 4),
+    DEFINE_XMM(xmm, 5),
+    DEFINE_XMM(xmm, 6),
+    DEFINE_XMM(xmm, 7),
+
+    // Copy of YMM registers assembled from xmm and ymmh
+    DEFINE_YMM(ymm, 0),
+    DEFINE_YMM(ymm, 1),
+    DEFINE_YMM(ymm, 2),
+    DEFINE_YMM(ymm, 3),
+    DEFINE_YMM(ymm, 4),
+    DEFINE_YMM(ymm, 5),
+    DEFINE_YMM(ymm, 6),
+    DEFINE_YMM(ymm, 7),
+
+    // Debug registers for lldb internal use
+    DEFINE_DR(dr, 0),
+    DEFINE_DR(dr, 1),
+    DEFINE_DR(dr, 2),
+    DEFINE_DR(dr, 3),
+    DEFINE_DR(dr, 4),
+    DEFINE_DR(dr, 5),
+    DEFINE_DR(dr, 6),
+    DEFINE_DR(dr, 7)
+};
+static_assert((sizeof(g_register_infos_i386) / sizeof(g_register_infos_i386[0])) == k_num_registers_i386,
+    "g_register_infos_x86_64 has wrong number of register infos");
+
+#undef GPR_OFFSET
+#undef FPR_OFFSET
+#undef YMM_OFFSET
+#undef FPR_SIZE
+#undef FP_SIZE
+#undef XMM_SIZE
+#undef YMM_SIZE
+#undef DEFINE_GPR
+#undef DEFINE_FPR
+#undef DEFINE_FP
+#undef DEFINE_XMM
+#undef DEFINE_YMM
+#undef DEFINE_DR
+#undef DEFINE_GPR_PSEUDO_16
+#undef DEFINE_GPR_PSEUDO_8H
+#undef DEFINE_GPR_PSEUDO_8L
+
+#endif // DECLARE_REGISTER_INFOS_I386_STRUCT

Added: lldb/trunk/source/Plugins/Process/POSIX/RegisterInfos_x86_64.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/POSIX/RegisterInfos_x86_64.h?rev=192263&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/Process/POSIX/RegisterInfos_x86_64.h (added)
+++ lldb/trunk/source/Plugins/Process/POSIX/RegisterInfos_x86_64.h Tue Oct  8 20:28:57 2013
@@ -0,0 +1,411 @@
+//===-- RegisterInfos_x86_64.h ---------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===---------------------------------------------------------------------===//
+
+// Computes the offset of the given GPR in the user data area.
+#define GPR_OFFSET(regname) \
+    (offsetof(GPR, regname))
+
+// Computes the offset of the given FPR in the extended data area.
+#define FPR_OFFSET(regname) \
+    (offsetof(FPR, xstate) + \
+     offsetof(FXSAVE, regname))
+
+// Computes the offset of the YMM register assembled from register halves.
+#define YMM_OFFSET(regname) \
+    (offsetof(YMM, regname))
+
+#ifdef DECLARE_REGISTER_INFOS_X86_64_STRUCT
+
+// Number of bytes needed to represent a FPR.
+#define FPR_SIZE(reg) sizeof(((FXSAVE*)NULL)->reg)
+
+// Number of bytes needed to represent the i'th FP register.
+#define FP_SIZE sizeof(((MMSReg*)NULL)->bytes)
+
+// Number of bytes needed to represent an XMM register.
+#define XMM_SIZE sizeof(XMMReg)
+
+// Number of bytes needed to represent a YMM register.
+#define YMM_SIZE sizeof(YMMReg)
+
+// RegisterKind: GCC, DWARF, Generic, GDB, LLDB
+
+// Note that the size and offset will be updated by platform-specific classes.
+#define DEFINE_GPR(reg, alt, kind1, kind2, kind3, kind4)    \
+    { #reg, alt, sizeof(GPR::reg), GPR_OFFSET(reg), eEncodingUint, \
+      eFormatHex, { kind1, kind2, kind3, kind4, gpr_##reg##_x86_64 }, NULL, NULL }
+
+#define DEFINE_FPR(name, reg, kind1, kind2, kind3, kind4)    \
+    { #name, NULL, FPR_SIZE(reg), FPR_OFFSET(reg), eEncodingUint,   \
+      eFormatHex, { kind1, kind2, kind3, kind4, fpu_##name##_x86_64 }, NULL, NULL }
+
+#define DEFINE_FP_ST(reg, i)                                       \
+    { #reg#i, NULL, FP_SIZE, LLVM_EXTENSION FPR_OFFSET(stmm[i]),   \
+      eEncodingVector, eFormatVectorOfUInt8,                       \
+      { gcc_dwarf_st##i##_x86_64, gcc_dwarf_st##i##_x86_64, LLDB_INVALID_REGNUM, gdb_st##i##_x86_64, fpu_st##i##_x86_64 }, \
+      NULL, NULL }
+
+#define DEFINE_FP_MM(reg, i)                                                \
+    { #reg#i, NULL, sizeof(uint64_t), LLVM_EXTENSION FPR_OFFSET(stmm[i]),   \
+      eEncodingUint, eFormatHex,                                            \
+      { gcc_dwarf_mm##i##_x86_64, gcc_dwarf_mm##i##_x86_64, LLDB_INVALID_REGNUM, gdb_st##i##_x86_64, fpu_mm##i##_x86_64 }, \
+      NULL, NULL }
+
+#define DEFINE_XMM(reg, i)                                         \
+    { #reg#i, NULL, XMM_SIZE, LLVM_EXTENSION FPR_OFFSET(reg[i]),   \
+      eEncodingVector, eFormatVectorOfUInt8,                       \
+      { gcc_dwarf_##reg##i##_x86_64, gcc_dwarf_##reg##i##_x86_64, LLDB_INVALID_REGNUM, gdb_##reg##i##_x86_64, fpu_##reg##i##_x86_64}, \
+      NULL, NULL }
+
+#define DEFINE_YMM(reg, i)                                                          \
+    { #reg#i, NULL, YMM_SIZE, LLVM_EXTENSION YMM_OFFSET(reg[i]),                    \
+      eEncodingVector, eFormatVectorOfUInt8,                                        \
+      { gcc_dwarf_##reg##i##h_x86_64, gcc_dwarf_##reg##i##h_x86_64, LLDB_INVALID_REGNUM, gdb_##reg##i##h_x86_64, fpu_##reg##i##_x86_64 }, \
+      NULL, NULL }
+
+#define DEFINE_DR(reg, i)                                               \
+    { #reg#i, NULL, DR_SIZE, DR_OFFSET(i), eEncodingUint, eFormatHex,   \
+      { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,  \
+      LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM }, NULL, NULL }
+
+#define REG_CONTEXT_SIZE (GetGPRSize() + sizeof(RegisterContextPOSIX_x86_64::FPR))
+
+#define DEFINE_GPR_PSEUDO_32(reg32, reg64)          \
+    { #reg32, NULL, 4, GPR_OFFSET(reg64), eEncodingUint,   \
+      eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_##reg32##_x86_64 }, RegisterContextPOSIX_x86_64::g_contained_##reg64, RegisterContextPOSIX_x86_64::g_invalidate_##reg64 }
+#define DEFINE_GPR_PSEUDO_16(reg16, reg64)          \
+    { #reg16, NULL, 2, GPR_OFFSET(reg64), eEncodingUint,   \
+      eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_##reg16##_x86_64 }, RegisterContextPOSIX_x86_64::g_contained_##reg64, RegisterContextPOSIX_x86_64::g_invalidate_##reg64 }
+#define DEFINE_GPR_PSEUDO_8H(reg8, reg64)           \
+    { #reg8, NULL, 1, GPR_OFFSET(reg64)+1, eEncodingUint,  \
+      eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_##reg8##_x86_64 }, RegisterContextPOSIX_x86_64::g_contained_##reg64, RegisterContextPOSIX_x86_64::g_invalidate_##reg64 }
+#define DEFINE_GPR_PSEUDO_8L(reg8, reg64)           \
+    { #reg8, NULL, 1, GPR_OFFSET(reg64), eEncodingUint,    \
+      eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_##reg8##_x86_64 }, RegisterContextPOSIX_x86_64::g_contained_##reg64, RegisterContextPOSIX_x86_64::g_invalidate_##reg64 }
+
+static RegisterInfo
+g_register_infos_x86_64[] =
+{
+    // General purpose registers.                GCC,                   DWARF,                Generic,                  GDB
+    DEFINE_GPR(rax,    NULL,    gcc_dwarf_rax_x86_64,    gcc_dwarf_rax_x86_64,    LLDB_INVALID_REGNUM,       gdb_rax_x86_64),
+    DEFINE_GPR(rbx,    NULL,    gcc_dwarf_rbx_x86_64,    gcc_dwarf_rbx_x86_64,    LLDB_INVALID_REGNUM,       gdb_rbx_x86_64),
+    DEFINE_GPR(rcx,    "arg4",  gcc_dwarf_rcx_x86_64,    gcc_dwarf_rcx_x86_64,    LLDB_INVALID_REGNUM,       gdb_rcx_x86_64),
+    DEFINE_GPR(rdx,    "arg3",  gcc_dwarf_rdx_x86_64,    gcc_dwarf_rdx_x86_64,    LLDB_INVALID_REGNUM,       gdb_rdx_x86_64),
+    DEFINE_GPR(rdi,    "arg1",  gcc_dwarf_rdi_x86_64,    gcc_dwarf_rdi_x86_64,    LLDB_INVALID_REGNUM,       gdb_rdi_x86_64),
+    DEFINE_GPR(rsi,    "arg2",  gcc_dwarf_rsi_x86_64,    gcc_dwarf_rsi_x86_64,    LLDB_INVALID_REGNUM,       gdb_rsi_x86_64),
+    DEFINE_GPR(rbp,    "fp",    gcc_dwarf_rbp_x86_64,    gcc_dwarf_rbp_x86_64,    LLDB_REGNUM_GENERIC_FP,    gdb_rbp_x86_64),
+    DEFINE_GPR(rsp,    "sp",    gcc_dwarf_rsp_x86_64,    gcc_dwarf_rsp_x86_64,    LLDB_REGNUM_GENERIC_SP,    gdb_rsp_x86_64),
+    DEFINE_GPR(r8,     "arg5",  gcc_dwarf_r8_x86_64,     gcc_dwarf_r8_x86_64,     LLDB_INVALID_REGNUM,       gdb_r8_x86_64),
+    DEFINE_GPR(r9,     "arg6",  gcc_dwarf_r9_x86_64,     gcc_dwarf_r9_x86_64,     LLDB_INVALID_REGNUM,       gdb_r9_x86_64),
+    DEFINE_GPR(r10,    NULL,    gcc_dwarf_r10_x86_64,    gcc_dwarf_r10_x86_64,    LLDB_INVALID_REGNUM,       gdb_r10_x86_64),
+    DEFINE_GPR(r11,    NULL,    gcc_dwarf_r11_x86_64,    gcc_dwarf_r11_x86_64,    LLDB_INVALID_REGNUM,       gdb_r11_x86_64),
+    DEFINE_GPR(r12,    NULL,    gcc_dwarf_r12_x86_64,    gcc_dwarf_r12_x86_64,    LLDB_INVALID_REGNUM,       gdb_r12_x86_64),
+    DEFINE_GPR(r13,    NULL,    gcc_dwarf_r13_x86_64,    gcc_dwarf_r13_x86_64,    LLDB_INVALID_REGNUM,       gdb_r13_x86_64),
+    DEFINE_GPR(r14,    NULL,    gcc_dwarf_r14_x86_64,    gcc_dwarf_r14_x86_64,    LLDB_INVALID_REGNUM,       gdb_r14_x86_64),
+    DEFINE_GPR(r15,    NULL,    gcc_dwarf_r15_x86_64,    gcc_dwarf_r15_x86_64,    LLDB_INVALID_REGNUM,       gdb_r15_x86_64),
+    DEFINE_GPR(rip,    "pc",    gcc_dwarf_rip_x86_64,    gcc_dwarf_rip_x86_64,    LLDB_REGNUM_GENERIC_PC,    gdb_rip_x86_64),
+    DEFINE_GPR(rflags, "flags", gcc_dwarf_rflags_x86_64, gcc_dwarf_rflags_x86_64, LLDB_REGNUM_GENERIC_FLAGS, gdb_rflags_x86_64),
+    DEFINE_GPR(cs,     NULL,    gcc_dwarf_cs_x86_64,     gcc_dwarf_cs_x86_64,     LLDB_INVALID_REGNUM,       gdb_cs_x86_64),
+    DEFINE_GPR(fs,     NULL,    gcc_dwarf_fs_x86_64,     gcc_dwarf_fs_x86_64,     LLDB_INVALID_REGNUM,       gdb_fs_x86_64),
+    DEFINE_GPR(gs,     NULL,    gcc_dwarf_gs_x86_64,     gcc_dwarf_gs_x86_64,     LLDB_INVALID_REGNUM,       gdb_gs_x86_64),
+    DEFINE_GPR(ss,     NULL,    gcc_dwarf_ss_x86_64,     gcc_dwarf_ss_x86_64,     LLDB_INVALID_REGNUM,       gdb_ss_x86_64),
+    DEFINE_GPR(ds,     NULL,    gcc_dwarf_ds_x86_64,     gcc_dwarf_ds_x86_64,     LLDB_INVALID_REGNUM,       gdb_ds_x86_64),
+    DEFINE_GPR(es,     NULL,    gcc_dwarf_es_x86_64,     gcc_dwarf_es_x86_64,     LLDB_INVALID_REGNUM,       gdb_es_x86_64),
+
+    DEFINE_GPR_PSEUDO_32(eax, rax),
+    DEFINE_GPR_PSEUDO_32(ebx, rbx),
+    DEFINE_GPR_PSEUDO_32(ecx, rcx),
+    DEFINE_GPR_PSEUDO_32(edx, rdx),
+    DEFINE_GPR_PSEUDO_32(edi, rdi),
+    DEFINE_GPR_PSEUDO_32(esi, rsi),
+    DEFINE_GPR_PSEUDO_32(ebp, rbp),
+    DEFINE_GPR_PSEUDO_32(esp, rsp),
+    DEFINE_GPR_PSEUDO_32(r8d,  r8),
+    DEFINE_GPR_PSEUDO_32(r9d,  r9),
+    DEFINE_GPR_PSEUDO_32(r10d, r10),
+    DEFINE_GPR_PSEUDO_32(r11d, r11),
+    DEFINE_GPR_PSEUDO_32(r12d, r12),
+    DEFINE_GPR_PSEUDO_32(r13d, r13),
+    DEFINE_GPR_PSEUDO_32(r14d, r14),
+    DEFINE_GPR_PSEUDO_32(r15d, r15),
+    DEFINE_GPR_PSEUDO_16(ax,   rax),
+    DEFINE_GPR_PSEUDO_16(bx,   rbx),
+    DEFINE_GPR_PSEUDO_16(cx,   rcx),
+    DEFINE_GPR_PSEUDO_16(dx,   rdx),
+    DEFINE_GPR_PSEUDO_16(di,   rdi),
+    DEFINE_GPR_PSEUDO_16(si,   rsi),
+    DEFINE_GPR_PSEUDO_16(bp,   rbp),
+    DEFINE_GPR_PSEUDO_16(sp,   rsp),
+    DEFINE_GPR_PSEUDO_16(r8w,  r8),
+    DEFINE_GPR_PSEUDO_16(r9w,  r9),
+    DEFINE_GPR_PSEUDO_16(r10w, r10),
+    DEFINE_GPR_PSEUDO_16(r11w, r11),
+    DEFINE_GPR_PSEUDO_16(r12w, r12),
+    DEFINE_GPR_PSEUDO_16(r13w, r13),
+    DEFINE_GPR_PSEUDO_16(r14w, r14),
+    DEFINE_GPR_PSEUDO_16(r15w, r15),
+    DEFINE_GPR_PSEUDO_8H(ah,   rax),
+    DEFINE_GPR_PSEUDO_8H(bh,   rbx),
+    DEFINE_GPR_PSEUDO_8H(ch,   rcx),
+    DEFINE_GPR_PSEUDO_8H(dh,   rdx),
+    DEFINE_GPR_PSEUDO_8L(al,   rax),
+    DEFINE_GPR_PSEUDO_8L(bl,   rbx),
+    DEFINE_GPR_PSEUDO_8L(cl,   rcx),
+    DEFINE_GPR_PSEUDO_8L(dl,   rdx),
+    DEFINE_GPR_PSEUDO_8L(dil,  rdi),
+    DEFINE_GPR_PSEUDO_8L(sil,  rsi),
+    DEFINE_GPR_PSEUDO_8L(bpl,  rbp),
+    DEFINE_GPR_PSEUDO_8L(spl,  rsp),
+    DEFINE_GPR_PSEUDO_8L(r8l,  r8),
+    DEFINE_GPR_PSEUDO_8L(r9l,  r9),
+    DEFINE_GPR_PSEUDO_8L(r10l, r10),
+    DEFINE_GPR_PSEUDO_8L(r11l, r11),
+    DEFINE_GPR_PSEUDO_8L(r12l, r12),
+    DEFINE_GPR_PSEUDO_8L(r13l, r13),
+    DEFINE_GPR_PSEUDO_8L(r14l, r14),
+    DEFINE_GPR_PSEUDO_8L(r15l, r15),
+
+    // i387 Floating point registers.     GCC,                                   DWARF,               Generic,            GDB
+    DEFINE_FPR(fctrl,     fctrl,          gcc_dwarf_fctrl_x86_64, gcc_dwarf_fctrl_x86_64, LLDB_INVALID_REGNUM, gdb_fctrl_x86_64),
+    DEFINE_FPR(fstat,     fstat,          gcc_dwarf_fstat_x86_64, gcc_dwarf_fstat_x86_64, LLDB_INVALID_REGNUM, gdb_fstat_x86_64),
+    DEFINE_FPR(ftag,      ftag,           LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM, gdb_ftag_x86_64),
+    DEFINE_FPR(fop,       fop,            LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM, gdb_fop_x86_64),
+    DEFINE_FPR(fiseg,     ptr.i386.fiseg, LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM, gdb_fiseg_x86_64),
+    DEFINE_FPR(fioff,     ptr.i386.fioff, LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM, gdb_fioff_x86_64),
+    DEFINE_FPR(foseg,     ptr.i386.foseg, LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM, gdb_foseg_x86_64),
+    DEFINE_FPR(fooff,     ptr.i386.fooff, LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM, gdb_fooff_x86_64),
+    DEFINE_FPR(mxcsr,     mxcsr,          gcc_dwarf_mxcsr_x86_64, gcc_dwarf_mxcsr_x86_64, LLDB_INVALID_REGNUM, gdb_mxcsr_x86_64),
+    DEFINE_FPR(mxcsrmask, mxcsrmask,      LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM,    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM),
+
+    // FP registers.
+    DEFINE_FP_ST(st, 0),
+    DEFINE_FP_ST(st, 1),
+    DEFINE_FP_ST(st, 2),
+    DEFINE_FP_ST(st, 3),
+    DEFINE_FP_ST(st, 4),
+    DEFINE_FP_ST(st, 5),
+    DEFINE_FP_ST(st, 6),
+    DEFINE_FP_ST(st, 7),
+    DEFINE_FP_MM(mm, 0),
+    DEFINE_FP_MM(mm, 1),
+    DEFINE_FP_MM(mm, 2),
+    DEFINE_FP_MM(mm, 3),
+    DEFINE_FP_MM(mm, 4),
+    DEFINE_FP_MM(mm, 5),
+    DEFINE_FP_MM(mm, 6),
+    DEFINE_FP_MM(mm, 7),
+
+    // XMM registers
+    DEFINE_XMM(xmm, 0),
+    DEFINE_XMM(xmm, 1),
+    DEFINE_XMM(xmm, 2),
+    DEFINE_XMM(xmm, 3),
+    DEFINE_XMM(xmm, 4),
+    DEFINE_XMM(xmm, 5),
+    DEFINE_XMM(xmm, 6),
+    DEFINE_XMM(xmm, 7),
+    DEFINE_XMM(xmm, 8),
+    DEFINE_XMM(xmm, 9),
+    DEFINE_XMM(xmm, 10),
+    DEFINE_XMM(xmm, 11),
+    DEFINE_XMM(xmm, 12),
+    DEFINE_XMM(xmm, 13),
+    DEFINE_XMM(xmm, 14),
+    DEFINE_XMM(xmm, 15),
+
+    // Copy of YMM registers assembled from xmm and ymmh
+    DEFINE_YMM(ymm, 0),
+    DEFINE_YMM(ymm, 1),
+    DEFINE_YMM(ymm, 2),
+    DEFINE_YMM(ymm, 3),
+    DEFINE_YMM(ymm, 4),
+    DEFINE_YMM(ymm, 5),
+    DEFINE_YMM(ymm, 6),
+    DEFINE_YMM(ymm, 7),
+    DEFINE_YMM(ymm, 8),
+    DEFINE_YMM(ymm, 9),
+    DEFINE_YMM(ymm, 10),
+    DEFINE_YMM(ymm, 11),
+    DEFINE_YMM(ymm, 12),
+    DEFINE_YMM(ymm, 13),
+    DEFINE_YMM(ymm, 14),
+    DEFINE_YMM(ymm, 15),
+
+    // Debug registers for lldb internal use
+    DEFINE_DR(dr, 0),
+    DEFINE_DR(dr, 1),
+    DEFINE_DR(dr, 2),
+    DEFINE_DR(dr, 3),
+    DEFINE_DR(dr, 4),
+    DEFINE_DR(dr, 5),
+    DEFINE_DR(dr, 6),
+    DEFINE_DR(dr, 7)
+};
+static_assert((sizeof(g_register_infos_x86_64) / sizeof(g_register_infos_x86_64[0])) == k_num_registers_x86_64,
+    "g_register_infos_x86_64 has wrong number of register infos");
+
+#undef FPR_SIZE
+#undef FP_SIZE
+#undef XMM_SIZE
+#undef YMM_SIZE
+#undef DEFINE_GPR
+#undef DEFINE_FPR
+#undef DEFINE_FP
+#undef DEFINE_XMM
+#undef DEFINE_YMM
+#undef DEFINE_DR
+#undef REG_CONTEXT_SIZE 
+#undef DEFINE_GPR_PSEUDO_32
+#undef DEFINE_GPR_PSEUDO_16
+#undef DEFINE_GPR_PSEUDO_8H
+#undef DEFINE_GPR_PSEUDO_8L
+
+#endif // DECLARE_REGISTER_INFOS_X86_64_STRUCT
+
+
+#ifdef UPDATE_REGISTER_INFOS_I386_STRUCT_WITH_X86_64_OFFSETS
+
+#define UPDATE_GPR_INFO(reg, reg64)                                             \
+do {                                                                            \
+    g_register_infos[gpr_##reg##_i386].byte_offset = GPR_OFFSET(reg64);         \
+} while(false);
+
+#define UPDATE_GPR_INFO_8H(reg, reg64)                                          \
+do {                                                                            \
+    g_register_infos[gpr_##reg##_i386].byte_offset = GPR_OFFSET(reg64) + 1;     \
+} while(false);
+
+#define UPDATE_FPR_INFO(reg, reg64)                                             \
+do {                                                                            \
+    g_register_infos[fpu_##reg##_i386].byte_offset = FPR_OFFSET(reg64);         \
+} while(false);
+
+#define UPDATE_FP_INFO(reg, i)                                                  \
+do {                                                                            \
+    g_register_infos[fpu_##reg##i##_i386].byte_offset = FPR_OFFSET(stmm[i]);    \
+} while(false);
+
+#define UPDATE_XMM_INFO(reg, i)                                                 \
+do {                                                                            \
+    g_register_infos[fpu_##reg##i##_i386].byte_offset = FPR_OFFSET(reg[i]);     \
+} while(false);
+
+#define UPDATE_YMM_INFO(reg, i)                                                 \
+do {                                                                            \
+    g_register_infos[fpu_##reg##i##_i386].byte_offset = YMM_OFFSET(reg[i]);     \
+} while(false);
+
+#define UPDATE_DR_INFO(reg_index)                                               \
+do {                                                                            \
+    g_register_infos[dr##reg_index##_i386].byte_offset = DR_OFFSET(reg_index);  \
+} while(false);
+
+    // Update the register offsets
+    UPDATE_GPR_INFO(eax,    rax);
+    UPDATE_GPR_INFO(ebx,    rbx);
+    UPDATE_GPR_INFO(ecx,    rcx);
+    UPDATE_GPR_INFO(edx,    rdx);
+    UPDATE_GPR_INFO(edi,    rdi);
+    UPDATE_GPR_INFO(esi,    rsi);
+    UPDATE_GPR_INFO(ebp,    rbp);
+    UPDATE_GPR_INFO(esp,    rsp);
+    UPDATE_GPR_INFO(eip,    rip);
+    UPDATE_GPR_INFO(eflags, rflags);
+    UPDATE_GPR_INFO(cs,     cs);
+    UPDATE_GPR_INFO(fs,     fs);
+    UPDATE_GPR_INFO(gs,     gs);
+    UPDATE_GPR_INFO(ss,     ss);
+    UPDATE_GPR_INFO(ds,     ds);
+    UPDATE_GPR_INFO(es,     es);
+
+    UPDATE_GPR_INFO(ax,     rax);
+    UPDATE_GPR_INFO(bx,     rbx);
+    UPDATE_GPR_INFO(cx,     rcx);
+    UPDATE_GPR_INFO(dx,     rdx);
+    UPDATE_GPR_INFO(di,     rdi);
+    UPDATE_GPR_INFO(si,     rsi);
+    UPDATE_GPR_INFO(bp,     rbp);
+    UPDATE_GPR_INFO(sp,     rsp);
+    UPDATE_GPR_INFO_8H(ah,  rax);
+    UPDATE_GPR_INFO_8H(bh,  rbx);
+    UPDATE_GPR_INFO_8H(ch,  rcx);
+    UPDATE_GPR_INFO_8H(dh,  rdx);
+    UPDATE_GPR_INFO(al,     rax);
+    UPDATE_GPR_INFO(bl,     rbx);
+    UPDATE_GPR_INFO(cl,     rcx);
+    UPDATE_GPR_INFO(dl,     rdx);
+
+    UPDATE_FPR_INFO(fctrl,     fctrl);
+    UPDATE_FPR_INFO(fstat,     fstat);
+    UPDATE_FPR_INFO(ftag,      ftag);
+    UPDATE_FPR_INFO(fop,       fop);
+    UPDATE_FPR_INFO(fiseg,     ptr.i386.fiseg);
+    UPDATE_FPR_INFO(fioff,     ptr.i386.fioff);
+    UPDATE_FPR_INFO(fooff,     ptr.i386.fooff);
+    UPDATE_FPR_INFO(foseg,     ptr.i386.foseg);
+    UPDATE_FPR_INFO(mxcsr,     mxcsr);
+    UPDATE_FPR_INFO(mxcsrmask, mxcsrmask);
+
+    UPDATE_FP_INFO(st, 0);
+    UPDATE_FP_INFO(st, 1);
+    UPDATE_FP_INFO(st, 2);
+    UPDATE_FP_INFO(st, 3);
+    UPDATE_FP_INFO(st, 4);
+    UPDATE_FP_INFO(st, 5);
+    UPDATE_FP_INFO(st, 6);
+    UPDATE_FP_INFO(st, 7);
+    UPDATE_FP_INFO(mm, 0);
+    UPDATE_FP_INFO(mm, 1);
+    UPDATE_FP_INFO(mm, 2);
+    UPDATE_FP_INFO(mm, 3);
+    UPDATE_FP_INFO(mm, 4);
+    UPDATE_FP_INFO(mm, 5);
+    UPDATE_FP_INFO(mm, 6);
+    UPDATE_FP_INFO(mm, 7);
+
+    UPDATE_XMM_INFO(xmm, 0);
+    UPDATE_XMM_INFO(xmm, 1);
+    UPDATE_XMM_INFO(xmm, 2);
+    UPDATE_XMM_INFO(xmm, 3);
+    UPDATE_XMM_INFO(xmm, 4);
+    UPDATE_XMM_INFO(xmm, 5);
+    UPDATE_XMM_INFO(xmm, 6);
+    UPDATE_XMM_INFO(xmm, 7);
+
+    UPDATE_YMM_INFO(ymm, 0);
+    UPDATE_YMM_INFO(ymm, 1);
+    UPDATE_YMM_INFO(ymm, 2);
+    UPDATE_YMM_INFO(ymm, 3);
+    UPDATE_YMM_INFO(ymm, 4);
+    UPDATE_YMM_INFO(ymm, 5);
+    UPDATE_YMM_INFO(ymm, 6);
+    UPDATE_YMM_INFO(ymm, 7);
+
+    UPDATE_DR_INFO(0);
+    UPDATE_DR_INFO(1);
+    UPDATE_DR_INFO(2);
+    UPDATE_DR_INFO(3);
+    UPDATE_DR_INFO(4);
+    UPDATE_DR_INFO(5);
+    UPDATE_DR_INFO(6);
+    UPDATE_DR_INFO(7);
+
+#undef UPDATE_GPR_INFO
+#undef UPDATE_GPR_INFO_8H
+#undef UPDATE_FPR_INFO
+#undef UPDATE_FP_INFO
+#undef UPDATE_XMM_INFO
+#undef UPDATE_YMM_INFO
+#undef UPDATE_DR_INFO
+
+#endif // UPDATE_REGISTER_INFOS_I386_STRUCT_WITH_X86_64_OFFSETS
+
+#undef GPR_OFFSET
+#undef FPR_OFFSET
+#undef YMM_OFFSET

Modified: lldb/trunk/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_x86_64.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_x86_64.cpp?rev=192263&r1=192262&r2=192263&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_x86_64.cpp (original)
+++ lldb/trunk/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_x86_64.cpp Tue Oct  8 20:28:57 2013
@@ -19,13 +19,13 @@ RegisterContextCorePOSIX_x86_64::Registe
                                                                  RegisterInfoInterface *register_info,
                                                                  const DataExtractor &gpregset,
                                                                  const DataExtractor &fpregset)
-    : RegisterContextPOSIX_x86_64(thread, 0, register_info)
+    : RegisterContextPOSIX_x86_64 (thread, 0, register_info)
 {
     size_t size, len;
 
     size = GetGPRSize();
     m_gpregset = new uint8_t[size];
-    len = gpregset.ExtractBytes(0, size, lldb::eByteOrderLittle, m_gpregset);
+    len = gpregset.ExtractBytes (0, size, lldb::eByteOrderLittle, m_gpregset);
     assert(len == size);
 }
 

Modified: lldb/trunk/source/Plugins/Process/elf-core/ThreadElfCore.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/elf-core/ThreadElfCore.cpp?rev=192263&r1=192262&r2=192263&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/elf-core/ThreadElfCore.cpp (original)
+++ lldb/trunk/source/Plugins/Process/elf-core/ThreadElfCore.cpp Tue Oct  8 20:28:57 2013
@@ -89,10 +89,10 @@ ThreadElfCore::CreateRegisterContextForF
                 switch (arch.GetTriple().getOS())
                 {
                     case llvm::Triple::FreeBSD:
-                        m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_x86_64 (*this, new RegisterContextFreeBSD_x86_64(), m_gpregset_data, m_fpregset_data));
+                        m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_x86_64 (*this, new RegisterContextFreeBSD_x86_64(arch), m_gpregset_data, m_fpregset_data));
                         break;
                     case llvm::Triple::Linux:
-                        m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_x86_64 (*this, new RegisterContextLinux_x86_64(), m_gpregset_data, m_fpregset_data));
+                        m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_x86_64 (*this, new RegisterContextLinux_x86_64(arch), m_gpregset_data, m_fpregset_data));
                         break;
                     default:
                         if (log)

Modified: lldb/trunk/test/functionalities/register/TestRegisters.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/register/TestRegisters.py?rev=192263&r1=192262&r2=192263&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/register/TestRegisters.py (original)
+++ lldb/trunk/test/functionalities/register/TestRegisters.py Tue Oct  8 20:28:57 2013
@@ -174,18 +174,18 @@ class RegisterCommandsTestCase(TestBase)
         self.write_and_restore(currentFrame, "mxcsrmask", False)
 
         new_value = "{0x01 0x02 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x00}"
-        self.vector_write_and_read(currentFrame, "stmm0", new_value)
+        self.vector_write_and_read(currentFrame, "st0", new_value)
         new_value = "{0x01 0x02 0x03 0x00 0x00 0x00 0x00 0x00 0x09 0x0a}"
-        self.vector_write_and_read(currentFrame, "stmm7", new_value)
+        self.vector_write_and_read(currentFrame, "st7", new_value)
 
         new_value = "{0x01 0x02 0x03 0x00 0x00 0x00 0x00 0x00 0x09 0x0a 0x2f 0x2f 0x2f 0x2f 0x2f 0x2f}"
         self.vector_write_and_read(currentFrame, "xmm0", new_value)
         new_value = "{0x01 0x02 0x03 0x00 0x00 0x00 0x00 0x00 0x09 0x0a 0x2f 0x2f 0x2f 0x2f 0x0e 0x0f}"
         self.vector_write_and_read(currentFrame, "xmm15", new_value, False)
 
-        self.runCmd("register write stmm0 \"{0x00 0x00 0x00 0x00 0x00 0x00 0x40 0x9a 0x09 0x40}\"")
-        self.expect("register read stmm0 --format f",
-            substrs = ['stmm0 = 1234'])
+        self.runCmd("register write st0 \"{0x00 0x00 0x00 0x00 0x00 0x00 0x40 0x9a 0x09 0x40}\"")
+        self.expect("register read st0 --format f",
+            substrs = ['st0 = 1234'])
 
         has_avx = False 
         registerSets = currentFrame.GetRegisters() # Returns an SBValueList.
@@ -197,7 +197,7 @@ class RegisterCommandsTestCase(TestBase)
         if has_avx:
             new_value = "{0x01 0x02 0x03 0x00 0x00 0x00 0x00 0x00 0x09 0x0a 0x2f 0x2f 0x2f 0x2f 0x0e 0x0f 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x0c 0x0d 0x0e 0x0f}"
             self.vector_write_and_read(currentFrame, "ymm0", new_value)
-            self.vector_write_and_read(currentFrame, "ymm15", new_value)
+            self.vector_write_and_read(currentFrame, "ymm7", new_value)
             self.expect("expr $ymm0", substrs = ['vector_type'])
         else:
             self.runCmd("register read ymm0")





More information about the lldb-commits mailing list