Hi zturner, clayborg, emaste, domipheus,

The visual studio 2013 x64 build is failing due to some type differences 
between 32bit and 64bit builds.

The CONTEXT structure used in RegisterContextWindows_x86 changes its fields 
based on the build.
Currently I have used #ifdefs to alternate between the different registers for 
each build, is this an acceptable solution?

It seems however that HostThreadWindows is largely 32bit specific, so should 
there rather be a dedicated x64 version?

In HostThreadWindows its seems that ULONG_PTR also changes its size based on 
the machine type, however the argument for ExitThread() doesnt change in a 
simmilar way.
I have created a proxy function to wrap ExitThread() so it can again be used as 
a function pointer.

If these changes are acceptable, would someone be able to commit these fixes 
since I dont currently have commit access.

Thanks,
Aidan

http://reviews.llvm.org/D6704

Files:
  source/Host/windows/HostThreadWindows.cpp
  source/Plugins/Process/Windows/RegisterContextWindows_x86.cpp

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
Index: source/Host/windows/HostThreadWindows.cpp
===================================================================
--- source/Host/windows/HostThreadWindows.cpp
+++ source/Host/windows/HostThreadWindows.cpp
@@ -17,6 +17,14 @@
 using namespace lldb;
 using namespace lldb_private;
 
+namespace
+{
+void __stdcall ExitThreadProxy(ULONG_PTR param)
+{
+    ::ExitThread( param );
+}
+}
+
 HostThreadWindows::HostThreadWindows()
     : HostNativeThreadBase()
     , m_owns_handle(true)
@@ -69,7 +77,7 @@
 {
     Error error;
 
-    DWORD result = ::QueueUserAPC(::ExitThread, m_thread, 0);
+    DWORD result = ::QueueUserAPC(::ExitThreadProxy, m_thread, 0);
     error.SetError(result, eErrorTypeWin32);
     return error;
 }
Index: source/Plugins/Process/Windows/RegisterContextWindows_x86.cpp
===================================================================
--- source/Plugins/Process/Windows/RegisterContextWindows_x86.cpp
+++ source/Plugins/Process/Windows/RegisterContextWindows_x86.cpp
@@ -140,6 +140,38 @@
 
     switch (reg_info->kinds[eRegisterKindLLDB])
     {
+#if defined (_M_IA64) || defined(_M_X64)
+        case lldb_eax_i386:
+            reg_value.SetUInt64(m_context_ptr->Rax);
+            break;
+        case lldb_ebx_i386:
+            reg_value.SetUInt64(m_context_ptr->Rbx);
+            break;
+        case lldb_ecx_i386:
+            reg_value.SetUInt64(m_context_ptr->Rcx);
+            break;
+        case lldb_edx_i386:
+            reg_value.SetUInt64(m_context_ptr->Rdx);
+            break;
+        case lldb_edi_i386:
+            reg_value.SetUInt64(m_context_ptr->Rdi);
+            break;
+        case lldb_esi_i386:
+            reg_value.SetUInt64(m_context_ptr->Rsi);
+            break;
+        case lldb_ebp_i386:
+            reg_value.SetUInt64(m_context_ptr->Rbp);
+            break;
+        case lldb_esp_i386:
+            reg_value.SetUInt64(m_context_ptr->Rsp);
+            break;
+        case lldb_eip_i386:
+            reg_value.SetUInt64(m_context_ptr->Rip);
+            break;
+        case lldb_eflags_i386:
+            reg_value.SetUInt32(m_context_ptr->EFlags);
+            break;
+#else
         case lldb_eax_i386:
             reg_value.SetUInt32(m_context_ptr->Eax);
             break;
@@ -170,6 +202,7 @@
         case lldb_eflags_i386:
             reg_value.SetUInt32(m_context_ptr->EFlags);
             break;
+#endif
     }
     return true;
 }
@@ -185,6 +218,39 @@
 
     switch (reg_info->kinds[eRegisterKindLLDB])
     {
+        
+#if defined (_M_IA64) || defined(_M_X64)
+        case lldb_eax_i386:
+            m_context_ptr->Rax = reg_value.GetAsUInt64();
+            break;
+        case lldb_ebx_i386:
+            m_context_ptr->Rbx = reg_value.GetAsUInt64();
+            break;
+        case lldb_ecx_i386:
+            m_context_ptr->Rcx = reg_value.GetAsUInt64();
+            break;
+        case lldb_edx_i386:
+            m_context_ptr->Rdx = reg_value.GetAsUInt64();
+            break;
+        case lldb_edi_i386:
+            m_context_ptr->Rdi = reg_value.GetAsUInt64();
+            break;
+        case lldb_esi_i386:
+            m_context_ptr->Rsi = reg_value.GetAsUInt64();
+            break;
+        case lldb_ebp_i386:
+            m_context_ptr->Rbp = reg_value.GetAsUInt64();
+            break;
+        case lldb_esp_i386:
+            m_context_ptr->Rsp = reg_value.GetAsUInt64();
+            break;
+        case lldb_eip_i386:
+            m_context_ptr->Rip = reg_value.GetAsUInt64();
+            break;
+        case lldb_eflags_i386:
+            m_context_ptr->EFlags = reg_value.GetAsUInt32();
+            break;
+#else
         case lldb_eax_i386:
             m_context_ptr->Eax = reg_value.GetAsUInt32();
             break;
@@ -215,6 +281,7 @@
         case lldb_eflags_i386:
             m_context_ptr->EFlags = reg_value.GetAsUInt32();
             break;
+#endif
     }
 
     // Physically update the registers in the target process.
_______________________________________________
lldb-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits

Reply via email to