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