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