diff options
-rw-r--r-- | lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp | 40 | ||||
-rw-r--r-- | lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.h | 9 | ||||
-rw-r--r-- | lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp | 47 | ||||
-rw-r--r-- | lldb/source/Symbol/ClangASTContext.cpp | 4 | ||||
-rw-r--r-- | lldb/source/Symbol/ClangASTType.cpp | 4 | ||||
-rw-r--r-- | lldb/source/Target/Process.cpp | 8 | ||||
-rw-r--r-- | lldb/tools/debugserver/source/RNBRemote.cpp | 9 |
7 files changed, 60 insertions, 61 deletions
diff --git a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp index 92e33b25771..38b823f77aa 100644 --- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp @@ -87,15 +87,24 @@ GDBRemoteCommunication::CalculcateChecksum (const char *payload, size_t payload_ } size_t -GDBRemoteCommunication::SendAck (char ack_char) +GDBRemoteCommunication::SendAck () { - Mutex::Locker locker(m_sequence_mutex); - ProcessGDBRemoteLog::LogIf (GDBR_LOG_PACKETS, "send packet: %c", ack_char); + ProcessGDBRemoteLog::LogIf (GDBR_LOG_PACKETS, "send packet: +"); ConnectionStatus status = eConnectionStatusSuccess; + char ack_char = '+'; return Write (&ack_char, 1, status, NULL) == 1; } size_t +GDBRemoteCommunication::SendNack () +{ + ProcessGDBRemoteLog::LogIf (GDBR_LOG_PACKETS, "send packet: -"); + ConnectionStatus status = eConnectionStatusSuccess; + char nack_char = '-'; + return Write (&nack_char, 1, status, NULL) == 1; +} + +size_t GDBRemoteCommunication::SendPacketAndWaitForResponse ( const char *payload, @@ -141,7 +150,8 @@ GDBRemoteCommunication::SendPacketAndWaitForResponse m_async_packet_predicate.SetValue (true, eBroadcastNever); bool timed_out = false; - if (SendInterrupt(locker, 1, &timed_out)) + bool sent_interrupt = false; + if (SendInterrupt(locker, 1, sent_interrupt, timed_out)) { if (m_async_packet_predicate.WaitForValueEqualTo (false, &timeout_time, &timed_out)) { @@ -443,8 +453,9 @@ GDBRemoteCommunication::SendAsyncSignal (int signo) { m_async_signal = signo; bool timed_out = false; + bool sent_interrupt = false; Mutex::Locker locker; - if (SendInterrupt (locker, 1, &timed_out)) + if (SendInterrupt (locker, 1, sent_interrupt, timed_out)) return true; m_async_signal = -1; return false; @@ -461,10 +472,16 @@ GDBRemoteCommunication::SendAsyncSignal (int signo) // (gdb remote protocol requires this), and do what we need to do, then resume. bool -GDBRemoteCommunication::SendInterrupt (Mutex::Locker& locker, uint32_t seconds_to_wait_for_stop, bool *timed_out) +GDBRemoteCommunication::SendInterrupt +( + Mutex::Locker& locker, + uint32_t seconds_to_wait_for_stop, + bool &sent_interrupt, + bool &timed_out +) { - if (timed_out) - *timed_out = false; + sent_interrupt = false; + timed_out = false; if (IsConnected() && IsRunning()) { @@ -484,8 +501,9 @@ GDBRemoteCommunication::SendInterrupt (Mutex::Locker& locker, uint32_t seconds_t ProcessGDBRemoteLog::LogIf (GDBR_LOG_PACKETS, "send packet: \\x03"); if (Write (&ctrl_c, 1, status, NULL) > 0) { + sent_interrupt = true; if (seconds_to_wait_for_stop) - m_private_is_running.WaitForValueEqualTo (false, &timeout, timed_out); + m_private_is_running.WaitForValueEqualTo (false, &timeout, &timed_out); return true; } } @@ -553,9 +571,9 @@ GDBRemoteCommunication::WaitForPacketNoLock (StringExtractorGDBRemote &response, checksum_error = packet_checksum != actual_checksum; // Send the ack or nack if needed if (checksum_error || !success) - SendAck('-'); + SendNack(); else - SendAck('+'); + SendAck(); } } else diff --git a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.h b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.h index ab9384f291e..bcbaeb5ebd9 100644 --- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.h +++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.h @@ -87,7 +87,11 @@ public: GetAck (uint32_t timeout_seconds); size_t - SendAck (char ack_char); + SendAck (); + + size_t + SendNack (); + char CalculcateChecksum (const char *payload, @@ -117,7 +121,8 @@ public: bool SendInterrupt (lldb_private::Mutex::Locker &locker, uint32_t seconds_to_wait_for_stop, - bool *timed_out = NULL); + bool &sent_interrupt, + bool &timed_out); bool GetSequenceMutex(lldb_private::Mutex::Locker& locker); diff --git a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp index f0087ec4200..5abe070f962 100644 --- a/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp @@ -541,7 +541,7 @@ ProcessGDBRemote::ConnectToDebugserver (const char *host_port) if (m_gdb_comm.StartReadThread(&error)) { // Send an initial ack - m_gdb_comm.SendAck('+'); + m_gdb_comm.SendAck(); if (m_debugserver_pid != LLDB_INVALID_PROCESS_ID) m_debugserver_thread = Host::StartMonitoringChildProcess (MonitorDebugserverProcess, @@ -1141,24 +1141,16 @@ Error ProcessGDBRemote::DoHalt (bool &caused_stop) { Error error; - - if (m_gdb_comm.IsRunning()) - { - caused_stop = true; - bool timed_out = false; - Mutex::Locker locker; - if (!m_gdb_comm.SendInterrupt (locker, 2, &timed_out)) - { - if (timed_out) - error.SetErrorString("timed out sending interrupt packet"); - else - error.SetErrorString("unknown error sending interrupt packet"); - } - } - else + bool timed_out = false; + Mutex::Locker locker; + + if (!m_gdb_comm.SendInterrupt (locker, 2, caused_stop, timed_out)) { - caused_stop = false; + if (timed_out) + error.SetErrorString("timed out sending interrupt packet"); + else + error.SetErrorString("unknown error sending interrupt packet"); } return error; @@ -1172,11 +1164,12 @@ ProcessGDBRemote::WillDetach () if (m_gdb_comm.IsRunning()) { bool timed_out = false; + bool sent_interrupt = false; Mutex::Locker locker; PausePrivateStateThread(); m_thread_list.DiscardThreadPlans(); m_debugserver_pid = LLDB_INVALID_PROCESS_ID; - if (!m_gdb_comm.SendInterrupt (locker, 2, &timed_out)) + if (!m_gdb_comm.SendInterrupt (locker, 2, sent_interrupt, timed_out)) { if (timed_out) error.SetErrorString("timed out sending interrupt packet"); @@ -1238,22 +1231,10 @@ ProcessGDBRemote::DoDestroy () log->Printf ("ProcessGDBRemote::DoDestroy()"); // Interrupt if our inferior is running... - Mutex::Locker locker; - m_gdb_comm.SendInterrupt (locker, 1); - DisableAllBreakpointSites (); - SetExitStatus(-1, "process killed"); - - StringExtractorGDBRemote response; - if (m_gdb_comm.SendPacketAndWaitForResponse("k", response, 1, false)) + if (m_gdb_comm.IsConnected()) { - log = ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS); - if (log) - { - if (response.IsOKPacket()) - log->Printf ("ProcessGDBRemote::DoDestroy() kill was successful"); - else - log->Printf ("ProcessGDBRemote::DoDestroy() kill failed: %s", response.GetStringRef().c_str()); - } + // Don't get a response when killing our + m_gdb_comm.SendPacket ("k", 1); } StopAsyncThread (); diff --git a/lldb/source/Symbol/ClangASTContext.cpp b/lldb/source/Symbol/ClangASTContext.cpp index 9988d0860c9..7e68a637f29 100644 --- a/lldb/source/Symbol/ClangASTContext.cpp +++ b/lldb/source/Symbol/ClangASTContext.cpp @@ -2475,9 +2475,9 @@ ClangASTContext::GetChildClangTypeAtIndex if (base_class->isVirtual()) - bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity(); + bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8; else - bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity(); + bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8; // Base classes should be a multiple of 8 bits in size assert (bit_offset % 8 == 0); diff --git a/lldb/source/Symbol/ClangASTType.cpp b/lldb/source/Symbol/ClangASTType.cpp index 6f6afdebf7d..de559fdc1d0 100644 --- a/lldb/source/Symbol/ClangASTType.cpp +++ b/lldb/source/Symbol/ClangASTType.cpp @@ -392,9 +392,9 @@ ClangASTType::DumpValue continue; if (base_class->isVirtual()) - field_bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity(); + field_bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8; else - field_bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity(); + field_bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8; field_byte_offset = field_bit_offset / 8; assert (field_bit_offset % 8 == 0); if (child_idx == 0) diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp index 2903daddde9..dab34765ef5 100644 --- a/lldb/source/Target/Process.cpp +++ b/lldb/source/Target/Process.cpp @@ -407,7 +407,6 @@ Process::WaitForStateChangedEvents (const TimeValue *timeout, EventSP &event_sp) event_sp)) state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); - log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS); if (log) log->Printf ("Process::%s (timeout = %p, event_sp) => %s", __FUNCTION__, @@ -427,7 +426,6 @@ Process::PeekAtStateChangedEvents () Event *event_ptr; event_ptr = m_listener.PeekAtNextEventForBroadcasterWithType (this, eBroadcastBitStateChanged); - log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS); if (log) { if (event_ptr) @@ -463,7 +461,6 @@ Process::WaitForStateChangedEventsPrivate (const TimeValue *timeout, EventSP &ev // This is a bit of a hack, but when we wait here we could very well return // to the command-line, and that could disable the log, which would render the // log we got above invalid. - log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS); if (log) log->Printf ("Process::%s (timeout = %p, event_sp) => %s", __FUNCTION__, timeout, StateAsCString(state)); return state; @@ -2140,7 +2137,6 @@ Process::RunPrivateStateThread () break; } - log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS); if (log) log->Printf ("Process::%s (arg = %p, pid = %i) got a control event: %d", __FUNCTION__, this, GetID(), event_sp->GetType()); @@ -2160,7 +2156,6 @@ Process::RunPrivateStateThread () internal_state == eStateExited || internal_state == eStateDetached ) { - log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS); if (log) log->Printf ("Process::%s (arg = %p, pid = %i) about to exit with internal state %s...", __FUNCTION__, this, GetID(), StateAsCString(internal_state)); @@ -2169,10 +2164,11 @@ Process::RunPrivateStateThread () } // Verify log is still enabled before attempting to write to it... - log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS); if (log) log->Printf ("Process::%s (arg = %p, pid = %i) thread exiting...", __FUNCTION__, this, GetID()); + m_private_state_control_wait.SetValue (true, eBroadcastAlways); + m_private_state_thread = LLDB_INVALID_HOST_THREAD; return NULL; } diff --git a/lldb/tools/debugserver/source/RNBRemote.cpp b/lldb/tools/debugserver/source/RNBRemote.cpp index bb1951955d3..235f9a7e047 100644 --- a/lldb/tools/debugserver/source/RNBRemote.cpp +++ b/lldb/tools/debugserver/source/RNBRemote.cpp @@ -3123,11 +3123,10 @@ RNBRemote::HandlePacket_D (const char *p) rnb_err_t RNBRemote::HandlePacket_k (const char *p) { - if (!m_ctx.HasValidProcessID()) - return SendPacket ("E26"); - if (!DNBProcessKill (m_ctx.ProcessID())) - return SendPacket ("E27"); - return SendPacket ("OK"); + // No response to should be sent to the kill packet + if (m_ctx.HasValidProcessID()) + DNBProcessKill (m_ctx.ProcessID()); + return rnb_success; } rnb_err_t |