1*9ed5b49cSJohnny Chen //===-- ProcessMessage.cpp --------------------------------------*- C++ -*-===// 2*9ed5b49cSJohnny Chen // 3*9ed5b49cSJohnny Chen // The LLVM Compiler Infrastructure 4*9ed5b49cSJohnny Chen // 5*9ed5b49cSJohnny Chen // This file is distributed under the University of Illinois Open Source 6*9ed5b49cSJohnny Chen // License. See LICENSE.TXT for details. 7*9ed5b49cSJohnny Chen // 8*9ed5b49cSJohnny Chen //===----------------------------------------------------------------------===// 9*9ed5b49cSJohnny Chen 10*9ed5b49cSJohnny Chen #include "ProcessMessage.h" 11*9ed5b49cSJohnny Chen 12*9ed5b49cSJohnny Chen using namespace lldb_private; 13*9ed5b49cSJohnny Chen 14*9ed5b49cSJohnny Chen const char * 15*9ed5b49cSJohnny Chen ProcessMessage::GetCrashReasonString(CrashReason reason) 16*9ed5b49cSJohnny Chen { 17*9ed5b49cSJohnny Chen const char *str = NULL; 18*9ed5b49cSJohnny Chen 19*9ed5b49cSJohnny Chen switch (reason) 20*9ed5b49cSJohnny Chen { 21*9ed5b49cSJohnny Chen default: 22*9ed5b49cSJohnny Chen assert(false && "invalid CrashReason"); 23*9ed5b49cSJohnny Chen break; 24*9ed5b49cSJohnny Chen 25*9ed5b49cSJohnny Chen case eInvalidAddress: 26*9ed5b49cSJohnny Chen str = "invalid address"; 27*9ed5b49cSJohnny Chen break; 28*9ed5b49cSJohnny Chen case ePrivilegedAddress: 29*9ed5b49cSJohnny Chen str = "address access protected"; 30*9ed5b49cSJohnny Chen break; 31*9ed5b49cSJohnny Chen case eIllegalOpcode: 32*9ed5b49cSJohnny Chen str = "illegal instruction"; 33*9ed5b49cSJohnny Chen break; 34*9ed5b49cSJohnny Chen case eIllegalOperand: 35*9ed5b49cSJohnny Chen str = "illegal instruction operand"; 36*9ed5b49cSJohnny Chen break; 37*9ed5b49cSJohnny Chen case eIllegalAddressingMode: 38*9ed5b49cSJohnny Chen str = "illegal addressing mode"; 39*9ed5b49cSJohnny Chen break; 40*9ed5b49cSJohnny Chen case eIllegalTrap: 41*9ed5b49cSJohnny Chen str = "illegal trap"; 42*9ed5b49cSJohnny Chen break; 43*9ed5b49cSJohnny Chen case ePrivilegedOpcode: 44*9ed5b49cSJohnny Chen str = "privileged instruction"; 45*9ed5b49cSJohnny Chen break; 46*9ed5b49cSJohnny Chen case ePrivilegedRegister: 47*9ed5b49cSJohnny Chen str = "privileged register"; 48*9ed5b49cSJohnny Chen break; 49*9ed5b49cSJohnny Chen case eCoprocessorError: 50*9ed5b49cSJohnny Chen str = "coprocessor error"; 51*9ed5b49cSJohnny Chen break; 52*9ed5b49cSJohnny Chen case eInternalStackError: 53*9ed5b49cSJohnny Chen str = "internal stack error"; 54*9ed5b49cSJohnny Chen break; 55*9ed5b49cSJohnny Chen case eIllegalAlignment: 56*9ed5b49cSJohnny Chen str = "illegal alignment"; 57*9ed5b49cSJohnny Chen break; 58*9ed5b49cSJohnny Chen case eIllegalAddress: 59*9ed5b49cSJohnny Chen str = "illegal address"; 60*9ed5b49cSJohnny Chen break; 61*9ed5b49cSJohnny Chen case eHardwareError: 62*9ed5b49cSJohnny Chen str = "hardware error"; 63*9ed5b49cSJohnny Chen break; 64*9ed5b49cSJohnny Chen case eIntegerDivideByZero: 65*9ed5b49cSJohnny Chen str = "integer divide by zero"; 66*9ed5b49cSJohnny Chen break; 67*9ed5b49cSJohnny Chen case eIntegerOverflow: 68*9ed5b49cSJohnny Chen str = "integer overflow"; 69*9ed5b49cSJohnny Chen break; 70*9ed5b49cSJohnny Chen case eFloatDivideByZero: 71*9ed5b49cSJohnny Chen str = "floating point divide by zero"; 72*9ed5b49cSJohnny Chen break; 73*9ed5b49cSJohnny Chen case eFloatOverflow: 74*9ed5b49cSJohnny Chen str = "floating point overflow"; 75*9ed5b49cSJohnny Chen break; 76*9ed5b49cSJohnny Chen case eFloatUnderflow: 77*9ed5b49cSJohnny Chen str = "floating point underflow"; 78*9ed5b49cSJohnny Chen break; 79*9ed5b49cSJohnny Chen case eFloatInexactResult: 80*9ed5b49cSJohnny Chen str = "inexact floating point result"; 81*9ed5b49cSJohnny Chen break; 82*9ed5b49cSJohnny Chen case eFloatInvalidOperation: 83*9ed5b49cSJohnny Chen str = "invalid floating point operation"; 84*9ed5b49cSJohnny Chen break; 85*9ed5b49cSJohnny Chen case eFloatSubscriptRange: 86*9ed5b49cSJohnny Chen str = "invalid floating point subscript range"; 87*9ed5b49cSJohnny Chen break; 88*9ed5b49cSJohnny Chen } 89*9ed5b49cSJohnny Chen 90*9ed5b49cSJohnny Chen return str; 91*9ed5b49cSJohnny Chen } 92*9ed5b49cSJohnny Chen 93*9ed5b49cSJohnny Chen const char * 94*9ed5b49cSJohnny Chen ProcessMessage::PrintCrashReason(CrashReason reason) 95*9ed5b49cSJohnny Chen { 96*9ed5b49cSJohnny Chen #ifdef LLDB_CONFIGURATION_BUILDANDINTEGRATION 97*9ed5b49cSJohnny Chen // Just return the code in asci for integration builds. 98*9ed5b49cSJohnny Chen chcar str[8]; 99*9ed5b49cSJohnny Chen sprintf(str, "%d", reason); 100*9ed5b49cSJohnny Chen #else 101*9ed5b49cSJohnny Chen const char *str = NULL; 102*9ed5b49cSJohnny Chen 103*9ed5b49cSJohnny Chen switch (reason) 104*9ed5b49cSJohnny Chen { 105*9ed5b49cSJohnny Chen default: 106*9ed5b49cSJohnny Chen assert(false && "invalid CrashReason"); 107*9ed5b49cSJohnny Chen break; 108*9ed5b49cSJohnny Chen 109*9ed5b49cSJohnny Chen case eInvalidCrashReason: 110*9ed5b49cSJohnny Chen str = "eInvalidCrashReason"; 111*9ed5b49cSJohnny Chen break; 112*9ed5b49cSJohnny Chen 113*9ed5b49cSJohnny Chen // SIGSEGV crash reasons. 114*9ed5b49cSJohnny Chen case eInvalidAddress: 115*9ed5b49cSJohnny Chen str = "eInvalidAddress"; 116*9ed5b49cSJohnny Chen break; 117*9ed5b49cSJohnny Chen case ePrivilegedAddress: 118*9ed5b49cSJohnny Chen str = "ePrivilegedAddress"; 119*9ed5b49cSJohnny Chen break; 120*9ed5b49cSJohnny Chen 121*9ed5b49cSJohnny Chen // SIGILL crash reasons. 122*9ed5b49cSJohnny Chen case eIllegalOpcode: 123*9ed5b49cSJohnny Chen str = "eIllegalOpcode"; 124*9ed5b49cSJohnny Chen break; 125*9ed5b49cSJohnny Chen case eIllegalOperand: 126*9ed5b49cSJohnny Chen str = "eIllegalOperand"; 127*9ed5b49cSJohnny Chen break; 128*9ed5b49cSJohnny Chen case eIllegalAddressingMode: 129*9ed5b49cSJohnny Chen str = "eIllegalAddressingMode"; 130*9ed5b49cSJohnny Chen break; 131*9ed5b49cSJohnny Chen case eIllegalTrap: 132*9ed5b49cSJohnny Chen str = "eIllegalTrap"; 133*9ed5b49cSJohnny Chen break; 134*9ed5b49cSJohnny Chen case ePrivilegedOpcode: 135*9ed5b49cSJohnny Chen str = "ePrivilegedOpcode"; 136*9ed5b49cSJohnny Chen break; 137*9ed5b49cSJohnny Chen case ePrivilegedRegister: 138*9ed5b49cSJohnny Chen str = "ePrivilegedRegister"; 139*9ed5b49cSJohnny Chen break; 140*9ed5b49cSJohnny Chen case eCoprocessorError: 141*9ed5b49cSJohnny Chen str = "eCoprocessorError"; 142*9ed5b49cSJohnny Chen break; 143*9ed5b49cSJohnny Chen case eInternalStackError: 144*9ed5b49cSJohnny Chen str = "eInternalStackError"; 145*9ed5b49cSJohnny Chen break; 146*9ed5b49cSJohnny Chen 147*9ed5b49cSJohnny Chen // SIGBUS crash reasons: 148*9ed5b49cSJohnny Chen case eIllegalAlignment: 149*9ed5b49cSJohnny Chen str = "eIllegalAlignment"; 150*9ed5b49cSJohnny Chen break; 151*9ed5b49cSJohnny Chen case eIllegalAddress: 152*9ed5b49cSJohnny Chen str = "eIllegalAddress"; 153*9ed5b49cSJohnny Chen break; 154*9ed5b49cSJohnny Chen case eHardwareError: 155*9ed5b49cSJohnny Chen str = "eHardwareError"; 156*9ed5b49cSJohnny Chen break; 157*9ed5b49cSJohnny Chen 158*9ed5b49cSJohnny Chen // SIGFPE crash reasons: 159*9ed5b49cSJohnny Chen case eIntegerDivideByZero: 160*9ed5b49cSJohnny Chen str = "eIntegerDivideByZero"; 161*9ed5b49cSJohnny Chen break; 162*9ed5b49cSJohnny Chen case eIntegerOverflow: 163*9ed5b49cSJohnny Chen str = "eIntegerOverflow"; 164*9ed5b49cSJohnny Chen break; 165*9ed5b49cSJohnny Chen case eFloatDivideByZero: 166*9ed5b49cSJohnny Chen str = "eFloatDivideByZero"; 167*9ed5b49cSJohnny Chen break; 168*9ed5b49cSJohnny Chen case eFloatOverflow: 169*9ed5b49cSJohnny Chen str = "eFloatOverflow"; 170*9ed5b49cSJohnny Chen break; 171*9ed5b49cSJohnny Chen case eFloatUnderflow: 172*9ed5b49cSJohnny Chen str = "eFloatUnderflow"; 173*9ed5b49cSJohnny Chen break; 174*9ed5b49cSJohnny Chen case eFloatInexactResult: 175*9ed5b49cSJohnny Chen str = "eFloatInexactResult"; 176*9ed5b49cSJohnny Chen break; 177*9ed5b49cSJohnny Chen case eFloatInvalidOperation: 178*9ed5b49cSJohnny Chen str = "eFloatInvalidOperation"; 179*9ed5b49cSJohnny Chen break; 180*9ed5b49cSJohnny Chen case eFloatSubscriptRange: 181*9ed5b49cSJohnny Chen str = "eFloatSubscriptRange"; 182*9ed5b49cSJohnny Chen break; 183*9ed5b49cSJohnny Chen } 184*9ed5b49cSJohnny Chen #endif 185*9ed5b49cSJohnny Chen 186*9ed5b49cSJohnny Chen return str; 187*9ed5b49cSJohnny Chen } 188*9ed5b49cSJohnny Chen 189*9ed5b49cSJohnny Chen const char * 190*9ed5b49cSJohnny Chen ProcessMessage::PrintCrashReason() const 191*9ed5b49cSJohnny Chen { 192*9ed5b49cSJohnny Chen return PrintCrashReason(m_crash_reason); 193*9ed5b49cSJohnny Chen } 194*9ed5b49cSJohnny Chen 195*9ed5b49cSJohnny Chen const char * 196*9ed5b49cSJohnny Chen ProcessMessage::PrintKind(Kind kind) 197*9ed5b49cSJohnny Chen { 198*9ed5b49cSJohnny Chen #ifdef LLDB_CONFIGURATION_BUILDANDINTEGRATION 199*9ed5b49cSJohnny Chen // Just return the code in asci for integration builds. 200*9ed5b49cSJohnny Chen chcar str[8]; 201*9ed5b49cSJohnny Chen sprintf(str, "%d", reason); 202*9ed5b49cSJohnny Chen #else 203*9ed5b49cSJohnny Chen const char *str = NULL; 204*9ed5b49cSJohnny Chen 205*9ed5b49cSJohnny Chen switch (kind) 206*9ed5b49cSJohnny Chen { 207*9ed5b49cSJohnny Chen default: 208*9ed5b49cSJohnny Chen assert(false && "invalid Kind"); 209*9ed5b49cSJohnny Chen break; 210*9ed5b49cSJohnny Chen 211*9ed5b49cSJohnny Chen case eInvalidMessage: 212*9ed5b49cSJohnny Chen str = "eInvalidMessage"; 213*9ed5b49cSJohnny Chen break; 214*9ed5b49cSJohnny Chen case eExitMessage: 215*9ed5b49cSJohnny Chen str = "eExitMessage"; 216*9ed5b49cSJohnny Chen break; 217*9ed5b49cSJohnny Chen case eLimboMessage: 218*9ed5b49cSJohnny Chen str = "eLimboMessage"; 219*9ed5b49cSJohnny Chen break; 220*9ed5b49cSJohnny Chen case eSignalMessage: 221*9ed5b49cSJohnny Chen str = "eSignalMessage"; 222*9ed5b49cSJohnny Chen break; 223*9ed5b49cSJohnny Chen case eSignalDeliveredMessage: 224*9ed5b49cSJohnny Chen str = "eSignalDeliveredMessage"; 225*9ed5b49cSJohnny Chen break; 226*9ed5b49cSJohnny Chen case eTraceMessage: 227*9ed5b49cSJohnny Chen str = "eTraceMessage"; 228*9ed5b49cSJohnny Chen break; 229*9ed5b49cSJohnny Chen case eBreakpointMessage: 230*9ed5b49cSJohnny Chen str = "eBreakpointMessage"; 231*9ed5b49cSJohnny Chen break; 232*9ed5b49cSJohnny Chen case eCrashMessage: 233*9ed5b49cSJohnny Chen str = "eCrashMessage"; 234*9ed5b49cSJohnny Chen break; 235*9ed5b49cSJohnny Chen } 236*9ed5b49cSJohnny Chen #endif 237*9ed5b49cSJohnny Chen 238*9ed5b49cSJohnny Chen return str; 239*9ed5b49cSJohnny Chen } 240*9ed5b49cSJohnny Chen 241*9ed5b49cSJohnny Chen const char * 242*9ed5b49cSJohnny Chen ProcessMessage::PrintKind() const 243*9ed5b49cSJohnny Chen { 244*9ed5b49cSJohnny Chen return PrintKind(m_kind); 245*9ed5b49cSJohnny Chen } 246