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