POSIXThread.h revision 102b2c2681c9a830afe25bfea35557421905e42c
1//===-- POSIXThread.h -------------------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef liblldb_POSIXThread_H_
11#define liblldb_POSIXThread_H_
12
13// C Includes
14// C++ Includes
15#include <memory>
16
17// Other libraries and framework includes
18#include "lldb/Target/Thread.h"
19#include "RegisterContextPOSIX.h"
20
21class ProcessMessage;
22class ProcessMonitor;
23class RegisterContextPOSIX;
24
25//------------------------------------------------------------------------------
26// @class POSIXThread
27// @brief Abstraction of a linux process (thread).
28class POSIXThread
29    : public lldb_private::Thread
30{
31public:
32    POSIXThread(lldb_private::Process &process, lldb::tid_t tid);
33
34    virtual ~POSIXThread();
35
36    void
37    RefreshStateAfterStop();
38
39    bool
40    WillResume(lldb::StateType resume_state);
41
42    const char *
43    GetInfo();
44
45    virtual lldb::RegisterContextSP
46    GetRegisterContext();
47
48    virtual lldb::RegisterContextSP
49    CreateRegisterContextForFrame (lldb_private::StackFrame *frame);
50
51    //--------------------------------------------------------------------------
52    // These static functions provide a mapping from the register offset
53    // back to the register index or name for use in debugging or log
54    // output.
55
56    static unsigned
57    GetRegisterIndexFromOffset(unsigned offset);
58
59    static const char *
60    GetRegisterName(unsigned reg);
61
62    static const char *
63    GetRegisterNameFromOffset(unsigned offset);
64
65    //--------------------------------------------------------------------------
66    // These methods form a specialized interface to linux threads.
67    //
68    bool Resume();
69
70    void Notify(const ProcessMessage &message);
71
72private:
73    RegisterContextPOSIX *
74    GetRegisterContextPOSIX ()
75    {
76        if (!m_reg_context_sp)
77            m_reg_context_sp = GetRegisterContext();
78#if 0
79        return dynamic_cast<RegisterContextPOSIX*>(m_reg_context_sp.get());
80#endif
81        return (RegisterContextPOSIX *)m_reg_context_sp.get();
82    }
83
84    std::unique_ptr<lldb_private::StackFrame> m_frame_ap;
85
86    lldb::BreakpointSiteSP m_breakpoint;
87    lldb::StopInfoSP m_stop_info;
88
89    ProcessMonitor &
90    GetMonitor();
91
92    lldb::StopInfoSP
93    GetPrivateStopReason();
94
95    void BreakNotify(const ProcessMessage &message);
96    void TraceNotify(const ProcessMessage &message);
97    void LimboNotify(const ProcessMessage &message);
98    void SignalNotify(const ProcessMessage &message);
99    void SignalDeliveredNotify(const ProcessMessage &message);
100    void CrashNotify(const ProcessMessage &message);
101    void ThreadNotify(const ProcessMessage &message);
102
103    lldb_private::Unwind *
104    GetUnwinder();
105};
106
107#endif // #ifndef liblldb_POSIXThread_H_
108