1254721Semaste//===-- POSIXThread.h -------------------------------------------*- C++ -*-===//
2254721Semaste//
3254721Semaste//                     The LLVM Compiler Infrastructure
4254721Semaste//
5254721Semaste// This file is distributed under the University of Illinois Open Source
6254721Semaste// License. See LICENSE.TXT for details.
7254721Semaste//
8254721Semaste//===----------------------------------------------------------------------===//
9254721Semaste
10254721Semaste#ifndef liblldb_POSIXThread_H_
11254721Semaste#define liblldb_POSIXThread_H_
12254721Semaste
13254721Semaste// C Includes
14254721Semaste// C++ Includes
15254721Semaste#include <memory>
16254721Semaste#include <string>
17254721Semaste
18254721Semaste// Other libraries and framework includes
19254721Semaste#include "lldb/Target/Thread.h"
20254721Semaste#include "RegisterContextPOSIX.h"
21254721Semaste
22254721Semasteclass ProcessMessage;
23254721Semasteclass ProcessMonitor;
24263363Semasteclass POSIXBreakpointProtocol;
25254721Semaste
26254721Semaste//------------------------------------------------------------------------------
27254721Semaste// @class POSIXThread
28254721Semaste// @brief Abstraction of a POSIX thread.
29254721Semasteclass POSIXThread
30254721Semaste    : public lldb_private::Thread
31254721Semaste{
32254721Semastepublic:
33254721Semaste    POSIXThread(lldb_private::Process &process, lldb::tid_t tid);
34254721Semaste
35254721Semaste    virtual ~POSIXThread();
36254721Semaste
37254721Semaste    void
38254721Semaste    RefreshStateAfterStop();
39254721Semaste
40254721Semaste    virtual void
41254721Semaste    WillResume(lldb::StateType resume_state);
42254721Semaste
43254721Semaste    // This notifies the thread when a private stop occurs.
44254721Semaste    virtual void
45254721Semaste    DidStop ();
46254721Semaste
47254721Semaste    const char *
48254721Semaste    GetInfo();
49254721Semaste
50254721Semaste    void
51254721Semaste    SetName (const char *name);
52254721Semaste
53254721Semaste    const char *
54254721Semaste    GetName ();
55254721Semaste
56254721Semaste    virtual lldb::RegisterContextSP
57254721Semaste    GetRegisterContext();
58254721Semaste
59254721Semaste    virtual lldb::RegisterContextSP
60254721Semaste    CreateRegisterContextForFrame (lldb_private::StackFrame *frame);
61254721Semaste
62263363Semaste    virtual lldb::addr_t
63263363Semaste    GetThreadPointer ();
64263363Semaste
65254721Semaste    //--------------------------------------------------------------------------
66254721Semaste    // These functions provide a mapping from the register offset
67254721Semaste    // back to the register index or name for use in debugging or log
68254721Semaste    // output.
69254721Semaste
70254721Semaste    unsigned
71254721Semaste    GetRegisterIndexFromOffset(unsigned offset);
72254721Semaste
73254721Semaste    const char *
74254721Semaste    GetRegisterName(unsigned reg);
75254721Semaste
76254721Semaste    const char *
77254721Semaste    GetRegisterNameFromOffset(unsigned offset);
78254721Semaste
79254721Semaste    //--------------------------------------------------------------------------
80254721Semaste    // These methods form a specialized interface to POSIX threads.
81254721Semaste    //
82269024Semaste    bool Resume();
83269024Semaste
84254721Semaste    void Notify(const ProcessMessage &message);
85254721Semaste
86254721Semaste    //--------------------------------------------------------------------------
87254721Semaste    // These methods provide an interface to watchpoints
88254721Semaste    //
89254721Semaste    bool EnableHardwareWatchpoint(lldb_private::Watchpoint *wp);
90254721Semaste
91254721Semaste    bool DisableHardwareWatchpoint(lldb_private::Watchpoint *wp);
92254721Semaste
93254721Semaste    uint32_t NumSupportedHardwareWatchpoints();
94254721Semaste
95254721Semaste    uint32_t FindVacantWatchpointIndex();
96254721Semaste
97254721Semasteprotected:
98263363Semaste    POSIXBreakpointProtocol *
99263363Semaste    GetPOSIXBreakpointProtocol ()
100254721Semaste    {
101254721Semaste        if (!m_reg_context_sp)
102254721Semaste            m_reg_context_sp = GetRegisterContext();
103263363Semaste        return m_posix_thread;
104254721Semaste    }
105254721Semaste
106254721Semaste    std::unique_ptr<lldb_private::StackFrame> m_frame_ap;
107254721Semaste
108254721Semaste    lldb::BreakpointSiteSP m_breakpoint;
109254721Semaste
110254721Semaste    bool m_thread_name_valid;
111254721Semaste    std::string m_thread_name;
112263363Semaste    POSIXBreakpointProtocol *m_posix_thread;
113254721Semaste
114254721Semaste    ProcessMonitor &
115254721Semaste    GetMonitor();
116254721Semaste
117254721Semaste    virtual bool
118254721Semaste    CalculateStopInfo();
119254721Semaste
120254721Semaste    void BreakNotify(const ProcessMessage &message);
121254721Semaste    void WatchNotify(const ProcessMessage &message);
122254721Semaste    virtual void TraceNotify(const ProcessMessage &message);
123254721Semaste    void LimboNotify(const ProcessMessage &message);
124254721Semaste    void SignalNotify(const ProcessMessage &message);
125254721Semaste    void SignalDeliveredNotify(const ProcessMessage &message);
126254721Semaste    void CrashNotify(const ProcessMessage &message);
127254721Semaste    void ThreadNotify(const ProcessMessage &message);
128254721Semaste    void ExitNotify(const ProcessMessage &message);
129263363Semaste    void ExecNotify(const ProcessMessage &message);
130254721Semaste
131254721Semaste    lldb_private::Unwind *
132254721Semaste    GetUnwinder();
133254721Semaste};
134254721Semaste
135254721Semaste#endif // #ifndef liblldb_POSIXThread_H_
136