[Lldb-commits] [lldb] r131334 - in /lldb/trunk: include/lldb/Target/ source/Plugins/ABI/MacOSX-arm/ source/Plugins/ABI/MacOSX-i386/ source/Plugins/ABI/SysV-x86_64/ source/Plugins/Process/gdb-remote/ source/Target/
Greg Clayton
gclayton at apple.com
Fri May 13 18:50:35 PDT 2011
Author: gclayton
Date: Fri May 13 20:50:35 2011
New Revision: 131334
URL: http://llvm.org/viewvc/llvm-project?rev=131334&view=rev
Log:
Expand the ABI prepare trivial function call to allow 6 simple args.
Modified:
lldb/trunk/include/lldb/Target/ABI.h
lldb/trunk/include/lldb/Target/ThreadPlanCallFunction.h
lldb/trunk/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.cpp
lldb/trunk/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.h
lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.cpp
lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.h
lldb/trunk/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.cpp
lldb/trunk/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.h
lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp
lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h
lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
lldb/trunk/source/Target/ThreadPlanCallFunction.cpp
Modified: lldb/trunk/include/lldb/Target/ABI.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/ABI.h?rev=131334&r1=131333&r2=131334&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Target/ABI.h (original)
+++ lldb/trunk/include/lldb/Target/ABI.h Fri May 13 20:50:35 2011
@@ -34,10 +34,13 @@
lldb::addr_t sp,
lldb::addr_t functionAddress,
lldb::addr_t returnAddress,
- lldb::addr_t *arg1_ptr,
- lldb::addr_t *arg2_ptr,
- lldb::addr_t *arg3_ptr) const = 0;
-
+ lldb::addr_t *arg1_ptr = NULL,
+ lldb::addr_t *arg2_ptr = NULL,
+ lldb::addr_t *arg3_ptr = NULL,
+ lldb::addr_t *arg4_ptr = NULL,
+ lldb::addr_t *arg5_ptr = NULL,
+ lldb::addr_t *arg6_ptr = NULL) const = 0;
+
virtual bool
GetArgumentValues (Thread &thread,
ValueList &values) const = 0;
Modified: lldb/trunk/include/lldb/Target/ThreadPlanCallFunction.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/ThreadPlanCallFunction.h?rev=131334&r1=131333&r2=131334&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Target/ThreadPlanCallFunction.h (original)
+++ lldb/trunk/include/lldb/Target/ThreadPlanCallFunction.h Fri May 13 20:50:35 2011
@@ -30,7 +30,18 @@
bool discard_on_error = true,
lldb::addr_t *this_arg = 0,
lldb::addr_t *cmd_arg = 0);
-
+
+ ThreadPlanCallFunction (Thread &thread,
+ Address &function,
+ bool stop_other_threads,
+ bool discard_on_error,
+ lldb::addr_t *arg1_ptr = NULL,
+ lldb::addr_t *arg2_ptr = NULL,
+ lldb::addr_t *arg3_ptr = NULL,
+ lldb::addr_t *arg4_ptr = NULL,
+ lldb::addr_t *arg5_ptr = NULL,
+ lldb::addr_t *arg6_ptr = NULL);
+
virtual
~ThreadPlanCallFunction ();
@@ -106,9 +117,7 @@
bool m_stop_other_threads;
Address m_function_addr;
Address m_start_addr;
- lldb::addr_t m_arg_addr;
lldb::addr_t m_function_sp;
- ValueList *m_args;
Process &m_process;
Thread &m_thread;
Thread::RegisterCheckpoint m_register_backup;
Modified: lldb/trunk/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.cpp?rev=131334&r1=131333&r2=131334&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.cpp (original)
+++ lldb/trunk/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.cpp Fri May 13 20:50:35 2011
@@ -65,9 +65,12 @@
addr_t sp,
addr_t function_addr,
addr_t return_addr,
- lldb::addr_t *arg1_ptr,
- lldb::addr_t *arg2_ptr,
- lldb::addr_t *arg3_ptr) const
+ addr_t *arg1_ptr,
+ addr_t *arg2_ptr,
+ addr_t *arg3_ptr,
+ addr_t *arg4_ptr,
+ addr_t *arg5_ptr,
+ addr_t *arg6_ptr) const
{
RegisterContext *reg_ctx = thread.GetRegisterContext().get();
if (!reg_ctx)
@@ -84,25 +87,41 @@
reg_value.SetUInt32(*arg1_ptr);
if (!reg_ctx->WriteRegister (reg_ctx->GetRegisterInfoByName("r0"), reg_value))
return false;
- }
-
- if (arg2_ptr)
- {
- assert (arg1_ptr != NULL); // Remove this after we know the assertion isn't firing (5/11/2011)
- reg_value.SetUInt32(*arg2_ptr);
- if (!reg_ctx->WriteRegister (reg_ctx->GetRegisterInfoByName("r1"), reg_value))
- return false;
- }
-
- if (arg3_ptr)
- {
- assert (arg1_ptr != NULL); // Remove this after we know the assertion isn't firing (5/11/2011)
- assert (arg2_ptr != NULL); // Remove this after we know the assertion isn't firing (5/11/2011)
+ if (arg2_ptr)
+ {
+ reg_value.SetUInt32(*arg2_ptr);
+ if (!reg_ctx->WriteRegister (reg_ctx->GetRegisterInfoByName("r1"), reg_value))
+ return false;
- reg_value.SetUInt32(*arg3_ptr);
- if (!reg_ctx->WriteRegister (reg_ctx->GetRegisterInfoByName("r2"), reg_value))
- return false;
+ if (arg3_ptr)
+ {
+ reg_value.SetUInt32(*arg3_ptr);
+ if (!reg_ctx->WriteRegister (reg_ctx->GetRegisterInfoByName("r2"), reg_value))
+ return false;
+ if (arg4_ptr)
+ {
+ reg_value.SetUInt32(*arg4_ptr);
+ const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoByName("r3");
+ if (!reg_ctx->WriteRegister (reg_info, reg_value))
+ return false;
+ if (arg5_ptr)
+ {
+ reg_value.SetUInt32(*arg5_ptr);
+ sp -= 4;
+ if (reg_ctx->WriteRegisterValueToMemory (reg_info, sp, reg_info->byte_size, reg_value).Fail())
+ return false;
+ if (arg6_ptr)
+ {
+ reg_value.SetUInt32(*arg6_ptr);
+ sp -= 4;
+ if (reg_ctx->WriteRegisterValueToMemory (reg_info, sp, reg_info->byte_size, reg_value).Fail())
+ return false;
+ }
+ }
+ }
+ }
+ }
}
// Set "lr" to the return address into "lr"
Modified: lldb/trunk/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.h?rev=131334&r1=131333&r2=131334&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.h (original)
+++ lldb/trunk/source/Plugins/ABI/MacOSX-arm/ABIMacOSX_arm.h Fri May 13 20:50:35 2011
@@ -30,9 +30,12 @@
lldb::addr_t sp,
lldb::addr_t func_addr,
lldb::addr_t returnAddress,
- lldb::addr_t *arg1_ptr,
- lldb::addr_t *arg2_ptr,
- lldb::addr_t *arg3_ptr) const;
+ lldb::addr_t *arg1_ptr = NULL,
+ lldb::addr_t *arg2_ptr = NULL,
+ lldb::addr_t *arg3_ptr = NULL,
+ lldb::addr_t *arg4_ptr = NULL,
+ lldb::addr_t *arg5_ptr = NULL,
+ lldb::addr_t *arg6_ptr = NULL) const;
virtual bool
GetArgumentValues (lldb_private::Thread &thread,
Modified: lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.cpp?rev=131334&r1=131333&r2=131334&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.cpp (original)
+++ lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.cpp Fri May 13 20:50:35 2011
@@ -57,15 +57,15 @@
bool
ABIMacOSX_i386::PrepareTrivialCall (Thread &thread,
- lldb::addr_t sp,
- lldb::addr_t func_addr,
- lldb::addr_t return_addr,
- lldb::addr_t *arg1_ptr,
- lldb::addr_t *arg2_ptr,
- lldb::addr_t *arg3_ptr) const
-// lldb::addr_t arg,
-// lldb::addr_t *this_arg,
-// lldb::addr_t *cmd_arg) const
+ addr_t sp,
+ addr_t func_addr,
+ addr_t return_addr,
+ addr_t *arg1_ptr,
+ addr_t *arg2_ptr,
+ addr_t *arg3_ptr,
+ addr_t *arg4_ptr,
+ addr_t *arg5_ptr,
+ addr_t *arg6_ptr) const
{
RegisterContext *reg_ctx = thread.GetRegisterContext().get();
if (!reg_ctx)
@@ -85,12 +85,30 @@
RegisterValue reg_value;
// Write any arguments onto the stack
- if (arg1_ptr && arg2_ptr && arg3_ptr)
- sp -= 12;
- else if (arg1_ptr && arg2_ptr)
- sp -= 8;
- else if (arg1_ptr)
+ if (arg1_ptr)
+ {
sp -= 4;
+ if (arg2_ptr)
+ {
+ sp -= 4;
+ if (arg3_ptr)
+ {
+ sp -= 4;
+ if (arg4_ptr)
+ {
+ sp -= 4;
+ if (arg5_ptr)
+ {
+ sp -= 4;
+ if (arg6_ptr)
+ {
+ sp -= 4;
+ }
+ }
+ }
+ }
+ }
+ }
// Align the SP
sp &= ~(0xfull); // 16-byte alignment
@@ -107,7 +125,6 @@
if (arg2_ptr)
{
- assert (arg1_ptr != NULL); // Remove this after we know the assertion isn't firing (5/11/2011)
reg_value.SetUInt32(*arg2_ptr);
// The register info used to write memory just needs to have the correct
// size of a 32 bit register, the actual register it pertains to is not
@@ -121,8 +138,6 @@
if (arg3_ptr)
{
- assert (arg1_ptr != NULL); // Remove this after we know the assertion isn't firing (5/11/2011)
- assert (arg2_ptr != NULL); // Remove this after we know the assertion isn't firing (5/11/2011)
reg_value.SetUInt32(*arg3_ptr);
// The register info used to write memory just needs to have the correct
// size of a 32 bit register, the actual register it pertains to is not
@@ -133,6 +148,46 @@
reg_value);
if (error.Fail())
return false;
+
+ if (arg4_ptr)
+ {
+ reg_value.SetUInt32(*arg4_ptr);
+ // The register info used to write memory just needs to have the correct
+ // size of a 32 bit register, the actual register it pertains to is not
+ // important, just the size needs to be correct. Here we use "eax"...
+ error = reg_ctx->WriteRegisterValueToMemory (reg_info_32,
+ sp + 12,
+ reg_info_32->byte_size,
+ reg_value);
+ if (error.Fail())
+ return false;
+ if (arg5_ptr)
+ {
+ reg_value.SetUInt32(*arg5_ptr);
+ // The register info used to write memory just needs to have the correct
+ // size of a 32 bit register, the actual register it pertains to is not
+ // important, just the size needs to be correct. Here we use "eax"...
+ error = reg_ctx->WriteRegisterValueToMemory (reg_info_32,
+ sp + 16,
+ reg_info_32->byte_size,
+ reg_value);
+ if (error.Fail())
+ return false;
+ if (arg6_ptr)
+ {
+ reg_value.SetUInt32(*arg6_ptr);
+ // The register info used to write memory just needs to have the correct
+ // size of a 32 bit register, the actual register it pertains to is not
+ // important, just the size needs to be correct. Here we use "eax"...
+ error = reg_ctx->WriteRegisterValueToMemory (reg_info_32,
+ sp + 20,
+ reg_info_32->byte_size,
+ reg_value);
+ if (error.Fail())
+ return false;
+ }
+ }
+ }
}
}
}
@@ -164,9 +219,9 @@
bool
ABIMacOSX_i386::PrepareNormalCall (Thread &thread,
- lldb::addr_t sp,
- lldb::addr_t func_addr,
- lldb::addr_t return_addr,
+ addr_t sp,
+ addr_t func_addr,
+ addr_t return_addr,
ValueList &args) const
{
RegisterContext *reg_ctx = thread.GetRegisterContext().get();
Modified: lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.h?rev=131334&r1=131333&r2=131334&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.h (original)
+++ lldb/trunk/source/Plugins/ABI/MacOSX-i386/ABIMacOSX_i386.h Fri May 13 20:50:35 2011
@@ -146,9 +146,12 @@
lldb::addr_t sp,
lldb::addr_t func_addr,
lldb::addr_t return_addr,
- lldb::addr_t *arg1_ptr,
- lldb::addr_t *arg2_ptr,
- lldb::addr_t *arg3_ptr) const;
+ lldb::addr_t *arg1_ptr = NULL,
+ lldb::addr_t *arg2_ptr = NULL,
+ lldb::addr_t *arg3_ptr = NULL,
+ lldb::addr_t *arg4_ptr = NULL,
+ lldb::addr_t *arg5_ptr = NULL,
+ lldb::addr_t *arg6_ptr = NULL) const;
virtual bool
PrepareNormalCall (lldb_private::Thread &thread,
Modified: lldb/trunk/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.cpp?rev=131334&r1=131333&r2=131334&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.cpp (original)
+++ lldb/trunk/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.cpp Fri May 13 20:50:35 2011
@@ -60,13 +60,19 @@
bool
ABISysV_x86_64::PrepareTrivialCall (Thread &thread,
- lldb::addr_t sp,
- lldb::addr_t func_addr,
- lldb::addr_t return_addr,
- lldb::addr_t *arg1_ptr,
- lldb::addr_t *arg2_ptr,
- lldb::addr_t *arg3_ptr) const
+ addr_t sp,
+ addr_t func_addr,
+ addr_t return_addr,
+ addr_t *arg1_ptr,
+ addr_t *arg2_ptr,
+ addr_t *arg3_ptr,
+ addr_t *arg4_ptr,
+ addr_t *arg5_ptr,
+ addr_t *arg6_ptr) const
{
+ if (arg4_ptr || arg5_ptr || arg6_ptr)
+ return false;
+
LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
if (log)
Modified: lldb/trunk/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.h?rev=131334&r1=131333&r2=131334&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.h (original)
+++ lldb/trunk/source/Plugins/ABI/SysV-x86_64/ABISysV_x86_64.h Fri May 13 20:50:35 2011
@@ -172,9 +172,12 @@
lldb::addr_t sp,
lldb::addr_t functionAddress,
lldb::addr_t returnAddress,
- lldb::addr_t *arg1_ptr,
- lldb::addr_t *arg2_ptr,
- lldb::addr_t *arg3_ptr) const;
+ lldb::addr_t *arg1_ptr = NULL,
+ lldb::addr_t *arg2_ptr = NULL,
+ lldb::addr_t *arg3_ptr = NULL,
+ lldb::addr_t *arg4_ptr = NULL,
+ lldb::addr_t *arg5_ptr = NULL,
+ lldb::addr_t *arg6_ptr = NULL) const;
virtual bool
GetArgumentValues (lldb_private::Thread &thread,
Modified: lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp?rev=131334&r1=131333&r2=131334&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp (original)
+++ lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp Fri May 13 20:50:35 2011
@@ -45,6 +45,8 @@
m_supports_vCont_s (eLazyBoolCalculate),
m_supports_vCont_S (eLazyBoolCalculate),
m_qHostInfo_is_valid (eLazyBoolCalculate),
+ m_supports__m (eLazyBoolCalculate),
+ m_supports__M (eLazyBoolCalculate),
m_supports_qProcessInfoPID (true),
m_supports_qfProcessInfo (true),
m_supports_qUserName (true),
@@ -130,6 +132,9 @@
m_supports_vCont_s = eLazyBoolCalculate;
m_supports_vCont_S = eLazyBoolCalculate;
m_qHostInfo_is_valid = eLazyBoolCalculate;
+ m_supports__m = eLazyBoolCalculate;
+ m_supports__M = eLazyBoolCalculate;
+
m_supports_qProcessInfoPID = true;
m_supports_qfProcessInfo = true;
m_supports_qUserName = true;
@@ -1016,17 +1021,23 @@
addr_t
GDBRemoteCommunicationClient::AllocateMemory (size_t size, uint32_t permissions)
{
- char packet[64];
- const int packet_len = ::snprintf (packet, sizeof(packet), "_M%zx,%s%s%s", size,
- permissions & lldb::ePermissionsReadable ? "r" : "",
- permissions & lldb::ePermissionsWritable ? "w" : "",
- permissions & lldb::ePermissionsExecutable ? "x" : "");
- assert (packet_len < sizeof(packet));
- StringExtractorGDBRemote response;
- if (SendPacketAndWaitForResponse (packet, packet_len, response, false))
+ if (m_supports__M != eLazyBoolNo)
{
- if (!response.IsErrorResponse())
- return response.GetHexMaxU64(false, LLDB_INVALID_ADDRESS);
+ m_supports__M = eLazyBoolYes;
+ char packet[64];
+ const int packet_len = ::snprintf (packet, sizeof(packet), "_M%zx,%s%s%s", size,
+ permissions & lldb::ePermissionsReadable ? "r" : "",
+ permissions & lldb::ePermissionsWritable ? "w" : "",
+ permissions & lldb::ePermissionsExecutable ? "x" : "");
+ assert (packet_len < sizeof(packet));
+ StringExtractorGDBRemote response;
+ if (SendPacketAndWaitForResponse (packet, packet_len, response, false))
+ {
+ if (response.IsUnsupportedResponse())
+ m_supports__M = eLazyBoolNo;
+ else if (!response.IsErrorResponse())
+ return response.GetHexMaxU64(false, LLDB_INVALID_ADDRESS);
+ }
}
return LLDB_INVALID_ADDRESS;
}
@@ -1034,14 +1045,20 @@
bool
GDBRemoteCommunicationClient::DeallocateMemory (addr_t addr)
{
- char packet[64];
- const int packet_len = ::snprintf(packet, sizeof(packet), "_m%llx", (uint64_t)addr);
- assert (packet_len < sizeof(packet));
- StringExtractorGDBRemote response;
- if (SendPacketAndWaitForResponse (packet, packet_len, response, false))
+ if (m_supports__m != eLazyBoolNo)
{
- if (response.IsOKResponse())
- return true;
+ m_supports__m = eLazyBoolYes;
+ char packet[64];
+ const int packet_len = ::snprintf(packet, sizeof(packet), "_m%llx", (uint64_t)addr);
+ assert (packet_len < sizeof(packet));
+ StringExtractorGDBRemote response;
+ if (SendPacketAndWaitForResponse (packet, packet_len, response, false))
+ {
+ if (response.IsOKResponse())
+ return true;
+ else if (response.IsUnsupportedResponse())
+ m_supports__m = eLazyBoolNo;
+ }
}
return false;
}
Modified: lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h?rev=131334&r1=131333&r2=131334&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h (original)
+++ lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h Fri May 13 20:50:35 2011
@@ -305,6 +305,18 @@
bool
SetCurrentThreadForRun (int tid);
+ lldb_private::LazyBool
+ SupportsAllocateMemory () const
+ {
+ return m_supports__M;
+ }
+
+ lldb_private::LazyBool
+ SupportsDeallocateMemory () const
+ {
+ return m_supports__m;
+ }
+
protected:
//------------------------------------------------------------------
@@ -319,6 +331,9 @@
lldb_private::LazyBool m_supports_vCont_s;
lldb_private::LazyBool m_supports_vCont_S;
lldb_private::LazyBool m_qHostInfo_is_valid;
+ lldb_private::LazyBool m_supports__m;
+ lldb_private::LazyBool m_supports__M;
+
bool
m_supports_qProcessInfoPID:1,
m_supports_qfProcessInfo:1,
@@ -330,6 +345,7 @@
m_supports_z2:1,
m_supports_z3:1,
m_supports_z4:1;
+
lldb::tid_t m_curr_tid; // Current gdb remote protocol thread index for all other operations
lldb::tid_t m_curr_tid_run; // Current gdb remote protocol thread index for continue, step, etc
Modified: lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp?rev=131334&r1=131333&r2=131334&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp (original)
+++ lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp Fri May 13 20:50:35 2011
@@ -11,8 +11,9 @@
#include <errno.h>
#include <spawn.h>
#include <stdlib.h>
-#include <sys/types.h>
+#include <sys/mman.h> // for mmap
#include <sys/stat.h>
+#include <sys/types.h>
#include <time.h>
// C++ Includes
@@ -38,6 +39,7 @@
#include "lldb/Target/DynamicLoader.h"
#include "lldb/Target/Target.h"
#include "lldb/Target/TargetList.h"
+#include "lldb/Target/ThreadPlanCallFunction.h"
#include "lldb/Utility/PseudoTerminal.h"
// Project includes
@@ -1541,7 +1543,93 @@
lldb::addr_t
ProcessGDBRemote::DoAllocateMemory (size_t size, uint32_t permissions, Error &error)
{
- addr_t allocated_addr = m_gdb_comm.AllocateMemory (size, permissions);
+ addr_t allocated_addr = LLDB_INVALID_ADDRESS;
+
+ LazyBool supported = m_gdb_comm.SupportsAllocateMemory();
+ switch (supported)
+ {
+ case eLazyBoolCalculate:
+ case eLazyBoolYes:
+ allocated_addr = m_gdb_comm.AllocateMemory (size, permissions);
+ if (allocated_addr != LLDB_INVALID_ADDRESS || supported == eLazyBoolYes)
+ return allocated_addr;
+
+ case eLazyBoolNo:
+ // Call mmap() to create executable memory in the inferior..
+ {
+ Thread *thread = GetThreadList().GetSelectedThread().get();
+ if (thread == NULL)
+ thread = GetThreadList().GetThreadAtIndex(0).get();
+
+ const bool append = true;
+ const bool include_symbols = true;
+ SymbolContextList sc_list;
+ const uint32_t count = m_target.GetImages().FindFunctions (ConstString ("mmap"),
+ eFunctionNameTypeFull,
+ include_symbols,
+ append,
+ sc_list);
+ if (count > 0)
+ {
+ SymbolContext sc;
+ if (sc_list.GetContextAtIndex(0, sc))
+ {
+ const uint32_t range_scope = eSymbolContextFunction | eSymbolContextSymbol;
+ const bool use_inline_block_range = false;
+ const bool stop_other_threads = true;
+ const bool discard_on_error = true;
+ const bool try_all_threads = true;
+ const uint32_t single_thread_timeout_usec = 500000;
+ addr_t arg1_addr = 0;
+ addr_t arg2_len = size;
+ addr_t arg3_prot = PROT_NONE;
+ addr_t arg4_flags = MAP_ANON;
+ addr_t arg5_fd = -1;
+ addr_t arg6_offset = 0;
+ if (permissions & lldb::ePermissionsReadable)
+ arg3_prot |= PROT_READ;
+ if (permissions & lldb::ePermissionsWritable)
+ arg3_prot |= PROT_WRITE;
+ if (permissions & lldb::ePermissionsExecutable)
+ arg3_prot |= PROT_EXEC;
+
+ AddressRange mmap_range;
+ if (sc.GetAddressRange(range_scope, 0, use_inline_block_range, mmap_range))
+ {
+ lldb::ThreadPlanSP call_plan_sp (new ThreadPlanCallFunction (*thread,
+ mmap_range.GetBaseAddress(),
+ stop_other_threads,
+ discard_on_error,
+ &arg1_addr,
+ &arg2_len,
+ &arg3_prot,
+ &arg4_flags,
+ &arg5_fd,
+ &arg6_offset));
+ if (call_plan_sp)
+ {
+ StreamFile error_strm;
+ StackFrame *frame = thread->GetStackFrameAtIndex (0).get();
+ if (frame)
+ {
+ ExecutionContext exe_ctx;
+ frame->CalculateExecutionContext (exe_ctx);
+ ExecutionResults results = RunThreadPlan (exe_ctx,
+ call_plan_sp,
+ stop_other_threads,
+ try_all_threads,
+ discard_on_error,
+ single_thread_timeout_usec,
+ error_strm);
+ }
+ }
+ }
+ }
+ }
+ }
+ break;
+ }
+
if (allocated_addr == LLDB_INVALID_ADDRESS)
error.SetErrorStringWithFormat("unable to allocate %zu bytes of memory with permissions %u", size, permissions);
else
Modified: lldb/trunk/source/Target/ThreadPlanCallFunction.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/ThreadPlanCallFunction.cpp?rev=131334&r1=131333&r2=131334&view=diff
==============================================================================
--- lldb/trunk/source/Target/ThreadPlanCallFunction.cpp (original)
+++ lldb/trunk/source/Target/ThreadPlanCallFunction.cpp Fri May 13 20:50:35 2011
@@ -37,20 +37,18 @@
ThreadPlanCallFunction::ThreadPlanCallFunction (Thread &thread,
Address &function,
- lldb::addr_t arg,
+ addr_t arg,
bool stop_other_threads,
bool discard_on_error,
- lldb::addr_t *this_arg,
- lldb::addr_t *cmd_arg) :
+ addr_t *this_arg,
+ addr_t *cmd_arg) :
ThreadPlan (ThreadPlan::eKindCallFunction, "Call function plan", thread, eVoteNoOpinion, eVoteNoOpinion),
m_valid (false),
m_stop_other_threads (stop_other_threads),
- m_arg_addr (arg),
- m_args (NULL),
m_process (thread.GetProcess()),
m_thread (thread),
m_takedown_done (false),
- m_function_sp(NULL)
+ m_function_sp (NULL)
{
SetOkayToDiscard (discard_on_error);
@@ -92,7 +90,7 @@
}
}
- lldb::addr_t StartLoadAddr = m_start_addr.GetLoadAddress(&target);
+ addr_t start_load_addr = m_start_addr.GetLoadAddress(&target);
// Checkpoint the thread state so we can restore it later.
if (log && log->GetVerbose())
@@ -108,17 +106,17 @@
thread.SetStopInfoToNothing();
m_function_addr = function;
- lldb::addr_t FunctionLoadAddr = m_function_addr.GetLoadAddress(&target);
+ addr_t FunctionLoadAddr = m_function_addr.GetLoadAddress(&target);
if (this_arg && cmd_arg)
{
if (!abi->PrepareTrivialCall (thread,
m_function_sp,
FunctionLoadAddr,
- StartLoadAddr,
+ start_load_addr,
this_arg,
cmd_arg,
- &m_arg_addr))
+ &arg))
return;
}
else if (this_arg)
@@ -126,10 +124,9 @@
if (!abi->PrepareTrivialCall (thread,
m_function_sp,
FunctionLoadAddr,
- StartLoadAddr,
+ start_load_addr,
this_arg,
- &m_arg_addr,
- NULL))
+ &arg))
return;
}
else
@@ -137,10 +134,104 @@
if (!abi->PrepareTrivialCall (thread,
m_function_sp,
FunctionLoadAddr,
- StartLoadAddr,
- &m_arg_addr,
- NULL,
- NULL))
+ start_load_addr,
+ &arg))
+ return;
+ }
+
+ ReportRegisterState ("Function call was set up. Register state was:");
+
+ m_valid = true;
+}
+
+
+ThreadPlanCallFunction::ThreadPlanCallFunction (Thread &thread,
+ Address &function,
+ bool stop_other_threads,
+ bool discard_on_error,
+ addr_t *arg1_ptr,
+ addr_t *arg2_ptr,
+ addr_t *arg3_ptr,
+ addr_t *arg4_ptr,
+ addr_t *arg5_ptr,
+ addr_t *arg6_ptr) :
+ ThreadPlan (ThreadPlan::eKindCallFunction, "Call function plan", thread, eVoteNoOpinion, eVoteNoOpinion),
+ m_valid (false),
+ m_stop_other_threads (stop_other_threads),
+ m_process (thread.GetProcess()),
+ m_thread (thread),
+ m_takedown_done (false),
+ m_function_sp(NULL)
+{
+ SetOkayToDiscard (discard_on_error);
+
+ Process& process = thread.GetProcess();
+ Target& target = process.GetTarget();
+ const ABI *abi = process.GetABI().get();
+
+ if (!abi)
+ return;
+
+ LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
+
+ SetBreakpoints();
+
+ m_function_sp = thread.GetRegisterContext()->GetSP() - abi->GetRedZoneSize();
+
+ ModuleSP executableModuleSP (target.GetExecutableModule());
+
+ if (!executableModuleSP)
+ {
+ log->Printf ("Can't execute code without an executable module.");
+ return;
+ }
+ else
+ {
+ ObjectFile *objectFile = executableModuleSP->GetObjectFile();
+ if (!objectFile)
+ {
+ log->Printf ("Could not find object file for module \"%s\".",
+ executableModuleSP->GetFileSpec().GetFilename().AsCString());
+ return;
+ }
+ m_start_addr = objectFile->GetEntryPointAddress();
+ if (!m_start_addr.IsValid())
+ {
+ log->Printf ("Could not find entry point address for executable module \"%s\".",
+ executableModuleSP->GetFileSpec().GetFilename().AsCString());
+ return;
+ }
+ }
+
+ addr_t start_load_addr = m_start_addr.GetLoadAddress(&target);
+
+ // Checkpoint the thread state so we can restore it later.
+ if (log && log->GetVerbose())
+ ReportRegisterState ("About to checkpoint thread before function call. Original register state was:");
+
+ if (!thread.CheckpointThreadState (m_stored_thread_state))
+ {
+ if (log)
+ log->Printf ("Setting up ThreadPlanCallFunction, failed to checkpoint thread state.");
+ return;
+ }
+ // Now set the thread state to "no reason" so we don't run with whatever signal was outstanding...
+ thread.SetStopInfoToNothing();
+
+ m_function_addr = function;
+ addr_t FunctionLoadAddr = m_function_addr.GetLoadAddress(&target);
+
+ if (!abi->PrepareTrivialCall (thread,
+ m_function_sp,
+ FunctionLoadAddr,
+ start_load_addr,
+ arg1_ptr,
+ arg2_ptr,
+ arg3_ptr,
+ arg4_ptr,
+ arg5_ptr,
+ arg6_ptr))
+ {
return;
}
@@ -205,18 +296,15 @@
}
void
-ThreadPlanCallFunction::GetDescription (Stream *s, lldb::DescriptionLevel level)
+ThreadPlanCallFunction::GetDescription (Stream *s, DescriptionLevel level)
{
- if (level == lldb::eDescriptionLevelBrief)
+ if (level == eDescriptionLevelBrief)
{
s->Printf("Function call thread plan");
}
else
{
- if (m_args)
- s->Printf("Thread plan to call 0x%llx with parsed arguments", m_function_addr.GetLoadAddress(&m_process.GetTarget()), m_arg_addr);
- else
- s->Printf("Thread plan to call 0x%llx void * argument at: 0x%llx", m_function_addr.GetLoadAddress(&m_process.GetTarget()), m_arg_addr);
+ s->Printf("Thread plan to call 0x%llx", m_function_addr.GetLoadAddress(&m_process.GetTarget()));
}
}
@@ -248,12 +336,12 @@
// Otherwise, check the case where we stopped for an internal breakpoint, in that case, continue on.
// If it is not an internal breakpoint, consult OkayToDiscard.
- lldb::StopInfoSP stop_info_sp = GetPrivateStopReason();
+ StopInfoSP stop_info_sp = GetPrivateStopReason();
if (stop_info_sp && stop_info_sp->GetStopReason() == eStopReasonBreakpoint)
{
uint64_t break_site_id = stop_info_sp->GetValue();
- lldb::BreakpointSiteSP bp_site_sp = m_thread.GetProcess().GetBreakpointSiteList().FindByID(break_site_id);
+ BreakpointSiteSP bp_site_sp = m_thread.GetProcess().GetBreakpointSiteList().FindByID(break_site_id);
if (bp_site_sp)
{
uint32_t num_owners = bp_site_sp->GetNumberOfOwners();
@@ -386,7 +474,7 @@
bool
ThreadPlanCallFunction::BreakpointsExplainStop()
{
- lldb::StopInfoSP stop_info_sp = GetPrivateStopReason();
+ StopInfoSP stop_info_sp = GetPrivateStopReason();
if (m_cxx_language_runtime &&
m_cxx_language_runtime->ExceptionBreakpointsExplainStop(stop_info_sp))
More information about the lldb-commits
mailing list