diff options
Diffstat (limited to 'lldb/source/Plugins/Process')
5 files changed, 139 insertions, 47 deletions
diff --git a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp index 5e685e000c7..fdd3fe2591b 100644 --- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp @@ -45,8 +45,7 @@ GDBRemoteCommunicationClient::GDBRemoteCommunicationClient(bool is_platform) : 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_alloc_dealloc_memory (eLazyBoolCalculate), m_supports_qProcessInfoPID (true), m_supports_qfProcessInfo (true), m_supports_qUserName (true), @@ -132,8 +131,7 @@ GDBRemoteCommunicationClient::ResetDiscoverableSettings() 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_alloc_dealloc_memory = eLazyBoolCalculate; m_supports_qProcessInfoPID = true; m_supports_qfProcessInfo = true; @@ -1021,9 +1019,9 @@ GDBRemoteCommunicationClient::GetHostArchitecture () addr_t GDBRemoteCommunicationClient::AllocateMemory (size_t size, uint32_t permissions) { - if (m_supports__M != eLazyBoolNo) + if (m_supports_alloc_dealloc_memory != eLazyBoolNo) { - m_supports__M = eLazyBoolYes; + m_supports_alloc_dealloc_memory = eLazyBoolYes; char packet[64]; const int packet_len = ::snprintf (packet, sizeof(packet), "_M%zx,%s%s%s", size, permissions & lldb::ePermissionsReadable ? "r" : "", @@ -1034,7 +1032,7 @@ GDBRemoteCommunicationClient::AllocateMemory (size_t size, uint32_t permissions) if (SendPacketAndWaitForResponse (packet, packet_len, response, false)) { if (response.IsUnsupportedResponse()) - m_supports__M = eLazyBoolNo; + m_supports_alloc_dealloc_memory = eLazyBoolNo; else if (!response.IsErrorResponse()) return response.GetHexMaxU64(false, LLDB_INVALID_ADDRESS); } @@ -1045,9 +1043,9 @@ GDBRemoteCommunicationClient::AllocateMemory (size_t size, uint32_t permissions) bool GDBRemoteCommunicationClient::DeallocateMemory (addr_t addr) { - if (m_supports__m != eLazyBoolNo) + if (m_supports_alloc_dealloc_memory != eLazyBoolNo) { - m_supports__m = eLazyBoolYes; + m_supports_alloc_dealloc_memory = eLazyBoolYes; char packet[64]; const int packet_len = ::snprintf(packet, sizeof(packet), "_m%llx", (uint64_t)addr); assert (packet_len < sizeof(packet)); @@ -1057,7 +1055,7 @@ GDBRemoteCommunicationClient::DeallocateMemory (addr_t addr) if (response.IsOKResponse()) return true; else if (response.IsUnsupportedResponse()) - m_supports__m = eLazyBoolNo; + m_supports_alloc_dealloc_memory = eLazyBoolNo; } } return false; diff --git a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h index e1d17be8105..727bc4e4f88 100644 --- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h +++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h @@ -306,15 +306,9 @@ public: SetCurrentThreadForRun (int tid); lldb_private::LazyBool - SupportsAllocateMemory () const + SupportsAllocDeallocMemory () const { - return m_supports__M; - } - - lldb_private::LazyBool - SupportsDeallocateMemory () const - { - return m_supports__m; + return m_supports_alloc_dealloc_memory; } protected: @@ -331,8 +325,7 @@ protected: 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; + lldb_private::LazyBool m_supports_alloc_dealloc_memory; bool m_supports_qProcessInfoPID:1, diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp index 14f31004a85..172a1cf0f77 100644 --- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp @@ -34,6 +34,7 @@ #include "lldb/Core/State.h" #include "lldb/Core/StreamString.h" #include "lldb/Core/Timer.h" +#include "lldb/Core/Value.h" #include "lldb/Host/TimeValue.h" #include "lldb/Symbol/ObjectFile.h" #include "lldb/Target/DynamicLoader.h" @@ -654,14 +655,18 @@ ProcessGDBRemote::DidLaunchOrAttach () // Fill in what is missing in the triple const llvm::Triple &remote_triple = gdb_remote_arch.GetTriple(); llvm::Triple &target_triple = target_arch.GetTriple(); - if (target_triple.getVendor() == llvm::Triple::UnknownVendor) + if (target_triple.getVendorName().size() == 0) + { target_triple.setVendor (remote_triple.getVendor()); - if (target_triple.getOS() == llvm::Triple::UnknownOS) - target_triple.setOS (remote_triple.getOS()); + if (target_triple.getOSName().size() == 0) + { + target_triple.setOS (remote_triple.getOS()); - if (target_triple.getEnvironment() == llvm::Triple::UnknownEnvironment) - target_triple.setEnvironment (remote_triple.getEnvironment()); + if (target_triple.getEnvironmentName().size() == 0) + target_triple.setEnvironment (remote_triple.getEnvironment()); + } + } } } else @@ -1545,7 +1550,7 @@ ProcessGDBRemote::DoAllocateMemory (size_t size, uint32_t permissions, Error &er { addr_t allocated_addr = LLDB_INVALID_ADDRESS; - LazyBool supported = m_gdb_comm.SupportsAllocateMemory(); + LazyBool supported = m_gdb_comm.SupportsAllocDeallocMemory(); switch (supported) { case eLazyBoolCalculate: @@ -1596,31 +1601,44 @@ ProcessGDBRemote::DoAllocateMemory (size_t size, uint32_t permissions, Error &er 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)); + ThreadPlanCallFunction *call_function_thread_plan = new ThreadPlanCallFunction (*thread, + mmap_range.GetBaseAddress(), + stop_other_threads, + discard_on_error, + &arg1_addr, + &arg2_len, + &arg3_prot, + &arg4_flags, + &arg5_fd, + &arg6_offset); + lldb::ThreadPlanSP call_plan_sp (call_function_thread_plan); if (call_plan_sp) { + ValueSP return_value_sp (new Value); + ClangASTContext *clang_ast_context = m_target.GetScratchClangASTContext(); + lldb::clang_type_t clang_void_ptr_type = clang_ast_context->GetVoidPtrType(false); + return_value_sp->SetValueType (Value::eValueTypeScalar); + return_value_sp->SetContext (Value::eContextTypeClangType, clang_void_ptr_type); + call_function_thread_plan->RequestReturnValue (return_value_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); + ExecutionResults result = RunThreadPlan (exe_ctx, + call_plan_sp, + stop_other_threads, + try_all_threads, + discard_on_error, + single_thread_timeout_usec, + error_strm); + if (result == eExecutionCompleted) + { + allocated_addr = return_value_sp->GetScalar().ULongLong(); + m_addr_to_mmap_size[allocated_addr] = size; + } } } } @@ -1641,8 +1659,91 @@ Error ProcessGDBRemote::DoDeallocateMemory (lldb::addr_t addr) { Error error; - if (!m_gdb_comm.DeallocateMemory (addr)) - error.SetErrorStringWithFormat("unable to deallocate memory at 0x%llx", addr); + LazyBool supported = m_gdb_comm.SupportsAllocDeallocMemory(); + + switch (supported) + { + case eLazyBoolCalculate: + // We should never be deallocating memory without allocating memory + // first so we should never get eLazyBoolCalculate + error.SetErrorString ("tried to deallocate memory without ever allocating memory"); + break; + + case eLazyBoolYes: + if (!m_gdb_comm.DeallocateMemory (addr)) + error.SetErrorStringWithFormat("unable to deallocate memory at 0x%llx", addr); + break; + + case eLazyBoolNo: + // Call munmap() to create executable memory in the inferior.. + { + MMapMap::iterator pos = m_addr_to_mmap_size.find(addr); + if (pos != m_addr_to_mmap_size.end()) + { + 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 ("munmap"), + 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 = addr; + addr_t arg2_len = pos->second; + + AddressRange munmap_range; + if (sc.GetAddressRange(range_scope, 0, use_inline_block_range, munmap_range)) + { + lldb::ThreadPlanSP call_plan_sp (new ThreadPlanCallFunction (*thread, + munmap_range.GetBaseAddress(), + stop_other_threads, + discard_on_error, + &arg1_addr, + &arg2_len)); + if (call_plan_sp) + { + StreamFile error_strm; + StackFrame *frame = thread->GetStackFrameAtIndex (0).get(); + if (frame) + { + ExecutionContext exe_ctx; + frame->CalculateExecutionContext (exe_ctx); + ExecutionResults result = RunThreadPlan (exe_ctx, + call_plan_sp, + stop_other_threads, + try_all_threads, + discard_on_error, + single_thread_timeout_usec, + error_strm); + if (result == eExecutionCompleted) + { + m_addr_to_mmap_size.erase (pos); + } + } + } + } + } + } + } + } + break; + } + return error; } diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h index cf03604a182..21646cbf286 100644 --- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h +++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.h @@ -303,6 +303,7 @@ protected: lldb::thread_t m_async_thread; typedef std::vector<lldb::tid_t> tid_collection; typedef std::vector< std::pair<lldb::tid_t,int> > tid_sig_collection; + typedef std::map<lldb::addr_t, lldb::addr_t> MMapMap; tid_collection m_continue_c_tids; // 'c' for continue tid_sig_collection m_continue_C_tids; // 'C' for continue with signal tid_collection m_continue_s_tids; // 's' for step @@ -312,7 +313,7 @@ protected: bool m_waiting_for_attach; bool m_local_debugserver; // Is the debugserver process we are talking to local or on another machine. std::vector<lldb::user_id_t> m_thread_observation_bps; - + MMapMap m_addr_to_mmap_size; bool StartAsyncThread (); diff --git a/lldb/source/Plugins/Process/gdb-remote/ThreadGDBRemote.cpp b/lldb/source/Plugins/Process/gdb-remote/ThreadGDBRemote.cpp index 3e9cef34c19..8ed7edaedb4 100644 --- a/lldb/source/Plugins/Process/gdb-remote/ThreadGDBRemote.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/ThreadGDBRemote.cpp @@ -43,7 +43,6 @@ ThreadGDBRemote::ThreadGDBRemote (ProcessGDBRemote &process, lldb::tid_t tid) : m_dispatch_queue_name (), m_thread_dispatch_qaddr (LLDB_INVALID_ADDRESS) { -// ProcessGDBRemoteLog::LogIf(GDBR_LOG_THREAD | GDBR_LOG_VERBOSE, "ThreadGDBRemote::ThreadGDBRemote ( pid = %i, tid = 0x%4.4x, )", m_process.GetID(), GetID()); ProcessGDBRemoteLog::LogIf(GDBR_LOG_THREAD, "%p: ThreadGDBRemote::ThreadGDBRemote (pid = %i, tid = 0x%4.4x)", this, m_process.GetID(), GetID()); } |