1 //===-- DWARFDefines.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 "DWARFDefines.h"
11 #include "lldb/Utility/ConstString.h"
12 #include <cstdio>
13 #include <cstring>
14 #include <string>
15
16 namespace lldb_private {
17
DW_TAG_value_to_name(uint32_t val)18 const char *DW_TAG_value_to_name(uint32_t val) {
19 static char invalid[100];
20
21 if (val == 0)
22 return "NULL";
23
24 llvm::StringRef llvmstr = llvm::dwarf::TagString(val);
25 if (llvmstr.empty()) {
26 snprintf(invalid, sizeof(invalid), "Unknown DW_TAG constant: 0x%x", val);
27 return invalid;
28 }
29 return llvmstr.data();
30 }
31
DW_CHILDREN_value_to_name(uint8_t val)32 const char *DW_CHILDREN_value_to_name(uint8_t val) {
33 static char invalid[100];
34 llvm::StringRef llvmstr = llvm::dwarf::ChildrenString(val);
35 if (llvmstr.empty()) {
36 snprintf(invalid, sizeof(invalid), "Unknown DW_CHILDREN constant: 0x%x",
37 val);
38 return invalid;
39 }
40 return llvmstr.data();
41 }
42
DW_AT_value_to_name(uint32_t val)43 const char *DW_AT_value_to_name(uint32_t val) {
44 static char invalid[100];
45 llvm::StringRef llvmstr = llvm::dwarf::AttributeString(val);
46 if (llvmstr.empty()) {
47 snprintf(invalid, sizeof(invalid), "Unknown DW_AT constant: 0x%x", val);
48 return invalid;
49 }
50 return llvmstr.data();
51 }
52
DW_FORM_value_to_name(uint32_t val)53 const char *DW_FORM_value_to_name(uint32_t val) {
54 static char invalid[100];
55 llvm::StringRef llvmstr = llvm::dwarf::FormEncodingString(val);
56 if (llvmstr.empty()) {
57 snprintf(invalid, sizeof(invalid), "Unknown DW_FORM constant: 0x%x", val);
58 return invalid;
59 }
60 return llvmstr.data();
61 }
62
DW_OP_value_to_name(uint32_t val)63 const char *DW_OP_value_to_name(uint32_t val) {
64 static char invalid[100];
65 llvm::StringRef llvmstr = llvm::dwarf::OperationEncodingString(val);
66 if (llvmstr.empty()) {
67 snprintf(invalid, sizeof(invalid), "Unknown DW_OP constant: 0x%x", val);
68 return invalid;
69 }
70 return llvmstr.data();
71 }
72
DW_OP_value_to_class(uint32_t val)73 DRC_class DW_OP_value_to_class(uint32_t val) {
74 switch (val) {
75 case 0x03:
76 return DRC_ONEOPERAND;
77 case 0x06:
78 return DRC_ZEROOPERANDS;
79 case 0x08:
80 return DRC_ONEOPERAND;
81 case 0x09:
82 return DRC_ONEOPERAND;
83 case 0x0a:
84 return DRC_ONEOPERAND;
85 case 0x0b:
86 return DRC_ONEOPERAND;
87 case 0x0c:
88 return DRC_ONEOPERAND;
89 case 0x0d:
90 return DRC_ONEOPERAND;
91 case 0x0e:
92 return DRC_ONEOPERAND;
93 case 0x0f:
94 return DRC_ONEOPERAND;
95 case 0x10:
96 return DRC_ONEOPERAND;
97 case 0x11:
98 return DRC_ONEOPERAND;
99 case 0x12:
100 return DRC_ZEROOPERANDS;
101 case 0x13:
102 return DRC_ZEROOPERANDS;
103 case 0x14:
104 return DRC_ZEROOPERANDS;
105 case 0x15:
106 return DRC_ONEOPERAND;
107 case 0x16:
108 return DRC_ZEROOPERANDS;
109 case 0x17:
110 return DRC_ZEROOPERANDS;
111 case 0x18:
112 return DRC_ZEROOPERANDS;
113 case 0x19:
114 return DRC_ZEROOPERANDS;
115 case 0x1a:
116 return DRC_ZEROOPERANDS;
117 case 0x1b:
118 return DRC_ZEROOPERANDS;
119 case 0x1c:
120 return DRC_ZEROOPERANDS;
121 case 0x1d:
122 return DRC_ZEROOPERANDS;
123 case 0x1e:
124 return DRC_ZEROOPERANDS;
125 case 0x1f:
126 return DRC_ZEROOPERANDS;
127 case 0x20:
128 return DRC_ZEROOPERANDS;
129 case 0x21:
130 return DRC_ZEROOPERANDS;
131 case 0x22:
132 return DRC_ZEROOPERANDS;
133 case 0x23:
134 return DRC_ONEOPERAND;
135 case 0x24:
136 return DRC_ZEROOPERANDS;
137 case 0x25:
138 return DRC_ZEROOPERANDS;
139 case 0x26:
140 return DRC_ZEROOPERANDS;
141 case 0x27:
142 return DRC_ZEROOPERANDS;
143 case 0x2f:
144 return DRC_ONEOPERAND;
145 case 0x28:
146 return DRC_ONEOPERAND;
147 case 0x29:
148 return DRC_ZEROOPERANDS;
149 case 0x2a:
150 return DRC_ZEROOPERANDS;
151 case 0x2b:
152 return DRC_ZEROOPERANDS;
153 case 0x2c:
154 return DRC_ZEROOPERANDS;
155 case 0x2d:
156 return DRC_ZEROOPERANDS;
157 case 0x2e:
158 return DRC_ZEROOPERANDS;
159 case 0x30:
160 return DRC_ZEROOPERANDS;
161 case 0x31:
162 return DRC_ZEROOPERANDS;
163 case 0x32:
164 return DRC_ZEROOPERANDS;
165 case 0x33:
166 return DRC_ZEROOPERANDS;
167 case 0x34:
168 return DRC_ZEROOPERANDS;
169 case 0x35:
170 return DRC_ZEROOPERANDS;
171 case 0x36:
172 return DRC_ZEROOPERANDS;
173 case 0x37:
174 return DRC_ZEROOPERANDS;
175 case 0x38:
176 return DRC_ZEROOPERANDS;
177 case 0x39:
178 return DRC_ZEROOPERANDS;
179 case 0x3a:
180 return DRC_ZEROOPERANDS;
181 case 0x3b:
182 return DRC_ZEROOPERANDS;
183 case 0x3c:
184 return DRC_ZEROOPERANDS;
185 case 0x3d:
186 return DRC_ZEROOPERANDS;
187 case 0x3e:
188 return DRC_ZEROOPERANDS;
189 case 0x3f:
190 return DRC_ZEROOPERANDS;
191 case 0x40:
192 return DRC_ZEROOPERANDS;
193 case 0x41:
194 return DRC_ZEROOPERANDS;
195 case 0x42:
196 return DRC_ZEROOPERANDS;
197 case 0x43:
198 return DRC_ZEROOPERANDS;
199 case 0x44:
200 return DRC_ZEROOPERANDS;
201 case 0x45:
202 return DRC_ZEROOPERANDS;
203 case 0x46:
204 return DRC_ZEROOPERANDS;
205 case 0x47:
206 return DRC_ZEROOPERANDS;
207 case 0x48:
208 return DRC_ZEROOPERANDS;
209 case 0x49:
210 return DRC_ZEROOPERANDS;
211 case 0x4a:
212 return DRC_ZEROOPERANDS;
213 case 0x4b:
214 return DRC_ZEROOPERANDS;
215 case 0x4c:
216 return DRC_ZEROOPERANDS;
217 case 0x4d:
218 return DRC_ZEROOPERANDS;
219 case 0x4e:
220 return DRC_ZEROOPERANDS;
221 case 0x4f:
222 return DRC_ZEROOPERANDS;
223 case 0x50:
224 return DRC_ZEROOPERANDS;
225 case 0x51:
226 return DRC_ZEROOPERANDS;
227 case 0x52:
228 return DRC_ZEROOPERANDS;
229 case 0x53:
230 return DRC_ZEROOPERANDS;
231 case 0x54:
232 return DRC_ZEROOPERANDS;
233 case 0x55:
234 return DRC_ZEROOPERANDS;
235 case 0x56:
236 return DRC_ZEROOPERANDS;
237 case 0x57:
238 return DRC_ZEROOPERANDS;
239 case 0x58:
240 return DRC_ZEROOPERANDS;
241 case 0x59:
242 return DRC_ZEROOPERANDS;
243 case 0x5a:
244 return DRC_ZEROOPERANDS;
245 case 0x5b:
246 return DRC_ZEROOPERANDS;
247 case 0x5c:
248 return DRC_ZEROOPERANDS;
249 case 0x5d:
250 return DRC_ZEROOPERANDS;
251 case 0x5e:
252 return DRC_ZEROOPERANDS;
253 case 0x5f:
254 return DRC_ZEROOPERANDS;
255 case 0x60:
256 return DRC_ZEROOPERANDS;
257 case 0x61:
258 return DRC_ZEROOPERANDS;
259 case 0x62:
260 return DRC_ZEROOPERANDS;
261 case 0x63:
262 return DRC_ZEROOPERANDS;
263 case 0x64:
264 return DRC_ZEROOPERANDS;
265 case 0x65:
266 return DRC_ZEROOPERANDS;
267 case 0x66:
268 return DRC_ZEROOPERANDS;
269 case 0x67:
270 return DRC_ZEROOPERANDS;
271 case 0x68:
272 return DRC_ZEROOPERANDS;
273 case 0x69:
274 return DRC_ZEROOPERANDS;
275 case 0x6a:
276 return DRC_ZEROOPERANDS;
277 case 0x6b:
278 return DRC_ZEROOPERANDS;
279 case 0x6c:
280 return DRC_ZEROOPERANDS;
281 case 0x6d:
282 return DRC_ZEROOPERANDS;
283 case 0x6e:
284 return DRC_ZEROOPERANDS;
285 case 0x6f:
286 return DRC_ZEROOPERANDS;
287 case 0x70:
288 return DRC_ONEOPERAND;
289 case 0x71:
290 return DRC_ONEOPERAND;
291 case 0x72:
292 return DRC_ONEOPERAND;
293 case 0x73:
294 return DRC_ONEOPERAND;
295 case 0x74:
296 return DRC_ONEOPERAND;
297 case 0x75:
298 return DRC_ONEOPERAND;
299 case 0x76:
300 return DRC_ONEOPERAND;
301 case 0x77:
302 return DRC_ONEOPERAND;
303 case 0x78:
304 return DRC_ONEOPERAND;
305 case 0x79:
306 return DRC_ONEOPERAND;
307 case 0x7a:
308 return DRC_ONEOPERAND;
309 case 0x7b:
310 return DRC_ONEOPERAND;
311 case 0x7c:
312 return DRC_ONEOPERAND;
313 case 0x7d:
314 return DRC_ONEOPERAND;
315 case 0x7e:
316 return DRC_ONEOPERAND;
317 case 0x7f:
318 return DRC_ONEOPERAND;
319 case 0x80:
320 return DRC_ONEOPERAND;
321 case 0x81:
322 return DRC_ONEOPERAND;
323 case 0x82:
324 return DRC_ONEOPERAND;
325 case 0x83:
326 return DRC_ONEOPERAND;
327 case 0x84:
328 return DRC_ONEOPERAND;
329 case 0x85:
330 return DRC_ONEOPERAND;
331 case 0x86:
332 return DRC_ONEOPERAND;
333 case 0x87:
334 return DRC_ONEOPERAND;
335 case 0x88:
336 return DRC_ONEOPERAND;
337 case 0x89:
338 return DRC_ONEOPERAND;
339 case 0x8a:
340 return DRC_ONEOPERAND;
341 case 0x8b:
342 return DRC_ONEOPERAND;
343 case 0x8c:
344 return DRC_ONEOPERAND;
345 case 0x8d:
346 return DRC_ONEOPERAND;
347 case 0x8e:
348 return DRC_ONEOPERAND;
349 case 0x8f:
350 return DRC_ONEOPERAND;
351 case 0x90:
352 return DRC_ONEOPERAND;
353 case 0x91:
354 return DRC_ONEOPERAND;
355 case 0x92:
356 return DRC_TWOOPERANDS;
357 case 0x93:
358 return DRC_ONEOPERAND;
359 case 0x94:
360 return DRC_ONEOPERAND;
361 case 0x95:
362 return DRC_ONEOPERAND;
363 case 0x96:
364 return DRC_ZEROOPERANDS;
365 case 0x97:
366 return DRC_DWARFv3 | DRC_ZEROOPERANDS;
367 case 0x98:
368 return DRC_DWARFv3 | DRC_ONEOPERAND;
369 case 0x99:
370 return DRC_DWARFv3 | DRC_ONEOPERAND;
371 case 0x9a:
372 return DRC_DWARFv3 | DRC_ONEOPERAND;
373 case 0xf0:
374 return DRC_ZEROOPERANDS; /* DW_OP_APPLE_uninit */
375 case 0xe0:
376 return 0;
377 case 0xff:
378 return 0;
379 default:
380 return 0;
381 }
382 }
383
DW_ATE_value_to_name(uint32_t val)384 const char *DW_ATE_value_to_name(uint32_t val) {
385 static char invalid[100];
386 llvm::StringRef llvmstr = llvm::dwarf::AttributeEncodingString(val);
387 if (llvmstr.empty()) {
388 snprintf(invalid, sizeof(invalid), "Unknown DW_ATE constant: 0x%x", val);
389 return invalid;
390 }
391 return llvmstr.data();
392 }
393
DW_ACCESS_value_to_name(uint32_t val)394 const char *DW_ACCESS_value_to_name(uint32_t val) {
395 static char invalid[100];
396
397 llvm::StringRef llvmstr = llvm::dwarf::AccessibilityString(val);
398 if (llvmstr.empty()) {
399 snprintf(invalid, sizeof(invalid), "Unknown DW_ACCESS constant: 0x%x", val);
400 return invalid;
401 }
402 return llvmstr.data();
403 }
404
DW_VIS_value_to_name(uint32_t val)405 const char *DW_VIS_value_to_name(uint32_t val) {
406 static char invalid[100];
407 llvm::StringRef llvmstr = llvm::dwarf::VisibilityString(val);
408 if (llvmstr.empty()) {
409 snprintf(invalid, sizeof(invalid), "Unknown DW_VIS constant: 0x%x", val);
410 return invalid;
411 }
412 return llvmstr.data();
413 }
414
DW_VIRTUALITY_value_to_name(uint32_t val)415 const char *DW_VIRTUALITY_value_to_name(uint32_t val) {
416 static char invalid[100];
417 llvm::StringRef llvmstr = llvm::dwarf::VirtualityString(val);
418 if (llvmstr.empty()) {
419 snprintf(invalid, sizeof(invalid), "Unknown DW_VIRTUALITY constant: 0x%x",
420 val);
421 return invalid;
422 }
423 return llvmstr.data();
424 }
425
DW_LANG_value_to_name(uint32_t val)426 const char *DW_LANG_value_to_name(uint32_t val) {
427 static char invalid[100];
428 llvm::StringRef llvmstr = llvm::dwarf::LanguageString(val);
429 if (llvmstr.empty()) {
430 snprintf(invalid, sizeof(invalid), "Unknown DW_LANG constant: 0x%x", val);
431 return invalid;
432 }
433 return llvmstr.data();
434 }
435
DW_ID_value_to_name(uint32_t val)436 const char *DW_ID_value_to_name(uint32_t val) {
437 static char invalid[100];
438 llvm::StringRef llvmstr = llvm::dwarf::CaseString(val);
439 if (llvmstr.empty()) {
440 snprintf(invalid, sizeof(invalid), "Unknown DW_ID constant: 0x%x", val);
441 return invalid;
442 }
443 return llvmstr.data();
444 }
445
DW_CC_value_to_name(uint32_t val)446 const char *DW_CC_value_to_name(uint32_t val) {
447 static char invalid[100];
448 llvm::StringRef llvmstr = llvm::dwarf::ConventionString(val);
449 if (llvmstr.empty()) {
450 snprintf(invalid, sizeof(invalid), "Unknown DW_CC constant: 0x%x", val);
451 return invalid;
452 }
453 return llvmstr.data();
454 }
455
DW_INL_value_to_name(uint32_t val)456 const char *DW_INL_value_to_name(uint32_t val) {
457 static char invalid[100];
458 llvm::StringRef llvmstr = llvm::dwarf::InlineCodeString(val);
459 if (llvmstr.empty()) {
460 snprintf(invalid, sizeof(invalid), "Unknown DW_INL constant: 0x%x", val);
461 return invalid;
462 }
463 return llvmstr.data();
464 }
465
DW_ORD_value_to_name(uint32_t val)466 const char *DW_ORD_value_to_name(uint32_t val) {
467 static char invalid[100];
468 llvm::StringRef llvmstr = llvm::dwarf::ArrayOrderString(val);
469 if (llvmstr.empty()) {
470 snprintf(invalid, sizeof(invalid), "Unknown DW_ORD constant: 0x%x", val);
471 return invalid;
472 }
473 return llvmstr.data();
474 }
475
DW_LNS_value_to_name(uint32_t val)476 const char *DW_LNS_value_to_name(uint32_t val) {
477 static char invalid[100];
478 llvm::StringRef llvmstr = llvm::dwarf::LNStandardString(val);
479 if (llvmstr.empty()) {
480 snprintf(invalid, sizeof(invalid), "Unknown DW_LNS constant: 0x%x", val);
481 return invalid;
482 }
483 return llvmstr.data();
484 }
485
DW_LNE_value_to_name(uint32_t val)486 const char *DW_LNE_value_to_name(uint32_t val) {
487 static char invalid[100];
488 llvm::StringRef llvmstr = llvm::dwarf::LNExtendedString(val);
489 if (llvmstr.empty()) {
490 snprintf(invalid, sizeof(invalid), "Unknown DW_LNE constant: 0x%x", val);
491 return invalid;
492 }
493 return llvmstr.data();
494 }
495
DW_MACINFO_value_to_name(uint32_t val)496 const char *DW_MACINFO_value_to_name(uint32_t val) {
497 static char invalid[100];
498 llvm::StringRef llvmstr = llvm::dwarf::MacinfoString(val);
499 if (llvmstr.empty()) {
500 snprintf(invalid, sizeof(invalid), "Unknown DW_MACINFO constant: 0x%x",
501 val);
502 return invalid;
503 }
504 return llvmstr.data();
505 }
506
DW_CFA_value_to_name(uint32_t val,llvm::Triple::ArchType Arch)507 const char *DW_CFA_value_to_name(uint32_t val, llvm::Triple::ArchType Arch) {
508 static char invalid[100];
509 llvm::StringRef llvmstr = llvm::dwarf::CallFrameString(val, Arch);
510 if (llvmstr.empty()) {
511 snprintf(invalid, sizeof(invalid), "Unknown DW_CFA constant: 0x%x", val);
512 return invalid;
513 }
514 return llvmstr.data();
515 }
516
get_tag_category(uint16_t tag)517 DW_TAG_CategoryEnum get_tag_category(uint16_t tag) {
518 switch (tag) {
519 case DW_TAG_array_type:
520 return TagCategoryType;
521 case DW_TAG_class_type:
522 return TagCategoryType;
523 case DW_TAG_entry_point:
524 return TagCategoryProgram;
525 case DW_TAG_enumeration_type:
526 return TagCategoryType;
527 case DW_TAG_formal_parameter:
528 return TagCategoryVariable;
529 case DW_TAG_imported_declaration:
530 return TagCategoryProgram;
531 case DW_TAG_label:
532 return TagCategoryProgram;
533 case DW_TAG_lexical_block:
534 return TagCategoryProgram;
535 case DW_TAG_member:
536 return TagCategoryType;
537 case DW_TAG_pointer_type:
538 return TagCategoryType;
539 case DW_TAG_reference_type:
540 return TagCategoryType;
541 case DW_TAG_compile_unit:
542 return TagCategoryProgram;
543 case DW_TAG_string_type:
544 return TagCategoryType;
545 case DW_TAG_structure_type:
546 return TagCategoryType;
547 case DW_TAG_subroutine_type:
548 return TagCategoryType;
549 case DW_TAG_typedef:
550 return TagCategoryType;
551 case DW_TAG_union_type:
552 return TagCategoryType;
553 case DW_TAG_unspecified_parameters:
554 return TagCategoryVariable;
555 case DW_TAG_variant:
556 return TagCategoryType;
557 case DW_TAG_common_block:
558 return TagCategoryProgram;
559 case DW_TAG_common_inclusion:
560 return TagCategoryProgram;
561 case DW_TAG_inheritance:
562 return TagCategoryType;
563 case DW_TAG_inlined_subroutine:
564 return TagCategoryProgram;
565 case DW_TAG_module:
566 return TagCategoryProgram;
567 case DW_TAG_ptr_to_member_type:
568 return TagCategoryType;
569 case DW_TAG_set_type:
570 return TagCategoryType;
571 case DW_TAG_subrange_type:
572 return TagCategoryType;
573 case DW_TAG_with_stmt:
574 return TagCategoryProgram;
575 case DW_TAG_access_declaration:
576 return TagCategoryProgram;
577 case DW_TAG_base_type:
578 return TagCategoryType;
579 case DW_TAG_catch_block:
580 return TagCategoryProgram;
581 case DW_TAG_const_type:
582 return TagCategoryType;
583 case DW_TAG_constant:
584 return TagCategoryVariable;
585 case DW_TAG_enumerator:
586 return TagCategoryType;
587 case DW_TAG_file_type:
588 return TagCategoryType;
589 case DW_TAG_friend:
590 return TagCategoryType;
591 case DW_TAG_namelist:
592 return TagCategoryVariable;
593 case DW_TAG_namelist_item:
594 return TagCategoryVariable;
595 case DW_TAG_packed_type:
596 return TagCategoryType;
597 case DW_TAG_subprogram:
598 return TagCategoryProgram;
599 case DW_TAG_template_type_parameter:
600 return TagCategoryType;
601 case DW_TAG_template_value_parameter:
602 return TagCategoryType;
603 case DW_TAG_GNU_template_parameter_pack:
604 return TagCategoryType;
605 case DW_TAG_thrown_type:
606 return TagCategoryType;
607 case DW_TAG_try_block:
608 return TagCategoryProgram;
609 case DW_TAG_variant_part:
610 return TagCategoryType;
611 case DW_TAG_variable:
612 return TagCategoryVariable;
613 case DW_TAG_volatile_type:
614 return TagCategoryType;
615 case DW_TAG_dwarf_procedure:
616 return TagCategoryProgram;
617 case DW_TAG_restrict_type:
618 return TagCategoryType;
619 case DW_TAG_interface_type:
620 return TagCategoryType;
621 case DW_TAG_namespace:
622 return TagCategoryProgram;
623 case DW_TAG_imported_module:
624 return TagCategoryProgram;
625 case DW_TAG_unspecified_type:
626 return TagCategoryType;
627 case DW_TAG_partial_unit:
628 return TagCategoryProgram;
629 case DW_TAG_imported_unit:
630 return TagCategoryProgram;
631 case DW_TAG_shared_type:
632 return TagCategoryType;
633 default:
634 break;
635 }
636 return TagCategoryProgram;
637 }
638
639 } // namespace lldb_private
640