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 12*b96a126bSMatt Kopec #include <sstream> 13*b96a126bSMatt Kopec 149ed5b49cSJohnny Chen using namespace lldb_private; 159ed5b49cSJohnny Chen 16*b96a126bSMatt Kopec namespace { 17*b96a126bSMatt Kopec 18*b96a126bSMatt Kopec inline void AppendFaultAddr(std::string& str, lldb::addr_t addr) 199ed5b49cSJohnny Chen { 20*b96a126bSMatt Kopec std::stringstream ss; 21*b96a126bSMatt Kopec ss << " (fault address: 0x" << std::hex << addr << ")"; 22*b96a126bSMatt Kopec str += ss.str(); 23*b96a126bSMatt Kopec } 24*b96a126bSMatt Kopec 25*b96a126bSMatt Kopec } 26*b96a126bSMatt Kopec 27*b96a126bSMatt Kopec const char * 28*b96a126bSMatt Kopec ProcessMessage::GetCrashReasonString(CrashReason reason, lldb::addr_t fault_addr) 29*b96a126bSMatt Kopec { 30*b96a126bSMatt 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"; 40*b96a126bSMatt Kopec AppendFaultAddr(str, fault_addr); 419ed5b49cSJohnny Chen break; 429ed5b49cSJohnny Chen case ePrivilegedAddress: 439ed5b49cSJohnny Chen str = "address access protected"; 44*b96a126bSMatt 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 105*b96a126bSMatt 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; 2219ed5b49cSJohnny Chen case eExitMessage: 2229ed5b49cSJohnny Chen str = "eExitMessage"; 2239ed5b49cSJohnny Chen break; 2249ed5b49cSJohnny Chen case eLimboMessage: 2259ed5b49cSJohnny Chen str = "eLimboMessage"; 2269ed5b49cSJohnny Chen break; 2279ed5b49cSJohnny Chen case eSignalMessage: 2289ed5b49cSJohnny Chen str = "eSignalMessage"; 2299ed5b49cSJohnny Chen break; 2309ed5b49cSJohnny Chen case eSignalDeliveredMessage: 2319ed5b49cSJohnny Chen str = "eSignalDeliveredMessage"; 2329ed5b49cSJohnny Chen break; 2339ed5b49cSJohnny Chen case eTraceMessage: 2349ed5b49cSJohnny Chen str = "eTraceMessage"; 2359ed5b49cSJohnny Chen break; 2369ed5b49cSJohnny Chen case eBreakpointMessage: 2379ed5b49cSJohnny Chen str = "eBreakpointMessage"; 2389ed5b49cSJohnny Chen break; 239e9ea0da8SMatt Kopec case eWatchpointMessage: 240e9ea0da8SMatt Kopec str = "eWatchpointMessage"; 241e9ea0da8SMatt Kopec break; 2429ed5b49cSJohnny Chen case eCrashMessage: 2439ed5b49cSJohnny Chen str = "eCrashMessage"; 2449ed5b49cSJohnny Chen break; 245650648faSMatt Kopec case eNewThreadMessage: 246650648faSMatt Kopec str = "eNewThreadMessage"; 247650648faSMatt Kopec break; 2489ed5b49cSJohnny Chen } 2499ed5b49cSJohnny Chen #endif 2509ed5b49cSJohnny Chen 2519ed5b49cSJohnny Chen return str; 2529ed5b49cSJohnny Chen } 2539ed5b49cSJohnny Chen 2549ed5b49cSJohnny Chen const char * 2559ed5b49cSJohnny Chen ProcessMessage::PrintKind() const 2569ed5b49cSJohnny Chen { 2579ed5b49cSJohnny Chen return PrintKind(m_kind); 2589ed5b49cSJohnny Chen } 259