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