Summary: The usage of shared_from_this forces us to separate construction and initialization phases, because shared_from_this() is not available in the constructor (or destructor). The shared semantics are not necessary, as we always have a clear owner of the native process class (GDBRemoteCommunicationServerLLDB object). Even if we need shared semantics in the future (which I think we should strongly avoid), reverting this will not be necessary -- the owners can still easily store the native process object in a shared pointer if they really want to -- this just prevents the knowledge of that from leaking into the class implementation. After this a NativeThread object will hold a reference to the parent process (instead of a weak_ptr) -- having a process instance always available allows us to simplify some logic in this class (some of it was already simplified because we were asserting that the process is available, but this makes it obvious). Reviewers: krytarowski, eugene, zturner Subscribers: lldb-commits Differential Revision: https://reviews.llvm.org/D35123 llvm-svn: 308282
118 lines
3.6 KiB
C++
118 lines
3.6 KiB
C++
//===-- NativeThreadLinux.h ----------------------------------- -*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef liblldb_NativeThreadLinux_H_
|
|
#define liblldb_NativeThreadLinux_H_
|
|
|
|
#include "SingleStepCheck.h"
|
|
#include "lldb/Host/common/NativeThreadProtocol.h"
|
|
#include "lldb/lldb-private-forward.h"
|
|
|
|
#include <map>
|
|
#include <memory>
|
|
#include <string>
|
|
|
|
namespace lldb_private {
|
|
namespace process_linux {
|
|
|
|
class NativeProcessLinux;
|
|
|
|
class NativeThreadLinux : public NativeThreadProtocol {
|
|
friend class NativeProcessLinux;
|
|
|
|
public:
|
|
NativeThreadLinux(NativeProcessLinux &process, lldb::tid_t tid);
|
|
|
|
// ---------------------------------------------------------------------
|
|
// NativeThreadProtocol Interface
|
|
// ---------------------------------------------------------------------
|
|
std::string GetName() override;
|
|
|
|
lldb::StateType GetState() override;
|
|
|
|
bool GetStopReason(ThreadStopInfo &stop_info,
|
|
std::string &description) override;
|
|
|
|
NativeRegisterContextSP 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
|
|
// ---------------------------------------------------------------------
|
|
|
|
/// Resumes the thread. If @p signo is anything but
|
|
/// LLDB_INVALID_SIGNAL_NUMBER, deliver that signal to the thread.
|
|
Status Resume(uint32_t signo);
|
|
|
|
/// Single steps the thread. If @p signo is anything but
|
|
/// LLDB_INVALID_SIGNAL_NUMBER, deliver that signal to the thread.
|
|
Status SingleStep(uint32_t signo);
|
|
|
|
void SetStoppedBySignal(uint32_t signo, const siginfo_t *info = nullptr);
|
|
|
|
/// Return true if the thread is stopped.
|
|
/// If stopped by a signal, indicate the signo in the signo argument.
|
|
/// Otherwise, return LLDB_INVALID_SIGNAL_NUMBER.
|
|
bool IsStopped(int *signo);
|
|
|
|
void SetStoppedByExec();
|
|
|
|
void SetStoppedByBreakpoint();
|
|
|
|
void SetStoppedByWatchpoint(uint32_t wp_index);
|
|
|
|
bool IsStoppedAtBreakpoint();
|
|
|
|
bool IsStoppedAtWatchpoint();
|
|
|
|
void SetStoppedByTrace();
|
|
|
|
void SetStoppedWithNoReason();
|
|
|
|
void SetExited();
|
|
|
|
Status RequestStop();
|
|
|
|
// ---------------------------------------------------------------------
|
|
// Private interface
|
|
// ---------------------------------------------------------------------
|
|
void MaybeLogStateChange(lldb::StateType new_state);
|
|
|
|
NativeProcessLinux &GetProcess();
|
|
|
|
void SetStopped();
|
|
|
|
// ---------------------------------------------------------------------
|
|
// Member Variables
|
|
// ---------------------------------------------------------------------
|
|
lldb::StateType m_state;
|
|
ThreadStopInfo m_stop_info;
|
|
NativeRegisterContextSP m_reg_context_sp;
|
|
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;
|
|
std::unique_ptr<SingleStepWorkaround> m_step_workaround;
|
|
};
|
|
|
|
typedef std::shared_ptr<NativeThreadLinux> NativeThreadLinuxSP;
|
|
} // namespace process_linux
|
|
} // namespace lldb_private
|
|
|
|
#endif // #ifndef liblldb_NativeThreadLinux_H_
|