13c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans//===-- ProcessMessage.h ----------------------------------------*- C++ -*-===//
2376b1529a383c39adf4674baf6db83a5e63f97acJason Evans//
33c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans//                     The LLVM Compiler Infrastructure
43c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans//
53c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans// This file is distributed under the University of Illinois Open Source
63c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans// License. See LICENSE.TXT for details.
7fc4dcfa2f546354dd536a3a33aa9f10fd3253731Jason Evans//
8fc4dcfa2f546354dd536a3a33aa9f10fd3253731Jason Evans//===----------------------------------------------------------------------===//
9fc4dcfa2f546354dd536a3a33aa9f10fd3253731Jason Evans
10fc4dcfa2f546354dd536a3a33aa9f10fd3253731Jason Evans#ifndef liblldb_ProcessMessage_H_
11fc4dcfa2f546354dd536a3a33aa9f10fd3253731Jason Evans#define liblldb_ProcessMessage_H_
123c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans
133c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans#include <cassert>
143c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans
153c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans#include "lldb/lldb-defines.h"
163c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans#include "lldb/lldb-types.h"
173c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans
18461ad5c87ae5f89cd086e47b31372e9123dcfcdfMike Hommeyclass ProcessMessage
19461ad5c87ae5f89cd086e47b31372e9123dcfcdfMike Hommey{
20461ad5c87ae5f89cd086e47b31372e9123dcfcdfMike Hommeypublic:
21461ad5c87ae5f89cd086e47b31372e9123dcfcdfMike Hommey
22461ad5c87ae5f89cd086e47b31372e9123dcfcdfMike Hommey    /// The type of signal this message can correspond to.
23461ad5c87ae5f89cd086e47b31372e9123dcfcdfMike Hommey    enum Kind
24461ad5c87ae5f89cd086e47b31372e9123dcfcdfMike Hommey    {
25461ad5c87ae5f89cd086e47b31372e9123dcfcdfMike Hommey        eInvalidMessage,
26461ad5c87ae5f89cd086e47b31372e9123dcfcdfMike Hommey        eExitMessage,
27461ad5c87ae5f89cd086e47b31372e9123dcfcdfMike Hommey        eLimboMessage,
28461ad5c87ae5f89cd086e47b31372e9123dcfcdfMike Hommey        eSignalMessage,
29461ad5c87ae5f89cd086e47b31372e9123dcfcdfMike Hommey        eSignalDeliveredMessage,
30461ad5c87ae5f89cd086e47b31372e9123dcfcdfMike Hommey        eTraceMessage,
31461ad5c87ae5f89cd086e47b31372e9123dcfcdfMike Hommey        eBreakpointMessage,
32461ad5c87ae5f89cd086e47b31372e9123dcfcdfMike Hommey        eWatchpointMessage,
33461ad5c87ae5f89cd086e47b31372e9123dcfcdfMike Hommey        eCrashMessage,
34461ad5c87ae5f89cd086e47b31372e9123dcfcdfMike Hommey        eNewThreadMessage
35461ad5c87ae5f89cd086e47b31372e9123dcfcdfMike Hommey    };
36461ad5c87ae5f89cd086e47b31372e9123dcfcdfMike Hommey
37461ad5c87ae5f89cd086e47b31372e9123dcfcdfMike Hommey    enum CrashReason
38461ad5c87ae5f89cd086e47b31372e9123dcfcdfMike Hommey    {
39461ad5c87ae5f89cd086e47b31372e9123dcfcdfMike Hommey        eInvalidCrashReason,
40461ad5c87ae5f89cd086e47b31372e9123dcfcdfMike Hommey
41461ad5c87ae5f89cd086e47b31372e9123dcfcdfMike Hommey        // SIGSEGV crash reasons.
42461ad5c87ae5f89cd086e47b31372e9123dcfcdfMike Hommey        eInvalidAddress,
43461ad5c87ae5f89cd086e47b31372e9123dcfcdfMike Hommey        ePrivilegedAddress,
443c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans
453c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans        // SIGILL crash reasons.
463c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans        eIllegalOpcode,
473c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans        eIllegalOperand,
483c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans        eIllegalAddressingMode,
493c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans        eIllegalTrap,
503c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans        ePrivilegedOpcode,
51609ae595f0358157b19311b0f9f9591db7cee705Jason Evans        ePrivilegedRegister,
52609ae595f0358157b19311b0f9f9591db7cee705Jason Evans        eCoprocessorError,
533c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans        eInternalStackError,
543c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans
553c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans        // SIGBUS crash reasons,
5686815df9dc7d2418a21c87b3dc9747ab42dea73dJason Evans        eIllegalAlignment,
5786815df9dc7d2418a21c87b3dc9747ab42dea73dJason Evans        eIllegalAddress,
5886815df9dc7d2418a21c87b3dc9747ab42dea73dJason Evans        eHardwareError,
5986815df9dc7d2418a21c87b3dc9747ab42dea73dJason Evans
603c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans        // SIGFPE crash reasons,
61609ae595f0358157b19311b0f9f9591db7cee705Jason Evans        eIntegerDivideByZero,
623c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans        eIntegerOverflow,
633c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans        eFloatDivideByZero,
643c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans        eFloatOverflow,
653c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans        eFloatUnderflow,
663c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans        eFloatInexactResult,
67a40bc7afe8ae71b05eba81805c87d92e9bf6ce27Jason Evans        eFloatInvalidOperation,
683c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans        eFloatSubscriptRange
69d4be8b7b6ee2e21d079180455d4ccbf45cc1cee7Jason Evans    };
70e7b8fa18d256e0bc18b61ee03b69af87fa3d7969Jason Evans
71b267d0f86aff15a0edb2929f09060c118ed98ec4Jason Evans    ProcessMessage()
7293443689a4367cc6fe3de1c9e918adc13d8f9100Jason Evans        : m_tid(LLDB_INVALID_PROCESS_ID),
73ecf229a39fc253da39ae6baeab9f5c1955786ff6Jason Evans          m_kind(eInvalidMessage),
7493443689a4367cc6fe3de1c9e918adc13d8f9100Jason Evans          m_crash_reason(eInvalidCrashReason),
75ecf229a39fc253da39ae6baeab9f5c1955786ff6Jason Evans          m_status(0),
763c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans          m_addr(0) { }
773c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans
783c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans    Kind GetKind() const { return m_kind; }
7959ae2766af88bad07ac721c4ee427b171e897bcbJason Evans
80d34f9e7e9306698e298a703c28526cd6bfc073ecJason Evans    lldb::tid_t GetTID() const { return m_tid; }
81d34f9e7e9306698e298a703c28526cd6bfc073ecJason Evans
82d34f9e7e9306698e298a703c28526cd6bfc073ecJason Evans    /// Indicates that the thread @p tid is about to exit with status @p status.
833c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans    static ProcessMessage Limbo(lldb::tid_t tid, int status) {
843c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans        return ProcessMessage(tid, eLimboMessage, status);
853c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans    }
86b147611b5253921a873191bb0589d3b18f613946Jason Evans
87122449b073bcbaa504c4f592ea2d733503c272d2Jason Evans    /// Indicates that the thread @p tid had the signal @p signum delivered.
883c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans    static ProcessMessage Signal(lldb::tid_t tid, int signum) {
893c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans        return ProcessMessage(tid, eSignalMessage, signum);
90609ae595f0358157b19311b0f9f9591db7cee705Jason Evans    }
91e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans
92e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans    /// Indicates that a signal @p signum generated by the debugging process was
93e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans    /// delivered to the thread @p tid.
94e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans    static ProcessMessage SignalDelivered(lldb::tid_t tid, int signum) {
953c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans        return ProcessMessage(tid, eSignalDeliveredMessage, signum);
96e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans    }
97122449b073bcbaa504c4f592ea2d733503c272d2Jason Evans
98122449b073bcbaa504c4f592ea2d733503c272d2Jason Evans    /// Indicates that the thread @p tid encountered a trace point.
99b147611b5253921a873191bb0589d3b18f613946Jason Evans    static ProcessMessage Trace(lldb::tid_t tid) {
1003c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans        return ProcessMessage(tid, eTraceMessage);
1013fa9a2fad83a3014d5069b5a2530a0cfb8d8d197Jason Evans    }
102f3ca7c8386f6a21347aed68053117c2c59939551Jason Evans
103d34f9e7e9306698e298a703c28526cd6bfc073ecJason Evans    /// Indicates that the thread @p tid encountered a break point.
104e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans    static ProcessMessage Break(lldb::tid_t tid) {
105f18c98200145de70779a1b3286e7829b0268231eJason Evans        return ProcessMessage(tid, eBreakpointMessage);
106b9477e782b07afa38c4b1dc0688e053be8a84dd8Jason Evans    }
107d34f9e7e9306698e298a703c28526cd6bfc073ecJason Evans
108e73397062ac3ab28a9d377591b63ed19fd154ccaJason Evans    static ProcessMessage Watch(lldb::tid_t tid, lldb::addr_t wp_addr) {
1090b25fe79aaf8840a5acda7e3160a053d42349872Jason Evans        return ProcessMessage(tid, eWatchpointMessage, 0, wp_addr);
110d34f9e7e9306698e298a703c28526cd6bfc073ecJason Evans    }
111a881cd2c61c1ced56f87fcb9d7ef6e92b81e6c58Jason Evans
112609ae595f0358157b19311b0f9f9591db7cee705Jason Evans    /// Indicates that the thread @p tid crashed.
11334457f51448e81f32a1bff16bbf600b79dd9ec5aJason Evans    static ProcessMessage Crash(lldb::pid_t pid, CrashReason reason,
114609ae595f0358157b19311b0f9f9591db7cee705Jason Evans                                int signo, lldb::addr_t fault_addr) {
11559113bcc94b9fc7549611afb99ca99cad1a7f196aravind        ProcessMessage message(pid, eCrashMessage, signo, fault_addr);
11612141150fdbda57651a53ae2fe0edaea4891d814Jason Evans        message.m_crash_reason = reason;
117609ae595f0358157b19311b0f9f9591db7cee705Jason Evans        return message;
1183c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans    }
1193c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans
1203c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans    /// Indicates that the thread @p child_tid was spawned.
1213c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans    static ProcessMessage NewThread(lldb::tid_t parent_tid, lldb::tid_t child_tid) {
1223c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans        return ProcessMessage(parent_tid, eNewThreadMessage, child_tid);
1233c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans    }
1243c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans
1253c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans    /// Indicates that the thread @p tid is about to exit with status @p status.
1263c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans    static ProcessMessage Exit(lldb::tid_t tid, int status) {
127ae4c7b4b4092906c641d69b4bf9fcb4a7d50790dJason Evans        return ProcessMessage(tid, eExitMessage, status);
128dafde14e08ddfda747aabb2045b350848b601b2eJason Evans    }
1293c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans
130dafde14e08ddfda747aabb2045b350848b601b2eJason Evans    int GetExitStatus() const {
1313c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans        assert(GetKind() == eExitMessage || GetKind() == eLimboMessage);
132609ae595f0358157b19311b0f9f9591db7cee705Jason Evans        return m_status;
133f18c98200145de70779a1b3286e7829b0268231eJason Evans    }
134d34f9e7e9306698e298a703c28526cd6bfc073ecJason Evans
135d34f9e7e9306698e298a703c28526cd6bfc073ecJason Evans    int GetSignal() const {
1363c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans        assert(GetKind() == eSignalMessage || GetKind() == eCrashMessage ||
1373c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans               GetKind() == eSignalDeliveredMessage);
1383c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans        return m_status;
1393c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans    }
1403c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans
1413c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans    int GetStopStatus() const {
14286815df9dc7d2418a21c87b3dc9747ab42dea73dJason Evans        assert(GetKind() == eSignalMessage);
1433c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans        return m_status;
1443c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans    }
1453c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans
146dafde14e08ddfda747aabb2045b350848b601b2eJason Evans    CrashReason GetCrashReason() const {
14712141150fdbda57651a53ae2fe0edaea4891d814Jason Evans        assert(GetKind() == eCrashMessage);
14812141150fdbda57651a53ae2fe0edaea4891d814Jason Evans        return m_crash_reason;
14912141150fdbda57651a53ae2fe0edaea4891d814Jason Evans    }
15012141150fdbda57651a53ae2fe0edaea4891d814Jason Evans
15186815df9dc7d2418a21c87b3dc9747ab42dea73dJason Evans    lldb::addr_t GetFaultAddress() const {
15286815df9dc7d2418a21c87b3dc9747ab42dea73dJason Evans        assert(GetKind() == eCrashMessage);
15386815df9dc7d2418a21c87b3dc9747ab42dea73dJason Evans        return m_addr;
1543c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans    }
1553c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans
1563c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans    lldb::addr_t GetHWAddress() const {
1573c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans        assert(GetKind() == eWatchpointMessage || GetKind() == eTraceMessage);
1583c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans        return m_addr;
1593c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans    }
1603c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans
161dafde14e08ddfda747aabb2045b350848b601b2eJason Evans    lldb::tid_t GetChildTID() const {
162dafde14e08ddfda747aabb2045b350848b601b2eJason Evans        assert(GetKind() == eNewThreadMessage);
1633c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans        return m_child_tid;
1643c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans    }
1653c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans
166597632be188d2bcc135dad2145cc46ef44897aadJason Evans    static const char *
167609ae595f0358157b19311b0f9f9591db7cee705Jason Evans    GetCrashReasonString(CrashReason reason, lldb::addr_t fault_addr);
1683c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans
1693c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans    const char *
1703c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans    PrintCrashReason() const;
1713c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans
1723c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans    static const char *
1733c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans    PrintCrashReason(CrashReason reason);
1743c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans
1750657f12acd43eb2082a71230341449eca648bc9bJason Evans    const char *
1763c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans    PrintKind() const;
1773c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans
1783c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans    static const char *
1793c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans    PrintKind(Kind);
1803c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans
1813c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evansprivate:
1823c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans    ProcessMessage(lldb::tid_t tid, Kind kind,
1833c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans                   int status = 0, lldb::addr_t addr = 0)
1843c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans        : m_tid(tid),
1853c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans          m_kind(kind),
186461ad5c87ae5f89cd086e47b31372e9123dcfcdfMike Hommey          m_crash_reason(eInvalidCrashReason),
18765f343a632aa1f6bd9b8a65761706391469d2620Jason Evans          m_status(status),
18865f343a632aa1f6bd9b8a65761706391469d2620Jason Evans          m_addr(addr),
18965f343a632aa1f6bd9b8a65761706391469d2620Jason Evans          m_child_tid(0) { }
19065f343a632aa1f6bd9b8a65761706391469d2620Jason Evans
191461ad5c87ae5f89cd086e47b31372e9123dcfcdfMike Hommey    ProcessMessage(lldb::tid_t tid, Kind kind, lldb::tid_t child_tid)
1923c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans        : m_tid(tid),
1933c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans          m_kind(kind),
1943c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans          m_crash_reason(eInvalidCrashReason),
1953c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans          m_status(0),
1963c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans          m_addr(0),
197461ad5c87ae5f89cd086e47b31372e9123dcfcdfMike Hommey          m_child_tid(child_tid) { }
1983c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans
199461ad5c87ae5f89cd086e47b31372e9123dcfcdfMike Hommey    lldb::tid_t m_tid;
200d4be8b7b6ee2e21d079180455d4ccbf45cc1cee7Jason Evans    Kind        m_kind         : 8;
201e7b8fa18d256e0bc18b61ee03b69af87fa3d7969Jason Evans    CrashReason m_crash_reason : 8;
2023c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans    int m_status;
2033c2343518c2b1fbbd66065c75a3c19f908de1d78Jason Evans    lldb::addr_t m_addr;
204461ad5c87ae5f89cd086e47b31372e9123dcfcdfMike Hommey    lldb::tid_t m_child_tid;
2057372b15a31c63ac5cb9ed8aeabc2a0a3c005e8bfJason Evans};
20693443689a4367cc6fe3de1c9e918adc13d8f9100Jason Evans
207ecf229a39fc253da39ae6baeab9f5c1955786ff6Jason Evans#endif // #ifndef liblldb_ProcessMessage_H_
208ecf229a39fc253da39ae6baeab9f5c1955786ff6Jason Evans