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