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