• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  //===-- 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  
13  #include <cassert>
14  
15  #include "lldb/lldb-defines.h"
16  #include "lldb/lldb-types.h"
17  
18  class ProcessMessage
19  {
20  public:
21  
22      /// The type of signal this message can correspond to.
23      enum Kind
24      {
25          eInvalidMessage,
26          eExitMessage,
27          eLimboMessage,
28          eSignalMessage,
29          eSignalDeliveredMessage,
30          eTraceMessage,
31          eBreakpointMessage,
32          eWatchpointMessage,
33          eCrashMessage,
34          eNewThreadMessage
35      };
36  
37      enum CrashReason
38      {
39          eInvalidCrashReason,
40  
41          // SIGSEGV crash reasons.
42          eInvalidAddress,
43          ePrivilegedAddress,
44  
45          // SIGILL crash reasons.
46          eIllegalOpcode,
47          eIllegalOperand,
48          eIllegalAddressingMode,
49          eIllegalTrap,
50          ePrivilegedOpcode,
51          ePrivilegedRegister,
52          eCoprocessorError,
53          eInternalStackError,
54  
55          // SIGBUS crash reasons,
56          eIllegalAlignment,
57          eIllegalAddress,
58          eHardwareError,
59  
60          // SIGFPE crash reasons,
61          eIntegerDivideByZero,
62          eIntegerOverflow,
63          eFloatDivideByZero,
64          eFloatOverflow,
65          eFloatUnderflow,
66          eFloatInexactResult,
67          eFloatInvalidOperation,
68          eFloatSubscriptRange
69      };
70  
ProcessMessage()71      ProcessMessage()
72          : m_tid(LLDB_INVALID_PROCESS_ID),
73            m_kind(eInvalidMessage),
74            m_crash_reason(eInvalidCrashReason),
75            m_status(0),
76            m_addr(0) { }
77  
GetKind()78      Kind GetKind() const { return m_kind; }
79  
GetTID()80      lldb::tid_t GetTID() const { return m_tid; }
81  
82      /// Indicates that the thread @p tid is about to exit with status @p status.
Limbo(lldb::tid_t tid,int status)83      static ProcessMessage Limbo(lldb::tid_t tid, int status) {
84          return ProcessMessage(tid, eLimboMessage, status);
85      }
86  
87      /// Indicates that the thread @p tid had the signal @p signum delivered.
Signal(lldb::tid_t tid,int signum)88      static ProcessMessage Signal(lldb::tid_t tid, int signum) {
89          return ProcessMessage(tid, eSignalMessage, signum);
90      }
91  
92      /// Indicates that a signal @p signum generated by the debugging process was
93      /// delivered to the thread @p tid.
SignalDelivered(lldb::tid_t tid,int signum)94      static ProcessMessage SignalDelivered(lldb::tid_t tid, int signum) {
95          return ProcessMessage(tid, eSignalDeliveredMessage, signum);
96      }
97  
98      /// Indicates that the thread @p tid encountered a trace point.
Trace(lldb::tid_t tid)99      static ProcessMessage Trace(lldb::tid_t tid) {
100          return ProcessMessage(tid, eTraceMessage);
101      }
102  
103      /// Indicates that the thread @p tid encountered a break point.
Break(lldb::tid_t tid)104      static ProcessMessage Break(lldb::tid_t tid) {
105          return ProcessMessage(tid, eBreakpointMessage);
106      }
107  
Watch(lldb::tid_t tid,lldb::addr_t wp_addr)108      static ProcessMessage Watch(lldb::tid_t tid, lldb::addr_t wp_addr) {
109          return ProcessMessage(tid, eWatchpointMessage, 0, wp_addr);
110      }
111  
112      /// Indicates that the thread @p tid crashed.
Crash(lldb::pid_t pid,CrashReason reason,int signo,lldb::addr_t fault_addr)113      static ProcessMessage Crash(lldb::pid_t pid, CrashReason reason,
114                                  int signo, lldb::addr_t fault_addr) {
115          ProcessMessage message(pid, eCrashMessage, signo, fault_addr);
116          message.m_crash_reason = reason;
117          return message;
118      }
119  
120      /// Indicates that the thread @p child_tid was spawned.
NewThread(lldb::tid_t parent_tid,lldb::tid_t child_tid)121      static ProcessMessage NewThread(lldb::tid_t parent_tid, lldb::tid_t child_tid) {
122          return ProcessMessage(parent_tid, eNewThreadMessage, child_tid);
123      }
124  
125      /// Indicates that the thread @p tid is about to exit with status @p status.
Exit(lldb::tid_t tid,int status)126      static ProcessMessage Exit(lldb::tid_t tid, int status) {
127          return ProcessMessage(tid, eExitMessage, status);
128      }
129  
GetExitStatus()130      int GetExitStatus() const {
131          assert(GetKind() == eExitMessage || GetKind() == eLimboMessage);
132          return m_status;
133      }
134  
GetSignal()135      int GetSignal() const {
136          assert(GetKind() == eSignalMessage || GetKind() == eCrashMessage ||
137                 GetKind() == eSignalDeliveredMessage);
138          return m_status;
139      }
140  
GetStopStatus()141      int GetStopStatus() const {
142          assert(GetKind() == eSignalMessage);
143          return m_status;
144      }
145  
GetCrashReason()146      CrashReason GetCrashReason() const {
147          assert(GetKind() == eCrashMessage);
148          return m_crash_reason;
149      }
150  
GetFaultAddress()151      lldb::addr_t GetFaultAddress() const {
152          assert(GetKind() == eCrashMessage);
153          return m_addr;
154      }
155  
GetHWAddress()156      lldb::addr_t GetHWAddress() const {
157          assert(GetKind() == eWatchpointMessage || GetKind() == eTraceMessage);
158          return m_addr;
159      }
160  
GetChildTID()161      lldb::tid_t GetChildTID() const {
162          assert(GetKind() == eNewThreadMessage);
163          return m_child_tid;
164      }
165  
166      static const char *
167      GetCrashReasonString(CrashReason reason, lldb::addr_t fault_addr);
168  
169      const char *
170      PrintCrashReason() const;
171  
172      static const char *
173      PrintCrashReason(CrashReason reason);
174  
175      const char *
176      PrintKind() const;
177  
178      static const char *
179      PrintKind(Kind);
180  
181  private:
182      ProcessMessage(lldb::tid_t tid, Kind kind,
183                     int status = 0, lldb::addr_t addr = 0)
m_tid(tid)184          : m_tid(tid),
185            m_kind(kind),
186            m_crash_reason(eInvalidCrashReason),
187            m_status(status),
188            m_addr(addr),
189            m_child_tid(0) { }
190  
ProcessMessage(lldb::tid_t tid,Kind kind,lldb::tid_t child_tid)191      ProcessMessage(lldb::tid_t tid, Kind kind, lldb::tid_t child_tid)
192          : m_tid(tid),
193            m_kind(kind),
194            m_crash_reason(eInvalidCrashReason),
195            m_status(0),
196            m_addr(0),
197            m_child_tid(child_tid) { }
198  
199      lldb::tid_t m_tid;
200      Kind        m_kind         : 8;
201      CrashReason m_crash_reason : 8;
202      int m_status;
203      lldb::addr_t m_addr;
204      lldb::tid_t m_child_tid;
205  };
206  
207  #endif // #ifndef liblldb_ProcessMessage_H_
208