aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm/tools/lldb/source/Plugins/Process/FreeBSD/FreeBSDThread.h
blob: 90c11dbefcb0d9a6439878f90a4bea82740615f1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
//===-- FreeBSDThread.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_FreeBSDThread_H_
#define liblldb_FreeBSDThread_H_

// C++ Includes
#include <memory>
#include <string>

// Other libraries and framework includes
#include "lldb/Target/Thread.h"
#include "RegisterContextPOSIX.h"

class ProcessMessage;
class ProcessMonitor;
class POSIXBreakpointProtocol;

//------------------------------------------------------------------------------
// @class FreeBSDThread
// @brief Abstraction of a FreeBSD thread.
class FreeBSDThread
    : public lldb_private::Thread
{
public:

    //------------------------------------------------------------------
    // Constructors and destructors
    //------------------------------------------------------------------
    FreeBSDThread(lldb_private::Process &process, lldb::tid_t tid);

    virtual ~FreeBSDThread();

    // POSIXThread
    void
    RefreshStateAfterStop() override;

    // This notifies the thread when a private stop occurs.
    void
    DidStop () override;

    const char *
    GetInfo() override;

    void
    SetName (const char *name) override;

    const char *
    GetName () override;

    lldb::RegisterContextSP
    GetRegisterContext() override;

    lldb::RegisterContextSP
    CreateRegisterContextForFrame (lldb_private::StackFrame *frame) override;

    lldb::addr_t
    GetThreadPointer () override;

    //--------------------------------------------------------------------------
    // These functions provide a mapping from the register offset
    // back to the register index or name for use in debugging or log
    // output.

    unsigned
    GetRegisterIndexFromOffset(unsigned offset);

    const char *
    GetRegisterName(unsigned reg);

    const char *
    GetRegisterNameFromOffset(unsigned offset);

    //--------------------------------------------------------------------------
    // These methods form a specialized interface to POSIX threads.
    //
    bool Resume();

    void Notify(const ProcessMessage &message);

    //--------------------------------------------------------------------------
    // These methods provide an interface to watchpoints
    //
    bool EnableHardwareWatchpoint(lldb_private::Watchpoint *wp);

    bool DisableHardwareWatchpoint(lldb_private::Watchpoint *wp);

    uint32_t NumSupportedHardwareWatchpoints();

    uint32_t FindVacantWatchpointIndex();

protected:
    POSIXBreakpointProtocol *
    GetPOSIXBreakpointProtocol ()
    {
        if (!m_reg_context_sp)
            m_reg_context_sp = GetRegisterContext();
        return m_posix_thread;
    }
    
    std::unique_ptr<lldb_private::StackFrame> m_frame_ap;

    lldb::BreakpointSiteSP m_breakpoint;

    bool m_thread_name_valid;
    std::string m_thread_name;
    POSIXBreakpointProtocol *m_posix_thread;

    ProcessMonitor &
    GetMonitor();

    bool
    CalculateStopInfo() override;

    void BreakNotify(const ProcessMessage &message);
    void WatchNotify(const ProcessMessage &message);
    virtual void TraceNotify(const ProcessMessage &message);
    void LimboNotify(const ProcessMessage &message);
    void SignalNotify(const ProcessMessage &message);
    void SignalDeliveredNotify(const ProcessMessage &message);
    void CrashNotify(const ProcessMessage &message);
    void ExitNotify(const ProcessMessage &message);
    void ExecNotify(const ProcessMessage &message);

    lldb_private::Unwind *
    GetUnwinder() override;

    //--------------------------------------------------------------------------
    // FreeBSDThread internal API.

    // POSIXThread override
    virtual void
    WillResume(lldb::StateType resume_state) override;
};

#endif // #ifndef liblldb_FreeBSDThread_H_