19ed5b49cSJohnny Chen //===-- ProcessMessage.cpp --------------------------------------*- C++ -*-===//
29ed5b49cSJohnny Chen //
39ed5b49cSJohnny Chen //                     The LLVM Compiler Infrastructure
49ed5b49cSJohnny Chen //
59ed5b49cSJohnny Chen // This file is distributed under the University of Illinois Open Source
69ed5b49cSJohnny Chen // License. See LICENSE.TXT for details.
79ed5b49cSJohnny Chen //
89ed5b49cSJohnny Chen //===----------------------------------------------------------------------===//
99ed5b49cSJohnny Chen 
109ed5b49cSJohnny Chen #include "ProcessMessage.h"
119ed5b49cSJohnny Chen 
12b96a126bSMatt Kopec #include <sstream>
13b96a126bSMatt Kopec 
149ed5b49cSJohnny Chen using namespace lldb_private;
159ed5b49cSJohnny Chen 
16b96a126bSMatt Kopec namespace {
17b96a126bSMatt Kopec 
18b96a126bSMatt Kopec inline void AppendFaultAddr(std::string& str, lldb::addr_t addr)
199ed5b49cSJohnny Chen {
20b96a126bSMatt Kopec     std::stringstream ss;
21b96a126bSMatt Kopec     ss << " (fault address: 0x" << std::hex << addr << ")";
22b96a126bSMatt Kopec     str += ss.str();
23b96a126bSMatt Kopec }
24b96a126bSMatt Kopec 
25b96a126bSMatt Kopec }
26b96a126bSMatt Kopec 
27b96a126bSMatt Kopec const char *
28b96a126bSMatt Kopec ProcessMessage::GetCrashReasonString(CrashReason reason, lldb::addr_t fault_addr)
29b96a126bSMatt Kopec {
30b96a126bSMatt Kopec     static std::string str;
319ed5b49cSJohnny Chen 
329ed5b49cSJohnny Chen     switch (reason)
339ed5b49cSJohnny Chen     {
349ed5b49cSJohnny Chen     default:
359ed5b49cSJohnny Chen         assert(false && "invalid CrashReason");
369ed5b49cSJohnny Chen         break;
379ed5b49cSJohnny Chen 
389ed5b49cSJohnny Chen     case eInvalidAddress:
399ed5b49cSJohnny Chen         str = "invalid address";
40b96a126bSMatt Kopec         AppendFaultAddr(str, fault_addr);
419ed5b49cSJohnny Chen         break;
429ed5b49cSJohnny Chen     case ePrivilegedAddress:
439ed5b49cSJohnny Chen         str = "address access protected";
44b96a126bSMatt Kopec         AppendFaultAddr(str, fault_addr);
459ed5b49cSJohnny Chen         break;
469ed5b49cSJohnny Chen     case eIllegalOpcode:
479ed5b49cSJohnny Chen         str = "illegal instruction";
489ed5b49cSJohnny Chen         break;
499ed5b49cSJohnny Chen     case eIllegalOperand:
509ed5b49cSJohnny Chen         str = "illegal instruction operand";
519ed5b49cSJohnny Chen         break;
529ed5b49cSJohnny Chen     case eIllegalAddressingMode:
539ed5b49cSJohnny Chen         str = "illegal addressing mode";
549ed5b49cSJohnny Chen         break;
559ed5b49cSJohnny Chen     case eIllegalTrap:
569ed5b49cSJohnny Chen         str = "illegal trap";
579ed5b49cSJohnny Chen         break;
589ed5b49cSJohnny Chen     case ePrivilegedOpcode:
599ed5b49cSJohnny Chen         str = "privileged instruction";
609ed5b49cSJohnny Chen         break;
619ed5b49cSJohnny Chen     case ePrivilegedRegister:
629ed5b49cSJohnny Chen         str = "privileged register";
639ed5b49cSJohnny Chen         break;
649ed5b49cSJohnny Chen     case eCoprocessorError:
659ed5b49cSJohnny Chen         str = "coprocessor error";
669ed5b49cSJohnny Chen         break;
679ed5b49cSJohnny Chen     case eInternalStackError:
689ed5b49cSJohnny Chen         str = "internal stack error";
699ed5b49cSJohnny Chen         break;
709ed5b49cSJohnny Chen     case eIllegalAlignment:
719ed5b49cSJohnny Chen         str = "illegal alignment";
729ed5b49cSJohnny Chen         break;
739ed5b49cSJohnny Chen     case eIllegalAddress:
749ed5b49cSJohnny Chen         str = "illegal address";
759ed5b49cSJohnny Chen         break;
769ed5b49cSJohnny Chen     case eHardwareError:
779ed5b49cSJohnny Chen         str = "hardware error";
789ed5b49cSJohnny Chen         break;
799ed5b49cSJohnny Chen     case eIntegerDivideByZero:
809ed5b49cSJohnny Chen         str = "integer divide by zero";
819ed5b49cSJohnny Chen         break;
829ed5b49cSJohnny Chen     case eIntegerOverflow:
839ed5b49cSJohnny Chen         str = "integer overflow";
849ed5b49cSJohnny Chen         break;
859ed5b49cSJohnny Chen     case eFloatDivideByZero:
869ed5b49cSJohnny Chen         str = "floating point divide by zero";
879ed5b49cSJohnny Chen         break;
889ed5b49cSJohnny Chen     case eFloatOverflow:
899ed5b49cSJohnny Chen         str = "floating point overflow";
909ed5b49cSJohnny Chen         break;
919ed5b49cSJohnny Chen     case eFloatUnderflow:
929ed5b49cSJohnny Chen         str = "floating point underflow";
939ed5b49cSJohnny Chen         break;
949ed5b49cSJohnny Chen     case eFloatInexactResult:
959ed5b49cSJohnny Chen         str = "inexact floating point result";
969ed5b49cSJohnny Chen         break;
979ed5b49cSJohnny Chen     case eFloatInvalidOperation:
989ed5b49cSJohnny Chen         str = "invalid floating point operation";
999ed5b49cSJohnny Chen         break;
1009ed5b49cSJohnny Chen     case eFloatSubscriptRange:
1019ed5b49cSJohnny Chen         str = "invalid floating point subscript range";
1029ed5b49cSJohnny Chen         break;
1039ed5b49cSJohnny Chen     }
1049ed5b49cSJohnny Chen 
105b96a126bSMatt Kopec     return str.c_str();
1069ed5b49cSJohnny Chen }
1079ed5b49cSJohnny Chen 
1089ed5b49cSJohnny Chen const char *
1099ed5b49cSJohnny Chen ProcessMessage::PrintCrashReason(CrashReason reason)
1109ed5b49cSJohnny Chen {
1119ed5b49cSJohnny Chen #ifdef LLDB_CONFIGURATION_BUILDANDINTEGRATION
1129ed5b49cSJohnny Chen     // Just return the code in asci for integration builds.
1139ed5b49cSJohnny Chen     chcar str[8];
1149ed5b49cSJohnny Chen     sprintf(str, "%d", reason);
1159ed5b49cSJohnny Chen #else
1169ed5b49cSJohnny Chen     const char *str = NULL;
1179ed5b49cSJohnny Chen 
1189ed5b49cSJohnny Chen     switch (reason)
1199ed5b49cSJohnny Chen     {
1209ed5b49cSJohnny Chen         case eInvalidCrashReason:
1219ed5b49cSJohnny Chen             str = "eInvalidCrashReason";
1229ed5b49cSJohnny Chen             break;
1239ed5b49cSJohnny Chen 
1249ed5b49cSJohnny Chen         // SIGSEGV crash reasons.
1259ed5b49cSJohnny Chen         case eInvalidAddress:
1269ed5b49cSJohnny Chen             str = "eInvalidAddress";
1279ed5b49cSJohnny Chen             break;
1289ed5b49cSJohnny Chen         case ePrivilegedAddress:
1299ed5b49cSJohnny Chen             str = "ePrivilegedAddress";
1309ed5b49cSJohnny Chen             break;
1319ed5b49cSJohnny Chen 
1329ed5b49cSJohnny Chen         // SIGILL crash reasons.
1339ed5b49cSJohnny Chen         case eIllegalOpcode:
1349ed5b49cSJohnny Chen             str = "eIllegalOpcode";
1359ed5b49cSJohnny Chen             break;
1369ed5b49cSJohnny Chen         case eIllegalOperand:
1379ed5b49cSJohnny Chen             str = "eIllegalOperand";
1389ed5b49cSJohnny Chen             break;
1399ed5b49cSJohnny Chen         case eIllegalAddressingMode:
1409ed5b49cSJohnny Chen             str = "eIllegalAddressingMode";
1419ed5b49cSJohnny Chen             break;
1429ed5b49cSJohnny Chen         case eIllegalTrap:
1439ed5b49cSJohnny Chen             str = "eIllegalTrap";
1449ed5b49cSJohnny Chen             break;
1459ed5b49cSJohnny Chen         case ePrivilegedOpcode:
1469ed5b49cSJohnny Chen             str = "ePrivilegedOpcode";
1479ed5b49cSJohnny Chen             break;
1489ed5b49cSJohnny Chen         case ePrivilegedRegister:
1499ed5b49cSJohnny Chen             str = "ePrivilegedRegister";
1509ed5b49cSJohnny Chen             break;
1519ed5b49cSJohnny Chen         case eCoprocessorError:
1529ed5b49cSJohnny Chen             str = "eCoprocessorError";
1539ed5b49cSJohnny Chen             break;
1549ed5b49cSJohnny Chen         case eInternalStackError:
1559ed5b49cSJohnny Chen             str = "eInternalStackError";
1569ed5b49cSJohnny Chen             break;
1579ed5b49cSJohnny Chen 
1589ed5b49cSJohnny Chen         // SIGBUS crash reasons:
1599ed5b49cSJohnny Chen         case eIllegalAlignment:
1609ed5b49cSJohnny Chen             str = "eIllegalAlignment";
1619ed5b49cSJohnny Chen             break;
1629ed5b49cSJohnny Chen         case eIllegalAddress:
1639ed5b49cSJohnny Chen             str = "eIllegalAddress";
1649ed5b49cSJohnny Chen             break;
1659ed5b49cSJohnny Chen         case eHardwareError:
1669ed5b49cSJohnny Chen             str = "eHardwareError";
1679ed5b49cSJohnny Chen             break;
1689ed5b49cSJohnny Chen 
1699ed5b49cSJohnny Chen         // SIGFPE crash reasons:
1709ed5b49cSJohnny Chen         case eIntegerDivideByZero:
1719ed5b49cSJohnny Chen             str = "eIntegerDivideByZero";
1729ed5b49cSJohnny Chen             break;
1739ed5b49cSJohnny Chen         case eIntegerOverflow:
1749ed5b49cSJohnny Chen             str = "eIntegerOverflow";
1759ed5b49cSJohnny Chen             break;
1769ed5b49cSJohnny Chen         case eFloatDivideByZero:
1779ed5b49cSJohnny Chen             str = "eFloatDivideByZero";
1789ed5b49cSJohnny Chen             break;
1799ed5b49cSJohnny Chen         case eFloatOverflow:
1809ed5b49cSJohnny Chen             str = "eFloatOverflow";
1819ed5b49cSJohnny Chen             break;
1829ed5b49cSJohnny Chen         case eFloatUnderflow:
1839ed5b49cSJohnny Chen             str = "eFloatUnderflow";
1849ed5b49cSJohnny Chen             break;
1859ed5b49cSJohnny Chen         case eFloatInexactResult:
1869ed5b49cSJohnny Chen             str = "eFloatInexactResult";
1879ed5b49cSJohnny Chen             break;
1889ed5b49cSJohnny Chen         case eFloatInvalidOperation:
1899ed5b49cSJohnny Chen             str = "eFloatInvalidOperation";
1909ed5b49cSJohnny Chen             break;
1919ed5b49cSJohnny Chen         case eFloatSubscriptRange:
1929ed5b49cSJohnny Chen             str = "eFloatSubscriptRange";
1939ed5b49cSJohnny Chen             break;
1949ed5b49cSJohnny Chen     }
1959ed5b49cSJohnny Chen #endif
1969ed5b49cSJohnny Chen 
1979ed5b49cSJohnny Chen     return str;
1989ed5b49cSJohnny Chen }
1999ed5b49cSJohnny Chen 
2009ed5b49cSJohnny Chen const char *
2019ed5b49cSJohnny Chen ProcessMessage::PrintCrashReason() const
2029ed5b49cSJohnny Chen {
2039ed5b49cSJohnny Chen     return PrintCrashReason(m_crash_reason);
2049ed5b49cSJohnny Chen }
2059ed5b49cSJohnny Chen 
2069ed5b49cSJohnny Chen const char *
2079ed5b49cSJohnny Chen ProcessMessage::PrintKind(Kind kind)
2089ed5b49cSJohnny Chen {
2099ed5b49cSJohnny Chen #ifdef LLDB_CONFIGURATION_BUILDANDINTEGRATION
2109ed5b49cSJohnny Chen     // Just return the code in asci for integration builds.
2119ed5b49cSJohnny Chen     chcar str[8];
2129ed5b49cSJohnny Chen     sprintf(str, "%d", reason);
2139ed5b49cSJohnny Chen #else
2149ed5b49cSJohnny Chen     const char *str = NULL;
2159ed5b49cSJohnny Chen 
2169ed5b49cSJohnny Chen     switch (kind)
2179ed5b49cSJohnny Chen     {
2189ed5b49cSJohnny Chen     case eInvalidMessage:
2199ed5b49cSJohnny Chen         str = "eInvalidMessage";
2209ed5b49cSJohnny Chen         break;
221e544143fSEd Maste     case eAttachMessage:
222e544143fSEd Maste         str = "eAttachMessage";
223e544143fSEd Maste         break;
2249ed5b49cSJohnny Chen     case eExitMessage:
2259ed5b49cSJohnny Chen         str = "eExitMessage";
2269ed5b49cSJohnny Chen         break;
2279ed5b49cSJohnny Chen     case eLimboMessage:
2289ed5b49cSJohnny Chen         str = "eLimboMessage";
2299ed5b49cSJohnny Chen         break;
2309ed5b49cSJohnny Chen     case eSignalMessage:
2319ed5b49cSJohnny Chen         str = "eSignalMessage";
2329ed5b49cSJohnny Chen         break;
2339ed5b49cSJohnny Chen     case eSignalDeliveredMessage:
2349ed5b49cSJohnny Chen         str = "eSignalDeliveredMessage";
2359ed5b49cSJohnny Chen         break;
2369ed5b49cSJohnny Chen     case eTraceMessage:
2379ed5b49cSJohnny Chen         str = "eTraceMessage";
2389ed5b49cSJohnny Chen         break;
2399ed5b49cSJohnny Chen     case eBreakpointMessage:
2409ed5b49cSJohnny Chen         str = "eBreakpointMessage";
2419ed5b49cSJohnny Chen         break;
242e9ea0da8SMatt Kopec     case eWatchpointMessage:
243e9ea0da8SMatt Kopec         str = "eWatchpointMessage";
244e9ea0da8SMatt Kopec         break;
2459ed5b49cSJohnny Chen     case eCrashMessage:
2469ed5b49cSJohnny Chen         str = "eCrashMessage";
2479ed5b49cSJohnny Chen         break;
248650648faSMatt Kopec     case eNewThreadMessage:
249650648faSMatt Kopec         str = "eNewThreadMessage";
250650648faSMatt Kopec         break;
251*c5e53bd1SJoerg Sonnenberger     case eExecMessage:
252*c5e53bd1SJoerg Sonnenberger         str = "eExecMessage";
253*c5e53bd1SJoerg Sonnenberger         break;
2549ed5b49cSJohnny Chen     }
2559ed5b49cSJohnny Chen #endif
2569ed5b49cSJohnny Chen 
2579ed5b49cSJohnny Chen     return str;
2589ed5b49cSJohnny Chen }
2599ed5b49cSJohnny Chen 
2609ed5b49cSJohnny Chen const char *
2619ed5b49cSJohnny Chen ProcessMessage::PrintKind() const
2629ed5b49cSJohnny Chen {
2639ed5b49cSJohnny Chen     return PrintKind(m_kind);
2649ed5b49cSJohnny Chen }
265