1 //===-- DWARFDefines.cpp ----------------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 #include "DWARFDefines.h"
10 #include "lldb/Utility/ConstString.h"
11 #include <cstdio>
12 #include <cstring>
13 #include <string>
14
15 namespace lldb_private {
16
DW_TAG_value_to_name(uint32_t val)17 const char *DW_TAG_value_to_name(uint32_t val) {
18 static char invalid[100];
19
20 if (val == 0)
21 return "NULL";
22
23 llvm::StringRef llvmstr = llvm::dwarf::TagString(val);
24 if (llvmstr.empty()) {
25 snprintf(invalid, sizeof(invalid), "Unknown DW_TAG constant: 0x%x", val);
26 return invalid;
27 }
28 return llvmstr.data();
29 }
30
DW_AT_value_to_name(uint32_t val)31 const char *DW_AT_value_to_name(uint32_t val) {
32 static char invalid[100];
33 llvm::StringRef llvmstr = llvm::dwarf::AttributeString(val);
34 if (llvmstr.empty()) {
35 snprintf(invalid, sizeof(invalid), "Unknown DW_AT constant: 0x%x", val);
36 return invalid;
37 }
38 return llvmstr.data();
39 }
40
DW_FORM_value_to_name(uint32_t val)41 const char *DW_FORM_value_to_name(uint32_t val) {
42 static char invalid[100];
43 llvm::StringRef llvmstr = llvm::dwarf::FormEncodingString(val);
44 if (llvmstr.empty()) {
45 snprintf(invalid, sizeof(invalid), "Unknown DW_FORM constant: 0x%x", val);
46 return invalid;
47 }
48 return llvmstr.data();
49 }
50
DW_OP_value_to_name(uint32_t val)51 const char *DW_OP_value_to_name(uint32_t val) {
52 static char invalid[100];
53 llvm::StringRef llvmstr = llvm::dwarf::OperationEncodingString(val);
54 if (llvmstr.empty()) {
55 snprintf(invalid, sizeof(invalid), "Unknown DW_OP constant: 0x%x", val);
56 return invalid;
57 }
58 return llvmstr.data();
59 }
60
DW_OP_value_to_class(uint32_t val)61 DRC_class DW_OP_value_to_class(uint32_t val) {
62 // FIXME: If we just used llvm's DWARFExpression printer, we could delete
63 // all this code (and more in lldb's DWARFExpression.cpp).
64 switch (val) {
65 case 0x03:
66 return DRC_ONEOPERAND;
67 case 0x06:
68 return DRC_ZEROOPERANDS;
69 case 0x08:
70 return DRC_ONEOPERAND;
71 case 0x09:
72 return DRC_ONEOPERAND;
73 case 0x0a:
74 return DRC_ONEOPERAND;
75 case 0x0b:
76 return DRC_ONEOPERAND;
77 case 0x0c:
78 return DRC_ONEOPERAND;
79 case 0x0d:
80 return DRC_ONEOPERAND;
81 case 0x0e:
82 return DRC_ONEOPERAND;
83 case 0x0f:
84 return DRC_ONEOPERAND;
85 case 0x10:
86 return DRC_ONEOPERAND;
87 case 0x11:
88 return DRC_ONEOPERAND;
89 case 0x12:
90 return DRC_ZEROOPERANDS;
91 case 0x13:
92 return DRC_ZEROOPERANDS;
93 case 0x14:
94 return DRC_ZEROOPERANDS;
95 case 0x15:
96 return DRC_ONEOPERAND;
97 case 0x16:
98 return DRC_ZEROOPERANDS;
99 case 0x17:
100 return DRC_ZEROOPERANDS;
101 case 0x18:
102 return DRC_ZEROOPERANDS;
103 case 0x19:
104 return DRC_ZEROOPERANDS;
105 case 0x1a:
106 return DRC_ZEROOPERANDS;
107 case 0x1b:
108 return DRC_ZEROOPERANDS;
109 case 0x1c:
110 return DRC_ZEROOPERANDS;
111 case 0x1d:
112 return DRC_ZEROOPERANDS;
113 case 0x1e:
114 return DRC_ZEROOPERANDS;
115 case 0x1f:
116 return DRC_ZEROOPERANDS;
117 case 0x20:
118 return DRC_ZEROOPERANDS;
119 case 0x21:
120 return DRC_ZEROOPERANDS;
121 case 0x22:
122 return DRC_ZEROOPERANDS;
123 case 0x23:
124 return DRC_ONEOPERAND;
125 case 0x24:
126 return DRC_ZEROOPERANDS;
127 case 0x25:
128 return DRC_ZEROOPERANDS;
129 case 0x26:
130 return DRC_ZEROOPERANDS;
131 case 0x27:
132 return DRC_ZEROOPERANDS;
133 case 0x2f:
134 return DRC_ONEOPERAND;
135 case 0x28:
136 return DRC_ONEOPERAND;
137 case 0x29:
138 return DRC_ZEROOPERANDS;
139 case 0x2a:
140 return DRC_ZEROOPERANDS;
141 case 0x2b:
142 return DRC_ZEROOPERANDS;
143 case 0x2c:
144 return DRC_ZEROOPERANDS;
145 case 0x2d:
146 return DRC_ZEROOPERANDS;
147 case 0x2e:
148 return DRC_ZEROOPERANDS;
149 case 0x30:
150 return DRC_ZEROOPERANDS;
151 case 0x31:
152 return DRC_ZEROOPERANDS;
153 case 0x32:
154 return DRC_ZEROOPERANDS;
155 case 0x33:
156 return DRC_ZEROOPERANDS;
157 case 0x34:
158 return DRC_ZEROOPERANDS;
159 case 0x35:
160 return DRC_ZEROOPERANDS;
161 case 0x36:
162 return DRC_ZEROOPERANDS;
163 case 0x37:
164 return DRC_ZEROOPERANDS;
165 case 0x38:
166 return DRC_ZEROOPERANDS;
167 case 0x39:
168 return DRC_ZEROOPERANDS;
169 case 0x3a:
170 return DRC_ZEROOPERANDS;
171 case 0x3b:
172 return DRC_ZEROOPERANDS;
173 case 0x3c:
174 return DRC_ZEROOPERANDS;
175 case 0x3d:
176 return DRC_ZEROOPERANDS;
177 case 0x3e:
178 return DRC_ZEROOPERANDS;
179 case 0x3f:
180 return DRC_ZEROOPERANDS;
181 case 0x40:
182 return DRC_ZEROOPERANDS;
183 case 0x41:
184 return DRC_ZEROOPERANDS;
185 case 0x42:
186 return DRC_ZEROOPERANDS;
187 case 0x43:
188 return DRC_ZEROOPERANDS;
189 case 0x44:
190 return DRC_ZEROOPERANDS;
191 case 0x45:
192 return DRC_ZEROOPERANDS;
193 case 0x46:
194 return DRC_ZEROOPERANDS;
195 case 0x47:
196 return DRC_ZEROOPERANDS;
197 case 0x48:
198 return DRC_ZEROOPERANDS;
199 case 0x49:
200 return DRC_ZEROOPERANDS;
201 case 0x4a:
202 return DRC_ZEROOPERANDS;
203 case 0x4b:
204 return DRC_ZEROOPERANDS;
205 case 0x4c:
206 return DRC_ZEROOPERANDS;
207 case 0x4d:
208 return DRC_ZEROOPERANDS;
209 case 0x4e:
210 return DRC_ZEROOPERANDS;
211 case 0x4f:
212 return DRC_ZEROOPERANDS;
213 case 0x50:
214 return DRC_ZEROOPERANDS;
215 case 0x51:
216 return DRC_ZEROOPERANDS;
217 case 0x52:
218 return DRC_ZEROOPERANDS;
219 case 0x53:
220 return DRC_ZEROOPERANDS;
221 case 0x54:
222 return DRC_ZEROOPERANDS;
223 case 0x55:
224 return DRC_ZEROOPERANDS;
225 case 0x56:
226 return DRC_ZEROOPERANDS;
227 case 0x57:
228 return DRC_ZEROOPERANDS;
229 case 0x58:
230 return DRC_ZEROOPERANDS;
231 case 0x59:
232 return DRC_ZEROOPERANDS;
233 case 0x5a:
234 return DRC_ZEROOPERANDS;
235 case 0x5b:
236 return DRC_ZEROOPERANDS;
237 case 0x5c:
238 return DRC_ZEROOPERANDS;
239 case 0x5d:
240 return DRC_ZEROOPERANDS;
241 case 0x5e:
242 return DRC_ZEROOPERANDS;
243 case 0x5f:
244 return DRC_ZEROOPERANDS;
245 case 0x60:
246 return DRC_ZEROOPERANDS;
247 case 0x61:
248 return DRC_ZEROOPERANDS;
249 case 0x62:
250 return DRC_ZEROOPERANDS;
251 case 0x63:
252 return DRC_ZEROOPERANDS;
253 case 0x64:
254 return DRC_ZEROOPERANDS;
255 case 0x65:
256 return DRC_ZEROOPERANDS;
257 case 0x66:
258 return DRC_ZEROOPERANDS;
259 case 0x67:
260 return DRC_ZEROOPERANDS;
261 case 0x68:
262 return DRC_ZEROOPERANDS;
263 case 0x69:
264 return DRC_ZEROOPERANDS;
265 case 0x6a:
266 return DRC_ZEROOPERANDS;
267 case 0x6b:
268 return DRC_ZEROOPERANDS;
269 case 0x6c:
270 return DRC_ZEROOPERANDS;
271 case 0x6d:
272 return DRC_ZEROOPERANDS;
273 case 0x6e:
274 return DRC_ZEROOPERANDS;
275 case 0x6f:
276 return DRC_ZEROOPERANDS;
277 case 0x70:
278 return DRC_ONEOPERAND;
279 case 0x71:
280 return DRC_ONEOPERAND;
281 case 0x72:
282 return DRC_ONEOPERAND;
283 case 0x73:
284 return DRC_ONEOPERAND;
285 case 0x74:
286 return DRC_ONEOPERAND;
287 case 0x75:
288 return DRC_ONEOPERAND;
289 case 0x76:
290 return DRC_ONEOPERAND;
291 case 0x77:
292 return DRC_ONEOPERAND;
293 case 0x78:
294 return DRC_ONEOPERAND;
295 case 0x79:
296 return DRC_ONEOPERAND;
297 case 0x7a:
298 return DRC_ONEOPERAND;
299 case 0x7b:
300 return DRC_ONEOPERAND;
301 case 0x7c:
302 return DRC_ONEOPERAND;
303 case 0x7d:
304 return DRC_ONEOPERAND;
305 case 0x7e:
306 return DRC_ONEOPERAND;
307 case 0x7f:
308 return DRC_ONEOPERAND;
309 case 0x80:
310 return DRC_ONEOPERAND;
311 case 0x81:
312 return DRC_ONEOPERAND;
313 case 0x82:
314 return DRC_ONEOPERAND;
315 case 0x83:
316 return DRC_ONEOPERAND;
317 case 0x84:
318 return DRC_ONEOPERAND;
319 case 0x85:
320 return DRC_ONEOPERAND;
321 case 0x86:
322 return DRC_ONEOPERAND;
323 case 0x87:
324 return DRC_ONEOPERAND;
325 case 0x88:
326 return DRC_ONEOPERAND;
327 case 0x89:
328 return DRC_ONEOPERAND;
329 case 0x8a:
330 return DRC_ONEOPERAND;
331 case 0x8b:
332 return DRC_ONEOPERAND;
333 case 0x8c:
334 return DRC_ONEOPERAND;
335 case 0x8d:
336 return DRC_ONEOPERAND;
337 case 0x8e:
338 return DRC_ONEOPERAND;
339 case 0x8f:
340 return DRC_ONEOPERAND;
341 case 0x90:
342 return DRC_ONEOPERAND;
343 case 0x91:
344 return DRC_ONEOPERAND;
345 case 0x92:
346 return DRC_TWOOPERANDS;
347 case 0x93:
348 return DRC_ONEOPERAND;
349 case 0x94:
350 return DRC_ONEOPERAND;
351 case 0x95:
352 return DRC_ONEOPERAND;
353 case 0x96:
354 return DRC_ZEROOPERANDS;
355 case 0x97:
356 return DRC_DWARFv3 | DRC_ZEROOPERANDS;
357 case 0x98:
358 return DRC_DWARFv3 | DRC_ONEOPERAND;
359 case 0x99:
360 return DRC_DWARFv3 | DRC_ONEOPERAND;
361 case 0x9a:
362 return DRC_DWARFv3 | DRC_ONEOPERAND;
363 case 0xa3: /* DW_OP_entry_value */
364 return DRC_TWOOPERANDS;
365 case 0xf0:
366 return DRC_ZEROOPERANDS; /* DW_OP_APPLE_uninit */
367 case 0xe0:
368 return 0;
369 case 0xff:
370 return 0;
371 default:
372 return 0;
373 }
374 }
375
DW_ATE_value_to_name(uint32_t val)376 const char *DW_ATE_value_to_name(uint32_t val) {
377 static char invalid[100];
378 llvm::StringRef llvmstr = llvm::dwarf::AttributeEncodingString(val);
379 if (llvmstr.empty()) {
380 snprintf(invalid, sizeof(invalid), "Unknown DW_ATE constant: 0x%x", val);
381 return invalid;
382 }
383 return llvmstr.data();
384 }
385
DW_LANG_value_to_name(uint32_t val)386 const char *DW_LANG_value_to_name(uint32_t val) {
387 static char invalid[100];
388 llvm::StringRef llvmstr = llvm::dwarf::LanguageString(val);
389 if (llvmstr.empty()) {
390 snprintf(invalid, sizeof(invalid), "Unknown DW_LANG constant: 0x%x", val);
391 return invalid;
392 }
393 return llvmstr.data();
394 }
395
DW_LNS_value_to_name(uint32_t val)396 const char *DW_LNS_value_to_name(uint32_t val) {
397 static char invalid[100];
398 llvm::StringRef llvmstr = llvm::dwarf::LNStandardString(val);
399 if (llvmstr.empty()) {
400 snprintf(invalid, sizeof(invalid), "Unknown DW_LNS constant: 0x%x", val);
401 return invalid;
402 }
403 return llvmstr.data();
404 }
405
406 } // namespace lldb_private
407