mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-04-12 19:38:50 +00:00

To support dumping the reproducer's GDB remote packets, we need the (de)serialization logic to live in Utility rather than the GDB remote plugin. This patch renames StreamGDBRemote to GDBRemote and moves the relevant packet code there. Its uses in the GDBRemoteCommunicationHistory and the GDBRemoteCommunicationReplayServer are updated as well. Differential revision: https://reviews.llvm.org/D67523 llvm-svn: 371907
83 lines
2.4 KiB
C++
83 lines
2.4 KiB
C++
//===-- GDBRemoteCommunicationReplayServer.h --------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef liblldb_GDBRemoteCommunicationReplayServer_h_
|
|
#define liblldb_GDBRemoteCommunicationReplayServer_h_
|
|
|
|
// Other libraries and framework includes
|
|
#include "GDBRemoteCommunication.h"
|
|
#include "GDBRemoteCommunicationHistory.h"
|
|
|
|
// Project includes
|
|
#include "lldb/Host/HostThread.h"
|
|
#include "lldb/Utility/Broadcaster.h"
|
|
#include "lldb/lldb-private-forward.h"
|
|
#include "llvm/Support/Error.h"
|
|
|
|
// C Includes
|
|
// C++ Includes
|
|
#include <functional>
|
|
#include <map>
|
|
#include <thread>
|
|
|
|
class StringExtractorGDBRemote;
|
|
|
|
namespace lldb_private {
|
|
namespace process_gdb_remote {
|
|
|
|
class ProcessGDBRemote;
|
|
|
|
/// Dummy GDB server that replays packets from the GDB Remote Communication
|
|
/// history. This is used to replay GDB packets.
|
|
class GDBRemoteCommunicationReplayServer : public GDBRemoteCommunication {
|
|
public:
|
|
GDBRemoteCommunicationReplayServer();
|
|
|
|
~GDBRemoteCommunicationReplayServer() override;
|
|
|
|
PacketResult GetPacketAndSendResponse(Timeout<std::micro> timeout,
|
|
Status &error, bool &interrupt,
|
|
bool &quit);
|
|
|
|
bool HandshakeWithClient() { return GetAck() == PacketResult::Success; }
|
|
|
|
llvm::Error LoadReplayHistory(const FileSpec &path);
|
|
|
|
bool StartAsyncThread();
|
|
void StopAsyncThread();
|
|
|
|
protected:
|
|
enum {
|
|
eBroadcastBitAsyncContinue = (1 << 0),
|
|
eBroadcastBitAsyncThreadShouldExit = (1 << 1),
|
|
};
|
|
|
|
static void ReceivePacket(GDBRemoteCommunicationReplayServer &server,
|
|
bool &done);
|
|
static lldb::thread_result_t AsyncThread(void *arg);
|
|
|
|
/// Replay history with the oldest packet at the end.
|
|
std::vector<GDBRemotePacket> m_packet_history;
|
|
|
|
/// Server thread.
|
|
Broadcaster m_async_broadcaster;
|
|
lldb::ListenerSP m_async_listener_sp;
|
|
HostThread m_async_thread;
|
|
std::recursive_mutex m_async_thread_state_mutex;
|
|
|
|
bool m_skip_acks;
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(GDBRemoteCommunicationReplayServer);
|
|
};
|
|
|
|
} // namespace process_gdb_remote
|
|
} // namespace lldb_private
|
|
|
|
#endif // liblldb_GDBRemoteCommunicationReplayServer_h_
|