blob: 3c596ca685497bde59e08c1c3d85be729ba35487 [file] [log] [blame]
Johnny Chen9ed5b492012-01-05 21:48:15 +00001//===-- ProcessMessage.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_ProcessMessage_H_
11#define liblldb_ProcessMessage_H_
12
Chaoren Lin28e57422015-02-03 01:51:25 +000013#include "CrashReason.h"
14
Johnny Chen9ed5b492012-01-05 21:48:15 +000015#include <cassert>
Chaoren Lin28e57422015-02-03 01:51:25 +000016#include <string>
Johnny Chen9ed5b492012-01-05 21:48:15 +000017
18#include "lldb/lldb-defines.h"
19#include "lldb/lldb-types.h"
20
Kate Stoneb9c1b512016-09-06 20:57:50 +000021class ProcessMessage {
Johnny Chen9ed5b492012-01-05 21:48:15 +000022public:
Kate Stoneb9c1b512016-09-06 20:57:50 +000023 /// The type of signal this message can correspond to.
24 enum Kind {
25 eInvalidMessage,
26 eAttachMessage,
27 eExitMessage,
28 eLimboMessage,
29 eSignalMessage,
30 eSignalDeliveredMessage,
31 eTraceMessage,
32 eBreakpointMessage,
33 eWatchpointMessage,
34 eCrashMessage,
35 eNewThreadMessage,
36 eExecMessage
37 };
Johnny Chen9ed5b492012-01-05 21:48:15 +000038
Kate Stoneb9c1b512016-09-06 20:57:50 +000039 ProcessMessage()
40 : m_tid(LLDB_INVALID_PROCESS_ID), m_kind(eInvalidMessage),
41 m_crash_reason(CrashReason::eInvalidCrashReason), m_status(0),
42 m_addr(0) {}
Johnny Chen9ed5b492012-01-05 21:48:15 +000043
Kate Stoneb9c1b512016-09-06 20:57:50 +000044 Kind GetKind() const { return m_kind; }
Johnny Chen9ed5b492012-01-05 21:48:15 +000045
Kate Stoneb9c1b512016-09-06 20:57:50 +000046 lldb::tid_t GetTID() const { return m_tid; }
Johnny Chen9ed5b492012-01-05 21:48:15 +000047
Kate Stoneb9c1b512016-09-06 20:57:50 +000048 /// Indicates that the process @p pid has successfully attached.
49 static ProcessMessage Attach(lldb::pid_t pid) {
50 return ProcessMessage(pid, eAttachMessage);
51 }
Johnny Chen9ed5b492012-01-05 21:48:15 +000052
Kate Stoneb9c1b512016-09-06 20:57:50 +000053 /// Indicates that the thread @p tid is about to exit with status @p status.
54 static ProcessMessage Limbo(lldb::tid_t tid, int status) {
55 return ProcessMessage(tid, eLimboMessage, status);
56 }
Ed Mastee5441432013-09-03 23:55:30 +000057
Kate Stoneb9c1b512016-09-06 20:57:50 +000058 /// Indicates that the thread @p tid had the signal @p signum delivered.
59 static ProcessMessage Signal(lldb::tid_t tid, int signum) {
60 return ProcessMessage(tid, eSignalMessage, signum);
61 }
Johnny Chen9ed5b492012-01-05 21:48:15 +000062
Kate Stoneb9c1b512016-09-06 20:57:50 +000063 /// Indicates that a signal @p signum generated by the debugging process was
64 /// delivered to the thread @p tid.
65 static ProcessMessage SignalDelivered(lldb::tid_t tid, int signum) {
66 return ProcessMessage(tid, eSignalDeliveredMessage, signum);
67 }
Johnny Chen9ed5b492012-01-05 21:48:15 +000068
Kate Stoneb9c1b512016-09-06 20:57:50 +000069 /// Indicates that the thread @p tid encountered a trace point.
70 static ProcessMessage Trace(lldb::tid_t tid) {
71 return ProcessMessage(tid, eTraceMessage);
72 }
Johnny Chen9ed5b492012-01-05 21:48:15 +000073
Kate Stoneb9c1b512016-09-06 20:57:50 +000074 /// Indicates that the thread @p tid encountered a break point.
75 static ProcessMessage Break(lldb::tid_t tid) {
76 return ProcessMessage(tid, eBreakpointMessage);
77 }
Johnny Chen9ed5b492012-01-05 21:48:15 +000078
Kate Stoneb9c1b512016-09-06 20:57:50 +000079 static ProcessMessage Watch(lldb::tid_t tid, lldb::addr_t wp_addr) {
80 return ProcessMessage(tid, eWatchpointMessage, 0, wp_addr);
81 }
Johnny Chen9ed5b492012-01-05 21:48:15 +000082
Kate Stoneb9c1b512016-09-06 20:57:50 +000083 /// Indicates that the thread @p tid crashed.
84 static ProcessMessage Crash(lldb::pid_t pid, CrashReason reason, int signo,
85 lldb::addr_t fault_addr) {
86 ProcessMessage message(pid, eCrashMessage, signo, fault_addr);
87 message.m_crash_reason = reason;
88 return message;
89 }
Matt Kopece9ea0da2013-05-07 19:29:28 +000090
Kate Stoneb9c1b512016-09-06 20:57:50 +000091 /// Indicates that the thread @p child_tid was spawned.
92 static ProcessMessage NewThread(lldb::tid_t parent_tid,
93 lldb::tid_t child_tid) {
94 return ProcessMessage(parent_tid, eNewThreadMessage, child_tid);
95 }
Johnny Chen9ed5b492012-01-05 21:48:15 +000096
Kate Stoneb9c1b512016-09-06 20:57:50 +000097 /// Indicates that the thread @p tid is about to exit with status @p status.
98 static ProcessMessage Exit(lldb::tid_t tid, int status) {
99 return ProcessMessage(tid, eExitMessage, status);
100 }
Matt Kopec650648f2013-01-08 16:30:18 +0000101
Kate Stoneb9c1b512016-09-06 20:57:50 +0000102 /// Indicates that the thread @p pid has exec'd.
103 static ProcessMessage Exec(lldb::tid_t tid) {
104 return ProcessMessage(tid, eExecMessage);
105 }
Andrew Kaylor93132f52013-05-28 23:04:25 +0000106
Kate Stoneb9c1b512016-09-06 20:57:50 +0000107 int GetExitStatus() const {
108 assert(GetKind() == eExitMessage || GetKind() == eLimboMessage);
109 return m_status;
110 }
Matt Kopec718be872013-10-09 19:39:55 +0000111
Kate Stoneb9c1b512016-09-06 20:57:50 +0000112 int GetSignal() const {
113 assert(GetKind() == eSignalMessage || GetKind() == eCrashMessage ||
114 GetKind() == eSignalDeliveredMessage);
115 return m_status;
116 }
Johnny Chen9ed5b492012-01-05 21:48:15 +0000117
Kate Stoneb9c1b512016-09-06 20:57:50 +0000118 int GetStopStatus() const {
119 assert(GetKind() == eSignalMessage);
120 return m_status;
121 }
Johnny Chen9ed5b492012-01-05 21:48:15 +0000122
Kate Stoneb9c1b512016-09-06 20:57:50 +0000123 CrashReason GetCrashReason() const {
124 assert(GetKind() == eCrashMessage);
125 return m_crash_reason;
126 }
Johnny Chen9ed5b492012-01-05 21:48:15 +0000127
Kate Stoneb9c1b512016-09-06 20:57:50 +0000128 lldb::addr_t GetFaultAddress() const {
129 assert(GetKind() == eCrashMessage);
130 return m_addr;
131 }
Johnny Chen9ed5b492012-01-05 21:48:15 +0000132
Kate Stoneb9c1b512016-09-06 20:57:50 +0000133 lldb::addr_t GetHWAddress() const {
134 assert(GetKind() == eWatchpointMessage || GetKind() == eTraceMessage);
135 return m_addr;
136 }
Johnny Chen9ed5b492012-01-05 21:48:15 +0000137
Kate Stoneb9c1b512016-09-06 20:57:50 +0000138 lldb::tid_t GetChildTID() const {
139 assert(GetKind() == eNewThreadMessage);
140 return m_child_tid;
141 }
Matt Kopece9ea0da2013-05-07 19:29:28 +0000142
Kate Stoneb9c1b512016-09-06 20:57:50 +0000143 const char *PrintCrashReason() const;
Matt Kopec650648f2013-01-08 16:30:18 +0000144
Kate Stoneb9c1b512016-09-06 20:57:50 +0000145 const char *PrintKind() const;
Johnny Chen9ed5b492012-01-05 21:48:15 +0000146
Kate Stoneb9c1b512016-09-06 20:57:50 +0000147 static const char *PrintKind(Kind);
Johnny Chen9ed5b492012-01-05 21:48:15 +0000148
149private:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000150 ProcessMessage(lldb::tid_t tid, Kind kind, int status = 0,
151 lldb::addr_t addr = 0)
152 : m_tid(tid), m_kind(kind),
153 m_crash_reason(CrashReason::eInvalidCrashReason), m_status(status),
154 m_addr(addr), m_child_tid(0) {}
Matt Kopec650648f2013-01-08 16:30:18 +0000155
Kate Stoneb9c1b512016-09-06 20:57:50 +0000156 ProcessMessage(lldb::tid_t tid, Kind kind, lldb::tid_t child_tid)
157 : m_tid(tid), m_kind(kind),
158 m_crash_reason(CrashReason::eInvalidCrashReason), m_status(0),
159 m_addr(0), m_child_tid(child_tid) {}
Johnny Chen9ed5b492012-01-05 21:48:15 +0000160
Kate Stoneb9c1b512016-09-06 20:57:50 +0000161 lldb::tid_t m_tid;
162 Kind m_kind : 8;
163 CrashReason m_crash_reason;
164 int m_status;
165 lldb::addr_t m_addr;
166 lldb::tid_t m_child_tid;
Johnny Chen9ed5b492012-01-05 21:48:15 +0000167};
168
169#endif // #ifndef liblldb_ProcessMessage_H_