File indexing completed on 2026-05-10 08:42:48
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef LLDB_HOST_DEBUG_H
0010 #define LLDB_HOST_DEBUG_H
0011
0012 #include <vector>
0013
0014 #include "lldb/lldb-private.h"
0015
0016 namespace lldb_private {
0017
0018
0019 struct ResumeAction {
0020 lldb::tid_t tid;
0021
0022
0023 lldb::StateType state;
0024
0025 int signal;
0026
0027 };
0028
0029
0030
0031
0032
0033 class ResumeActionList {
0034 public:
0035 ResumeActionList() = default;
0036
0037 ResumeActionList(lldb::StateType default_action, int signal) {
0038 SetDefaultThreadActionIfNeeded(default_action, signal);
0039 }
0040
0041 ResumeActionList(const ResumeAction *actions, size_t num_actions) {
0042 if (actions && num_actions) {
0043 m_actions.assign(actions, actions + num_actions);
0044 m_signal_handled.assign(num_actions, false);
0045 }
0046 }
0047
0048 ~ResumeActionList() = default;
0049
0050 bool IsEmpty() const { return m_actions.empty(); }
0051
0052 void Append(const ResumeAction &action) {
0053 m_actions.push_back(action);
0054 m_signal_handled.push_back(false);
0055 }
0056
0057 void AppendAction(lldb::tid_t tid, lldb::StateType state, int signal = 0) {
0058 ResumeAction action = {tid, state, signal};
0059 Append(action);
0060 }
0061
0062 void AppendResumeAll() {
0063 AppendAction(LLDB_INVALID_THREAD_ID, lldb::eStateRunning);
0064 }
0065
0066 void AppendSuspendAll() {
0067 AppendAction(LLDB_INVALID_THREAD_ID, lldb::eStateStopped);
0068 }
0069
0070 void AppendStepAll() {
0071 AppendAction(LLDB_INVALID_THREAD_ID, lldb::eStateStepping);
0072 }
0073
0074 const ResumeAction *GetActionForThread(lldb::tid_t tid,
0075 bool default_ok) const {
0076 const size_t num_actions = m_actions.size();
0077 for (size_t i = 0; i < num_actions; ++i) {
0078 if (m_actions[i].tid == tid)
0079 return &m_actions[i];
0080 }
0081 if (default_ok && tid != LLDB_INVALID_THREAD_ID)
0082 return GetActionForThread(LLDB_INVALID_THREAD_ID, false);
0083 return nullptr;
0084 }
0085
0086 size_t NumActionsWithState(lldb::StateType state) const {
0087 size_t count = 0;
0088 const size_t num_actions = m_actions.size();
0089 for (size_t i = 0; i < num_actions; ++i) {
0090 if (m_actions[i].state == state)
0091 ++count;
0092 }
0093 return count;
0094 }
0095
0096 bool SetDefaultThreadActionIfNeeded(lldb::StateType action, int signal) {
0097 if (GetActionForThread(LLDB_INVALID_THREAD_ID, true) == nullptr) {
0098
0099 ResumeAction default_action = {LLDB_INVALID_THREAD_ID, action, signal};
0100 m_actions.push_back(default_action);
0101 m_signal_handled.push_back(false);
0102 return true;
0103 }
0104 return false;
0105 }
0106
0107 void SetSignalHandledForThread(lldb::tid_t tid) const {
0108 if (tid != LLDB_INVALID_THREAD_ID) {
0109 const size_t num_actions = m_actions.size();
0110 for (size_t i = 0; i < num_actions; ++i) {
0111 if (m_actions[i].tid == tid)
0112 m_signal_handled[i] = true;
0113 }
0114 }
0115 }
0116
0117 const ResumeAction *GetFirst() const { return m_actions.data(); }
0118
0119 size_t GetSize() const { return m_actions.size(); }
0120
0121 void Clear() {
0122 m_actions.clear();
0123 m_signal_handled.clear();
0124 }
0125
0126 protected:
0127 std::vector<ResumeAction> m_actions;
0128 mutable std::vector<bool> m_signal_handled;
0129 };
0130
0131 struct ThreadStopInfo {
0132 lldb::StopReason reason;
0133 uint32_t signo;
0134 union {
0135
0136 struct {
0137 uint64_t type;
0138 uint32_t data_count;
0139 lldb::addr_t data[8];
0140 } exception;
0141
0142
0143 struct {
0144 lldb::pid_t child_pid;
0145 lldb::tid_t child_tid;
0146 } fork;
0147 } details;
0148 };
0149 }
0150
0151 #endif