Files
clang-p2996/lldb/source/Plugins/Process/FreeBSDRemote/NativeThreadFreeBSD.h
Michał Górny 1a600266c3 [lldb] Initial version of FreeBSD remote process plugin
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
2020-10-08 16:03:00 +02:00

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_