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 
129ed5b49cSJohnny Chen using namespace lldb_private;
139ed5b49cSJohnny Chen 
149ed5b49cSJohnny Chen const char *
159ed5b49cSJohnny Chen ProcessMessage::GetCrashReasonString(CrashReason reason)
169ed5b49cSJohnny Chen {
179ed5b49cSJohnny Chen     const char *str = NULL;
189ed5b49cSJohnny Chen 
199ed5b49cSJohnny Chen     switch (reason)
209ed5b49cSJohnny Chen     {
219ed5b49cSJohnny Chen     default:
229ed5b49cSJohnny Chen         assert(false && "invalid CrashReason");
239ed5b49cSJohnny Chen         break;
249ed5b49cSJohnny Chen 
259ed5b49cSJohnny Chen     case eInvalidAddress:
269ed5b49cSJohnny Chen         str = "invalid address";
279ed5b49cSJohnny Chen         break;
289ed5b49cSJohnny Chen     case ePrivilegedAddress:
299ed5b49cSJohnny Chen         str = "address access protected";
309ed5b49cSJohnny Chen         break;
319ed5b49cSJohnny Chen     case eIllegalOpcode:
329ed5b49cSJohnny Chen         str = "illegal instruction";
339ed5b49cSJohnny Chen         break;
349ed5b49cSJohnny Chen     case eIllegalOperand:
359ed5b49cSJohnny Chen         str = "illegal instruction operand";
369ed5b49cSJohnny Chen         break;
379ed5b49cSJohnny Chen     case eIllegalAddressingMode:
389ed5b49cSJohnny Chen         str = "illegal addressing mode";
399ed5b49cSJohnny Chen         break;
409ed5b49cSJohnny Chen     case eIllegalTrap:
419ed5b49cSJohnny Chen         str = "illegal trap";
429ed5b49cSJohnny Chen         break;
439ed5b49cSJohnny Chen     case ePrivilegedOpcode:
449ed5b49cSJohnny Chen         str = "privileged instruction";
459ed5b49cSJohnny Chen         break;
469ed5b49cSJohnny Chen     case ePrivilegedRegister:
479ed5b49cSJohnny Chen         str = "privileged register";
489ed5b49cSJohnny Chen         break;
499ed5b49cSJohnny Chen     case eCoprocessorError:
509ed5b49cSJohnny Chen         str = "coprocessor error";
519ed5b49cSJohnny Chen         break;
529ed5b49cSJohnny Chen     case eInternalStackError:
539ed5b49cSJohnny Chen         str = "internal stack error";
549ed5b49cSJohnny Chen         break;
559ed5b49cSJohnny Chen     case eIllegalAlignment:
569ed5b49cSJohnny Chen         str = "illegal alignment";
579ed5b49cSJohnny Chen         break;
589ed5b49cSJohnny Chen     case eIllegalAddress:
599ed5b49cSJohnny Chen         str = "illegal address";
609ed5b49cSJohnny Chen         break;
619ed5b49cSJohnny Chen     case eHardwareError:
629ed5b49cSJohnny Chen         str = "hardware error";
639ed5b49cSJohnny Chen         break;
649ed5b49cSJohnny Chen     case eIntegerDivideByZero:
659ed5b49cSJohnny Chen         str = "integer divide by zero";
669ed5b49cSJohnny Chen         break;
679ed5b49cSJohnny Chen     case eIntegerOverflow:
689ed5b49cSJohnny Chen         str = "integer overflow";
699ed5b49cSJohnny Chen         break;
709ed5b49cSJohnny Chen     case eFloatDivideByZero:
719ed5b49cSJohnny Chen         str = "floating point divide by zero";
729ed5b49cSJohnny Chen         break;
739ed5b49cSJohnny Chen     case eFloatOverflow:
749ed5b49cSJohnny Chen         str = "floating point overflow";
759ed5b49cSJohnny Chen         break;
769ed5b49cSJohnny Chen     case eFloatUnderflow:
779ed5b49cSJohnny Chen         str = "floating point underflow";
789ed5b49cSJohnny Chen         break;
799ed5b49cSJohnny Chen     case eFloatInexactResult:
809ed5b49cSJohnny Chen         str = "inexact floating point result";
819ed5b49cSJohnny Chen         break;
829ed5b49cSJohnny Chen     case eFloatInvalidOperation:
839ed5b49cSJohnny Chen         str = "invalid floating point operation";
849ed5b49cSJohnny Chen         break;
859ed5b49cSJohnny Chen     case eFloatSubscriptRange:
869ed5b49cSJohnny Chen         str = "invalid floating point subscript range";
879ed5b49cSJohnny Chen         break;
889ed5b49cSJohnny Chen     }
899ed5b49cSJohnny Chen 
909ed5b49cSJohnny Chen     return str;
919ed5b49cSJohnny Chen }
929ed5b49cSJohnny Chen 
939ed5b49cSJohnny Chen const char *
949ed5b49cSJohnny Chen ProcessMessage::PrintCrashReason(CrashReason reason)
959ed5b49cSJohnny Chen {
969ed5b49cSJohnny Chen #ifdef LLDB_CONFIGURATION_BUILDANDINTEGRATION
979ed5b49cSJohnny Chen     // Just return the code in asci for integration builds.
989ed5b49cSJohnny Chen     chcar str[8];
999ed5b49cSJohnny Chen     sprintf(str, "%d", reason);
1009ed5b49cSJohnny Chen #else
1019ed5b49cSJohnny Chen     const char *str = NULL;
1029ed5b49cSJohnny Chen 
1039ed5b49cSJohnny Chen     switch (reason)
1049ed5b49cSJohnny Chen     {
1059ed5b49cSJohnny Chen         case eInvalidCrashReason:
1069ed5b49cSJohnny Chen             str = "eInvalidCrashReason";
1079ed5b49cSJohnny Chen             break;
1089ed5b49cSJohnny Chen 
1099ed5b49cSJohnny Chen         // SIGSEGV crash reasons.
1109ed5b49cSJohnny Chen         case eInvalidAddress:
1119ed5b49cSJohnny Chen             str = "eInvalidAddress";
1129ed5b49cSJohnny Chen             break;
1139ed5b49cSJohnny Chen         case ePrivilegedAddress:
1149ed5b49cSJohnny Chen             str = "ePrivilegedAddress";
1159ed5b49cSJohnny Chen             break;
1169ed5b49cSJohnny Chen 
1179ed5b49cSJohnny Chen         // SIGILL crash reasons.
1189ed5b49cSJohnny Chen         case eIllegalOpcode:
1199ed5b49cSJohnny Chen             str = "eIllegalOpcode";
1209ed5b49cSJohnny Chen             break;
1219ed5b49cSJohnny Chen         case eIllegalOperand:
1229ed5b49cSJohnny Chen             str = "eIllegalOperand";
1239ed5b49cSJohnny Chen             break;
1249ed5b49cSJohnny Chen         case eIllegalAddressingMode:
1259ed5b49cSJohnny Chen             str = "eIllegalAddressingMode";
1269ed5b49cSJohnny Chen             break;
1279ed5b49cSJohnny Chen         case eIllegalTrap:
1289ed5b49cSJohnny Chen             str = "eIllegalTrap";
1299ed5b49cSJohnny Chen             break;
1309ed5b49cSJohnny Chen         case ePrivilegedOpcode:
1319ed5b49cSJohnny Chen             str = "ePrivilegedOpcode";
1329ed5b49cSJohnny Chen             break;
1339ed5b49cSJohnny Chen         case ePrivilegedRegister:
1349ed5b49cSJohnny Chen             str = "ePrivilegedRegister";
1359ed5b49cSJohnny Chen             break;
1369ed5b49cSJohnny Chen         case eCoprocessorError:
1379ed5b49cSJohnny Chen             str = "eCoprocessorError";
1389ed5b49cSJohnny Chen             break;
1399ed5b49cSJohnny Chen         case eInternalStackError:
1409ed5b49cSJohnny Chen             str = "eInternalStackError";
1419ed5b49cSJohnny Chen             break;
1429ed5b49cSJohnny Chen 
1439ed5b49cSJohnny Chen         // SIGBUS crash reasons:
1449ed5b49cSJohnny Chen         case eIllegalAlignment:
1459ed5b49cSJohnny Chen             str = "eIllegalAlignment";
1469ed5b49cSJohnny Chen             break;
1479ed5b49cSJohnny Chen         case eIllegalAddress:
1489ed5b49cSJohnny Chen             str = "eIllegalAddress";
1499ed5b49cSJohnny Chen             break;
1509ed5b49cSJohnny Chen         case eHardwareError:
1519ed5b49cSJohnny Chen             str = "eHardwareError";
1529ed5b49cSJohnny Chen             break;
1539ed5b49cSJohnny Chen 
1549ed5b49cSJohnny Chen         // SIGFPE crash reasons:
1559ed5b49cSJohnny Chen         case eIntegerDivideByZero:
1569ed5b49cSJohnny Chen             str = "eIntegerDivideByZero";
1579ed5b49cSJohnny Chen             break;
1589ed5b49cSJohnny Chen         case eIntegerOverflow:
1599ed5b49cSJohnny Chen             str = "eIntegerOverflow";
1609ed5b49cSJohnny Chen             break;
1619ed5b49cSJohnny Chen         case eFloatDivideByZero:
1629ed5b49cSJohnny Chen             str = "eFloatDivideByZero";
1639ed5b49cSJohnny Chen             break;
1649ed5b49cSJohnny Chen         case eFloatOverflow:
1659ed5b49cSJohnny Chen             str = "eFloatOverflow";
1669ed5b49cSJohnny Chen             break;
1679ed5b49cSJohnny Chen         case eFloatUnderflow:
1689ed5b49cSJohnny Chen             str = "eFloatUnderflow";
1699ed5b49cSJohnny Chen             break;
1709ed5b49cSJohnny Chen         case eFloatInexactResult:
1719ed5b49cSJohnny Chen             str = "eFloatInexactResult";
1729ed5b49cSJohnny Chen             break;
1739ed5b49cSJohnny Chen         case eFloatInvalidOperation:
1749ed5b49cSJohnny Chen             str = "eFloatInvalidOperation";
1759ed5b49cSJohnny Chen             break;
1769ed5b49cSJohnny Chen         case eFloatSubscriptRange:
1779ed5b49cSJohnny Chen             str = "eFloatSubscriptRange";
1789ed5b49cSJohnny Chen             break;
1799ed5b49cSJohnny Chen     }
1809ed5b49cSJohnny Chen #endif
1819ed5b49cSJohnny Chen 
1829ed5b49cSJohnny Chen     return str;
1839ed5b49cSJohnny Chen }
1849ed5b49cSJohnny Chen 
1859ed5b49cSJohnny Chen const char *
1869ed5b49cSJohnny Chen ProcessMessage::PrintCrashReason() const
1879ed5b49cSJohnny Chen {
1889ed5b49cSJohnny Chen     return PrintCrashReason(m_crash_reason);
1899ed5b49cSJohnny Chen }
1909ed5b49cSJohnny Chen 
1919ed5b49cSJohnny Chen const char *
1929ed5b49cSJohnny Chen ProcessMessage::PrintKind(Kind kind)
1939ed5b49cSJohnny Chen {
1949ed5b49cSJohnny Chen #ifdef LLDB_CONFIGURATION_BUILDANDINTEGRATION
1959ed5b49cSJohnny Chen     // Just return the code in asci for integration builds.
1969ed5b49cSJohnny Chen     chcar str[8];
1979ed5b49cSJohnny Chen     sprintf(str, "%d", reason);
1989ed5b49cSJohnny Chen #else
1999ed5b49cSJohnny Chen     const char *str = NULL;
2009ed5b49cSJohnny Chen 
2019ed5b49cSJohnny Chen     switch (kind)
2029ed5b49cSJohnny Chen     {
2039ed5b49cSJohnny Chen     case eInvalidMessage:
2049ed5b49cSJohnny Chen         str = "eInvalidMessage";
2059ed5b49cSJohnny Chen         break;
2069ed5b49cSJohnny Chen     case eExitMessage:
2079ed5b49cSJohnny Chen         str = "eExitMessage";
2089ed5b49cSJohnny Chen         break;
2099ed5b49cSJohnny Chen     case eLimboMessage:
2109ed5b49cSJohnny Chen         str = "eLimboMessage";
2119ed5b49cSJohnny Chen         break;
2129ed5b49cSJohnny Chen     case eSignalMessage:
2139ed5b49cSJohnny Chen         str = "eSignalMessage";
2149ed5b49cSJohnny Chen         break;
2159ed5b49cSJohnny Chen     case eSignalDeliveredMessage:
2169ed5b49cSJohnny Chen         str = "eSignalDeliveredMessage";
2179ed5b49cSJohnny Chen         break;
2189ed5b49cSJohnny Chen     case eTraceMessage:
2199ed5b49cSJohnny Chen         str = "eTraceMessage";
2209ed5b49cSJohnny Chen         break;
2219ed5b49cSJohnny Chen     case eBreakpointMessage:
2229ed5b49cSJohnny Chen         str = "eBreakpointMessage";
2239ed5b49cSJohnny Chen         break;
2249ed5b49cSJohnny Chen     case eCrashMessage:
2259ed5b49cSJohnny Chen         str = "eCrashMessage";
2269ed5b49cSJohnny Chen         break;
227*650648faSMatt Kopec     case eNewThreadMessage:
228*650648faSMatt Kopec         str = "eNewThreadMessage";
229*650648faSMatt Kopec         break;
2309ed5b49cSJohnny Chen     }
2319ed5b49cSJohnny Chen #endif
2329ed5b49cSJohnny Chen 
2339ed5b49cSJohnny Chen     return str;
2349ed5b49cSJohnny Chen }
2359ed5b49cSJohnny Chen 
2369ed5b49cSJohnny Chen const char *
2379ed5b49cSJohnny Chen ProcessMessage::PrintKind() const
2389ed5b49cSJohnny Chen {
2399ed5b49cSJohnny Chen     return PrintKind(m_kind);
2409ed5b49cSJohnny Chen }
241