xref: /openbsd-src/gnu/llvm/lldb/source/Plugins/Process/POSIX/ProcessMessage.h (revision 061da546b983eb767bad15e67af1174fb0bcf31c)
1*061da546Spatrick //===-- ProcessMessage.h ----------------------------------------*- C++ -*-===//
2*061da546Spatrick //
3*061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5*061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*061da546Spatrick //
7*061da546Spatrick //===----------------------------------------------------------------------===//
8*061da546Spatrick 
9*061da546Spatrick #ifndef liblldb_ProcessMessage_H_
10*061da546Spatrick #define liblldb_ProcessMessage_H_
11*061da546Spatrick 
12*061da546Spatrick #include "CrashReason.h"
13*061da546Spatrick 
14*061da546Spatrick #include <cassert>
15*061da546Spatrick #include <string>
16*061da546Spatrick 
17*061da546Spatrick #include "lldb/lldb-defines.h"
18*061da546Spatrick #include "lldb/lldb-types.h"
19*061da546Spatrick 
20*061da546Spatrick class ProcessMessage {
21*061da546Spatrick public:
22*061da546Spatrick   /// The type of signal this message can correspond to.
23*061da546Spatrick   enum Kind {
24*061da546Spatrick     eInvalidMessage,
25*061da546Spatrick     eAttachMessage,
26*061da546Spatrick     eExitMessage,
27*061da546Spatrick     eLimboMessage,
28*061da546Spatrick     eSignalMessage,
29*061da546Spatrick     eSignalDeliveredMessage,
30*061da546Spatrick     eTraceMessage,
31*061da546Spatrick     eBreakpointMessage,
32*061da546Spatrick     eWatchpointMessage,
33*061da546Spatrick     eCrashMessage,
34*061da546Spatrick     eNewThreadMessage,
35*061da546Spatrick     eExecMessage
36*061da546Spatrick   };
37*061da546Spatrick 
ProcessMessage()38*061da546Spatrick   ProcessMessage()
39*061da546Spatrick       : m_tid(LLDB_INVALID_PROCESS_ID), m_kind(eInvalidMessage),
40*061da546Spatrick         m_crash_reason(CrashReason::eInvalidCrashReason), m_status(0),
41*061da546Spatrick         m_addr(0) {}
42*061da546Spatrick 
GetKind()43*061da546Spatrick   Kind GetKind() const { return m_kind; }
44*061da546Spatrick 
GetTID()45*061da546Spatrick   lldb::tid_t GetTID() const { return m_tid; }
46*061da546Spatrick 
47*061da546Spatrick   /// Indicates that the process \p pid has successfully attached.
Attach(lldb::pid_t pid)48*061da546Spatrick   static ProcessMessage Attach(lldb::pid_t pid) {
49*061da546Spatrick     return ProcessMessage(pid, eAttachMessage);
50*061da546Spatrick   }
51*061da546Spatrick 
52*061da546Spatrick   /// Indicates that the thread \p tid is about to exit with status \p status.
Limbo(lldb::tid_t tid,int status)53*061da546Spatrick   static ProcessMessage Limbo(lldb::tid_t tid, int status) {
54*061da546Spatrick     return ProcessMessage(tid, eLimboMessage, status);
55*061da546Spatrick   }
56*061da546Spatrick 
57*061da546Spatrick   /// Indicates that the thread \p tid had the signal \p signum delivered.
Signal(lldb::tid_t tid,int signum)58*061da546Spatrick   static ProcessMessage Signal(lldb::tid_t tid, int signum) {
59*061da546Spatrick     return ProcessMessage(tid, eSignalMessage, signum);
60*061da546Spatrick   }
61*061da546Spatrick 
62*061da546Spatrick   /// Indicates that a signal \p signum generated by the debugging process was
63*061da546Spatrick   /// delivered to the thread \p tid.
SignalDelivered(lldb::tid_t tid,int signum)64*061da546Spatrick   static ProcessMessage SignalDelivered(lldb::tid_t tid, int signum) {
65*061da546Spatrick     return ProcessMessage(tid, eSignalDeliveredMessage, signum);
66*061da546Spatrick   }
67*061da546Spatrick 
68*061da546Spatrick   /// Indicates that the thread \p tid encountered a trace point.
Trace(lldb::tid_t tid)69*061da546Spatrick   static ProcessMessage Trace(lldb::tid_t tid) {
70*061da546Spatrick     return ProcessMessage(tid, eTraceMessage);
71*061da546Spatrick   }
72*061da546Spatrick 
73*061da546Spatrick   /// Indicates that the thread \p tid encountered a break point.
Break(lldb::tid_t tid)74*061da546Spatrick   static ProcessMessage Break(lldb::tid_t tid) {
75*061da546Spatrick     return ProcessMessage(tid, eBreakpointMessage);
76*061da546Spatrick   }
77*061da546Spatrick 
Watch(lldb::tid_t tid,lldb::addr_t wp_addr)78*061da546Spatrick   static ProcessMessage Watch(lldb::tid_t tid, lldb::addr_t wp_addr) {
79*061da546Spatrick     return ProcessMessage(tid, eWatchpointMessage, 0, wp_addr);
80*061da546Spatrick   }
81*061da546Spatrick 
82*061da546Spatrick   /// Indicates that the thread \p tid crashed.
Crash(lldb::pid_t pid,CrashReason reason,int signo,lldb::addr_t fault_addr)83*061da546Spatrick   static ProcessMessage Crash(lldb::pid_t pid, CrashReason reason, int signo,
84*061da546Spatrick                               lldb::addr_t fault_addr) {
85*061da546Spatrick     ProcessMessage message(pid, eCrashMessage, signo, fault_addr);
86*061da546Spatrick     message.m_crash_reason = reason;
87*061da546Spatrick     return message;
88*061da546Spatrick   }
89*061da546Spatrick 
90*061da546Spatrick   /// Indicates that the thread \p child_tid was spawned.
NewThread(lldb::tid_t parent_tid,lldb::tid_t child_tid)91*061da546Spatrick   static ProcessMessage NewThread(lldb::tid_t parent_tid,
92*061da546Spatrick                                   lldb::tid_t child_tid) {
93*061da546Spatrick     return ProcessMessage(parent_tid, eNewThreadMessage, child_tid);
94*061da546Spatrick   }
95*061da546Spatrick 
96*061da546Spatrick   /// Indicates that the thread \p tid is about to exit with status \p status.
Exit(lldb::tid_t tid,int status)97*061da546Spatrick   static ProcessMessage Exit(lldb::tid_t tid, int status) {
98*061da546Spatrick     return ProcessMessage(tid, eExitMessage, status);
99*061da546Spatrick   }
100*061da546Spatrick 
101*061da546Spatrick   /// Indicates that the thread \p pid has exec'd.
Exec(lldb::tid_t tid)102*061da546Spatrick   static ProcessMessage Exec(lldb::tid_t tid) {
103*061da546Spatrick     return ProcessMessage(tid, eExecMessage);
104*061da546Spatrick   }
105*061da546Spatrick 
GetExitStatus()106*061da546Spatrick   int GetExitStatus() const {
107*061da546Spatrick     assert(GetKind() == eExitMessage || GetKind() == eLimboMessage);
108*061da546Spatrick     return m_status;
109*061da546Spatrick   }
110*061da546Spatrick 
GetSignal()111*061da546Spatrick   int GetSignal() const {
112*061da546Spatrick     assert(GetKind() == eSignalMessage || GetKind() == eCrashMessage ||
113*061da546Spatrick            GetKind() == eSignalDeliveredMessage);
114*061da546Spatrick     return m_status;
115*061da546Spatrick   }
116*061da546Spatrick 
GetStopStatus()117*061da546Spatrick   int GetStopStatus() const {
118*061da546Spatrick     assert(GetKind() == eSignalMessage);
119*061da546Spatrick     return m_status;
120*061da546Spatrick   }
121*061da546Spatrick 
GetCrashReason()122*061da546Spatrick   CrashReason GetCrashReason() const {
123*061da546Spatrick     assert(GetKind() == eCrashMessage);
124*061da546Spatrick     return m_crash_reason;
125*061da546Spatrick   }
126*061da546Spatrick 
GetFaultAddress()127*061da546Spatrick   lldb::addr_t GetFaultAddress() const {
128*061da546Spatrick     assert(GetKind() == eCrashMessage);
129*061da546Spatrick     return m_addr;
130*061da546Spatrick   }
131*061da546Spatrick 
GetHWAddress()132*061da546Spatrick   lldb::addr_t GetHWAddress() const {
133*061da546Spatrick     assert(GetKind() == eWatchpointMessage || GetKind() == eTraceMessage);
134*061da546Spatrick     return m_addr;
135*061da546Spatrick   }
136*061da546Spatrick 
GetChildTID()137*061da546Spatrick   lldb::tid_t GetChildTID() const {
138*061da546Spatrick     assert(GetKind() == eNewThreadMessage);
139*061da546Spatrick     return m_child_tid;
140*061da546Spatrick   }
141*061da546Spatrick 
142*061da546Spatrick   const char *PrintCrashReason() const;
143*061da546Spatrick 
144*061da546Spatrick   const char *PrintKind() const;
145*061da546Spatrick 
146*061da546Spatrick   static const char *PrintKind(Kind);
147*061da546Spatrick 
148*061da546Spatrick private:
149*061da546Spatrick   ProcessMessage(lldb::tid_t tid, Kind kind, int status = 0,
150*061da546Spatrick                  lldb::addr_t addr = 0)
m_tid(tid)151*061da546Spatrick       : m_tid(tid), m_kind(kind),
152*061da546Spatrick         m_crash_reason(CrashReason::eInvalidCrashReason), m_status(status),
153*061da546Spatrick         m_addr(addr), m_child_tid(0) {}
154*061da546Spatrick 
ProcessMessage(lldb::tid_t tid,Kind kind,lldb::tid_t child_tid)155*061da546Spatrick   ProcessMessage(lldb::tid_t tid, Kind kind, lldb::tid_t child_tid)
156*061da546Spatrick       : m_tid(tid), m_kind(kind),
157*061da546Spatrick         m_crash_reason(CrashReason::eInvalidCrashReason), m_status(0),
158*061da546Spatrick         m_addr(0), m_child_tid(child_tid) {}
159*061da546Spatrick 
160*061da546Spatrick   lldb::tid_t m_tid;
161*061da546Spatrick   Kind m_kind : 8;
162*061da546Spatrick   CrashReason m_crash_reason;
163*061da546Spatrick   int m_status;
164*061da546Spatrick   lldb::addr_t m_addr;
165*061da546Spatrick   lldb::tid_t m_child_tid;
166*061da546Spatrick };
167*061da546Spatrick 
168*061da546Spatrick #endif // #ifndef liblldb_ProcessMessage_H_
169