blob: 5c53627f9e0bdc37b5f980ec4ad6ca6c994a8890 [file] [log] [blame]
Johnny Chen9ed5b492012-01-05 21:48:15 +00001//===-- ProcessMessage.cpp --------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "ProcessMessage.h"
11
Matt Kopecb96a1262013-06-10 22:14:47 +000012#include <sstream>
13
Johnny Chen9ed5b492012-01-05 21:48:15 +000014using namespace lldb_private;
15
Matt Kopecb96a1262013-06-10 22:14:47 +000016namespace {
17
18inline void AppendFaultAddr(std::string& str, lldb::addr_t addr)
Johnny Chen9ed5b492012-01-05 21:48:15 +000019{
Matt Kopecb96a1262013-06-10 22:14:47 +000020 std::stringstream ss;
21 ss << " (fault address: 0x" << std::hex << addr << ")";
22 str += ss.str();
23}
24
25}
26
27const char *
28ProcessMessage::GetCrashReasonString(CrashReason reason, lldb::addr_t fault_addr)
29{
30 static std::string str;
Johnny Chen9ed5b492012-01-05 21:48:15 +000031
32 switch (reason)
33 {
34 default:
35 assert(false && "invalid CrashReason");
36 break;
37
38 case eInvalidAddress:
39 str = "invalid address";
Matt Kopecb96a1262013-06-10 22:14:47 +000040 AppendFaultAddr(str, fault_addr);
Johnny Chen9ed5b492012-01-05 21:48:15 +000041 break;
42 case ePrivilegedAddress:
43 str = "address access protected";
Matt Kopecb96a1262013-06-10 22:14:47 +000044 AppendFaultAddr(str, fault_addr);
Johnny Chen9ed5b492012-01-05 21:48:15 +000045 break;
46 case eIllegalOpcode:
47 str = "illegal instruction";
48 break;
49 case eIllegalOperand:
50 str = "illegal instruction operand";
51 break;
52 case eIllegalAddressingMode:
53 str = "illegal addressing mode";
54 break;
55 case eIllegalTrap:
56 str = "illegal trap";
57 break;
58 case ePrivilegedOpcode:
59 str = "privileged instruction";
60 break;
61 case ePrivilegedRegister:
62 str = "privileged register";
63 break;
64 case eCoprocessorError:
65 str = "coprocessor error";
66 break;
67 case eInternalStackError:
68 str = "internal stack error";
69 break;
70 case eIllegalAlignment:
71 str = "illegal alignment";
72 break;
73 case eIllegalAddress:
74 str = "illegal address";
75 break;
76 case eHardwareError:
77 str = "hardware error";
78 break;
79 case eIntegerDivideByZero:
80 str = "integer divide by zero";
81 break;
82 case eIntegerOverflow:
83 str = "integer overflow";
84 break;
85 case eFloatDivideByZero:
86 str = "floating point divide by zero";
87 break;
88 case eFloatOverflow:
89 str = "floating point overflow";
90 break;
91 case eFloatUnderflow:
92 str = "floating point underflow";
93 break;
94 case eFloatInexactResult:
95 str = "inexact floating point result";
96 break;
97 case eFloatInvalidOperation:
98 str = "invalid floating point operation";
99 break;
100 case eFloatSubscriptRange:
101 str = "invalid floating point subscript range";
102 break;
103 }
104
Matt Kopecb96a1262013-06-10 22:14:47 +0000105 return str.c_str();
Johnny Chen9ed5b492012-01-05 21:48:15 +0000106}
107
108const char *
109ProcessMessage::PrintCrashReason(CrashReason reason)
110{
111#ifdef LLDB_CONFIGURATION_BUILDANDINTEGRATION
112 // Just return the code in asci for integration builds.
113 chcar str[8];
114 sprintf(str, "%d", reason);
115#else
116 const char *str = NULL;
117
118 switch (reason)
119 {
Johnny Chen9ed5b492012-01-05 21:48:15 +0000120 case eInvalidCrashReason:
121 str = "eInvalidCrashReason";
122 break;
123
124 // SIGSEGV crash reasons.
125 case eInvalidAddress:
126 str = "eInvalidAddress";
127 break;
128 case ePrivilegedAddress:
129 str = "ePrivilegedAddress";
130 break;
131
132 // SIGILL crash reasons.
133 case eIllegalOpcode:
134 str = "eIllegalOpcode";
135 break;
136 case eIllegalOperand:
137 str = "eIllegalOperand";
138 break;
139 case eIllegalAddressingMode:
140 str = "eIllegalAddressingMode";
141 break;
142 case eIllegalTrap:
143 str = "eIllegalTrap";
144 break;
145 case ePrivilegedOpcode:
146 str = "ePrivilegedOpcode";
147 break;
148 case ePrivilegedRegister:
149 str = "ePrivilegedRegister";
150 break;
151 case eCoprocessorError:
152 str = "eCoprocessorError";
153 break;
154 case eInternalStackError:
155 str = "eInternalStackError";
156 break;
157
158 // SIGBUS crash reasons:
159 case eIllegalAlignment:
160 str = "eIllegalAlignment";
161 break;
162 case eIllegalAddress:
163 str = "eIllegalAddress";
164 break;
165 case eHardwareError:
166 str = "eHardwareError";
167 break;
168
169 // SIGFPE crash reasons:
170 case eIntegerDivideByZero:
171 str = "eIntegerDivideByZero";
172 break;
173 case eIntegerOverflow:
174 str = "eIntegerOverflow";
175 break;
176 case eFloatDivideByZero:
177 str = "eFloatDivideByZero";
178 break;
179 case eFloatOverflow:
180 str = "eFloatOverflow";
181 break;
182 case eFloatUnderflow:
183 str = "eFloatUnderflow";
184 break;
185 case eFloatInexactResult:
186 str = "eFloatInexactResult";
187 break;
188 case eFloatInvalidOperation:
189 str = "eFloatInvalidOperation";
190 break;
191 case eFloatSubscriptRange:
192 str = "eFloatSubscriptRange";
193 break;
194 }
195#endif
196
197 return str;
198}
199
200const char *
201ProcessMessage::PrintCrashReason() const
202{
203 return PrintCrashReason(m_crash_reason);
204}
205
206const char *
207ProcessMessage::PrintKind(Kind kind)
208{
209#ifdef LLDB_CONFIGURATION_BUILDANDINTEGRATION
210 // Just return the code in asci for integration builds.
211 chcar str[8];
212 sprintf(str, "%d", reason);
213#else
214 const char *str = NULL;
215
216 switch (kind)
217 {
Johnny Chen9ed5b492012-01-05 21:48:15 +0000218 case eInvalidMessage:
219 str = "eInvalidMessage";
220 break;
Ed Mastee5441432013-09-03 23:55:30 +0000221 case eAttachMessage:
222 str = "eAttachMessage";
223 break;
Johnny Chen9ed5b492012-01-05 21:48:15 +0000224 case eExitMessage:
225 str = "eExitMessage";
226 break;
227 case eLimboMessage:
228 str = "eLimboMessage";
229 break;
230 case eSignalMessage:
231 str = "eSignalMessage";
232 break;
233 case eSignalDeliveredMessage:
234 str = "eSignalDeliveredMessage";
235 break;
236 case eTraceMessage:
237 str = "eTraceMessage";
238 break;
239 case eBreakpointMessage:
240 str = "eBreakpointMessage";
241 break;
Matt Kopece9ea0da2013-05-07 19:29:28 +0000242 case eWatchpointMessage:
243 str = "eWatchpointMessage";
244 break;
Johnny Chen9ed5b492012-01-05 21:48:15 +0000245 case eCrashMessage:
246 str = "eCrashMessage";
247 break;
Matt Kopec650648f2013-01-08 16:30:18 +0000248 case eNewThreadMessage:
249 str = "eNewThreadMessage";
250 break;
Joerg Sonnenbergerc5e53bd2013-10-20 17:35:46 +0000251 case eExecMessage:
252 str = "eExecMessage";
253 break;
Johnny Chen9ed5b492012-01-05 21:48:15 +0000254 }
255#endif
256
257 return str;
258}
259
260const char *
261ProcessMessage::PrintKind() const
262{
263 return PrintKind(m_kind);
264}