blob: f1b6a6e44782833aef98a6b0f25617219d28ab95 (
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
|
//===-- 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 "lldb/lldb-private-forward.h"
#include "lldb/Host/common/NativeThreadProtocol.h"
#include <sched.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;
Error
SetWatchpoint (lldb::addr_t addr, size_t size, uint32_t watch_flags, bool hardware) override;
Error
RemoveWatchpoint (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.
Error
Resume(uint32_t signo);
/// Single steps the thread. If @p signo is anything but
/// LLDB_INVALID_SIGNAL_NUMBER, deliver that signal to the thread.
Error
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 ();
Error
RequestStop ();
// ---------------------------------------------------------------------
// Private interface
// ---------------------------------------------------------------------
void
MaybeLogStateChange (lldb::StateType new_state);
NativeProcessLinux &
GetProcess();
void
SetStopped();
inline void
MaybePrepareSingleStepWorkaround();
inline void
MaybeCleanupSingleStepWorkaround();
// ---------------------------------------------------------------------
// 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;
cpu_set_t m_original_cpu_set; // For single-step workaround.
};
typedef std::shared_ptr<NativeThreadLinux> NativeThreadLinuxSP;
} // namespace process_linux
} // namespace lldb_private
#endif // #ifndef liblldb_NativeThreadLinux_H_
|