Add a new FreeBSD Process plugin using client/server model. This plugin is based on the one used by NetBSD. It currently supports a subset of functionality for amd64. It is automatically used when spawning lldb-server. It can also be used by lldb client by setting FREEBSD_REMOTE_PLUGIN environment variable (to any value). The code is capable of debugging simple single-threaded programs. It supports general purpose, debug and FPU registers (up to XMM) of amd64, basic signalling, software breakpoints. Adding the support for the plugin involves removing some dead code from FreeBSDPlatform plugin (that was not ever used because CanDebugProcess() returned false), and replacing it with appropriate code from NetBSD platform support. Differential Revision: https://reviews.llvm.org/D88796
84 lines
2.4 KiB
C++
84 lines
2.4 KiB
C++
//===-- NativeThreadFreeBSD.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_NativeThreadFreeBSD_H_
|
|
#define liblldb_NativeThreadFreeBSD_H_
|
|
|
|
#include "lldb/Host/common/NativeThreadProtocol.h"
|
|
|
|
#include "Plugins/Process/FreeBSDRemote/NativeRegisterContextFreeBSD.h"
|
|
|
|
#include <csignal>
|
|
#include <map>
|
|
#include <string>
|
|
|
|
namespace lldb_private {
|
|
namespace process_freebsd {
|
|
|
|
class NativeProcessFreeBSD;
|
|
|
|
class NativeThreadFreeBSD : public NativeThreadProtocol {
|
|
friend class NativeProcessFreeBSD;
|
|
|
|
public:
|
|
NativeThreadFreeBSD(NativeProcessFreeBSD &process, lldb::tid_t tid);
|
|
|
|
// NativeThreadProtocol Interface
|
|
std::string GetName() override;
|
|
|
|
lldb::StateType GetState() override;
|
|
|
|
bool GetStopReason(ThreadStopInfo &stop_info,
|
|
std::string &description) override;
|
|
|
|
NativeRegisterContextFreeBSD &GetRegisterContext() override;
|
|
|
|
Status SetWatchpoint(lldb::addr_t addr, size_t size, uint32_t watch_flags,
|
|
bool hardware) override;
|
|
|
|
Status RemoveWatchpoint(lldb::addr_t addr) override;
|
|
|
|
Status SetHardwareBreakpoint(lldb::addr_t addr, size_t size) override;
|
|
|
|
Status RemoveHardwareBreakpoint(lldb::addr_t addr) override;
|
|
|
|
private:
|
|
// Interface for friend classes
|
|
|
|
Status Resume();
|
|
Status SingleStep();
|
|
Status Suspend();
|
|
|
|
void SetStoppedBySignal(uint32_t signo, const siginfo_t *info = nullptr);
|
|
void SetStoppedByBreakpoint();
|
|
void SetStoppedByTrace();
|
|
void SetStoppedByExec();
|
|
void SetStoppedByWatchpoint(uint32_t wp_index);
|
|
void SetStoppedWithNoReason();
|
|
void SetStopped();
|
|
void SetRunning();
|
|
void SetStepping();
|
|
|
|
Status CopyWatchpointsFrom(NativeThreadFreeBSD &source);
|
|
|
|
// Member Variables
|
|
lldb::StateType m_state;
|
|
ThreadStopInfo m_stop_info;
|
|
std::unique_ptr<NativeRegisterContextFreeBSD> m_reg_context_up;
|
|
std::string m_stop_description;
|
|
using WatchpointIndexMap = std::map<lldb::addr_t, uint32_t>;
|
|
WatchpointIndexMap m_watchpoint_index_map;
|
|
WatchpointIndexMap m_hw_break_index_map;
|
|
};
|
|
|
|
typedef std::shared_ptr<NativeThreadFreeBSD> NativeThreadFreeBSDSP;
|
|
} // namespace process_freebsd
|
|
} // namespace lldb_private
|
|
|
|
#endif // #ifndef liblldb_NativeThreadFreeBSD_H_
|